uigraph 0.0.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2467) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +252 -0
  3. package/dist/agents.md +28 -0
  4. package/dist/bin.mjs +4583 -0
  5. package/dist/plan-prompt.md +56 -0
  6. package/dist/prompt.md +44 -0
  7. package/dist/schema/actor.graphqls +8 -0
  8. package/dist/schema/assets.graphqls +18 -0
  9. package/dist/schema/auth.graphqls +25 -0
  10. package/dist/schema/catalog.graphqls +451 -0
  11. package/dist/schema/comments.graphqls +32 -0
  12. package/dist/schema/component.graphqls +62 -0
  13. package/dist/schema/dependency.graphqls +63 -0
  14. package/dist/schema/diagram.graphqls +137 -0
  15. package/dist/schema/docs.graphqls +53 -0
  16. package/dist/schema/features.graphqls +10 -0
  17. package/dist/schema/github_diagram.graphqls +32 -0
  18. package/dist/schema/github_onboarding.graphqls +77 -0
  19. package/dist/schema/org.graphqls +48 -0
  20. package/dist/schema/saved_query.graphqls +75 -0
  21. package/dist/schema/schema.graphqls +5 -0
  22. package/dist/schema/testpack.graphqls +13 -0
  23. package/dist/schema/uimap.graphqls +403 -0
  24. package/dist/uigraph-mark.png +0 -0
  25. package/dist/viewer/animated-nodes/Authentication.gif +0 -0
  26. package/dist/viewer/animated-nodes/Data-Analysis.gif +0 -0
  27. package/dist/viewer/animated-nodes/Document.gif +0 -0
  28. package/dist/viewer/animated-nodes/Laptop.gif +0 -0
  29. package/dist/viewer/animated-nodes/Loading.gif +0 -0
  30. package/dist/viewer/animated-nodes/Message.gif +0 -0
  31. package/dist/viewer/animated-nodes/Mobile-Analytics.gif +0 -0
  32. package/dist/viewer/animated-nodes/Notification.gif +0 -0
  33. package/dist/viewer/animated-nodes/Security.gif +0 -0
  34. package/dist/viewer/animated-nodes/Send-Message.gif +0 -0
  35. package/dist/viewer/animated-nodes/Server.gif +0 -0
  36. package/dist/viewer/animated-nodes/Settings.gif +0 -0
  37. package/dist/viewer/animated-nodes/Stats.gif +0 -0
  38. package/dist/viewer/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  39. package/dist/viewer/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  40. package/dist/viewer/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  41. package/dist/viewer/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  42. package/dist/viewer/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  43. package/dist/viewer/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  44. package/dist/viewer/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  45. package/dist/viewer/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  46. package/dist/viewer/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  47. package/dist/viewer/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  48. package/dist/viewer/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  49. package/dist/viewer/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  50. package/dist/viewer/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  51. package/dist/viewer/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  52. package/dist/viewer/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  53. package/dist/viewer/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  54. package/dist/viewer/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  55. package/dist/viewer/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  56. package/dist/viewer/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  57. package/dist/viewer/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  58. package/dist/viewer/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  59. package/dist/viewer/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  60. package/dist/viewer/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  61. package/dist/viewer/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  62. package/dist/viewer/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  63. package/dist/viewer/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  64. package/dist/viewer/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  65. package/dist/viewer/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  66. package/dist/viewer/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  67. package/dist/viewer/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  68. package/dist/viewer/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  69. package/dist/viewer/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  70. package/dist/viewer/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  71. package/dist/viewer/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  72. package/dist/viewer/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  73. package/dist/viewer/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  74. package/dist/viewer/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  75. package/dist/viewer/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  76. package/dist/viewer/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  77. package/dist/viewer/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  78. package/dist/viewer/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  79. package/dist/viewer/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  80. package/dist/viewer/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  81. package/dist/viewer/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  82. package/dist/viewer/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  83. package/dist/viewer/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  84. package/dist/viewer/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  85. package/dist/viewer/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  86. package/dist/viewer/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  87. package/dist/viewer/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  88. package/dist/viewer/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  89. package/dist/viewer/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  90. package/dist/viewer/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  91. package/dist/viewer/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  92. package/dist/viewer/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  93. package/dist/viewer/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  94. package/dist/viewer/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  95. package/dist/viewer/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  96. package/dist/viewer/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  97. package/dist/viewer/assets/__animated-nodes.DI0XYTuw-C-Pp0d4E.js +1 -0
  98. package/dist/viewer/assets/__aws-icons.agWBtDk7-CePtapr2.js +1 -0
  99. package/dist/viewer/assets/__azure-icons.DgR1F6C6-DcLey4UX.js +1 -0
  100. package/dist/viewer/assets/abap-BdImnpbu.js +1 -0
  101. package/dist/viewer/assets/abnfDiagram-VCTEODGH-D7zWJuPJ.js +1 -0
  102. package/dist/viewer/assets/actionscript-3-B3316cI-.js +1 -0
  103. package/dist/viewer/assets/actor-avatar-Bu-mKKXB.js +1 -0
  104. package/dist/viewer/assets/ada-BIOnG6TC.js +1 -0
  105. package/dist/viewer/assets/ahk-BrbAagtO.js +1 -0
  106. package/dist/viewer/assets/ahk2-8Zs4aa1G.js +1 -0
  107. package/dist/viewer/assets/andromeeda-C4gqWexZ.js +1 -0
  108. package/dist/viewer/assets/angular-html-D_SYSyRt.js +1 -0
  109. package/dist/viewer/assets/angular-ts-DGq0tZX5.js +1 -0
  110. package/dist/viewer/assets/apache-Pmp26Uib.js +1 -0
  111. package/dist/viewer/assets/apex-DhZFqWV2.js +1 -0
  112. package/dist/viewer/assets/api-adapters-tfr51BsS.js +3 -0
  113. package/dist/viewer/assets/api-endpoints-D-Whnnwd.js +172 -0
  114. package/dist/viewer/assets/api-group-endpoints-page-B9R1EI4i.js +107 -0
  115. package/dist/viewer/assets/api-r74Oi8H6.js +1 -0
  116. package/dist/viewer/assets/apl-ChzvTHjC.js +1 -0
  117. package/dist/viewer/assets/applescript-Co6uUVPk.js +1 -0
  118. package/dist/viewer/assets/ara-BRHolxvo.js +1 -0
  119. package/dist/viewer/assets/arc-DauzQXFu.js +1 -0
  120. package/dist/viewer/assets/architectureDiagram-5GKGNRK7-CXzgHd-c.js +36 -0
  121. package/dist/viewer/assets/arrow-left-DpQqmf17.js +6 -0
  122. package/dist/viewer/assets/asciidoc-CSVQ5wI8.js +1 -0
  123. package/dist/viewer/assets/asm-D_Q5rh1f.js +1 -0
  124. package/dist/viewer/assets/astro-DTjqU0_L.js +1 -0
  125. package/dist/viewer/assets/aurora-x-D-2ljcwZ.js +1 -0
  126. package/dist/viewer/assets/avatar-DAFUyk1i.js +43 -0
  127. package/dist/viewer/assets/awk-DMzUqQB5.js +1 -0
  128. package/dist/viewer/assets/ayu-dark-DYE7WIF3.js +1 -0
  129. package/dist/viewer/assets/ayu-light-BA47KaF1.js +1 -0
  130. package/dist/viewer/assets/ayu-mirage-32ctXXKs.js +1 -0
  131. package/dist/viewer/assets/badge-hR3QvPWv.js +1 -0
  132. package/dist/viewer/assets/ballerina-BFfxhgS-.js +1 -0
  133. package/dist/viewer/assets/bat-CickPsom.js +1 -0
  134. package/dist/viewer/assets/beancount-BgSHGh8x.js +1 -0
  135. package/dist/viewer/assets/berry-uYugtg8r.js +1 -0
  136. package/dist/viewer/assets/better-delete-confirmation-modal-CGEQ5O4X.js +1 -0
  137. package/dist/viewer/assets/better-dialog-B58_5-Gn.css +1 -0
  138. package/dist/viewer/assets/better-dialog-DcIxFWwk.js +1 -0
  139. package/dist/viewer/assets/bibtex-CHM0blh-.js +1 -0
  140. package/dist/viewer/assets/bicep-Bmn6On1c.js +1 -0
  141. package/dist/viewer/assets/bird2-Bx8U0n9b.js +1 -0
  142. package/dist/viewer/assets/blade-k33SngOZ.js +1 -0
  143. package/dist/viewer/assets/blockDiagram-I7D4REHJ-CFHWUw4z.js +129 -0
  144. package/dist/viewer/assets/brands-DtmA1AhP.js +1 -0
  145. package/dist/viewer/assets/bsl-DlhNcFeZ.js +1 -0
  146. package/dist/viewer/assets/button-DZj74qS7.js +1 -0
  147. package/dist/viewer/assets/c-BIGW1oBm.js +1 -0
  148. package/dist/viewer/assets/c3-Dp5svz6Z.js +1 -0
  149. package/dist/viewer/assets/c4Diagram-7LVT6UL2-BHSggPKI.js +38 -0
  150. package/dist/viewer/assets/cadence-Bv_4Rxtq.js +1 -0
  151. package/dist/viewer/assets/cairo-KRGpt6FW.js +1 -0
  152. package/dist/viewer/assets/calendar-Bolgc8E5.js +6 -0
  153. package/dist/viewer/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
  154. package/dist/viewer/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
  155. package/dist/viewer/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
  156. package/dist/viewer/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
  157. package/dist/viewer/assets/channel-CNRSofFP.js +1 -0
  158. package/dist/viewer/assets/chapel-DTp_pixX.js +1 -0
  159. package/dist/viewer/assets/check-BpmCQNbj.js +6 -0
  160. package/dist/viewer/assets/checkbox-CFJfXL6R.js +1 -0
  161. package/dist/viewer/assets/chevron-down-DDsUE_xz.js +6 -0
  162. package/dist/viewer/assets/chevron-up-DVznKMGv.js +6 -0
  163. package/dist/viewer/assets/chunk-2Q5K7J3B-CNfz5YDQ.js +1 -0
  164. package/dist/viewer/assets/chunk-5VM5RSS4-CwIhjvMe.js +15 -0
  165. package/dist/viewer/assets/chunk-F27PBJKO-YFexFJof.js +1 -0
  166. package/dist/viewer/assets/chunk-IMKFNOWR-GY2yrvuo.js +231 -0
  167. package/dist/viewer/assets/chunk-JWPE2WC7-xd0JGvne.js +1 -0
  168. package/dist/viewer/assets/chunk-OB3PAWPO-DJIP1M4r.js +12 -0
  169. package/dist/viewer/assets/chunk-POPQ4Y6H-Bh6rizEy.js +1 -0
  170. package/dist/viewer/assets/chunk-SVP7TREG-DtNrjvpq.js +88 -0
  171. package/dist/viewer/assets/chunk-TICWLB2K-DrERwtw8.js +206 -0
  172. package/dist/viewer/assets/chunk-XXDRQBXY-fYo04iwY.js +1 -0
  173. package/dist/viewer/assets/circle-alert-Bl7DXYD_.js +6 -0
  174. package/dist/viewer/assets/clarity-Dn5IMItf.js +1 -0
  175. package/dist/viewer/assets/classDiagram-ZZMXUADV-D7PO-ME9.js +1 -0
  176. package/dist/viewer/assets/classDiagram-v2-VYDZK3BY-D7PO-ME9.js +1 -0
  177. package/dist/viewer/assets/clojure-P80f7IUj.js +1 -0
  178. package/dist/viewer/assets/cmake-D1j8_8rp.js +1 -0
  179. package/dist/viewer/assets/cobol-BBKr1ja6.js +1 -0
  180. package/dist/viewer/assets/codeowners-Bp6g37R7.js +1 -0
  181. package/dist/viewer/assets/codeql-DsOJ9woJ.js +1 -0
  182. package/dist/viewer/assets/coffee-Ch7k5sss.js +1 -0
  183. package/dist/viewer/assets/color-input-ClkkG_kZ.js +11 -0
  184. package/dist/viewer/assets/common-DLCsGQ-t.js +1 -0
  185. package/dist/viewer/assets/common-lisp-Cg-RD9OK.js +1 -0
  186. package/dist/viewer/assets/component-icons-BD8MpcyB.css +1 -0
  187. package/dist/viewer/assets/component-icons-MJ61E9nt.js +6 -0
  188. package/dist/viewer/assets/copy-DMJJonQF.js +6 -0
  189. package/dist/viewer/assets/coq-BqXF5kFF.js +1 -0
  190. package/dist/viewer/assets/cose-bilkent-JH36ORCC-Dplz8nVT.js +1 -0
  191. package/dist/viewer/assets/cpp-BMRokrvK.js +1 -0
  192. package/dist/viewer/assets/cross-button-D5qst1tj.js +1 -0
  193. package/dist/viewer/assets/crystal-LUwhHfY5.js +1 -0
  194. package/dist/viewer/assets/csharp-B_TYUkTI.js +1 -0
  195. package/dist/viewer/assets/css-Z72CF80r.js +1 -0
  196. package/dist/viewer/assets/csv-fuZLfV_i.js +1 -0
  197. package/dist/viewer/assets/cue-D82EKSYY.js +1 -0
  198. package/dist/viewer/assets/cynefin-OW5HDTMX-DiBs4CI8.js +178 -0
  199. package/dist/viewer/assets/cynefinDiagram-5FMLGOSQ-COXS8-dI.js +62 -0
  200. package/dist/viewer/assets/cypher-COkxafJQ.js +1 -0
  201. package/dist/viewer/assets/cytoscape.esm-CtNdOvlO.js +331 -0
  202. package/dist/viewer/assets/d-85-TOEBH.js +1 -0
  203. package/dist/viewer/assets/dagre-GXQ25YYZ-K8qvfG8D.js +4 -0
  204. package/dist/viewer/assets/dark-plus-C3mMm8J8.js +1 -0
  205. package/dist/viewer/assets/dart-CtKP3W-j.js +1 -0
  206. package/dist/viewer/assets/dashboard-diagrams-page-Cb0xNr4W.js +2 -0
  207. package/dist/viewer/assets/dashboard-diagrams-page-inner-CD--zr5q.js +1 -0
  208. package/dist/viewer/assets/dashboard-docs-page-BfWR9Ai9.js +2 -0
  209. package/dist/viewer/assets/dashboard-docs-page-inner-BLbX-YwF.js +67 -0
  210. package/dist/viewer/assets/dashboard-layout-sTeeHNsZ.js +1 -0
  211. package/dist/viewer/assets/dashboard-lens-layout-D-tu_4kn.js +1 -0
  212. package/dist/viewer/assets/dashboard-map-frame-page-7pDmbTSe.js +1 -0
  213. package/dist/viewer/assets/dashboard-plans-page-CfwOZ34A.js +1 -0
  214. package/dist/viewer/assets/dashboard-service-apis-k93fjW51.js +1 -0
  215. package/dist/viewer/assets/dashboard-service-diagrams-BIWUxX-Y.js +50 -0
  216. package/dist/viewer/assets/dashboard-service-docs-CnniTD6Q.js +1 -0
  217. package/dist/viewer/assets/dashboard-service-overview-CGBu4omY.js +83 -0
  218. package/dist/viewer/assets/dashboard-services-DEscIO2O.js +1 -0
  219. package/dist/viewer/assets/dax-CEL-wOlO.js +1 -0
  220. package/dist/viewer/assets/db-type-badge-UbPgpwQf.js +6 -0
  221. package/dist/viewer/assets/debounce-Cp8eREM4-D7o-Pzb-.js +2 -0
  222. package/dist/viewer/assets/defaultLocale-DX6XiGOO.js +1 -0
  223. package/dist/viewer/assets/dependencies-DK2GDlhQ.js +111 -0
  224. package/dist/viewer/assets/dependency-graph-xBEnCS0J.js +22 -0
  225. package/dist/viewer/assets/desktop-BmXAJ9_W.js +1 -0
  226. package/dist/viewer/assets/diagram-S7CK7UJ4-D-liadVe.js +30 -0
  227. package/dist/viewer/assets/diagram-UQ7AKVKN-CnA8mgXp.js +41 -0
  228. package/dist/viewer/assets/diagram-VSXAHHWV-Ck7dgRFR.js +3 -0
  229. package/dist/viewer/assets/diagram-VX7I27RA-Cm1LHbu3.js +24 -0
  230. package/dist/viewer/assets/diagram-Z3DM3KII-DV3yBUCB.js +24 -0
  231. package/dist/viewer/assets/diagram-live-preview-DzJ7Nxp1.js +2 -0
  232. package/dist/viewer/assets/diagram-portal-page-1e3ypafd.css +1 -0
  233. package/dist/viewer/assets/diagram-portal-page-gguGLULH.js +231 -0
  234. package/dist/viewer/assets/diagrams-BqBSv2eb.js +68 -0
  235. package/dist/viewer/assets/dialog-D7wzTt0L.js +6 -0
  236. package/dist/viewer/assets/diff-D97Zzqfu.js +1 -0
  237. package/dist/viewer/assets/doc-file-content-Be0au9Vo.js +101 -0
  238. package/dist/viewer/assets/doc-file-content-Cp579UoJ.css +1 -0
  239. package/dist/viewer/assets/docker-BcOcwvcX.js +1 -0
  240. package/dist/viewer/assets/dotenv-De0Btta0.js +1 -0
  241. package/dist/viewer/assets/download-DhyZ3g4F.js +6 -0
  242. package/dist/viewer/assets/dracula-BzJJZx-M.js +1 -0
  243. package/dist/viewer/assets/dracula-soft-BXkSAIEj.js +1 -0
  244. package/dist/viewer/assets/dream-maker-BtqSS_iP.js +1 -0
  245. package/dist/viewer/assets/ebnfDiagram-PWID7BFC-BXbHVQvG.js +1 -0
  246. package/dist/viewer/assets/edge-CJaD-t2L.js +1 -0
  247. package/dist/viewer/assets/editor-F9o4zoeB.js +10 -0
  248. package/dist/viewer/assets/editor-njNjsRVH.css +7 -0
  249. package/dist/viewer/assets/elixir-DkJLSxtU.js +1 -0
  250. package/dist/viewer/assets/elm-DbKCFpqz.js +1 -0
  251. package/dist/viewer/assets/emacs-lisp-DaIrSCgJ.js +1 -0
  252. package/dist/viewer/assets/en-US-B1Lg1a1H.js +1 -0
  253. package/dist/viewer/assets/endOfMonth-CMPv5yN4.js +1 -0
  254. package/dist/viewer/assets/erDiagram-RLTQ6QDP-DMfiWput.js +99 -0
  255. package/dist/viewer/assets/erb-CSMaCouu.js +1 -0
  256. package/dist/viewer/assets/erlang-DsQrWhSR.js +1 -0
  257. package/dist/viewer/assets/everforest-dark-BgDCqdQA.js +1 -0
  258. package/dist/viewer/assets/everforest-light-C8M2exoo.js +1 -0
  259. package/dist/viewer/assets/fennel-BYunw83y.js +1 -0
  260. package/dist/viewer/assets/file-text-BFqJQ67P.js +6 -0
  261. package/dist/viewer/assets/fira-code-cyrillic-400-normal-UC0NFL4U.woff2 +0 -0
  262. package/dist/viewer/assets/fira-code-cyrillic-400-normal-dc1q3VD7.woff +0 -0
  263. package/dist/viewer/assets/fira-code-cyrillic-500-normal-Bu7VCL72.woff +0 -0
  264. package/dist/viewer/assets/fira-code-cyrillic-500-normal-CX35h3Mg.woff2 +0 -0
  265. package/dist/viewer/assets/fira-code-cyrillic-ext-400-normal-Buh61xzB.woff +0 -0
  266. package/dist/viewer/assets/fira-code-cyrillic-ext-400-normal-txZ9Fk_1.woff2 +0 -0
  267. package/dist/viewer/assets/fira-code-cyrillic-ext-500-normal-CYRspHgm.woff2 +0 -0
  268. package/dist/viewer/assets/fira-code-cyrillic-ext-500-normal-CwtLmSFD.woff +0 -0
  269. package/dist/viewer/assets/fira-code-greek-400-normal-B2Gh_Y8s.woff2 +0 -0
  270. package/dist/viewer/assets/fira-code-greek-400-normal-DobhaxvF.woff +0 -0
  271. package/dist/viewer/assets/fira-code-greek-500-normal-CVO0IRNt.woff2 +0 -0
  272. package/dist/viewer/assets/fira-code-greek-500-normal-DEXIWiey.woff +0 -0
  273. package/dist/viewer/assets/fira-code-greek-ext-400-normal-DR7mBgIM.woff2 +0 -0
  274. package/dist/viewer/assets/fira-code-greek-ext-400-normal-DSPUheWg.woff +0 -0
  275. package/dist/viewer/assets/fira-code-greek-ext-500-normal-BO3iq16n.woff2 +0 -0
  276. package/dist/viewer/assets/fira-code-greek-ext-500-normal-CMiNLXER.woff +0 -0
  277. package/dist/viewer/assets/fira-code-latin-400-normal-C-QZfXAs.woff +0 -0
  278. package/dist/viewer/assets/fira-code-latin-400-normal-DGosTW8U.woff2 +0 -0
  279. package/dist/viewer/assets/fira-code-latin-500-normal-B6gioGu8.woff2 +0 -0
  280. package/dist/viewer/assets/fira-code-latin-500-normal-aMLC2AMm.woff +0 -0
  281. package/dist/viewer/assets/fira-code-latin-ext-400-normal-DG73JjOf.woff +0 -0
  282. package/dist/viewer/assets/fira-code-latin-ext-400-normal-KSMg0QLl.woff2 +0 -0
  283. package/dist/viewer/assets/fira-code-latin-ext-500-normal-CaANqXjI.woff +0 -0
  284. package/dist/viewer/assets/fira-code-latin-ext-500-normal-Crd9e_oI.woff2 +0 -0
  285. package/dist/viewer/assets/fira-code-symbols2-400-normal-_QEZCEwe.woff +0 -0
  286. package/dist/viewer/assets/fira-code-symbols2-500-normal-DwsgbIjQ.woff +0 -0
  287. package/dist/viewer/assets/fish-BvzEVeQv.js +1 -0
  288. package/dist/viewer/assets/flow-diagram-preview-B83UU1n_.js +1 -0
  289. package/dist/viewer/assets/flowDiagram-HODETNUW-BNFS2Mkr.js +168 -0
  290. package/dist/viewer/assets/fluent-C4IJs8-o.js +1 -0
  291. package/dist/viewer/assets/format-BquKoU4D.js +1 -0
  292. package/dist/viewer/assets/formatDistanceToNow-DdN6W2RC.js +1 -0
  293. package/dist/viewer/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  294. package/dist/viewer/assets/fortran-free-form-BxgE0vQu.js +1 -0
  295. package/dist/viewer/assets/fsharp-CXgrBDvD.js +1 -0
  296. package/dist/viewer/assets/ganttDiagram-EL5Y4UJY-DFDsYJNp.js +292 -0
  297. package/dist/viewer/assets/gdresource-TyuKm33G.js +1 -0
  298. package/dist/viewer/assets/gdscript-DqcFQ5yU.js +1 -0
  299. package/dist/viewer/assets/gdshader-DkwncUOv.js +1 -0
  300. package/dist/viewer/assets/genie-D0YGMca9.js +1 -0
  301. package/dist/viewer/assets/getRoundingMethod-DC1wW3rl.js +1 -0
  302. package/dist/viewer/assets/gherkin-DyxjwDmM.js +1 -0
  303. package/dist/viewer/assets/git-BilAlIQ8.js +1 -0
  304. package/dist/viewer/assets/git-commit-F4YmCXRG.js +1 -0
  305. package/dist/viewer/assets/git-rebase-r7XF79zn.js +1 -0
  306. package/dist/viewer/assets/gitGraphDiagram-WWUBYQGX-BVHabPDp.js +106 -0
  307. package/dist/viewer/assets/github-dark-DHJKELXO.js +1 -0
  308. package/dist/viewer/assets/github-dark-default-Cuk6v7N8.js +1 -0
  309. package/dist/viewer/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  310. package/dist/viewer/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  311. package/dist/viewer/assets/github-light-DAi9KRSo.js +1 -0
  312. package/dist/viewer/assets/github-light-default-D7oLnXFd.js +1 -0
  313. package/dist/viewer/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  314. package/dist/viewer/assets/gleam-BspZqrRM.js +1 -0
  315. package/dist/viewer/assets/glimmer-js-Drrc9bTt.js +1 -0
  316. package/dist/viewer/assets/glimmer-ts-zeybXsvi.js +1 -0
  317. package/dist/viewer/assets/global-loader-XJO9_e0l.js +1 -0
  318. package/dist/viewer/assets/globe-CJ35KsQW.js +6 -0
  319. package/dist/viewer/assets/glsl-DplSGwfg.js +1 -0
  320. package/dist/viewer/assets/gn-8iBmfbXw.js +1 -0
  321. package/dist/viewer/assets/gnuplot-DdkO51Og.js +1 -0
  322. package/dist/viewer/assets/go-C27-OAKa.js +1 -0
  323. package/dist/viewer/assets/gql-FFIj8zdp.js +1 -0
  324. package/dist/viewer/assets/graphql-ChdNCCLP.js +1 -0
  325. package/dist/viewer/assets/grid-scroll-body-DC5pYDPJ.js +15 -0
  326. package/dist/viewer/assets/groovy-gcz8RCvz.js +1 -0
  327. package/dist/viewer/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  328. package/dist/viewer/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  329. package/dist/viewer/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  330. package/dist/viewer/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  331. package/dist/viewer/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  332. package/dist/viewer/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  333. package/dist/viewer/assets/hack-Ck6-gGSS.js +1 -0
  334. package/dist/viewer/assets/haml-GN_XdMnF.js +1 -0
  335. package/dist/viewer/assets/handlebars-DPT5vKgj.js +1 -0
  336. package/dist/viewer/assets/haskell-Df6bDoY_.js +1 -0
  337. package/dist/viewer/assets/haxe-CfZj7gIn.js +1 -0
  338. package/dist/viewer/assets/hcl-BWvSN4gD.js +1 -0
  339. package/dist/viewer/assets/hjson-D5-asLiD.js +1 -0
  340. package/dist/viewer/assets/hlsl-D3lLCCz7.js +1 -0
  341. package/dist/viewer/assets/horizon-BUw7H-hv.js +1 -0
  342. package/dist/viewer/assets/horizon-bright-CUuTKBJd.js +1 -0
  343. package/dist/viewer/assets/houston-DnULxvSX.js +1 -0
  344. package/dist/viewer/assets/html-BlS82ilI.js +1 -0
  345. package/dist/viewer/assets/html-derivative-DZhk3IEZ.js +1 -0
  346. package/dist/viewer/assets/http-jrhK8wxY.js +1 -0
  347. package/dist/viewer/assets/hurl-irOxFIW8.js +1 -0
  348. package/dist/viewer/assets/hxml-2-FPmUDs.js +1 -0
  349. package/dist/viewer/assets/hy-DFXneXwc.js +1 -0
  350. package/dist/viewer/assets/iconBase-DtqdW2XR.js +1 -0
  351. package/dist/viewer/assets/imba-DGztddWO.js +1 -0
  352. package/dist/viewer/assets/index-B6MxYIzs.js +1 -0
  353. package/dist/viewer/assets/index-BC5xdBQU.js +48 -0
  354. package/dist/viewer/assets/index-BIrx3oY4.js +1 -0
  355. package/dist/viewer/assets/index-BZGsDmUx.js +12 -0
  356. package/dist/viewer/assets/index-BZXhpoWr.js +50 -0
  357. package/dist/viewer/assets/index-Bn2bqqMd.js +1 -0
  358. package/dist/viewer/assets/index-BpCVYTvP.js +77 -0
  359. package/dist/viewer/assets/index-CBOYhBKJ.js +1 -0
  360. package/dist/viewer/assets/index-CH7cEAxj.js +17 -0
  361. package/dist/viewer/assets/index-CIf0GId3.js +74 -0
  362. package/dist/viewer/assets/index-Ck66Ic_p.js +22 -0
  363. package/dist/viewer/assets/index-Cp9mIQ8F.js +1 -0
  364. package/dist/viewer/assets/index-DDmBuMKI.js +1 -0
  365. package/dist/viewer/assets/index-DY3BFyb6.js +1 -0
  366. package/dist/viewer/assets/index-Dj_05fqk.js +1 -0
  367. package/dist/viewer/assets/index-DkzZ-ZvR.js +1 -0
  368. package/dist/viewer/assets/index-PglMbhys.js +1 -0
  369. package/dist/viewer/assets/index-m8s6_jQi.css +1 -0
  370. package/dist/viewer/assets/infoDiagram-27XIBGKW-CG-wwxBf.js +2 -0
  371. package/dist/viewer/assets/ini-BEwlwnbL.js +1 -0
  372. package/dist/viewer/assets/init-Gi6I4Gst.js +1 -0
  373. package/dist/viewer/assets/input--C59pq6j.js +1 -0
  374. package/dist/viewer/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  375. package/dist/viewer/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  376. package/dist/viewer/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  377. package/dist/viewer/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  378. package/dist/viewer/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  379. package/dist/viewer/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  380. package/dist/viewer/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  381. package/dist/viewer/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  382. package/dist/viewer/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  383. package/dist/viewer/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  384. package/dist/viewer/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  385. package/dist/viewer/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  386. package/dist/viewer/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  387. package/dist/viewer/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  388. package/dist/viewer/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  389. package/dist/viewer/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  390. package/dist/viewer/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4-BOeWTOD4.woff2 +0 -0
  391. package/dist/viewer/assets/inter-cyrillic-wght-normal-DqGufNeO-DqGufNeO.woff2 +0 -0
  392. package/dist/viewer/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  393. package/dist/viewer/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  394. package/dist/viewer/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  395. package/dist/viewer/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  396. package/dist/viewer/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  397. package/dist/viewer/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  398. package/dist/viewer/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  399. package/dist/viewer/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  400. package/dist/viewer/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  401. package/dist/viewer/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  402. package/dist/viewer/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  403. package/dist/viewer/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  404. package/dist/viewer/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  405. package/dist/viewer/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  406. package/dist/viewer/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  407. package/dist/viewer/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  408. package/dist/viewer/assets/inter-greek-ext-wght-normal-DlzME5K_-DlzME5K_.woff2 +0 -0
  409. package/dist/viewer/assets/inter-greek-wght-normal-CkhJZR-_-CkhJZR-_.woff2 +0 -0
  410. package/dist/viewer/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  411. package/dist/viewer/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  412. package/dist/viewer/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  413. package/dist/viewer/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  414. package/dist/viewer/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  415. package/dist/viewer/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  416. package/dist/viewer/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  417. package/dist/viewer/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  418. package/dist/viewer/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  419. package/dist/viewer/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  420. package/dist/viewer/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  421. package/dist/viewer/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  422. package/dist/viewer/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  423. package/dist/viewer/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  424. package/dist/viewer/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  425. package/dist/viewer/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  426. package/dist/viewer/assets/inter-latin-ext-wght-normal-DO1Apj_S-DO1Apj_S.woff2 +0 -0
  427. package/dist/viewer/assets/inter-latin-wght-normal-Dx4kXJAl-Dx4kXJAl.woff2 +0 -0
  428. package/dist/viewer/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  429. package/dist/viewer/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  430. package/dist/viewer/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  431. package/dist/viewer/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  432. package/dist/viewer/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  433. package/dist/viewer/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  434. package/dist/viewer/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  435. package/dist/viewer/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  436. package/dist/viewer/assets/inter-vietnamese-wght-normal-CBcvBZtf-CBcvBZtf.woff2 +0 -0
  437. package/dist/viewer/assets/ishikawaDiagram-5VMMS53U-BlgV7ceJ.js +70 -0
  438. package/dist/viewer/assets/java-CylS5w8V.js +1 -0
  439. package/dist/viewer/assets/javascript-wDzz0qaB.js +1 -0
  440. package/dist/viewer/assets/jetbrains-mono-latin-400-normal-6-qcROiO-6-qcROiO.woff +0 -0
  441. package/dist/viewer/assets/jetbrains-mono-latin-400-normal-V6pRDFza-V6pRDFza.woff2 +0 -0
  442. package/dist/viewer/assets/jetbrains-mono-latin-500-normal-BWZEU5yA-BWZEU5yA.woff2 +0 -0
  443. package/dist/viewer/assets/jetbrains-mono-latin-500-normal-CJOVTJB7-CJOVTJB7.woff +0 -0
  444. package/dist/viewer/assets/jinja-DFQZVq3b.js +1 -0
  445. package/dist/viewer/assets/jison-wvAkD_A8.js +1 -0
  446. package/dist/viewer/assets/journeyDiagram-3NMN7TZE-Cn03_Xl6.js +139 -0
  447. package/dist/viewer/assets/js-yaml-3VEnDAEN.js +32 -0
  448. package/dist/viewer/assets/json-Cp-IABpG.js +1 -0
  449. package/dist/viewer/assets/json5-C9tS-k6U.js +1 -0
  450. package/dist/viewer/assets/jsonc-Des-eS-w.js +1 -0
  451. package/dist/viewer/assets/jsonl-DcaNXYhu.js +1 -0
  452. package/dist/viewer/assets/jsonnet-DFQXde-d.js +1 -0
  453. package/dist/viewer/assets/jssm-C2t-YnRu.js +1 -0
  454. package/dist/viewer/assets/jsx-g9-lgVsj.js +1 -0
  455. package/dist/viewer/assets/julia-Cu79e8SL.js +1 -0
  456. package/dist/viewer/assets/just-CMxyWJJc.js +1 -0
  457. package/dist/viewer/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
  458. package/dist/viewer/assets/kanagawa-lotus-C3DzagqV.js +1 -0
  459. package/dist/viewer/assets/kanagawa-wave-DFGoQZhC.js +1 -0
  460. package/dist/viewer/assets/kanban-definition-UXKFOSKX-CJogvDPY.js +89 -0
  461. package/dist/viewer/assets/katex-HP8lGamR.js +257 -0
  462. package/dist/viewer/assets/kdl-DV7GczEv.js +1 -0
  463. package/dist/viewer/assets/kotlin-BdnUsdx6.js +1 -0
  464. package/dist/viewer/assets/kusto-wEQ09or8.js +1 -0
  465. package/dist/viewer/assets/laserwave-DUszq2jm.js +1 -0
  466. package/dist/viewer/assets/last-DXTTfs9a.js +1 -0
  467. package/dist/viewer/assets/latex-DJVikpzR.js +1 -0
  468. package/dist/viewer/assets/layout-B26eC4yQ.js +1 -0
  469. package/dist/viewer/assets/lean-BZvkOJ9d.js +1 -0
  470. package/dist/viewer/assets/lens-run-page-Ba1ppzJt.js +356 -0
  471. package/dist/viewer/assets/lens-runs-page-BnUS57LM.js +1 -0
  472. package/dist/viewer/assets/less-B1dDrJ26.js +1 -0
  473. package/dist/viewer/assets/lg-B0dIV2BS.svg +54 -0
  474. package/dist/viewer/assets/lg-CosQH4Cu.woff +0 -0
  475. package/dist/viewer/assets/lg-oyjwlqP2.ttf +0 -0
  476. package/dist/viewer/assets/light-plus-B7mTdjB0.js +1 -0
  477. package/dist/viewer/assets/linear-BT-xgETh.js +1 -0
  478. package/dist/viewer/assets/link-2-D1e0xznG.js +6 -0
  479. package/dist/viewer/assets/linked-project-dot-BY1gEES9.js +543 -0
  480. package/dist/viewer/assets/linked-project-dot-DLrQ6umA.css +1 -0
  481. package/dist/viewer/assets/liquid-B-duXHXw.js +1 -0
  482. package/dist/viewer/assets/llvm-BZoOZj88.js +1 -0
  483. package/dist/viewer/assets/loader-circle-CiqyoJF7.js +6 -0
  484. package/dist/viewer/assets/loading-BZOHaeKn.gif +0 -0
  485. package/dist/viewer/assets/log-2UxHyX5q.js +1 -0
  486. package/dist/viewer/assets/logo-BtOb2qkB.js +1 -0
  487. package/dist/viewer/assets/lua-BaeVxFsk.js +1 -0
  488. package/dist/viewer/assets/luau-nOZpfvQi.js +1 -0
  489. package/dist/viewer/assets/make-CHLpvVh8.js +1 -0
  490. package/dist/viewer/assets/markdown-Cvjx9yec.js +1 -0
  491. package/dist/viewer/assets/marko-BYgDmDgU.js +1 -0
  492. package/dist/viewer/assets/material-theme-D5KoaKCx.js +1 -0
  493. package/dist/viewer/assets/material-theme-darker-BfHTSMKl.js +1 -0
  494. package/dist/viewer/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  495. package/dist/viewer/assets/material-theme-ocean-CyktbL80.js +1 -0
  496. package/dist/viewer/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  497. package/dist/viewer/assets/matlab-D7o27uSR.js +1 -0
  498. package/dist/viewer/assets/mdc-DF4WjDMn.js +1 -0
  499. package/dist/viewer/assets/mdx-Cmh6b_Ma.js +1 -0
  500. package/dist/viewer/assets/merge-BhOMvhW1.js +1 -0
  501. package/dist/viewer/assets/mermaid-CQcHuHx7.js +1 -0
  502. package/dist/viewer/assets/mermaid.core-BDgZg3kW.js +312 -0
  503. package/dist/viewer/assets/method-badge-DErZP7y5.js +1 -0
  504. package/dist/viewer/assets/min-dark-CafNBF8u.js +1 -0
  505. package/dist/viewer/assets/min-light-CTRr51gU.js +1 -0
  506. package/dist/viewer/assets/mindmap-definition-YA3MSWOX-DFkLu0ac.js +96 -0
  507. package/dist/viewer/assets/mipsasm-CKIfxQSi.js +1 -0
  508. package/dist/viewer/assets/mojo-DJz3ZmWd.js +1 -0
  509. package/dist/viewer/assets/monokai-CR4piiQ-.js +1 -0
  510. package/dist/viewer/assets/moonbit-Bag4Rp_g.js +1 -0
  511. package/dist/viewer/assets/move-el3G9tDJ.js +1 -0
  512. package/dist/viewer/assets/narrat-DRg8JJMk.js +1 -0
  513. package/dist/viewer/assets/nav-links-DZWMpwMR.js +61 -0
  514. package/dist/viewer/assets/network-B1apzT1s.js +6 -0
  515. package/dist/viewer/assets/nextflow-BCxp2Aob.js +1 -0
  516. package/dist/viewer/assets/nextflow-groovy-CedDknKX.js +1 -0
  517. package/dist/viewer/assets/nginx-BpAMiNFr.js +1 -0
  518. package/dist/viewer/assets/night-owl-C39BiMTA.js +1 -0
  519. package/dist/viewer/assets/night-owl-light-CMTm3GFP.js +1 -0
  520. package/dist/viewer/assets/nim-nV83PyhX.js +1 -0
  521. package/dist/viewer/assets/nix-CwoSXNpI.js +1 -0
  522. package/dist/viewer/assets/nord-Ddv68eIx.js +1 -0
  523. package/dist/viewer/assets/nosql-editor-modal-CvH0SWAi.js +21 -0
  524. package/dist/viewer/assets/not-found-page-C-fn8QeM.js +1 -0
  525. package/dist/viewer/assets/nsis-BlV79W_Q.js +1 -0
  526. package/dist/viewer/assets/nushell-BXD5iret.js +1 -0
  527. package/dist/viewer/assets/objective-c-DXmwc3jG.js +1 -0
  528. package/dist/viewer/assets/objective-cpp-CLxacb5B.js +1 -0
  529. package/dist/viewer/assets/ocaml-C0hk2d4L.js +1 -0
  530. package/dist/viewer/assets/odin-BBf5iR-q.js +1 -0
  531. package/dist/viewer/assets/one-dark-pro-CxGP3dtY.js +1 -0
  532. package/dist/viewer/assets/one-light-C3Wv6jpd.js +1 -0
  533. package/dist/viewer/assets/openscad-C4EeE6gA.js +1 -0
  534. package/dist/viewer/assets/ordinal-Cboi1Yqb.js +1 -0
  535. package/dist/viewer/assets/org-6a7ccXN_.js +1 -0
  536. package/dist/viewer/assets/organization-dependency-graph-page-BryP-iJL.js +1 -0
  537. package/dist/viewer/assets/pascal-D93ZcfNL.js +1 -0
  538. package/dist/viewer/assets/pegDiagram-XKGWAZYB-g1cM14-L.js +1 -0
  539. package/dist/viewer/assets/perl-5klg-GXX.js +1 -0
  540. package/dist/viewer/assets/php-DoruYMF0.js +1 -0
  541. package/dist/viewer/assets/pieDiagram-E7YTZNPT-WEnDsMY3.js +39 -0
  542. package/dist/viewer/assets/pierre-dark-CyvmCCZW.js +1 -0
  543. package/dist/viewer/assets/pierre-dark-protanopia-deuteranopia-Rgc0TwpF.js +1 -0
  544. package/dist/viewer/assets/pierre-dark-soft-BHGpRqa4.js +1 -0
  545. package/dist/viewer/assets/pierre-dark-tritanopia-Beq2gCRQ.js +1 -0
  546. package/dist/viewer/assets/pierre-dark-vibrant-BWBVywrn.js +1 -0
  547. package/dist/viewer/assets/pierre-light-480U9XYS.js +1 -0
  548. package/dist/viewer/assets/pierre-light-protanopia-deuteranopia-CaVOBURG.js +1 -0
  549. package/dist/viewer/assets/pierre-light-soft-CVdyfjmI.js +1 -0
  550. package/dist/viewer/assets/pierre-light-tritanopia-B4_gpKOM.js +1 -0
  551. package/dist/viewer/assets/pierre-light-vibrant-DdTDNdfJ.js +1 -0
  552. package/dist/viewer/assets/pkl-u5AG7uiY.js +1 -0
  553. package/dist/viewer/assets/plastic-3e1v2bzS.js +1 -0
  554. package/dist/viewer/assets/plsql-ChMvpjG-.js +1 -0
  555. package/dist/viewer/assets/plus-DbyuOgKB.js +6 -0
  556. package/dist/viewer/assets/po-BTJTHyun.js +1 -0
  557. package/dist/viewer/assets/poimandres-CS3Unz2-.js +1 -0
  558. package/dist/viewer/assets/polar-C0HS_06l.js +1 -0
  559. package/dist/viewer/assets/popover-476u3TN0.js +1 -0
  560. package/dist/viewer/assets/poppins-devanagari-400-normal-CJDn6rn8.woff2 +0 -0
  561. package/dist/viewer/assets/poppins-devanagari-400-normal-CqVvlrh5.woff +0 -0
  562. package/dist/viewer/assets/poppins-devanagari-500-normal-BIdkeU1p.woff2 +0 -0
  563. package/dist/viewer/assets/poppins-devanagari-500-normal-DMPDjHtT.woff +0 -0
  564. package/dist/viewer/assets/poppins-devanagari-600-normal-ClASKHrr.woff +0 -0
  565. package/dist/viewer/assets/poppins-devanagari-600-normal-STEjXBNN.woff2 +0 -0
  566. package/dist/viewer/assets/poppins-devanagari-700-normal-O-jipLrW.woff2 +0 -0
  567. package/dist/viewer/assets/poppins-devanagari-700-normal-fHs-vx92.woff +0 -0
  568. package/dist/viewer/assets/poppins-latin-400-normal-BOb3E3N0.woff +0 -0
  569. package/dist/viewer/assets/poppins-latin-400-normal-cpxAROuN.woff2 +0 -0
  570. package/dist/viewer/assets/poppins-latin-500-normal-C8OXljZJ.woff2 +0 -0
  571. package/dist/viewer/assets/poppins-latin-500-normal-DGXqpDMm.woff +0 -0
  572. package/dist/viewer/assets/poppins-latin-600-normal-BJdTmd5m.woff +0 -0
  573. package/dist/viewer/assets/poppins-latin-600-normal-zEkxB9Mr.woff2 +0 -0
  574. package/dist/viewer/assets/poppins-latin-700-normal-BVuQR_eA.woff +0 -0
  575. package/dist/viewer/assets/poppins-latin-700-normal-Qrb0O0WB.woff2 +0 -0
  576. package/dist/viewer/assets/poppins-latin-ext-400-normal-DaBSavcJ.woff +0 -0
  577. package/dist/viewer/assets/poppins-latin-ext-400-normal-by3JarPu.woff2 +0 -0
  578. package/dist/viewer/assets/poppins-latin-ext-500-normal-CK-6C4Hw.woff2 +0 -0
  579. package/dist/viewer/assets/poppins-latin-ext-500-normal-CgAe2rWW.woff +0 -0
  580. package/dist/viewer/assets/poppins-latin-ext-600-normal-CAhIAdZj.woff2 +0 -0
  581. package/dist/viewer/assets/poppins-latin-ext-600-normal-Df5ffKXP.woff +0 -0
  582. package/dist/viewer/assets/poppins-latin-ext-700-normal-DctTR6Tg.woff +0 -0
  583. package/dist/viewer/assets/poppins-latin-ext-700-normal-cby-RkWa.woff2 +0 -0
  584. package/dist/viewer/assets/postcss-CXtECtnM.js +1 -0
  585. package/dist/viewer/assets/powerquery-CEu0bR-o.js +1 -0
  586. package/dist/viewer/assets/powershell-Dd0kTxKP.js +1 -0
  587. package/dist/viewer/assets/preload-helper-BlTxHScW.js +1 -0
  588. package/dist/viewer/assets/prisma-Vru482bI.js +1 -0
  589. package/dist/viewer/assets/prolog-CbFg5uaA.js +1 -0
  590. package/dist/viewer/assets/proto-C7zT0LnQ.js +1 -0
  591. package/dist/viewer/assets/pug-BtYPkAgq.js +1 -0
  592. package/dist/viewer/assets/puppet-BMWR74SV.js +1 -0
  593. package/dist/viewer/assets/purescript-CklMAg4u.js +1 -0
  594. package/dist/viewer/assets/python-B6aJPvgy.js +1 -0
  595. package/dist/viewer/assets/qml-3beO22l8.js +1 -0
  596. package/dist/viewer/assets/qmldir-C8lEn-DE.js +1 -0
  597. package/dist/viewer/assets/qss-IeuSbFQv.js +1 -0
  598. package/dist/viewer/assets/quadrantDiagram-AXDQQJYC-NdfQCpzF.js +7 -0
  599. package/dist/viewer/assets/query-D9oj6LGx.js +50 -0
  600. package/dist/viewer/assets/quill-Cde5JMRD.js +49 -0
  601. package/dist/viewer/assets/r-Cf5RLm7j.js +1 -0
  602. package/dist/viewer/assets/racket-BqYA7rlc.js +1 -0
  603. package/dist/viewer/assets/railroadDiagram-O6MQD6OU-BYhlXlMY.js +1 -0
  604. package/dist/viewer/assets/raku-DXvB9xmW.js +1 -0
  605. package/dist/viewer/assets/razor-CyjPwjZj.js +1 -0
  606. package/dist/viewer/assets/rbs-CpoqiR4B.js +1 -0
  607. package/dist/viewer/assets/react-Bx48XWN4.js +1 -0
  608. package/dist/viewer/assets/react-flow-wrapper-BcbvHgxz.js +277 -0
  609. package/dist/viewer/assets/react-flow-wrapper-ClwlSOam.css +1 -0
  610. package/dist/viewer/assets/red-DMbB5_pp.js +1 -0
  611. package/dist/viewer/assets/reg-C-SQnVFl.js +1 -0
  612. package/dist/viewer/assets/regexp-CDVJQ6XC.js +1 -0
  613. package/dist/viewer/assets/rel-C3B-1QV4.js +1 -0
  614. package/dist/viewer/assets/requirementDiagram-BXWQKSXE-C25Bcm2L.js +84 -0
  615. package/dist/viewer/assets/riscv-BM1_JUlF.js +1 -0
  616. package/dist/viewer/assets/ron-D8l8udqQ.js +1 -0
  617. package/dist/viewer/assets/rose-pine-5qJOZa0Y.js +1 -0
  618. package/dist/viewer/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
  619. package/dist/viewer/assets/rose-pine-moon-C9pEdX9L.js +1 -0
  620. package/dist/viewer/assets/rosmsg-BJDFO7_C.js +1 -0
  621. package/dist/viewer/assets/rst-CVOjT0e7.js +1 -0
  622. package/dist/viewer/assets/ruby-C8rp0wew.js +1 -0
  623. package/dist/viewer/assets/rust-DPvrY3IQ.js +1 -0
  624. package/dist/viewer/assets/sankeyDiagram-P5KCCOFB-h8LiCsgk.js +40 -0
  625. package/dist/viewer/assets/sas-BGn39htG.js +1 -0
  626. package/dist/viewer/assets/sass-Cj5Yp3dK.js +1 -0
  627. package/dist/viewer/assets/scala-CqE71os6.js +1 -0
  628. package/dist/viewer/assets/scheme-C98Dy4si.js +1 -0
  629. package/dist/viewer/assets/scroll-area-RagrStGj.js +6 -0
  630. package/dist/viewer/assets/scss-Cw6XMfVs.js +1 -0
  631. package/dist/viewer/assets/sdbl-DVxCFoDh.js +1 -0
  632. package/dist/viewer/assets/search-vw7ucoOs.js +6 -0
  633. package/dist/viewer/assets/section-loader-C4hOfhQS.js +1 -0
  634. package/dist/viewer/assets/section-not-found-BnrXiPog.js +1 -0
  635. package/dist/viewer/assets/select-D9fbrr7O.js +1 -0
  636. package/dist/viewer/assets/sequenceDiagram-WJ2MYXX4-CDRVvD30.js +162 -0
  637. package/dist/viewer/assets/service-context-D5nBtU18.js +1 -0
  638. package/dist/viewer/assets/service-database-list-page-DBjaDLVy.js +6 -0
  639. package/dist/viewer/assets/service-database-page-CenNCgwf.js +2 -0
  640. package/dist/viewer/assets/service-database-page-inner-gS51TQTZ.js +85 -0
  641. package/dist/viewer/assets/service-doc-C-jHqT1U.js +40 -0
  642. package/dist/viewer/assets/service-doc-preview-modal-5sX6FOu1.js +6 -0
  643. package/dist/viewer/assets/service-layout-Bf0vZBCH.js +1 -0
  644. package/dist/viewer/assets/service-pages-CFikvX4t.js +1 -0
  645. package/dist/viewer/assets/services-Ivav34WC.js +102 -0
  646. package/dist/viewer/assets/shaderlab-Dg9Lc6iA.js +1 -0
  647. package/dist/viewer/assets/share-2-CQEaWbfH.js +6 -0
  648. package/dist/viewer/assets/shellscript-Yzrsuije.js +1 -0
  649. package/dist/viewer/assets/shellsession-BADoaaVG.js +1 -0
  650. package/dist/viewer/assets/sizeCapture-INFHLROL-BJ6ndnPM.js +1 -0
  651. package/dist/viewer/assets/slack-dark-BthQWCQV.js +1 -0
  652. package/dist/viewer/assets/slack-ochin-DqwNpetd.js +1 -0
  653. package/dist/viewer/assets/smalltalk-BOQMe2GC.js +1 -0
  654. package/dist/viewer/assets/smithy-cds9vsN8.js +1 -0
  655. package/dist/viewer/assets/snazzy-light-Bw305WKR.js +1 -0
  656. package/dist/viewer/assets/solarized-dark-UcubFVte.js +1 -0
  657. package/dist/viewer/assets/solarized-light-DCG28T6R.js +1 -0
  658. package/dist/viewer/assets/solidity-DijEV5ha.js +1 -0
  659. package/dist/viewer/assets/soy-zscZBeg6.js +1 -0
  660. package/dist/viewer/assets/sparql-rVzFXLq3.js +1 -0
  661. package/dist/viewer/assets/splunk-BtCnVYZw.js +1 -0
  662. package/dist/viewer/assets/sql-DkvoVjww.js +1 -0
  663. package/dist/viewer/assets/ssh-config-_ykCGR6B.js +1 -0
  664. package/dist/viewer/assets/stata-DACIj5bg.js +1 -0
  665. package/dist/viewer/assets/stateDiagram-D77RDMKH-B_tNCX3o.js +1 -0
  666. package/dist/viewer/assets/stateDiagram-v2-MP3YSRHH-Dl9wqdli.js +1 -0
  667. package/dist/viewer/assets/style-BPesJvJr.js +153 -0
  668. package/dist/viewer/assets/style-BnuhLJ6X.css +1 -0
  669. package/dist/viewer/assets/stylus-BEDo0Tqx.js +1 -0
  670. package/dist/viewer/assets/super-circle-loader-DSkos6uP.js +1 -0
  671. package/dist/viewer/assets/super-logo-loader-Cxlbn6MB.js +1 -0
  672. package/dist/viewer/assets/surrealql-Cjom0U5J.js +1 -0
  673. package/dist/viewer/assets/svelte-D84K1R2Q.js +1 -0
  674. package/dist/viewer/assets/swift-C2oV4EkX.js +1 -0
  675. package/dist/viewer/assets/swimlanes-42K2YHIH-CzURzYwf.js +1 -0
  676. package/dist/viewer/assets/swimlanesDiagram-VR7AAH4N-DrIlwFtk.js +8 -0
  677. package/dist/viewer/assets/synthwave-84-CbfX1IO0.js +1 -0
  678. package/dist/viewer/assets/system-verilog-0hqHdDBg.js +1 -0
  679. package/dist/viewer/assets/systemd-4A_iFExJ.js +1 -0
  680. package/dist/viewer/assets/table-B4pFND-o.js +1 -0
  681. package/dist/viewer/assets/talonscript-CkByrt1z.js +1 -0
  682. package/dist/viewer/assets/tasl-QIJgUcNo.js +1 -0
  683. package/dist/viewer/assets/tcl-dwOrl1Do.js +1 -0
  684. package/dist/viewer/assets/templ-Vpw5XpSW.js +1 -0
  685. package/dist/viewer/assets/terraform-BETggiCN.js +1 -0
  686. package/dist/viewer/assets/tex-D96PA37w.js +1 -0
  687. package/dist/viewer/assets/textarea-Clgdv3Oi.js +1 -0
  688. package/dist/viewer/assets/timeline-definition-24CTP7MA-D0YXQE1U.js +120 -0
  689. package/dist/viewer/assets/tokyo-night-hegEt444.js +1 -0
  690. package/dist/viewer/assets/toml-vGWfd6FD.js +1 -0
  691. package/dist/viewer/assets/transform-BqqRT-Iy.js +1 -0
  692. package/dist/viewer/assets/ts-tags-Ls60c9xG.js +1 -0
  693. package/dist/viewer/assets/tsv-B_m7g4N7.js +1 -0
  694. package/dist/viewer/assets/tsx-COt5Ahok.js +1 -0
  695. package/dist/viewer/assets/turtle-BsS91CYL.js +1 -0
  696. package/dist/viewer/assets/twig-D9-LOF2p.js +1 -0
  697. package/dist/viewer/assets/typescript-BPQ3VLAy.js +1 -0
  698. package/dist/viewer/assets/typespec-ClX509-Q.js +1 -0
  699. package/dist/viewer/assets/typst-DamkJZ1Q.js +1 -0
  700. package/dist/viewer/assets/ui-graph-logo-gHowu5gP.js +1 -0
  701. package/dist/viewer/assets/upload-CYb3nN_5.js +6 -0
  702. package/dist/viewer/assets/uploads-CX2kdXbM.js +26 -0
  703. package/dist/viewer/assets/use-debounced-value-BpNFJd3C.js +1 -0
  704. package/dist/viewer/assets/use-localstorage-D233xVb0.js +1 -0
  705. package/dist/viewer/assets/use-permissions-BvmxJJ5r.js +1 -0
  706. package/dist/viewer/assets/use-scoped-storage-DL1XVp1j.js +6 -0
  707. package/dist/viewer/assets/useMutation-D5ZHwHsx.js +1 -0
  708. package/dist/viewer/assets/useQuery-Dhe6uxrL.js +1 -0
  709. package/dist/viewer/assets/v-BGw2Nkan.js +1 -0
  710. package/dist/viewer/assets/vala-CsfeWuGM.js +1 -0
  711. package/dist/viewer/assets/value-wA6veExk.js +1 -0
  712. package/dist/viewer/assets/vb-Cu-pLBUe.js +1 -0
  713. package/dist/viewer/assets/vennDiagram-4TSXK5OY-SSjHlqCQ.js +34 -0
  714. package/dist/viewer/assets/verilog-nZwndyjY.js +1 -0
  715. package/dist/viewer/assets/vesper-DRje8inN.js +1 -0
  716. package/dist/viewer/assets/vhdl-CeAyd5Ju.js +1 -0
  717. package/dist/viewer/assets/viml-CJc9bBzg.js +1 -0
  718. package/dist/viewer/assets/vitesse-black-Bkuqu6BP.js +1 -0
  719. package/dist/viewer/assets/vitesse-dark-D0r3Knsf.js +1 -0
  720. package/dist/viewer/assets/vitesse-light-CVO1_9PV.js +1 -0
  721. package/dist/viewer/assets/vue-DSqPwMUe.js +1 -0
  722. package/dist/viewer/assets/vue-html-AaS7Mt5G.js +1 -0
  723. package/dist/viewer/assets/vue-vine-C0RcJ6UU.js +1 -0
  724. package/dist/viewer/assets/vyper-CDx5xZoG.js +1 -0
  725. package/dist/viewer/assets/wardleyDiagram-VM6X3IG4-CZWNdQxH.js +78 -0
  726. package/dist/viewer/assets/wasm-CG6Dc4jp.js +1 -0
  727. package/dist/viewer/assets/wasm-MzD3tlZU.js +1 -0
  728. package/dist/viewer/assets/wenyan-BV7otONQ.js +1 -0
  729. package/dist/viewer/assets/wgsl-Dx-B1_4e.js +1 -0
  730. package/dist/viewer/assets/wikitext-BhOHFoWU.js +1 -0
  731. package/dist/viewer/assets/wit-5i3qLPDT.js +1 -0
  732. package/dist/viewer/assets/wolfram-lXgVvXCa.js +1 -0
  733. package/dist/viewer/assets/xml-sdJ4AIDG.js +1 -0
  734. package/dist/viewer/assets/xsl-CtQFsRM5.js +1 -0
  735. package/dist/viewer/assets/xychartDiagram-S5SC5T6Z-B2qAGeb0.js +7 -0
  736. package/dist/viewer/assets/yaml-Buea-lGh.js +1 -0
  737. package/dist/viewer/assets/zenscript-DVFEvuxE.js +1 -0
  738. package/dist/viewer/assets/zig-VOosw3JB.js +1 -0
  739. package/dist/viewer/assets/zod-BMU4UTQt.js +1 -0
  740. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_AWS-Clean-Rooms_64.svg +10 -0
  741. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_AWS-Data-Exchange_64.svg +10 -0
  742. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_AWS-Entity-Resolution_64.svg +12 -0
  743. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_AWS-Glue-DataBrew_64.svg +12 -0
  744. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_AWS-Glue_64.svg +10 -0
  745. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_AWS-Lake-Formation_64.svg +10 -0
  746. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-Athena_64.svg +10 -0
  747. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-CloudSearch_64.svg +10 -0
  748. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-Data-Firehose_64.svg +12 -0
  749. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-DataZone_64.svg +10 -0
  750. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-EMR_64.svg +10 -0
  751. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-FinSpace_64.svg +12 -0
  752. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-Kinesis-Data-Streams_64.svg +12 -0
  753. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-Kinesis-Video-Streams_64.svg +12 -0
  754. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-Kinesis_64.svg +10 -0
  755. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-Managed-Service-for-Apache-Flink_64.svg +12 -0
  756. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-Managed-Streaming-for-Apache-Kafka_64.svg +10 -0
  757. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-OpenSearch-Service_64.svg +10 -0
  758. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-QuickSight_64.svg +10 -0
  759. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-Redshift_64.svg +10 -0
  760. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Analytics/64/Arch_Amazon-SageMaker_64.svg +4 -0
  761. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_AWS-AppSync_64.svg +12 -0
  762. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_AWS-B2B-Data-Interchange_64.svg +12 -0
  763. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_AWS-Express-Workflows_64.svg +10 -0
  764. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_AWS-Step-Functions_64.svg +10 -0
  765. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_Amazon-AppFlow_64.svg +12 -0
  766. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_Amazon-EventBridge_64.svg +10 -0
  767. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_Amazon-MQ_64.svg +10 -0
  768. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_Amazon-Managed-Workflows-for-Apache-Airflow_64.svg +12 -0
  769. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_Amazon-Simple-Notification-Service_64.svg +10 -0
  770. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_App-Integration/64/Arch_Amazon-Simple-Queue-Service_64.svg +10 -0
  771. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-App-Studio_64.svg +12 -0
  772. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-Deep-Learning-AMIs_64.svg +12 -0
  773. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-Deep-Learning-Containers_64.svg +10 -0
  774. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-DeepComposer_64.svg +10 -0
  775. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-DeepRacer_64.svg +10 -0
  776. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-HealthImaging_64.svg +12 -0
  777. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-HealthLake_64.svg +12 -0
  778. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-HealthOmics_64.svg +10 -0
  779. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-HealthScribe_64.svg +12 -0
  780. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-Neuron_64.svg +10 -0
  781. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_AWS-Panorama_64.svg +12 -0
  782. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Augmented-AI-A2I_64.svg +10 -0
  783. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Bedrock_64.svg +12 -0
  784. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-CodeGuru_64.svg +10 -0
  785. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-CodeWhisperer_64.svg +12 -0
  786. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Comprehend-Medical_64.svg +12 -0
  787. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Comprehend_64.svg +10 -0
  788. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-DevOps-Guru_64.svg +12 -0
  789. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Elastic-Inference_64.svg +10 -0
  790. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Forecast_64.svg +10 -0
  791. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Fraud-Detector_64.svg +10 -0
  792. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Kendra_64.svg +10 -0
  793. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Lex_64.svg +10 -0
  794. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Lookout-for-Equipment_64.svg +12 -0
  795. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Lookout-for-Metrics_64.svg +12 -0
  796. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Lookout-for-Vision_64.svg +12 -0
  797. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Monitron_64.svg +12 -0
  798. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Nova_64.svg +4 -0
  799. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Personalize_64.svg +10 -0
  800. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Polly_64.svg +10 -0
  801. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Q_64.svg +12 -0
  802. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Rekognition_64.svg +10 -0
  803. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-SageMaker-AI_64.svg +10 -0
  804. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-SageMaker-Ground-Truth_64.svg +10 -0
  805. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-SageMaker-Studio-Lab_64.svg +12 -0
  806. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Textract_64.svg +10 -0
  807. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Transcribe_64.svg +10 -0
  808. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Amazon-Translate_64.svg +10 -0
  809. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_Apache-MXNet-on-AWS_64.svg +10 -0
  810. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_PyTorch-on-AWS_64.svg +12 -0
  811. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Artificial-Intelligence/64/Arch_TensorFlow-on-AWS_64.svg +10 -0
  812. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Blockchain/64/Arch_Amazon-Managed-Blockchain_64.svg +10 -0
  813. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Blockchain/64/Arch_Amazon-Quantum-Ledger-Database_64.svg +10 -0
  814. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_AWS-AppFabric_64.svg +12 -0
  815. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_AWS-End-User-Messaging_64.svg +11 -0
  816. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_AWS-Supply-Chain_64.svg +10 -0
  817. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_AWS-Wickr_64.svg +10 -0
  818. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Alexa-For-Business_64.svg +10 -0
  819. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-Chime-SDK_64.svg +12 -0
  820. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-Chime_64.svg +10 -0
  821. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-Connect_64.svg +10 -0
  822. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-Pinpoint-APIs_64.svg +12 -0
  823. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-Pinpoint_64.svg +12 -0
  824. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-Simple-Email-Service_64.svg +10 -0
  825. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-WorkDocs-SDK_64.svg +12 -0
  826. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-WorkDocs_64.svg +12 -0
  827. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Business-Applications/64/Arch_Amazon-WorkMail_64.svg +10 -0
  828. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Cloud-Financial-Management/64/Arch_AWS-Billing-Conductor_64.svg +12 -0
  829. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Cloud-Financial-Management/64/Arch_AWS-Budgets_64.svg +10 -0
  830. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Cloud-Financial-Management/64/Arch_AWS-Cost-Explorer_64.svg +10 -0
  831. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Cloud-Financial-Management/64/Arch_AWS-Cost-and-Usage-Report_64.svg +10 -0
  832. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Cloud-Financial-Management/64/Arch_Reserved-Instance-Reporting_64.svg +10 -0
  833. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Cloud-Financial-Management/64/Arch_Savings-Plans_64.svg +12 -0
  834. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-App-Runner_64.svg +12 -0
  835. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Batch_64.svg +10 -0
  836. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Compute-Optimizer_64.svg +12 -0
  837. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Elastic-Beanstalk_64.svg +10 -0
  838. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Lambda_64.svg +10 -0
  839. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Local-Zones_64.svg +10 -0
  840. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Nitro-Enclaves_64.svg +10 -0
  841. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Outposts-family_64.svg +10 -0
  842. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Outposts-rack_64.svg +10 -0
  843. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Outposts-servers_64.svg +12 -0
  844. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Parallel-Cluster_64.svg +12 -0
  845. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Parallel-Computing-Service_64.svg +12 -0
  846. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Serverless-Application-Repository_64.svg +10 -0
  847. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-SimSpace-Weaver_64.svg +10 -0
  848. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_AWS-Wavelength_64.svg +10 -0
  849. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Amazon-DCV_64.svg +12 -0
  850. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Amazon-EC2-Auto-Scaling_64.svg +10 -0
  851. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Amazon-EC2-Image-Builder_64.svg +10 -0
  852. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Amazon-EC2_64.svg +10 -0
  853. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Amazon-Elastic-VMware-Service_64.svg +4 -0
  854. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Amazon-Lightsail-for-Research_64.svg +10 -0
  855. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Amazon-Lightsail_64.svg +10 -0
  856. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Bottlerocket_64.svg +12 -0
  857. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_Elastic-Fabric-Adapter_64.svg +12 -0
  858. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Compute/64/Arch_NICE-EnginFrame_64.svg +12 -0
  859. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_AWS-Fargate_64.svg +10 -0
  860. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_Amazon-ECS-Anywhere_64.svg +12 -0
  861. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_Amazon-EKS-Anywhere_64.svg +12 -0
  862. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_Amazon-EKS-Cloud_64.svg +12 -0
  863. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_Amazon-EKS-Distro_64.svg +12 -0
  864. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_Amazon-Elastic-Container-Registry_64.svg +10 -0
  865. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_Amazon-Elastic-Container-Service_64.svg +10 -0
  866. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_Amazon-Elastic-Kubernetes-Service_64.svg +10 -0
  867. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Containers/64/Arch_Red-Hat-OpenShift-Service-on-AWS_64.svg +12 -0
  868. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Customer-Enablement/64/Arch_AWS-Activate_64.svg +12 -0
  869. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Customer-Enablement/64/Arch_AWS-IQ_64.svg +12 -0
  870. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Customer-Enablement/64/Arch_AWS-Managed-Services_64.svg +12 -0
  871. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Customer-Enablement/64/Arch_AWS-Professional-Services_64.svg +12 -0
  872. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Customer-Enablement/64/Arch_AWS-Support_64.svg +10 -0
  873. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Customer-Enablement/64/Arch_AWS-Training-Certification_64.svg +10 -0
  874. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Customer-Enablement/64/Arch_AWS-rePost-Private_64.svg +12 -0
  875. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Customer-Enablement/64/Arch_AWS-rePost_64.svg +12 -0
  876. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_AWS-Database-Migration-Service_64.svg +10 -0
  877. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-Aurora_64.svg +10 -0
  878. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-DocumentDB_64.svg +10 -0
  879. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-DynamoDB_64.svg +10 -0
  880. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-ElastiCache_64.svg +10 -0
  881. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-Keyspaces_64.svg +10 -0
  882. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-MemoryDB_64.svg +12 -0
  883. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-Neptune_64.svg +10 -0
  884. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-RDS_64.svg +10 -0
  885. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Amazon-Timestream_64.svg +10 -0
  886. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Database/64/Arch_Oracle-Database-at-AWS_64.svg +4 -0
  887. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-Cloud-Control-API_64.svg +12 -0
  888. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-Cloud-Development-Kit_64.svg +10 -0
  889. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-Cloud9_64.svg +10 -0
  890. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-CloudShell_64.svg +12 -0
  891. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-CodeArtifact_64.svg +12 -0
  892. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-CodeBuild_64.svg +10 -0
  893. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-CodeCommit_64.svg +10 -0
  894. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-CodeDeploy_64.svg +10 -0
  895. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-CodePipeline_64.svg +10 -0
  896. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-Command-Line-Interface_64.svg +10 -0
  897. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-Fault-Injection-Service_64.svg +10 -0
  898. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-Infrastructure-Composer_64.svg +10 -0
  899. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-Tools-and-SDKs_64.svg +10 -0
  900. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_AWS-X-Ray_64.svg +10 -0
  901. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_Amazon-CodeCatalyst_64.svg +10 -0
  902. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Developer-Tools/64/Arch_Amazon-Corretto_64.svg +12 -0
  903. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_End-User-Computing/64/Arch_Amazon-AppStream-2_64.svg +10 -0
  904. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_End-User-Computing/64/Arch_Amazon-WorkSpaces-Family_64.svg +10 -0
  905. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Front-End-Web-Mobile/64/Arch_AWS-Amplify_64.svg +10 -0
  906. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Front-End-Web-Mobile/64/Arch_AWS-Device-Farm_64.svg +10 -0
  907. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Front-End-Web-Mobile/64/Arch_Amazon-Location-Service_64.svg +12 -0
  908. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Games/64/Arch_Amazon-GameLift-Servers_64.svg +12 -0
  909. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Games/64/Arch_Amazon-GameLift-Streams_64.svg +4 -0
  910. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Games/64/Arch_Open-3D-Engine_64.svg +12 -0
  911. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_General-Icons/64/Arch_AWS-Marketplace_Dark_64.svg +10 -0
  912. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_General-Icons/64/Arch_AWS-Marketplace_Light_64.svg +10 -0
  913. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-Analytics_64.svg +10 -0
  914. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-Button_64.svg +10 -0
  915. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-Core_64.svg +10 -0
  916. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-Device-Defender_64.svg +10 -0
  917. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-Device-Management_64.svg +10 -0
  918. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-Events_64.svg +10 -0
  919. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-ExpressLink_64.svg +12 -0
  920. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-FleetWise_64.svg +12 -0
  921. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-Greengrass_64.svg +10 -0
  922. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-SiteWise_64.svg +10 -0
  923. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_AWS-IoT-TwinMaker_64.svg +12 -0
  924. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Internet-of-Things/64/Arch_FreeRTOS_64.svg +10 -0
  925. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-AppConfig_64.svg +10 -0
  926. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Application-Auto-Scaling_64.svg +12 -0
  927. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Auto-Scaling_64.svg +10 -0
  928. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Backint-Agent_64.svg +12 -0
  929. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Chatbot_64.svg +10 -0
  930. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-CloudFormation_64.svg +10 -0
  931. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-CloudTrail_64.svg +10 -0
  932. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Compute-Optimizer_64.svg +10 -0
  933. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Config_64.svg +10 -0
  934. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Console-Mobile-Application_64.svg +12 -0
  935. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Control-Tower_64.svg +10 -0
  936. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Distro-for-OpenTelemetry_64.svg +12 -0
  937. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Health-Dashboard_64.svg +10 -0
  938. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Launch-Wizard_64.svg +10 -0
  939. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-License-Manager_64.svg +10 -0
  940. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Management-Console_64.svg +10 -0
  941. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Organizations_64.svg +10 -0
  942. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Proton_64.svg +12 -0
  943. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Resilience-Hub_64.svg +10 -0
  944. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Resource-Explorer_64.svg +10 -0
  945. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Service-Catalog_64.svg +10 -0
  946. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Service-Management-Connector_64.svg +10 -0
  947. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Systems-Manager_64.svg +10 -0
  948. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Telco-Network-Builder_64.svg +10 -0
  949. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Trusted-Advisor_64.svg +10 -0
  950. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-User-Notifications_64.svg +4 -0
  951. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_AWS-Well-Architected-Tool_64.svg +10 -0
  952. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_Amazon-CloudWatch_64.svg +10 -0
  953. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_Amazon-Managed-Grafana_64.svg +12 -0
  954. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Management-Governance/64/Arch_Amazon-Managed-Service-for-Prometheus_64.svg +12 -0
  955. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Deadline-Cloud_64.svg +12 -0
  956. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-Appliances-&-Software_64.svg +10 -0
  957. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-Conductor_64.svg +10 -0
  958. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-Delta_64.svg +10 -0
  959. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-Link_64.svg +12 -0
  960. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-Live_64.svg +10 -0
  961. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-MediaConnect_64.svg +10 -0
  962. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-MediaConvert_64.svg +10 -0
  963. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-MediaLive_64.svg +10 -0
  964. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-MediaPackage_64.svg +10 -0
  965. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-MediaStore_64.svg +10 -0
  966. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-MediaTailor_64.svg +10 -0
  967. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Elemental-Server_64.svg +10 -0
  968. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Thinkbox-Deadline_64.svg +12 -0
  969. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Thinkbox-Frost_64.svg +12 -0
  970. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Thinkbox-Krakatoa_64.svg +12 -0
  971. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Thinkbox-Sequoia_64.svg +10 -0
  972. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Thinkbox-Stoke_64.svg +12 -0
  973. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_AWS-Thinkbox-XMesh_64.svg +12 -0
  974. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_Amazon-Elastic-Transcoder_64.svg +10 -0
  975. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_Amazon-Interactive-Video-Service_64.svg +12 -0
  976. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Media-Services/64/Arch_Amazon-Kinesis-Video-Streams_64.svg +10 -0
  977. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-Application-Discovery-Service_64.svg +10 -0
  978. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-Application-Migration-Service_64.svg +10 -0
  979. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-Data-Transfer-Terminal_64.svg +11 -0
  980. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-DataSync_64.svg +10 -0
  981. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-Mainframe-Modernization_64.svg +12 -0
  982. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-Migration-Evaluator_64.svg +12 -0
  983. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-Migration-Hub_64.svg +10 -0
  984. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-Transfer-Family_64.svg +10 -0
  985. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Migration-Modernization/64/Arch_AWS-Transform_64.svg +11 -0
  986. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-App-Mesh_64.svg +10 -0
  987. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Client-VPN_64.svg +10 -0
  988. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Cloud-Map_64.svg +10 -0
  989. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Cloud-WAN_64.svg +10 -0
  990. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Direct-Connect_64.svg +10 -0
  991. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Global-Accelerator_64.svg +10 -0
  992. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Private-5G_64.svg +10 -0
  993. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-PrivateLink_64.svg +10 -0
  994. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Site-to-Site-VPN_64.svg +12 -0
  995. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Transit-Gateway_64.svg +10 -0
  996. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_AWS-Verified-Access_64.svg +10 -0
  997. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_Amazon-API-Gateway_64.svg +10 -0
  998. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_Amazon-Application-Recovery-Controller_64.svg +11 -0
  999. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_Amazon-CloudFront_64.svg +10 -0
  1000. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_Amazon-Route-53_64.svg +10 -0
  1001. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_Amazon-VPC-Lattice_64.svg +10 -0
  1002. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_Amazon-Virtual-Private-Cloud_64.svg +10 -0
  1003. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Networking-Content-Delivery/64/Arch_Elastic-Load-Balancing_64.svg +10 -0
  1004. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Quantum-Technologies/64/Arch_Amazon-Braket_64.svg +10 -0
  1005. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Satellite/64/Arch_AWS-Ground-Station_64.svg +10 -0
  1006. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Artifact_64.svg +10 -0
  1007. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Audit-Manager_64.svg +12 -0
  1008. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Certificate-Manager_64.svg +10 -0
  1009. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-CloudHSM_64.svg +10 -0
  1010. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Directory-Service_64.svg +10 -0
  1011. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Firewall-Manager_64.svg +10 -0
  1012. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-IAM-Identity-Center_64.svg +10 -0
  1013. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Identity-and-Access-Management_64.svg +10 -0
  1014. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Key-Management-Service_64.svg +10 -0
  1015. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Network-Firewall_64.svg +12 -0
  1016. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Payment-Cryptography_64.svg +12 -0
  1017. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Private-Certificate-Authority_64.svg +10 -0
  1018. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Resource-Access-Manager_64.svg +10 -0
  1019. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Secrets-Manager_64.svg +10 -0
  1020. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Security-Hub_64.svg +10 -0
  1021. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Security-Incident-Response_64.svg +10 -0
  1022. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Shield_64.svg +10 -0
  1023. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-Signer_64.svg +12 -0
  1024. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_AWS-WAF_64.svg +12 -0
  1025. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_Amazon-Cloud-Directory_64.svg +12 -0
  1026. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_Amazon-Cognito_64.svg +10 -0
  1027. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_Amazon-Detective_64.svg +10 -0
  1028. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_Amazon-GuardDuty_64.svg +10 -0
  1029. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_Amazon-Inspector_64.svg +10 -0
  1030. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_Amazon-Macie_64.svg +10 -0
  1031. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_Amazon-Security-Lake_64.svg +10 -0
  1032. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Security-Identity-Compliance/64/Arch_Amazon-Verified-Permissions_64.svg +10 -0
  1033. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_AWS-Backup_64.svg +10 -0
  1034. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_AWS-Elastic-Disaster-Recovery_64.svg +10 -0
  1035. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_AWS-Snowball-Edge_64.svg +10 -0
  1036. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_AWS-Snowball_64.svg +10 -0
  1037. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_AWS-Storage-Gateway_64.svg +10 -0
  1038. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-EFS_64.svg +12 -0
  1039. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-Elastic-Block-Store_64.svg +10 -0
  1040. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-FSx-for-Lustre_64.svg +10 -0
  1041. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-FSx-for-NetApp-ONTAP_64.svg +12 -0
  1042. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-FSx-for-OpenZFS_64.svg +10 -0
  1043. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-FSx-for-WFS_64.svg +12 -0
  1044. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-FSx_64.svg +12 -0
  1045. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-File-Cache_64.svg +10 -0
  1046. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-S3-on-Outposts_64.svg +12 -0
  1047. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-Simple-Storage-Service-Glacier_64.svg +12 -0
  1048. package/dist/viewer/aws-icons/Architecture-Service-Icons_07312025/Arch_Storage/64/Arch_Amazon-Simple-Storage-Service_64.svg +12 -0
  1049. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_AWS-Data-Exchange-for-APIs_48.svg +7 -0
  1050. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_AWS-Glue_AWS-Glue-for-Ray_48.svg +7 -0
  1051. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_AWS-Glue_Crawler_48.svg +7 -0
  1052. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_AWS-Glue_Data-Catalog_48.svg +7 -0
  1053. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_AWS-Glue_Data-Quality_48.svg +7 -0
  1054. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_AWS-Lake-Formation_Data-Lake_48.svg +7 -0
  1055. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Athena_Data-Source-Connectors_48.svg +7 -0
  1056. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-CloudSearch_Search-Documents_48.svg +7 -0
  1057. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-DataZone_Business-Data-Catalog_48.svg +7 -0
  1058. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-DataZone_Data-Portal_48.svg +7 -0
  1059. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-DataZone_Data-Projects_48.svg +7 -0
  1060. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-EMR_Cluster_48.svg +7 -0
  1061. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-EMR_EMR-Engine_48.svg +7 -0
  1062. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-EMR_HDFS-Cluster_48.svg +7 -0
  1063. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-MSK_Amazon-MSK-Connect_48.svg +7 -0
  1064. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-OpenSearch-Service_Cluster-Administrator-Node_48.svg +7 -0
  1065. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-OpenSearch-Service_Data-Node_48.svg +7 -0
  1066. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-OpenSearch-Service_Index_48.svg +7 -0
  1067. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-OpenSearch-Service_Observability_48.svg +7 -0
  1068. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-OpenSearch-Service_OpenSearch-Dashboards_48.svg +7 -0
  1069. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-OpenSearch-Service_OpenSearch-Ingestion_48.svg +7 -0
  1070. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-OpenSearch-Service_Traces_48.svg +7 -0
  1071. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-OpenSearch-Service_UltraWarm-Node_48.svg +7 -0
  1072. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Quicksight_Paginated-Reports_48.svg +7 -0
  1073. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Redshift_Auto-copy_48.svg +7 -0
  1074. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Redshift_Data-Sharing-Governance_48.svg +7 -0
  1075. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Redshift_Dense-Compute-Node_48.svg +7 -0
  1076. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Redshift_Dense-Storage-Node_48.svg +7 -0
  1077. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Redshift_ML_48.svg +7 -0
  1078. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Redshift_Query-Editor-v2.0_48.svg +7 -0
  1079. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Redshift_RA3_48.svg +7 -0
  1080. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Analytics/Res_Amazon-Redshift_Streaming-Ingestion_48.svg +7 -0
  1081. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge-Event_48.svg +7 -0
  1082. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge_Custom-Event-Bus_48.svg +7 -0
  1083. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge_Default-Event-Bus_48.svg +7 -0
  1084. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge_Pipes_48.svg +7 -0
  1085. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge_Rule_48.svg +7 -0
  1086. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge_Saas-Partner-Event_48.svg +7 -0
  1087. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge_Scheduler_48.svg +7 -0
  1088. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge_Schema-Registry_48.svg +7 -0
  1089. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-EventBridge_Schema_48.svg +7 -0
  1090. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-MQ_Broker_48.svg +7 -0
  1091. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-Simple-Notification-Service_Email-Notification_48.svg +7 -0
  1092. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-Simple-Notification-Service_HTTP-Notification_48.svg +7 -0
  1093. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-Simple-Notification-Service_Topic_48.svg +7 -0
  1094. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-Simple-Queue-Service_Message_48.svg +7 -0
  1095. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Application-Integration/Res_Amazon-Simple-Queue-Service_Queue_48.svg +7 -0
  1096. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-DevOps-Guru_Insights_48.svg +7 -0
  1097. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-Rekognition_Image_48.svg +7 -0
  1098. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-Rekognition_Video_48.svg +7 -0
  1099. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-SageMaker-AI_Canvas_48.svg +7 -0
  1100. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-SageMaker-AI_Geospatial-ML_48.svg +7 -0
  1101. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-SageMaker-AI_Model_48.svg +7 -0
  1102. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-SageMaker-AI_Notebook_48.svg +7 -0
  1103. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-SageMaker-AI_Shadow-Testing_48.svg +7 -0
  1104. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-SageMaker-AI_Train_48.svg +7 -0
  1105. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Artificial-Intelligence/Res_Amazon-Textract_Analyze-Lending_48.svg +7 -0
  1106. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Blockchain/Res_Amazon-Managed-Blockchain_Blockchain_48.svg +7 -0
  1107. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Business-Applications/Res_Amazon-Pinpoint_Journey_48.svg +7 -0
  1108. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Business-Applications/Res_Amazon-Simple-Email-Service_Email_48.svg +7 -0
  1109. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_AWS-Elastic-Beanstalk_Application_48.svg +7 -0
  1110. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_AWS-Elastic-Beanstalk_Deployment_48.svg +7 -0
  1111. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_AWS-Lambda_Lambda-Function_48.svg +7 -0
  1112. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_AMI_48.svg +7 -0
  1113. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_AWS-Microservice-Extractor-for-.NET_48.svg +7 -0
  1114. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_Auto-Scaling_48.svg +7 -0
  1115. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_DB-Instance_48.svg +7 -0
  1116. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_Elastic-IP-Address_48.svg +7 -0
  1117. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_Instance-with-CloudWatch_48.svg +7 -0
  1118. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_Instance_48.svg +7 -0
  1119. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_Instances_48.svg +7 -0
  1120. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_Rescue_48.svg +7 -0
  1121. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Compute/Res_Amazon-EC2_Spot-Instance_48.svg +7 -0
  1122. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Registry_Image_48.svg +7 -0
  1123. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Registry_Registry_48.svg +7 -0
  1124. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Service_Container-1_48.svg +7 -0
  1125. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Service_Container-2_48.svg +7 -0
  1126. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Service_Container-3_48.svg +7 -0
  1127. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Service_CopiIoT-CLI_48.svg +7 -0
  1128. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Service_ECS-Service-Connect_48.svg +7 -0
  1129. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Service_Service_48.svg +7 -0
  1130. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Container-Service_Task_48.svg +7 -0
  1131. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Containers/Res_Amazon-Elastic-Kubernetes-Service_EKS-on-Outposts_48.svg +7 -0
  1132. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_AWS-Database-Migration-Service_Database-migration-workflow-or-job_48.svg +7 -0
  1133. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-Instance_48.svg +7 -0
  1134. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-MariaDB-Instance-Alternate_48.svg +7 -0
  1135. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-MariaDB-Instance_48.svg +7 -0
  1136. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-MySQL-Instance-Alternate_48.svg +7 -0
  1137. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-MySQL-Instance_48.svg +7 -0
  1138. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-Oracle-Instance-Alternate_48.svg +7 -0
  1139. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-Oracle-Instance_48.svg +7 -0
  1140. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-PIOPS-Instance_48.svg +7 -0
  1141. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-PostgreSQL-Instance-Alternate_48.svg +7 -0
  1142. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-PostgreSQL-Instance_48.svg +7 -0
  1143. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-SQL-Server-Instance-Alternate_48.svg +7 -0
  1144. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora-SQL-Server-Instance_48.svg +7 -0
  1145. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora_Amazon-Aurora-Instance-alternate_48.svg +7 -0
  1146. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora_Amazon-RDS-Instance-Aternate_48.svg +7 -0
  1147. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora_Amazon-RDS-Instance_48.svg +7 -0
  1148. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-Aurora_Trusted-Language-Extensions-for-PostgreSQL_48.svg +7 -0
  1149. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DocumentDB_Elastic-Clusters_48.svg +7 -0
  1150. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Amazon-DynamoDB-Accelerator_48.svg +7 -0
  1151. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Attribute_48.svg +7 -0
  1152. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Attributes_48.svg +7 -0
  1153. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Global-secondary-index_48.svg +7 -0
  1154. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Item_48.svg +7 -0
  1155. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Items_48.svg +7 -0
  1156. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Standard-Access-Table-Class_48.svg +7 -0
  1157. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Standard-Infrequent-Access-Table-Class_48.svg +7 -0
  1158. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Stream_48.svg +7 -0
  1159. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-DynamoDB_Table_48.svg +7 -0
  1160. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-ElastiCache_Cache-Node_48.svg +7 -0
  1161. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-ElastiCache_ElastiCache-for-Memcached_48.svg +7 -0
  1162. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-ElastiCache_ElastiCache-for-Redis_48.svg +7 -0
  1163. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-ElastiCache_ElastiCache-for-Valkey_48.svg +3 -0
  1164. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-RDS-Proxy-Instance-Alternate_48.svg +7 -0
  1165. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-RDS-Proxy-Instance_48.svg +7 -0
  1166. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-RDS_Blue-Green-Deployments_48.svg +7 -0
  1167. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-RDS_Multi-AZ-DB-Cluster_48.svg +7 -0
  1168. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-RDS_Multi-AZ_48.svg +7 -0
  1169. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-RDS_Optimized-Writes_48.svg +7 -0
  1170. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Database/Res_Amazon-RDS_Trusted-Language-Extensions-for-PostgreSQL_48.svg +7 -0
  1171. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Developer-Tools/Res_AWS-Cloud9_Cloud9_48.svg +7 -0
  1172. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_End-User-Computing/Res_Amazon-WorkSpaces-Family_Amazon-WorkSpaces-Core_48.svg +7 -0
  1173. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_End-User-Computing/Res_Amazon-WorkSpaces-Family_Amazon-WorkSpaces-Secure-Browser_48.svg +7 -0
  1174. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_End-User-Computing/Res_Amazon-WorkSpaces-Family_Amazon-WorkSpaces_48.svg +7 -0
  1175. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Front-End-Web-Mobile/Res_AWS-Amplify_AWS-Amplify-Studio_48.svg +7 -0
  1176. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Front-End-Web-Mobile/Res_Amazon-Location-Service_Geofence_48.svg +7 -0
  1177. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Front-End-Web-Mobile/Res_Amazon-Location-Service_Map _48.svg +7 -0
  1178. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Front-End-Web-Mobile/Res_Amazon-Location-Service_Place_48.svg +7 -0
  1179. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Front-End-Web-Mobile/Res_Amazon-Location-Service_Routes_48.svg +7 -0
  1180. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Front-End-Web-Mobile/Res_Amazon-Location-Service_Track _48.svg +7 -0
  1181. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Analytics_Channel_48.svg +7 -0
  1182. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Analytics_Data-Store_48.svg +7 -0
  1183. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Analytics_Dataset_48.svg +7 -0
  1184. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Analytics_Notebook_48.svg +7 -0
  1185. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Analytics_Pipeline_48.svg +7 -0
  1186. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Core_Device-Advisor_48.svg +7 -0
  1187. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Core_Device-Location_48.svg +7 -0
  1188. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Device-Defender_IoT-Device-Jobs_48.svg +7 -0
  1189. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Device-Management_Fleet-Hub_48.svg +7 -0
  1190. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Device-Tester_48.svg +7 -0
  1191. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Artifact_48.svg +7 -0
  1192. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Component-Machine-Learning_48.svg +7 -0
  1193. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Component-Nucleus_48.svg +7 -0
  1194. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Component-Private_48.svg +7 -0
  1195. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Component-Public_48.svg +7 -0
  1196. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Component_48.svg +7 -0
  1197. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Connector_48.svg +7 -0
  1198. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Interprocess-Communication_48.svg +7 -0
  1199. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Protocol_48.svg +7 -0
  1200. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Recipe_48.svg +7 -0
  1201. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Greengrass_Stream-Manager_48.svg +7 -0
  1202. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Hardware-Board_48.svg +7 -0
  1203. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-Rule_48.svg +7 -0
  1204. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-SiteWise_Asset-Hierarchy_48.svg +7 -0
  1205. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-SiteWise_Asset-Model_48.svg +7 -0
  1206. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-SiteWise_Asset-Properties_48.svg +7 -0
  1207. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-SiteWise_Asset_48.svg +7 -0
  1208. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT-SiteWise_Data-Streams_48.svg +7 -0
  1209. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Action_48.svg +7 -0
  1210. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Actuator_48.svg +7 -0
  1211. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Alexa_Enabled-Device_48.svg +7 -0
  1212. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Alexa_Skill_48.svg +7 -0
  1213. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Alexa_Voice-Service_48.svg +7 -0
  1214. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Certificate_48.svg +7 -0
  1215. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Desired-State_48.svg +7 -0
  1216. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Device-Gateway_48.svg +7 -0
  1217. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Echo_48.svg +7 -0
  1218. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Fire-TV_Stick_48.svg +7 -0
  1219. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Fire_TV_48.svg +7 -0
  1220. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_HTTP2-Protocol_48.svg +7 -0
  1221. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_HTTP_Protocol_48.svg +7 -0
  1222. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Lambda_Function_48.svg +7 -0
  1223. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_LoRaWAN-Protocol_48.svg +7 -0
  1224. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_MQTT_Protocol_48.svg +7 -0
  1225. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Over-Air-Update_48.svg +7 -0
  1226. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Policy_48.svg +7 -0
  1227. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Reported-State_48.svg +7 -0
  1228. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Sailboat_48.svg +7 -0
  1229. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Sensor_48.svg +7 -0
  1230. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Servo_48.svg +7 -0
  1231. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Shadow_48.svg +7 -0
  1232. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Simulator_48.svg +7 -0
  1233. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Bank_48.svg +7 -0
  1234. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Bicycle_48.svg +7 -0
  1235. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Camera_48.svg +7 -0
  1236. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Car_48.svg +7 -0
  1237. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Cart_48.svg +7 -0
  1238. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Coffee-Pot_48.svg +7 -0
  1239. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Door-Lock_48.svg +7 -0
  1240. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Factory_48.svg +7 -0
  1241. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_FreeRTOS-Device_48.svg +7 -0
  1242. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Generic_48.svg +7 -0
  1243. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_House_48.svg +7 -0
  1244. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Humidity-Sensor_48.svg +7 -0
  1245. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Industrial-PC_48.svg +7 -0
  1246. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Lightbulb_48.svg +7 -0
  1247. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Medical-Emergency_48.svg +7 -0
  1248. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_PLC_48.svg +7 -0
  1249. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Police-Emergency_48.svg +7 -0
  1250. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Relay_48.svg +7 -0
  1251. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Stacklight_48.svg +7 -0
  1252. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Temperature-Humidity-Sensor_48.svg +7 -0
  1253. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Temperature-Sensor_48.svg +7 -0
  1254. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Temperature-Vibration-Sensor_48.svg +7 -0
  1255. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Thermostat_48.svg +7 -0
  1256. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Travel_48.svg +7 -0
  1257. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Utility_48.svg +7 -0
  1258. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Vibration-Sensor_48.svg +7 -0
  1259. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Thing_Windfarm_48.svg +7 -0
  1260. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_IoT/Res_AWS-IoT_Topic_48.svg +7 -0
  1261. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-CloudFormation_Change-Set_48.svg +7 -0
  1262. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-CloudFormation_Stack_48.svg +7 -0
  1263. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-CloudFormation_Template_48.svg +7 -0
  1264. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-CloudTrail_CloudTrail-Lake_48.svg +7 -0
  1265. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-License-Manager_Application-Discovery_48.svg +7 -0
  1266. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-License-Manager_License-Blending_48.svg +7 -0
  1267. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Organizations_Account_48.svg +7 -0
  1268. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Organizations_Management-Account_48.svg +7 -0
  1269. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Organizations_Organizational-Unit_48.svg +7 -0
  1270. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Application-Manager_48.svg +7 -0
  1271. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Automation_48.svg +7 -0
  1272. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Change-Calendar_48.svg +7 -0
  1273. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Change-Manager_48.svg +7 -0
  1274. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Compliance_48.svg +7 -0
  1275. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Distributor_48.svg +7 -0
  1276. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Documents_48.svg +7 -0
  1277. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Incident-Manager_48.svg +7 -0
  1278. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Inventory_48.svg +7 -0
  1279. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Maintenance-Windows_48.svg +7 -0
  1280. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_OpsCenter_48.svg +7 -0
  1281. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Parameter-Store_48.svg +7 -0
  1282. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Patch-Manager_48.svg +7 -0
  1283. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Run-Command_48.svg +7 -0
  1284. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_Session-Manager_48.svg +7 -0
  1285. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Systems-Manager_State-Manager_48.svg +7 -0
  1286. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Trusted-Advisor_Checklist-Cost_48.svg +7 -0
  1287. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Trusted-Advisor_Checklist-Fault-Tolerant_48.svg +7 -0
  1288. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Trusted-Advisor_Checklist-Performance_48.svg +7 -0
  1289. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Trusted-Advisor_Checklist-Security_48.svg +7 -0
  1290. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_AWS-Trusted-Advisor_Checklist_48.svg +7 -0
  1291. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Alarm_48.svg +7 -0
  1292. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Cross-account-Observability_48.svg +7 -0
  1293. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Data-Protection_48.svg +7 -0
  1294. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Event-Event-Based_48.svg +7 -0
  1295. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Event-Time-Based_48.svg +7 -0
  1296. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Evidently_48.svg +7 -0
  1297. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Logs_48.svg +7 -0
  1298. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Metrics-Insights_48.svg +7 -0
  1299. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_RUM_48.svg +7 -0
  1300. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Rule_48.svg +7 -0
  1301. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Management-Governance/Res_Amazon-CloudWatch_Synthetics_48.svg +7 -0
  1302. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Media-Services/Res_AWS-Cloud-Digital-Interface_48.svg +7 -0
  1303. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Media-Services/Res_AWS-Elemental-MediaConnect_MediaConnect-Gateway_48.svg +7 -0
  1304. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Application-Discovery-Service_AWS-Agentless-Collector_48.svg +7 -0
  1305. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Application-Discovery-Service_AWS-Discovery-Agent_48.svg +7 -0
  1306. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Application-Discovery-Service_Migration-Evaluator-Collector_48.svg +7 -0
  1307. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-DataSync_Discovery_48.svg +7 -0
  1308. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Datasync_Agent_48.svg +7 -0
  1309. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Mainframe-Modernization_Analyzer_48.svg +7 -0
  1310. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Mainframe-Modernization_Compiler_48.svg +7 -0
  1311. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Mainframe-Modernization_Converter_48.svg +7 -0
  1312. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Mainframe-Modernization_Developer_48.svg +7 -0
  1313. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Mainframe-Modernization_Runtime_48.svg +7 -0
  1314. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Migration-Hub_Refactor-Spaces-Applications_48.svg +7 -0
  1315. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Migration-Hub_Refactor-Spaces-Environments_48.svg +7 -0
  1316. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Migration-Hub_Refactor-Spaces-Services_48.svg +7 -0
  1317. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Transfer-Family_AWS-AS2_48.svg +7 -0
  1318. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Transfer-Family_AWS-FTPS_48.svg +7 -0
  1319. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Transfer-Family_AWS-FTP_48.svg +7 -0
  1320. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Migration-Modernization/Res_AWS-Transfer-Family_AWS-SFTP_48.svg +7 -0
  1321. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-App-Mesh_Mesh_48.svg +7 -0
  1322. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-App-Mesh_Virtual-Gateway_48.svg +7 -0
  1323. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-App-Mesh_Virtual-Node_48.svg +7 -0
  1324. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-App-Mesh_Virtual-Router_48.svg +7 -0
  1325. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-App-Mesh_Virtual-Service_48.svg +7 -0
  1326. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-Cloud-Map_Namespace_48.svg +7 -0
  1327. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-Cloud-Map_Resource_48.svg +7 -0
  1328. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-Cloud-Map_Service_48.svg +7 -0
  1329. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-Cloud-WAN_Core-Network-Edge_48.svg +7 -0
  1330. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-Cloud-WAN_Segment-Network_48.svg +7 -0
  1331. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-Cloud-WAN_Transit-Gateway-Route-Table-Attachment_48.svg +7 -0
  1332. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-Direct-Connect_Gateway_48.svg +7 -0
  1333. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_AWS-Transit-Gateway_Attachment_48.svg +7 -0
  1334. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-API-Gateway_Endpoint_48.svg +5 -0
  1335. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-CloudFront_Download-Distribution_48.svg +7 -0
  1336. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-CloudFront_Edge-Location_48.svg +7 -0
  1337. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-CloudFront_Functions_48.svg +7 -0
  1338. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-CloudFront_Streaming-Distribution_48.svg +7 -0
  1339. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-Route-53-Hosted-Zone_48.svg +7 -0
  1340. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-Route-53_Readiness-Checks_48.svg +7 -0
  1341. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-Route-53_Resolver-DNS-Firewall_48.svg +7 -0
  1342. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-Route-53_Resolver-Query-Logging_48.svg +7 -0
  1343. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-Route-53_Resolver_48.svg +7 -0
  1344. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-Route-53_Route-Table_48.svg +7 -0
  1345. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-Route-53_Routing-Controls_48.svg +7 -0
  1346. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Carrier-Gateway_48.svg +7 -0
  1347. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Customer-Gateway_48.svg +7 -0
  1348. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Elastic-Network-Adapter_48.svg +7 -0
  1349. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Elastic-Network-Interface_48.svg +7 -0
  1350. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Endpoints_48.svg +7 -0
  1351. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Flow-Logs_48.svg +7 -0
  1352. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Internet-Gateway_48.svg +7 -0
  1353. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_NAT-Gateway_48.svg +7 -0
  1354. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Network-Access-Analyzer_48.svg +7 -0
  1355. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Network-Access-Control-List_48.svg +7 -0
  1356. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Peering-Connection_48.svg +7 -0
  1357. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Reachability-Analyzer_48.svg +7 -0
  1358. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Router_48.svg +7 -0
  1359. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Traffic-Mirroring_48.svg +7 -0
  1360. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_VPN-Connection_48.svg +7 -0
  1361. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_VPN-Gateway_48.svg +7 -0
  1362. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Amazon-VPC_Virtual-private-cloud-VPC_48.svg +7 -0
  1363. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Elastic-Load-Balancing_Application-Load-Balancer_48.svg +7 -0
  1364. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Elastic-Load-Balancing_Classic-Load-Balancer_48.svg +7 -0
  1365. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Elastic-Load-Balancing_Gateway-Load-Balancer_48.svg +7 -0
  1366. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Networking-Content-Delivery/Res_Elastic-Load-Balancing_Network-Load-Balancer_48.svg +7 -0
  1367. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Chandelier_48.svg +7 -0
  1368. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Chip_48.svg +7 -0
  1369. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Embedded-Simulator_48.svg +7 -0
  1370. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Managed-Simulator_48.svg +7 -0
  1371. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Noise-Simulator_48.svg +7 -0
  1372. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_QPU_48.svg +7 -0
  1373. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Simulator-1_48.svg +7 -0
  1374. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Simulator-2_48.svg +7 -0
  1375. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Simulator-3_48.svg +7 -0
  1376. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Simulator-4_48.svg +7 -0
  1377. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Simulator_48.svg +7 -0
  1378. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_State-Vector_48.svg +7 -0
  1379. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Quantum-Technologies/Res_Amazon-Braket_Tensor-Network_48.svg +7 -0
  1380. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Certificate-Manager_Certificate-Authority_48.svg +7 -0
  1381. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Directory-Service_AD-Connector_48.svg +7 -0
  1382. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Directory-Service_AWS-Managed-Microsoft-AD_48.svg +7 -0
  1383. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Directory-Service_Simple-AD_48.svg +7 -0
  1384. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_AWS-STS-Alternate_48.svg +7 -0
  1385. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_AWS-STS_48.svg +7 -0
  1386. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_Add-on_48.svg +7 -0
  1387. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_Data-Encryption-Key_48.svg +7 -0
  1388. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_Encrypted-Data_48.svg +7 -0
  1389. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_IAM-Access-Analyzer_48.svg +7 -0
  1390. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_IAM-Roles-Anywhere_48.svg +7 -0
  1391. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_Long-Term-Security-Credential_48.svg +7 -0
  1392. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_MFA-Token_48.svg +7 -0
  1393. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_Permissions_48.svg +7 -0
  1394. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_Role_48.svg +7 -0
  1395. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Identity-Access-Management_Temporary-Security-Credential_48.svg +7 -0
  1396. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Key-Management-Service_External-Key-Store_48.svg +7 -0
  1397. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Network-Firewall_Endpoints_48.svg +7 -0
  1398. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Security-Hub_Finding_48.svg +7 -0
  1399. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-Shield_AWS-Shield-Advanced_48.svg +7 -0
  1400. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-WAF_Bad-Bot_48.svg +7 -0
  1401. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-WAF_Bot-Control_48.svg +7 -0
  1402. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-WAF_Bot_48.svg +7 -0
  1403. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-WAF_Filtering-Rule_48.svg +7 -0
  1404. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-WAF_Labels_48.svg +7 -0
  1405. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-WAF_Managed-Rule_48.svg +7 -0
  1406. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_AWS-WAF_Rule_48.svg +7 -0
  1407. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Security-Identity-Compliance/Res_Amazon-Inspector_Agent_48.svg +7 -0
  1408. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_AWS-Backup-Support-for-VMware-Workloads_48.svg +7 -0
  1409. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_AWS-Backup-for-AWS-CloudFormation_48.svg +7 -0
  1410. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_AWS-Backup-support-for-Amazon-FSx-for-NetApp-ONTAP_48.svg +7 -0
  1411. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_AWS-Backup-support-for-Amazon-S3_48.svg +7 -0
  1412. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Audit-Manager_48.svg +7 -0
  1413. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Backup-Plan_48.svg +7 -0
  1414. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Backup-Restore_48.svg +7 -0
  1415. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Backup-Vault_48.svg +7 -0
  1416. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Compliance-Reporting_48.svg +7 -0
  1417. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Compute_48.svg +7 -0
  1418. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Database_48.svg +7 -0
  1419. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Gateway_48.svg +7 -0
  1420. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Legal-Hold_48.svg +7 -0
  1421. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Recovery-Point-Objective_48.svg +7 -0
  1422. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Recovery-Time-Objective_48.svg +7 -0
  1423. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Storage_48.svg +7 -0
  1424. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Vault-Lock_48.svg +7 -0
  1425. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Virtual-Machine-Monitor_48.svg +7 -0
  1426. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Backup_Virtual-Machine_48.svg +7 -0
  1427. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Snowball_Snowball-Import-Export_48.svg +7 -0
  1428. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Storage-Gateway_Amazon-FSx-File-Gateway_48.svg +7 -0
  1429. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Storage-Gateway_Amazon-S3-File-Gateway_48.svg +7 -0
  1430. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Storage-Gateway_Cached-Volume_48.svg +7 -0
  1431. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Storage-Gateway_File-Gateway_48.svg +7 -0
  1432. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Storage-Gateway_Noncached-Volume_48.svg +7 -0
  1433. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Storage-Gateway_Tape-Gateway_48.svg +7 -0
  1434. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Storage-Gateway_Virtual-Tape-Library_48.svg +7 -0
  1435. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_AWS-Storage-Gateway_Volume-Gateway_48.svg +7 -0
  1436. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-Block-Store_Amazon-Data-Lifecycle-Manager_48.svg +7 -0
  1437. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-Block-Store_Multiple-Volumes_48.svg +7 -0
  1438. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-Block-Store_Snapshot_48.svg +7 -0
  1439. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-Block-Store_Volume-gp3_48.svg +7 -0
  1440. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-Block-Store_Volume_48.svg +7 -0
  1441. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-File-System_EFS-Intelligent-Tiering_48.svg +7 -0
  1442. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-File-System_EFS-One-Zone-Infrequent-Access_48.svg +7 -0
  1443. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-File-System_EFS-One-Zone_48.svg +7 -0
  1444. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-File-System_EFS-Standard-Infrequent-Access_48.svg +7 -0
  1445. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-File-System_EFS-Standard_48.svg +7 -0
  1446. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-File-System_Elastic-Throughput_48.svg +7 -0
  1447. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Elastic-File-System_File-System_48.svg +7 -0
  1448. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-File-Cache_Hybrid-NFS-linked-datasets_48.svg +7 -0
  1449. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-File-Cache_On-premises-NFS-linked-datasets_48.svg +7 -0
  1450. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-File-Cache_S3-linked-datasets_48.svg +7 -0
  1451. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service-Glacier_Archive_48.svg +7 -0
  1452. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service-Glacier_Vault_48.svg +7 -0
  1453. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_Bucket-With-Objects_48.svg +7 -0
  1454. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_Bucket_48.svg +7 -0
  1455. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_Directory-bucket_48.svg +3 -0
  1456. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_General-Access-Points_48.svg +7 -0
  1457. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_Object_48.svg +7 -0
  1458. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Batch-Operations_48.svg +7 -0
  1459. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Express-One-Zone_48.svg +10 -0
  1460. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Glacier-Deep-Archive_48.svg +7 -0
  1461. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Glacier-Flexible-Retrieval_48.svg +7 -0
  1462. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Glacier-Instant-Retrieval_48.svg +7 -0
  1463. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Intelligent-Tiering_48.svg +7 -0
  1464. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Multi-Region-Access-Points_48.svg +7 -0
  1465. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Object-Lambda-Access-Points_48.svg +7 -0
  1466. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Object-Lambda_48.svg +7 -0
  1467. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Object-Lock_48.svg +7 -0
  1468. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-On-Outposts_48.svg +7 -0
  1469. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-One-Zone-IA_48.svg +7 -0
  1470. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Replication-Time-Control_48.svg +7 -0
  1471. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Replication_48.svg +7 -0
  1472. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Select_48.svg +7 -0
  1473. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Standard-IA_48.svg +7 -0
  1474. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Standard_48.svg +7 -0
  1475. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Storage-Lens_48.svg +7 -0
  1476. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Tables_48.svg +3 -0
  1477. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_S3-Vectors_48.svg +3 -0
  1478. package/dist/viewer/aws-icons/Resource-Icons_07312025/Res_Storage/Res_Amazon-Simple-Storage-Service_VPC-Access-Points_48.svg +7 -0
  1479. package/dist/viewer/aws-icons.json +5914 -0
  1480. package/dist/viewer/azure-icons/ai + machine learning/00028-icon-service-Batch-AI.svg +1 -0
  1481. package/dist/viewer/azure-icons/ai + machine learning/00030-icon-service-Machine-Learning-Studio-(Classic)-Web-Services.svg +1 -0
  1482. package/dist/viewer/azure-icons/ai + machine learning/00031-icon-service-Genomics.svg +1 -0
  1483. package/dist/viewer/azure-icons/ai + machine learning/00792-icon-service-Computer-Vision.svg +1 -0
  1484. package/dist/viewer/azure-icons/ai + machine learning/00793-icon-service-Custom-Vision.svg +1 -0
  1485. package/dist/viewer/azure-icons/ai + machine learning/00794-icon-service-Face-APIs.svg +1 -0
  1486. package/dist/viewer/azure-icons/ai + machine learning/00795-icon-service-Content-Moderators.svg +1 -0
  1487. package/dist/viewer/azure-icons/ai + machine learning/00796-icon-service-Personalizers.svg +1 -0
  1488. package/dist/viewer/azure-icons/ai + machine learning/00797-icon-service-Speech-Services.svg +1 -0
  1489. package/dist/viewer/azure-icons/ai + machine learning/00799-icon-service-QnA-Makers.svg +1 -0
  1490. package/dist/viewer/azure-icons/ai + machine learning/00800-icon-service-Translator-Text.svg +2 -0
  1491. package/dist/viewer/azure-icons/ai + machine learning/00801-icon-service-Language-Understanding.svg +1 -0
  1492. package/dist/viewer/azure-icons/ai + machine learning/00812-icon-service-Immersive-Readers.svg +1 -0
  1493. package/dist/viewer/azure-icons/ai + machine learning/00814-icon-service-Anomaly-Detector.svg +1 -0
  1494. package/dist/viewer/azure-icons/ai + machine learning/00819-icon-service-Form-Recognizers.svg +1 -0
  1495. package/dist/viewer/azure-icons/ai + machine learning/01239-icon-service-Azure-Experimentation-Studio.svg +2 -0
  1496. package/dist/viewer/azure-icons/ai + machine learning/01688-icon-service-Azure-Object-Understanding.svg +1 -0
  1497. package/dist/viewer/azure-icons/ai + machine learning/02409-icon-service-Metrics-Advisor.svg +1 -0
  1498. package/dist/viewer/azure-icons/ai + machine learning/02749-icon-service-Azure-Applied-AI-Services.svg +1 -0
  1499. package/dist/viewer/azure-icons/ai + machine learning/02876-icon-service-Language.svg +1 -0
  1500. package/dist/viewer/azure-icons/ai + machine learning/03173-icon-service-Cognitive-Services-Decisions.svg +1 -0
  1501. package/dist/viewer/azure-icons/ai + machine learning/03321-icon-service-Serverless-Search.svg +1 -0
  1502. package/dist/viewer/azure-icons/ai + machine learning/03337-icon-service-Bonsai.svg +1 -0
  1503. package/dist/viewer/azure-icons/ai + machine learning/03390-icon-service-Content-Safety.svg +1 -0
  1504. package/dist/viewer/azure-icons/ai + machine learning/03438-icon-service-Azure-OpenAI.svg +1 -0
  1505. package/dist/viewer/azure-icons/ai + machine learning/03513-icon-service-AI-Studio.svg +1 -0
  1506. package/dist/viewer/azure-icons/ai + machine learning/10044-icon-service-Cognitive-Search.svg +1 -0
  1507. package/dist/viewer/azure-icons/ai + machine learning/10162-icon-service-Cognitive-Services.svg +1 -0
  1508. package/dist/viewer/azure-icons/ai + machine learning/10164-icon-service-Genomics-Accounts.svg +1 -0
  1509. package/dist/viewer/azure-icons/ai + machine learning/10165-icon-service-Bot-Services.svg +1 -0
  1510. package/dist/viewer/azure-icons/ai + machine learning/10166-icon-service-Machine-Learning.svg +1 -0
  1511. package/dist/viewer/azure-icons/ai + machine learning/10167-icon-service-Machine-Learning-Studio-Workspaces.svg +1 -0
  1512. package/dist/viewer/azure-icons/ai + machine learning/10168-icon-service-Machine-Learning-Studio-Web-Service-Plans.svg +1 -0
  1513. package/dist/viewer/azure-icons/analytics/00009-icon-service-Log-Analytics-Workspaces.svg +1 -0
  1514. package/dist/viewer/azure-icons/analytics/00039-icon-service-Event-Hubs.svg +1 -0
  1515. package/dist/viewer/azure-icons/analytics/00042-icon-service-Stream-Analytics-Jobs.svg +1 -0
  1516. package/dist/viewer/azure-icons/analytics/00562-icon-service-Endpoint-Analytics.svg +2 -0
  1517. package/dist/viewer/azure-icons/analytics/00606-icon-service-Azure-Synapse-Analytics.svg +1 -0
  1518. package/dist/viewer/azure-icons/analytics/02189-icon-service-Azure-Workbooks.svg +1 -0
  1519. package/dist/viewer/azure-icons/analytics/02209-icon-service-Private-Link-Services.svg +1 -0
  1520. package/dist/viewer/azure-icons/analytics/03332-icon-service-Power-BI-Embedded.svg +1 -0
  1521. package/dist/viewer/azure-icons/analytics/03335-icon-service-Power-Platform.svg +1 -0
  1522. package/dist/viewer/azure-icons/analytics/10126-icon-service-Data-Factories.svg +1 -0
  1523. package/dist/viewer/azure-icons/analytics/10142-icon-service-HD-Insight-Clusters.svg +1 -0
  1524. package/dist/viewer/azure-icons/analytics/10143-icon-service-Data-Lake-Analytics.svg +1 -0
  1525. package/dist/viewer/azure-icons/analytics/10145-icon-service-Azure-Data-Explorer-Clusters.svg +1 -0
  1526. package/dist/viewer/azure-icons/analytics/10148-icon-service-Analysis-Services.svg +1 -0
  1527. package/dist/viewer/azure-icons/analytics/10149-icon-service-Event-Hub-Clusters.svg +1 -0
  1528. package/dist/viewer/azure-icons/analytics/10150-icon-service-Data-Lake-Store-Gen1.svg +1 -0
  1529. package/dist/viewer/azure-icons/analytics/10787-icon-service-Azure-Databricks.svg +1 -0
  1530. package/dist/viewer/azure-icons/app services/00046-icon-service-App-Service-Plans.svg +1 -0
  1531. package/dist/viewer/azure-icons/app services/00049-icon-service-App-Service-Certificates.svg +1 -0
  1532. package/dist/viewer/azure-icons/app services/00050-icon-service-App-Service-Domains.svg +1 -0
  1533. package/dist/viewer/azure-icons/app services/00056-icon-service-CDN-Profiles.svg +1 -0
  1534. package/dist/viewer/azure-icons/app services/10035-icon-service-App-Services.svg +1 -0
  1535. package/dist/viewer/azure-icons/app services/10044-icon-service-Cognitive-Search.svg +1 -0
  1536. package/dist/viewer/azure-icons/app services/10045-icon-service-Notification-Hubs.svg +1 -0
  1537. package/dist/viewer/azure-icons/app services/10047-icon-service-App-Service-Environments.svg +1 -0
  1538. package/dist/viewer/azure-icons/azure ecosystem/01038-icon-service-Collaborative-Service.svg +2 -0
  1539. package/dist/viewer/azure-icons/azure ecosystem/02354-icon-service-Applens.svg +1 -0
  1540. package/dist/viewer/azure-icons/azure ecosystem/02573-icon-service-Azure-Hybrid-Center.svg +1 -0
  1541. package/dist/viewer/azure-icons/azure stack/00965-icon-service-Multi-Tenancy.svg +1 -0
  1542. package/dist/viewer/azure-icons/azure stack/10108-icon-service-Infrastructure-Backup.svg +1 -0
  1543. package/dist/viewer/azure-icons/azure stack/10109-icon-service-Capacity.svg +1 -0
  1544. package/dist/viewer/azure-icons/azure stack/10110-icon-service-Offers.svg +1 -0
  1545. package/dist/viewer/azure-icons/azure stack/10111-icon-service-User-Subscriptions.svg +1 -0
  1546. package/dist/viewer/azure-icons/azure stack/10113-icon-service-Plans.svg +1 -0
  1547. package/dist/viewer/azure-icons/azure stack/10115-icon-service-Updates.svg +1 -0
  1548. package/dist/viewer/azure-icons/blockchain/10210-icon-service-Blockchain-Applications.svg +1 -0
  1549. package/dist/viewer/azure-icons/blockchain/10364-icon-service-Outbound-Connection.svg +1 -0
  1550. package/dist/viewer/azure-icons/blockchain/10366-icon-service-Azure-Blockchain-Service.svg +1 -0
  1551. package/dist/viewer/azure-icons/blockchain/10367-icon-service-Azure-Token-Service.svg +1 -0
  1552. package/dist/viewer/azure-icons/blockchain/10374-icon-service-ABS-Member.svg +1 -0
  1553. package/dist/viewer/azure-icons/blockchain/10375-icon-service-Consortium.svg +1 -0
  1554. package/dist/viewer/azure-icons/compute/00195-icon-service-Maintenance-Configuration.svg +1 -0
  1555. package/dist/viewer/azure-icons/compute/00328-icon-service-Host-Pools.svg +1 -0
  1556. package/dist/viewer/azure-icons/compute/00329-icon-service-Application-Group.svg +1 -0
  1557. package/dist/viewer/azure-icons/compute/00330-icon-service-Workspaces.svg +1 -0
  1558. package/dist/viewer/azure-icons/compute/00398-icon-service-Disk-Encryption-Sets.svg +1 -0
  1559. package/dist/viewer/azure-icons/compute/00400-icon-service-Workspaces.svg +1 -0
  1560. package/dist/viewer/azure-icons/compute/02112-icon-service-Automanaged-VM.svg +2 -0
  1561. package/dist/viewer/azure-icons/compute/02370-icon-service-Managed-Service-Fabric.svg +1 -0
  1562. package/dist/viewer/azure-icons/compute/02409-icon-service-Metrics-Advisor.svg +1 -0
  1563. package/dist/viewer/azure-icons/compute/02634-icon-service-Image-Templates.svg +1 -0
  1564. package/dist/viewer/azure-icons/compute/02817-icon-service-Restore-Points.svg +1 -0
  1565. package/dist/viewer/azure-icons/compute/02818-icon-service-Restore-Points-Collections.svg +1 -0
  1566. package/dist/viewer/azure-icons/compute/02864-icon-service-Azure-Compute-Galleries.svg +1 -0
  1567. package/dist/viewer/azure-icons/compute/03487-icon-service-Compute-Fleet.svg +1 -0
  1568. package/dist/viewer/azure-icons/compute/03543-icon-service-AKS-Automatic.svg +1 -0
  1569. package/dist/viewer/azure-icons/compute/10021-icon-service-Virtual-Machine.svg +1 -0
  1570. package/dist/viewer/azure-icons/compute/10023-icon-service-Kubernetes-Services.svg +1 -0
  1571. package/dist/viewer/azure-icons/compute/10024-icon-service-Mesh-Applications.svg +1 -0
  1572. package/dist/viewer/azure-icons/compute/10025-icon-service-Availability-Sets.svg +1 -0
  1573. package/dist/viewer/azure-icons/compute/10026-icon-service-Disks-Snapshots.svg +1 -0
  1574. package/dist/viewer/azure-icons/compute/10027-icon-service-OS-Images-(Classic).svg +1 -0
  1575. package/dist/viewer/azure-icons/compute/10028-icon-service-Virtual-Machines-(Classic).svg +1 -0
  1576. package/dist/viewer/azure-icons/compute/10029-icon-service-Function-Apps.svg +1 -0
  1577. package/dist/viewer/azure-icons/compute/10030-icon-service-Cloud-Services-(Classic).svg +1 -0
  1578. package/dist/viewer/azure-icons/compute/10031-icon-service-Batch-Accounts.svg +1 -0
  1579. package/dist/viewer/azure-icons/compute/10032-icon-service-Disks.svg +1 -0
  1580. package/dist/viewer/azure-icons/compute/10033-icon-service-Images.svg +1 -0
  1581. package/dist/viewer/azure-icons/compute/10034-icon-service-VM-Scale-Sets.svg +1 -0
  1582. package/dist/viewer/azure-icons/compute/10035-icon-service-App-Services.svg +1 -0
  1583. package/dist/viewer/azure-icons/compute/10036-icon-service-Service-Fabric-Clusters.svg +1 -0
  1584. package/dist/viewer/azure-icons/compute/10037-icon-service-Image-Definitions.svg +1 -0
  1585. package/dist/viewer/azure-icons/compute/10038-icon-service-Image-Versions.svg +1 -0
  1586. package/dist/viewer/azure-icons/compute/10039-icon-service-Shared-Image-Galleries.svg +1 -0
  1587. package/dist/viewer/azure-icons/compute/10040-icon-service-VM-Images-(Classic).svg +1 -0
  1588. package/dist/viewer/azure-icons/compute/10041-icon-service-Disks-(Classic).svg +1 -0
  1589. package/dist/viewer/azure-icons/compute/10049-icon-service-Container-Services-(Deprecated).svg +1 -0
  1590. package/dist/viewer/azure-icons/compute/10104-icon-service-Container-Instances.svg +1 -0
  1591. package/dist/viewer/azure-icons/compute/10346-icon-service-Host-Groups.svg +1 -0
  1592. package/dist/viewer/azure-icons/compute/10347-icon-service-Hosts.svg +1 -0
  1593. package/dist/viewer/azure-icons/compute/10370-icon-service-Azure-Spring-Apps.svg +1 -0
  1594. package/dist/viewer/azure-icons/containers/03331-icon-service-Azure-Red-Hat-OpenShift.svg +1 -0
  1595. package/dist/viewer/azure-icons/containers/10023-icon-service-Kubernetes-Services.svg +1 -0
  1596. package/dist/viewer/azure-icons/containers/10031-icon-service-Batch-Accounts.svg +1 -0
  1597. package/dist/viewer/azure-icons/containers/10035-icon-service-App-Services.svg +1 -0
  1598. package/dist/viewer/azure-icons/containers/10036-icon-service-Service-Fabric-Clusters.svg +1 -0
  1599. package/dist/viewer/azure-icons/containers/10104-icon-service-Container-Instances.svg +1 -0
  1600. package/dist/viewer/azure-icons/containers/10105-icon-service-Container-Registries.svg +1 -0
  1601. package/dist/viewer/azure-icons/copy-summary.json +8 -0
  1602. package/dist/viewer/azure-icons/databases/00036-icon-service-SQL-Data-Warehouses.svg +1 -0
  1603. package/dist/viewer/azure-icons/databases/00606-icon-service-Azure-Synapse-Analytics.svg +1 -0
  1604. package/dist/viewer/azure-icons/databases/02390-icon-service-Azure-SQL.svg +2 -0
  1605. package/dist/viewer/azure-icons/databases/02392-icon-service-SSIS-Lift-And-Shift-IR.svg +2 -0
  1606. package/dist/viewer/azure-icons/databases/02517-icon-service-Azure-Purview-Accounts.svg +1 -0
  1607. package/dist/viewer/azure-icons/databases/02750-icon-service-Azure-SQL-Edge.svg +1 -0
  1608. package/dist/viewer/azure-icons/databases/02827-icon-service-Azure-Database-PostgreSQL-Server-Group.svg +1 -0
  1609. package/dist/viewer/azure-icons/databases/03490-icon-service-Oracle-Database.svg +1 -0
  1610. package/dist/viewer/azure-icons/databases/10121-icon-service-Azure-Cosmos-DB.svg +1 -0
  1611. package/dist/viewer/azure-icons/databases/10122-icon-service-Azure-Database-MySQL-Server.svg +1 -0
  1612. package/dist/viewer/azure-icons/databases/10123-icon-service-Azure-Database-MariaDB-Server.svg +1 -0
  1613. package/dist/viewer/azure-icons/databases/10124-icon-service-Azure-SQL-VM.svg +1 -0
  1614. package/dist/viewer/azure-icons/databases/10126-icon-service-Data-Factories.svg +1 -0
  1615. package/dist/viewer/azure-icons/databases/10127-icon-service-Virtual-Clusters.svg +1 -0
  1616. package/dist/viewer/azure-icons/databases/10128-icon-service-Elastic-Job-Agents.svg +1 -0
  1617. package/dist/viewer/azure-icons/databases/10130-icon-service-SQL-Database.svg +1 -0
  1618. package/dist/viewer/azure-icons/databases/10131-icon-service-Azure-Database-PostgreSQL-Server.svg +1 -0
  1619. package/dist/viewer/azure-icons/databases/10132-icon-service-SQL-Server.svg +1 -0
  1620. package/dist/viewer/azure-icons/databases/10133-icon-service-Azure-Database-Migration-Services.svg +1 -0
  1621. package/dist/viewer/azure-icons/databases/10134-icon-service-SQL-Elastic-Pools.svg +1 -0
  1622. package/dist/viewer/azure-icons/databases/10135-icon-service-Managed-Database.svg +1 -0
  1623. package/dist/viewer/azure-icons/databases/10136-icon-service-SQL-Managed-Instance.svg +1 -0
  1624. package/dist/viewer/azure-icons/databases/10137-icon-service-Azure-SQL-Server-Stretch-Databases.svg +1 -0
  1625. package/dist/viewer/azure-icons/databases/10137-icon-service-Cache-Redis.svg +1 -0
  1626. package/dist/viewer/azure-icons/databases/10139-icon-service-Instance-Pools.svg +1 -0
  1627. package/dist/viewer/azure-icons/databases/10145-icon-service-Azure-Data-Explorer-Clusters.svg +1 -0
  1628. package/dist/viewer/azure-icons/databases/10351-icon-service-SQL-Server-Registries.svg +1 -0
  1629. package/dist/viewer/azure-icons/devops/00012-icon-service-Application-Insights.svg +1 -0
  1630. package/dist/viewer/azure-icons/devops/00563-icon-service-Change-Analysis.svg +1 -0
  1631. package/dist/viewer/azure-icons/devops/02373-icon-service-CloudTest.svg +2 -0
  1632. package/dist/viewer/azure-icons/devops/02423-icon-service-Load-Testing.svg +1 -0
  1633. package/dist/viewer/azure-icons/devops/02761-icon-service-Lab-Accounts.svg +1 -0
  1634. package/dist/viewer/azure-icons/devops/03339-icon-service-DevOps-Starter.svg +1 -0
  1635. package/dist/viewer/azure-icons/devops/03393-icon-service-Managed-DevOps-Pools.svg +1 -0
  1636. package/dist/viewer/azure-icons/devops/03455-icon-service-Code-Optimization.svg +1 -0
  1637. package/dist/viewer/azure-icons/devops/03623-icon-service-Workspace-Gateway.svg +1 -0
  1638. package/dist/viewer/azure-icons/devops/10042-icon-service-API-Management-Services.svg +1 -0
  1639. package/dist/viewer/azure-icons/devops/10048-icon-service-API-Connections.svg +1 -0
  1640. package/dist/viewer/azure-icons/devops/10261-icon-service-Azure-DevOps.svg +1 -0
  1641. package/dist/viewer/azure-icons/devops/10264-icon-service-DevTest-Labs.svg +1 -0
  1642. package/dist/viewer/azure-icons/devops/10265-icon-service-Lab-Services.svg +1 -0
  1643. package/dist/viewer/azure-icons/general/00004-icon-service-Cost-Management-and-Billing.svg +1 -0
  1644. package/dist/viewer/azure-icons/general/00456-icon-service-Preview-Features.svg +1 -0
  1645. package/dist/viewer/azure-icons/general/10001-icon-service-All-Resources.svg +1 -0
  1646. package/dist/viewer/azure-icons/general/10002-icon-service-Subscriptions.svg +1 -0
  1647. package/dist/viewer/azure-icons/general/10003-icon-service-Reservations.svg +1 -0
  1648. package/dist/viewer/azure-icons/general/10004-icon-service-Service-Health.svg +1 -0
  1649. package/dist/viewer/azure-icons/general/10005-icon-service-Information.svg +1 -0
  1650. package/dist/viewer/azure-icons/general/10006-icon-service-Recent.svg +1 -0
  1651. package/dist/viewer/azure-icons/general/10007-icon-service-Resource-Groups.svg +1 -0
  1652. package/dist/viewer/azure-icons/general/10008-icon-service-Marketplace.svg +1 -0
  1653. package/dist/viewer/azure-icons/general/10009-icon-service-Templates.svg +1 -0
  1654. package/dist/viewer/azure-icons/general/10010-icon-service-Quickstart-Center.svg +1 -0
  1655. package/dist/viewer/azure-icons/general/10011-icon-service-Management-Groups.svg +1 -0
  1656. package/dist/viewer/azure-icons/general/10013-icon-service-Help-and-Support.svg +1 -0
  1657. package/dist/viewer/azure-icons/general/10014-icon-service-Tag.svg +1 -0
  1658. package/dist/viewer/azure-icons/general/10015-icon-service-Dashboard.svg +2 -0
  1659. package/dist/viewer/azure-icons/general/10016-icon-service-Free-Services.svg +1 -0
  1660. package/dist/viewer/azure-icons/general/10019-icon-service-Cost-Management.svg +1 -0
  1661. package/dist/viewer/azure-icons/general/10112-icon-service-Marketplace-Management.svg +1 -0
  1662. package/dist/viewer/azure-icons/general/10116-icon-service-Region-Management.svg +1 -0
  1663. package/dist/viewer/azure-icons/general/10341-icon-service-Troubleshoot.svg +1 -0
  1664. package/dist/viewer/azure-icons/general/10349-icon-service-Resource-Explorer.svg +1 -0
  1665. package/dist/viewer/azure-icons/general/10779-icon-service-Biz-Talk.svg +1 -0
  1666. package/dist/viewer/azure-icons/general/10780-icon-service-Blob-Block.svg +1 -0
  1667. package/dist/viewer/azure-icons/general/10781-icon-service-Blob-Page.svg +1 -0
  1668. package/dist/viewer/azure-icons/general/10782-icon-service-Branch.svg +1 -0
  1669. package/dist/viewer/azure-icons/general/10783-icon-service-Browser.svg +1 -0
  1670. package/dist/viewer/azure-icons/general/10784-icon-service-Bug.svg +1 -0
  1671. package/dist/viewer/azure-icons/general/10785-icon-service-Builds.svg +1 -0
  1672. package/dist/viewer/azure-icons/general/10786-icon-service-Cache.svg +1 -0
  1673. package/dist/viewer/azure-icons/general/10787-icon-service-Code.svg +1 -0
  1674. package/dist/viewer/azure-icons/general/10788-icon-service-Commit.svg +1 -0
  1675. package/dist/viewer/azure-icons/general/10789-icon-service-Controls.svg +1 -0
  1676. package/dist/viewer/azure-icons/general/10790-icon-service-Controls-Horizontal.svg +1 -0
  1677. package/dist/viewer/azure-icons/general/10791-icon-service-Cost-Alerts.svg +1 -0
  1678. package/dist/viewer/azure-icons/general/10792-icon-service-Cost-Analysis.svg +1 -0
  1679. package/dist/viewer/azure-icons/general/10793-icon-service-Cost-Budgets.svg +1 -0
  1680. package/dist/viewer/azure-icons/general/10794-icon-service-Counter.svg +1 -0
  1681. package/dist/viewer/azure-icons/general/10795-icon-service-Cubes.svg +1 -0
  1682. package/dist/viewer/azure-icons/general/10796-icon-service-Dev-Console.svg +1 -0
  1683. package/dist/viewer/azure-icons/general/10797-icon-service-Download.svg +1 -0
  1684. package/dist/viewer/azure-icons/general/10798-icon-service-Error.svg +1 -0
  1685. package/dist/viewer/azure-icons/general/10799-icon-service-Extensions.svg +1 -0
  1686. package/dist/viewer/azure-icons/general/10800-icon-service-File.svg +1 -0
  1687. package/dist/viewer/azure-icons/general/10801-icon-service-Files.svg +1 -0
  1688. package/dist/viewer/azure-icons/general/10802-icon-service-Folder-Blank.svg +1 -0
  1689. package/dist/viewer/azure-icons/general/10803-icon-service-Folder-Website.svg +1 -0
  1690. package/dist/viewer/azure-icons/general/10804-icon-service-FTP.svg +1 -0
  1691. package/dist/viewer/azure-icons/general/10805-icon-service-Gear.svg +1 -0
  1692. package/dist/viewer/azure-icons/general/10807-icon-service-Globe-Error.svg +1 -0
  1693. package/dist/viewer/azure-icons/general/10808-icon-service-Globe-Success.svg +1 -0
  1694. package/dist/viewer/azure-icons/general/10809-icon-service-Globe-Warning.svg +1 -0
  1695. package/dist/viewer/azure-icons/general/10810-icon-service-Guide.svg +1 -0
  1696. package/dist/viewer/azure-icons/general/10811-icon-service-Heart.svg +1 -0
  1697. package/dist/viewer/azure-icons/general/10812-icon-service-Image.svg +1 -0
  1698. package/dist/viewer/azure-icons/general/10813-icon-service-Input-Output.svg +1 -0
  1699. package/dist/viewer/azure-icons/general/10814-icon-service-Journey-Hub.svg +1 -0
  1700. package/dist/viewer/azure-icons/general/10815-icon-service-Launch-Portal.svg +1 -0
  1701. package/dist/viewer/azure-icons/general/10816-icon-service-Learn.svg +1 -0
  1702. package/dist/viewer/azure-icons/general/10817-icon-service-Load-Test.svg +1 -0
  1703. package/dist/viewer/azure-icons/general/10818-icon-service-Location.svg +1 -0
  1704. package/dist/viewer/azure-icons/general/10819-icon-service-Log-Streaming.svg +1 -0
  1705. package/dist/viewer/azure-icons/general/10820-icon-service-Management-Portal.svg +1 -0
  1706. package/dist/viewer/azure-icons/general/10821-icon-service-Media-File.svg +1 -0
  1707. package/dist/viewer/azure-icons/general/10822-icon-service-Mobile.svg +1 -0
  1708. package/dist/viewer/azure-icons/general/10823-icon-service-Mobile-Engagement.svg +1 -0
  1709. package/dist/viewer/azure-icons/general/10824-icon-service-Power.svg +1 -0
  1710. package/dist/viewer/azure-icons/general/10825-icon-service-Powershell.svg +1 -0
  1711. package/dist/viewer/azure-icons/general/10826-icon-service-Power-Up.svg +1 -0
  1712. package/dist/viewer/azure-icons/general/10827-icon-service-Feature-Previews.svg +1 -0
  1713. package/dist/viewer/azure-icons/general/10828-icon-service-Process-Explorer.svg +1 -0
  1714. package/dist/viewer/azure-icons/general/10829-icon-service-Production-Ready-Database.svg +1 -0
  1715. package/dist/viewer/azure-icons/general/10830-icon-service-Resource-Group-List.svg +1 -0
  1716. package/dist/viewer/azure-icons/general/10831-icon-service-Resource-Linked.svg +1 -0
  1717. package/dist/viewer/azure-icons/general/10833-icon-service-Scheduler.svg +1 -0
  1718. package/dist/viewer/azure-icons/general/10834-icon-service-Search.svg +1 -0
  1719. package/dist/viewer/azure-icons/general/10835-icon-service-Server-Farm.svg +1 -0
  1720. package/dist/viewer/azure-icons/general/10837-icon-service-SSD.svg +1 -0
  1721. package/dist/viewer/azure-icons/general/10838-icon-service-Storage-Azure-Files.svg +1 -0
  1722. package/dist/viewer/azure-icons/general/10839-icon-service-Storage-Container.svg +1 -0
  1723. package/dist/viewer/azure-icons/general/10840-icon-service-Storage-Queue.svg +1 -0
  1724. package/dist/viewer/azure-icons/general/10841-icon-service-Table.svg +1 -0
  1725. package/dist/viewer/azure-icons/general/10842-icon-service-Tags.svg +1 -0
  1726. package/dist/viewer/azure-icons/general/10843-icon-service-TFS-VC-Repository.svg +1 -0
  1727. package/dist/viewer/azure-icons/general/10844-icon-service-Toolbox.svg +1 -0
  1728. package/dist/viewer/azure-icons/general/10845-icon-service-Versions.svg +1 -0
  1729. package/dist/viewer/azure-icons/general/10847-icon-service-Website-Power.svg +1 -0
  1730. package/dist/viewer/azure-icons/general/10848-icon-service-Website-Staging.svg +1 -0
  1731. package/dist/viewer/azure-icons/general/10849-icon-service-Web-Slots.svg +1 -0
  1732. package/dist/viewer/azure-icons/general/10850-icon-service-Web-Test.svg +1 -0
  1733. package/dist/viewer/azure-icons/general/10851-icon-service-Workbooks.svg +1 -0
  1734. package/dist/viewer/azure-icons/general/10852-icon-service-Workflow.svg +1 -0
  1735. package/dist/viewer/azure-icons/general/10853-icon-service-Backlog.svg +1 -0
  1736. package/dist/viewer/azure-icons/general/10854-icon-service-Media.svg +1 -0
  1737. package/dist/viewer/azure-icons/general/10855-icon-service-Module.svg +1 -0
  1738. package/dist/viewer/azure-icons/general/10856-icon-service-Search-Grid.svg +1 -0
  1739. package/dist/viewer/azure-icons/hybrid + multicloud/03248-icon-service-Azure-Operator-5G-Core.svg +1 -0
  1740. package/dist/viewer/azure-icons/hybrid + multicloud/03324-icon-service-Azure-Operator-Nexus.svg +1 -0
  1741. package/dist/viewer/azure-icons/hybrid + multicloud/03333-icon-service-Azure-Operator-Insights.svg +1 -0
  1742. package/dist/viewer/azure-icons/hybrid + multicloud/03334-icon-service-Azure-Operator-Service-Manager.svg +1 -0
  1743. package/dist/viewer/azure-icons/hybrid + multicloud/03347-icon-service-Azure-Programmable-Connectivity.svg +1 -0
  1744. package/dist/viewer/azure-icons/hybrid + multicloud/03585-icon-service-Azure-Monitor-Pipeline.svg +1 -0
  1745. package/dist/viewer/azure-icons/identity/00321-icon-service-Security.svg +1 -0
  1746. package/dist/viewer/azure-icons/identity/00919-icon-service-Administrative-Units.svg +1 -0
  1747. package/dist/viewer/azure-icons/identity/01084-icon-service-Verifiable-Credentials.svg +1 -0
  1748. package/dist/viewer/azure-icons/identity/02251-icon-service-Entra-Privleged-Identity-Management.svg +1 -0
  1749. package/dist/viewer/azure-icons/identity/02386-icon-service-API-Proxy.svg +2 -0
  1750. package/dist/viewer/azure-icons/identity/02679-icon-service-Tenant-Properties.svg +1 -0
  1751. package/dist/viewer/azure-icons/identity/02680-icon-service-Entra-Identity-Custom-Roles.svg +1 -0
  1752. package/dist/viewer/azure-icons/identity/02681-icon-service-Entra-Identity-Licenses.svg +1 -0
  1753. package/dist/viewer/azure-icons/identity/02854-icon-service-Entra-Connect.svg +1 -0
  1754. package/dist/viewer/azure-icons/identity/03143-icon-service-Entra-Verified-ID.svg +1 -0
  1755. package/dist/viewer/azure-icons/identity/03225-icon-service-Verification-As-A-Service.svg +1 -0
  1756. package/dist/viewer/azure-icons/identity/03256-icon-service-Multi-Factor-Authentication.svg +1 -0
  1757. package/dist/viewer/azure-icons/identity/03309-icon-service-Entra-Global-Secure-Access.svg +1 -0
  1758. package/dist/viewer/azure-icons/identity/03338-icon-service-External-Identities.svg +1 -0
  1759. package/dist/viewer/azure-icons/identity/03382-icon-service-Entra-Private-Access.svg +1 -0
  1760. package/dist/viewer/azure-icons/identity/03383-icon-service-Entra-Internet-Access.svg +1 -0
  1761. package/dist/viewer/azure-icons/identity/03533-icon-service-Entra-Connect-Sync.svg +1 -0
  1762. package/dist/viewer/azure-icons/identity/10222-icon-service-Entra-Domain-Services.svg +1 -0
  1763. package/dist/viewer/azure-icons/identity/10223-icon-service-Groups.svg +1 -0
  1764. package/dist/viewer/azure-icons/identity/10224-icon-service-Active-Directory-Connect-Health.svg +1 -0
  1765. package/dist/viewer/azure-icons/identity/10224-icon-service-Entra-Connect-Health.svg +1 -0
  1766. package/dist/viewer/azure-icons/identity/10225-icon-service-Enterprise-Applications.svg +1 -0
  1767. package/dist/viewer/azure-icons/identity/10227-icon-service-Entra-Managed-Identities.svg +1 -0
  1768. package/dist/viewer/azure-icons/identity/10227-icon-service-Managed-Identities.svg +1 -0
  1769. package/dist/viewer/azure-icons/identity/10228-icon-service-Azure-AD-B2C.svg +1 -0
  1770. package/dist/viewer/azure-icons/identity/10229-icon-service-Azure-Information-Protection.svg +1 -0
  1771. package/dist/viewer/azure-icons/identity/10230-icon-service-Users.svg +1 -0
  1772. package/dist/viewer/azure-icons/identity/10231-icon-service-Entra-ID-Protection.svg +1 -0
  1773. package/dist/viewer/azure-icons/identity/10232-icon-service-App-Registrations.svg +1 -0
  1774. package/dist/viewer/azure-icons/identity/10235-icon-service-Identity-Governance.svg +1 -0
  1775. package/dist/viewer/azure-icons/identity/10340-icon-service-Entra-Identity-Roles-and-Administrators.svg +1 -0
  1776. package/dist/viewer/azure-icons/identity/10433-icon-service-User-Settings.svg +1 -0
  1777. package/dist/viewer/azure-icons/integration/00036-icon-service-SQL-Data-Warehouses.svg +1 -0
  1778. package/dist/viewer/azure-icons/integration/00555-icon-service-Integration-Service-Environments.svg +1 -0
  1779. package/dist/viewer/azure-icons/integration/00691-icon-service-Azure-Databox-Gateway.svg +1 -0
  1780. package/dist/viewer/azure-icons/integration/02072-icon-service-Partner-Topic.svg +2 -0
  1781. package/dist/viewer/azure-icons/integration/02073-icon-service-System-Topic.svg +2 -0
  1782. package/dist/viewer/azure-icons/integration/02265-icon-service-Partner-Registration.svg +2 -0
  1783. package/dist/viewer/azure-icons/integration/02266-icon-service-Partner-Namespace.svg +2 -0
  1784. package/dist/viewer/azure-icons/integration/02631-icon-service-Logic-Apps.svg +1 -0
  1785. package/dist/viewer/azure-icons/integration/03335-icon-service-Power-Platform.svg +1 -0
  1786. package/dist/viewer/azure-icons/integration/03345-icon-service-Integration-Environments.svg +1 -0
  1787. package/dist/viewer/azure-icons/integration/03637-icon-service-Business-Process-Tracking.svg +1 -0
  1788. package/dist/viewer/azure-icons/integration/10042-icon-service-API-Management-Services.svg +1 -0
  1789. package/dist/viewer/azure-icons/integration/10048-icon-service-API-Connections.svg +1 -0
  1790. package/dist/viewer/azure-icons/integration/10089-icon-service-StorSimple-Device-Managers.svg +1 -0
  1791. package/dist/viewer/azure-icons/integration/10095-icon-service-Azure-Stack-Edge.svg +1 -0
  1792. package/dist/viewer/azure-icons/integration/10126-icon-service-Data-Factories.svg +1 -0
  1793. package/dist/viewer/azure-icons/integration/10137-icon-service-Azure-SQL-Server-Stretch-Databases.svg +1 -0
  1794. package/dist/viewer/azure-icons/integration/10206-icon-service-Event-Grid-Topics.svg +1 -0
  1795. package/dist/viewer/azure-icons/integration/10209-icon-service-Relays.svg +1 -0
  1796. package/dist/viewer/azure-icons/integration/10212-icon-service-Azure-API-for-FHIR.svg +1 -0
  1797. package/dist/viewer/azure-icons/integration/10213-icon-service-Software-as-a-Service.svg +1 -0
  1798. package/dist/viewer/azure-icons/integration/10215-icon-service-Event-Grid-Domains.svg +1 -0
  1799. package/dist/viewer/azure-icons/integration/10216-icon-service-Azure-Data-Catalog.svg +1 -0
  1800. package/dist/viewer/azure-icons/integration/10218-icon-service-Integration-Accounts.svg +1 -0
  1801. package/dist/viewer/azure-icons/integration/10219-icon-service-App-Configuration.svg +1 -0
  1802. package/dist/viewer/azure-icons/integration/10220-icon-service-SendGrid-Accounts.svg +1 -0
  1803. package/dist/viewer/azure-icons/integration/10221-icon-service-Event-Grid-Subscriptions.svg +1 -0
  1804. package/dist/viewer/azure-icons/integration/10363-icon-service-Logic-Apps-Custom-Connector.svg +1 -0
  1805. package/dist/viewer/azure-icons/integration/10836-icon-service-Azure-Service-Bus.svg +1 -0
  1806. package/dist/viewer/azure-icons/intune/00399-icon-service-Device-Security-Apple.svg +1 -0
  1807. package/dist/viewer/azure-icons/intune/00399-icon-service-Device-Security-Google.svg +1 -0
  1808. package/dist/viewer/azure-icons/intune/00399-icon-service-Device-Security-Windows.svg +1 -0
  1809. package/dist/viewer/azure-icons/intune/10329-icon-service-Intune.svg +1 -0
  1810. package/dist/viewer/azure-icons/intune/10330-icon-service-eBooks.svg +1 -0
  1811. package/dist/viewer/azure-icons/intune/10331-icon-service-Client-Apps.svg +1 -0
  1812. package/dist/viewer/azure-icons/intune/10332-icon-service-Devices.svg +1 -0
  1813. package/dist/viewer/azure-icons/intune/10333-icon-service-Device-Compliance.svg +1 -0
  1814. package/dist/viewer/azure-icons/intune/10335-icon-service-Software-Updates.svg +1 -0
  1815. package/dist/viewer/azure-icons/intune/10336-icon-service-Security-Baselines.svg +1 -0
  1816. package/dist/viewer/azure-icons/intune/10337-icon-service-Device-Enrollment.svg +1 -0
  1817. package/dist/viewer/azure-icons/intune/10338-icon-service-Device-Configuration.svg +1 -0
  1818. package/dist/viewer/azure-icons/intune/10339-icon-service-Exchange-Access.svg +1 -0
  1819. package/dist/viewer/azure-icons/intune/10340-icon-service-Entra-Identity-Roles-and-Administrators.svg +1 -0
  1820. package/dist/viewer/azure-icons/intune/10342-icon-service-Tenant-Status.svg +1 -0
  1821. package/dist/viewer/azure-icons/intune/10343-icon-service-Intune-For-Education.svg +1 -0
  1822. package/dist/viewer/azure-icons/intune/10344-icon-service-Intune-App-Protection.svg +1 -0
  1823. package/dist/viewer/azure-icons/intune/10350-icon-service-Mindaro.svg +1 -0
  1824. package/dist/viewer/azure-icons/iot/00030-icon-service-Machine-Learning-Studio-(Classic)-Web-Services.svg +1 -0
  1825. package/dist/viewer/azure-icons/iot/00039-icon-service-Event-Hubs.svg +1 -0
  1826. package/dist/viewer/azure-icons/iot/00042-icon-service-Stream-Analytics-Jobs.svg +1 -0
  1827. package/dist/viewer/azure-icons/iot/00691-icon-service-Azure-Databox-Gateway.svg +1 -0
  1828. package/dist/viewer/azure-icons/iot/01030-icon-service-Digital-Twins.svg +2 -0
  1829. package/dist/viewer/azure-icons/iot/02359-icon-service-Industrial-IoT.svg +2 -0
  1830. package/dist/viewer/azure-icons/iot/02631-icon-service-Logic-Apps.svg +1 -0
  1831. package/dist/viewer/azure-icons/iot/03293-icon-service-Azure-Stack-HCI-Sizer.svg +1 -0
  1832. package/dist/viewer/azure-icons/iot/03466-icon-service-Stack-HCI-Premium.svg +1 -0
  1833. package/dist/viewer/azure-icons/iot/03485-icon-service-Azure-IoT-Operations.svg +1 -0
  1834. package/dist/viewer/azure-icons/iot/10029-icon-service-Function-Apps.svg +1 -0
  1835. package/dist/viewer/azure-icons/iot/10045-icon-service-Notification-Hubs.svg +1 -0
  1836. package/dist/viewer/azure-icons/iot/10053-icon-service-Notification-Hub-Namespaces.svg +1 -0
  1837. package/dist/viewer/azure-icons/iot/10114-icon-service-Azure-Stack.svg +1 -0
  1838. package/dist/viewer/azure-icons/iot/10121-icon-service-Azure-Cosmos-DB.svg +1 -0
  1839. package/dist/viewer/azure-icons/iot/10149-icon-service-Event-Hub-Clusters.svg +1 -0
  1840. package/dist/viewer/azure-icons/iot/10167-icon-service-Machine-Learning-Studio-Workspaces.svg +1 -0
  1841. package/dist/viewer/azure-icons/iot/10168-icon-service-Machine-Learning-Studio-Web-Service-Plans.svg +1 -0
  1842. package/dist/viewer/azure-icons/iot/10181-icon-service-Time-Series-Insights-Environments.svg +1 -0
  1843. package/dist/viewer/azure-icons/iot/10182-icon-service-IoT-Hub.svg +1 -0
  1844. package/dist/viewer/azure-icons/iot/10184-icon-service-IoT-Central-Applications.svg +1 -0
  1845. package/dist/viewer/azure-icons/iot/10185-icon-service-Azure-Maps-Accounts.svg +1 -0
  1846. package/dist/viewer/azure-icons/iot/10186-icon-service-IoT-Edge.svg +1 -0
  1847. package/dist/viewer/azure-icons/iot/10188-icon-service-Time-Series-Insights-Event-Sources.svg +1 -0
  1848. package/dist/viewer/azure-icons/iot/10192-icon-service-Time-Series-Insights-Access-Policies.svg +2 -0
  1849. package/dist/viewer/azure-icons/iot/10198-icon-service-Time-Series-Data-Sets.svg +1 -0
  1850. package/dist/viewer/azure-icons/iot/10203-icon-service-Windows10-Core-Services.svg +1 -0
  1851. package/dist/viewer/azure-icons/iot/10221-icon-service-Event-Grid-Subscriptions.svg +1 -0
  1852. package/dist/viewer/azure-icons/iot/10369-icon-service-Device-Provisioning-Services.svg +1 -0
  1853. package/dist/viewer/azure-icons/management + governance/00001-icon-service-Monitor.svg +1 -0
  1854. package/dist/viewer/azure-icons/management + governance/00002-icon-service-Alerts.svg +1 -0
  1855. package/dist/viewer/azure-icons/management + governance/00003-icon-service-Advisor.svg +1 -0
  1856. package/dist/viewer/azure-icons/management + governance/00004-icon-service-Cost-Management-and-Billing.svg +1 -0
  1857. package/dist/viewer/azure-icons/management + governance/00006-icon-service-Blueprints.svg +1 -0
  1858. package/dist/viewer/azure-icons/management + governance/00007-icon-service-Activity-Log.svg +1 -0
  1859. package/dist/viewer/azure-icons/management + governance/00008-icon-service-Diagnostics-Settings.svg +1 -0
  1860. package/dist/viewer/azure-icons/management + governance/00009-icon-service-Log-Analytics-Workspaces.svg +1 -0
  1861. package/dist/viewer/azure-icons/management + governance/00010-icon-service-Scheduler-Job-Collections.svg +1 -0
  1862. package/dist/viewer/azure-icons/management + governance/00011-icon-service-Compliance.svg +1 -0
  1863. package/dist/viewer/azure-icons/management + governance/00012-icon-service-Application-Insights.svg +1 -0
  1864. package/dist/viewer/azure-icons/management + governance/00014-icon-service-My-Customers.svg +1 -0
  1865. package/dist/viewer/azure-icons/management + governance/00017-icon-service-Recovery-Services-Vaults.svg +1 -0
  1866. package/dist/viewer/azure-icons/management + governance/00020-icon-service-Metrics.svg +1 -0
  1867. package/dist/viewer/azure-icons/management + governance/00021-icon-service-Solutions.svg +1 -0
  1868. package/dist/viewer/azure-icons/management + governance/00022-icon-service-Automation-Accounts.svg +1 -0
  1869. package/dist/viewer/azure-icons/management + governance/00024-icon-service-Operation-Log-(Classic).svg +1 -0
  1870. package/dist/viewer/azure-icons/management + governance/00025-icon-service-Service-Providers.svg +1 -0
  1871. package/dist/viewer/azure-icons/management + governance/00026-icon-service-Education.svg +1 -0
  1872. package/dist/viewer/azure-icons/management + governance/00027-icon-service-Service-Catalog-MAD.svg +1 -0
  1873. package/dist/viewer/azure-icons/management + governance/00408-icon-service-Intune-Trends.svg +1 -0
  1874. package/dist/viewer/azure-icons/management + governance/00471-icon-service-Azure-Lighthouse.svg +1 -0
  1875. package/dist/viewer/azure-icons/management + governance/00571-icon-service-Universal-Print.svg +1 -0
  1876. package/dist/viewer/azure-icons/management + governance/00756-icon-service-Azure-Arc.svg +1 -0
  1877. package/dist/viewer/azure-icons/management + governance/01710-icon-service-Arc-Machines.svg +1 -0
  1878. package/dist/viewer/azure-icons/management + governance/03366-icon-service-Resources-Provider.svg +1 -0
  1879. package/dist/viewer/azure-icons/management + governance/10303-icon-service-User-Privacy.svg +1 -0
  1880. package/dist/viewer/azure-icons/management + governance/10311-icon-service-Managed-Desktop.svg +1 -0
  1881. package/dist/viewer/azure-icons/management + governance/10313-icon-service-Managed-Applications-Center.svg +1 -0
  1882. package/dist/viewer/azure-icons/management + governance/10314-icon-service-Customer-Lockbox-for-Microsoft-Azure.svg +1 -0
  1883. package/dist/viewer/azure-icons/management + governance/10316-icon-service-Policy.svg +1 -0
  1884. package/dist/viewer/azure-icons/management + governance/10318-icon-service-Resource-Graph-Explorer.svg +1 -0
  1885. package/dist/viewer/azure-icons/management + governance/10450-icon-service-MachinesAzureArc.svg +1 -0
  1886. package/dist/viewer/azure-icons/menu/00787-icon-service-Keys.svg +2 -0
  1887. package/dist/viewer/azure-icons/migrate/00004-icon-service-Cost-Management-and-Billing.svg +1 -0
  1888. package/dist/viewer/azure-icons/migrate/00017-icon-service-Recovery-Services-Vaults.svg +1 -0
  1889. package/dist/viewer/azure-icons/migrate/00691-icon-service-Azure-Databox-Gateway.svg +1 -0
  1890. package/dist/viewer/azure-icons/migrate/10094-icon-service-Data-Box.svg +1 -0
  1891. package/dist/viewer/azure-icons/migrate/10095-icon-service-Azure-Stack-Edge.svg +1 -0
  1892. package/dist/viewer/azure-icons/migrate/10281-icon-service-Azure-Migrate.svg +1 -0
  1893. package/dist/viewer/azure-icons/migration/10133-icon-service-Azure-Database-Migration-Services.svg +1 -0
  1894. package/dist/viewer/azure-icons/mixed reality/00698-icon-service-Remote-Rendering.svg +1 -0
  1895. package/dist/viewer/azure-icons/mixed reality/10352-icon-service-Spatial-Anchor-Accounts.svg +1 -0
  1896. package/dist/viewer/azure-icons/mobile/03335-icon-service-Power-Platform.svg +1 -0
  1897. package/dist/viewer/azure-icons/mobile/10035-icon-service-App-Services.svg +1 -0
  1898. package/dist/viewer/azure-icons/mobile/10045-icon-service-Notification-Hubs.svg +1 -0
  1899. package/dist/viewer/azure-icons/monitor/00001-icon-service-Monitor.svg +1 -0
  1900. package/dist/viewer/azure-icons/monitor/00007-icon-service-Activity-Log.svg +1 -0
  1901. package/dist/viewer/azure-icons/monitor/00008-icon-service-Diagnostics-Settings.svg +1 -0
  1902. package/dist/viewer/azure-icons/monitor/00009-icon-service-Log-Analytics-Workspaces.svg +1 -0
  1903. package/dist/viewer/azure-icons/monitor/00012-icon-service-Application-Insights.svg +1 -0
  1904. package/dist/viewer/azure-icons/monitor/00020-icon-service-Metrics.svg +1 -0
  1905. package/dist/viewer/azure-icons/monitor/00438-icon-service-Azure-Monitors-for-SAP-Solutions.svg +1 -0
  1906. package/dist/viewer/azure-icons/monitor/00563-icon-service-Change-Analysis.svg +1 -0
  1907. package/dist/viewer/azure-icons/monitor/02189-icon-service-Azure-Workbooks.svg +1 -0
  1908. package/dist/viewer/azure-icons/monitor/10066-icon-service-Network-Watcher.svg +1 -0
  1909. package/dist/viewer/azure-icons/monitor/10832-icon-service-Auto-Scale.svg +1 -0
  1910. package/dist/viewer/azure-icons/networking/00056-icon-service-CDN-Profiles.svg +1 -0
  1911. package/dist/viewer/azure-icons/networking/00271-icon-service-Azure-Firewall-Manager.svg +1 -0
  1912. package/dist/viewer/azure-icons/networking/00272-icon-service-Azure-Firewall-Policy.svg +1 -0
  1913. package/dist/viewer/azure-icons/networking/00427-icon-service-Private-Link.svg +1 -0
  1914. package/dist/viewer/azure-icons/networking/00701-icon-service-IP-Groups.svg +1 -0
  1915. package/dist/viewer/azure-icons/networking/00860-icon-service-Virtual-WAN-Hub.svg +1 -0
  1916. package/dist/viewer/azure-icons/networking/01105-icon-service-Private-Link-Service.svg +1 -0
  1917. package/dist/viewer/azure-icons/networking/02145-icon-service-Resource-Management-Private-Link.svg +2 -0
  1918. package/dist/viewer/azure-icons/networking/02209-icon-service-Private-Link-Services.svg +1 -0
  1919. package/dist/viewer/azure-icons/networking/02302-icon-service-Load-Balancer-Hub.svg +1 -0
  1920. package/dist/viewer/azure-icons/networking/02422-icon-service-Bastions.svg +1 -0
  1921. package/dist/viewer/azure-icons/networking/02496-icon-service-Virtual-Router.svg +1 -0
  1922. package/dist/viewer/azure-icons/networking/02509-icon-service-Connected-Cache.svg +1 -0
  1923. package/dist/viewer/azure-icons/networking/02692-icon-service-Spot-VMSS.svg +1 -0
  1924. package/dist/viewer/azure-icons/networking/02695-icon-service-Spot-VM.svg +1 -0
  1925. package/dist/viewer/azure-icons/networking/02742-icon-service-Subnet.svg +1 -0
  1926. package/dist/viewer/azure-icons/networking/02882-icon-service-DNS-Private-Resolver.svg +1 -0
  1927. package/dist/viewer/azure-icons/networking/03311-icon-service-Azure-Communications-Gateway.svg +1 -0
  1928. package/dist/viewer/azure-icons/networking/03328-icon-service-Application-Gateway-Containers.svg +1 -0
  1929. package/dist/viewer/azure-icons/networking/03368-icon-service-DNS-Security-Policy.svg +1 -0
  1930. package/dist/viewer/azure-icons/networking/03459-icon-service-DNS-Multistack.svg +1 -0
  1931. package/dist/viewer/azure-icons/networking/03460-icon-service-ATM-Multistack.svg +1 -0
  1932. package/dist/viewer/azure-icons/networking/03461-icon-service-IP-Address-manager.svg +1 -0
  1933. package/dist/viewer/azure-icons/networking/10061-icon-service-Virtual-Networks.svg +1 -0
  1934. package/dist/viewer/azure-icons/networking/10062-icon-service-Load-Balancers.svg +1 -0
  1935. package/dist/viewer/azure-icons/networking/10063-icon-service-Virtual-Network-Gateways.svg +1 -0
  1936. package/dist/viewer/azure-icons/networking/10064-icon-service-DNS-Zones.svg +1 -0
  1937. package/dist/viewer/azure-icons/networking/10065-icon-service-Traffic-Manager-Profiles.svg +1 -0
  1938. package/dist/viewer/azure-icons/networking/10066-icon-service-Network-Watcher.svg +1 -0
  1939. package/dist/viewer/azure-icons/networking/10067-icon-service-Network-Security-Groups.svg +1 -0
  1940. package/dist/viewer/azure-icons/networking/10068-icon-service-Public-IP-Addresses-(Classic).svg +1 -0
  1941. package/dist/viewer/azure-icons/networking/10069-icon-service-Public-IP-Addresses.svg +1 -0
  1942. package/dist/viewer/azure-icons/networking/10070-icon-service-On-Premises-Data-Gateways.svg +1 -0
  1943. package/dist/viewer/azure-icons/networking/10071-icon-service-Route-Filters.svg +1 -0
  1944. package/dist/viewer/azure-icons/networking/10072-icon-service-DDoS-Protection-Plans.svg +1 -0
  1945. package/dist/viewer/azure-icons/networking/10073-icon-service-Front-Door-and-CDN-Profiles.svg +1 -0
  1946. package/dist/viewer/azure-icons/networking/10075-icon-service-Virtual-Networks-(Classic).svg +1 -0
  1947. package/dist/viewer/azure-icons/networking/10076-icon-service-Application-Gateways.svg +1 -0
  1948. package/dist/viewer/azure-icons/networking/10077-icon-service-Local-Network-Gateways.svg +1 -0
  1949. package/dist/viewer/azure-icons/networking/10079-icon-service-ExpressRoute-Circuits.svg +1 -0
  1950. package/dist/viewer/azure-icons/networking/10080-icon-service-Network-Interfaces.svg +1 -0
  1951. package/dist/viewer/azure-icons/networking/10081-icon-service-Connections.svg +1 -0
  1952. package/dist/viewer/azure-icons/networking/10082-icon-service-Route-Tables.svg +1 -0
  1953. package/dist/viewer/azure-icons/networking/10084-icon-service-Firewalls.svg +1 -0
  1954. package/dist/viewer/azure-icons/networking/10085-icon-service-Service-Endpoint-Policies.svg +1 -0
  1955. package/dist/viewer/azure-icons/networking/10310-icon-service-NAT.svg +1 -0
  1956. package/dist/viewer/azure-icons/networking/10353-icon-service-Virtual-WANs.svg +1 -0
  1957. package/dist/viewer/azure-icons/networking/10362-icon-service-Web-Application-Firewall-Policies(WAF).svg +1 -0
  1958. package/dist/viewer/azure-icons/networking/10365-icon-service-Proximity-Placement-Groups.svg +1 -0
  1959. package/dist/viewer/azure-icons/networking/10371-icon-service-Reserved-IP-Addresses-(Classic).svg +1 -0
  1960. package/dist/viewer/azure-icons/networking/10372-icon-service-Public-IP-Prefixes.svg +1 -0
  1961. package/dist/viewer/azure-icons/new icons/029029174-icon-service-Load-Balancer-Hub.svg +1 -0
  1962. package/dist/viewer/azure-icons/new icons/029109619-icon-service-Toolchain-Orchestrator.svg +1 -0
  1963. package/dist/viewer/azure-icons/new icons/029109619-icon-service-Workload-Orchestration.svg +1 -0
  1964. package/dist/viewer/azure-icons/new icons/029203566-icon-service-Data-Virtualization.svg +1 -0
  1965. package/dist/viewer/azure-icons/new icons/029273094-icon-service-Edge-Actions.svg +1 -0
  1966. package/dist/viewer/azure-icons/new icons/029455661-icon-service-FRD-QA.svg +1 -0
  1967. package/dist/viewer/azure-icons/new icons/029636048-icon-service-Landing-Zone.svg +1 -0
  1968. package/dist/viewer/azure-icons/new icons/029637767-icon-service-Service-Groups.svg +1 -0
  1969. package/dist/viewer/azure-icons/new icons/029797391-icon-service-Engage-Center-Connect.svg +1 -0
  1970. package/dist/viewer/azure-icons/new icons/030486388-icon-service-Storage-Hubs.svg +1 -0
  1971. package/dist/viewer/azure-icons/new icons/030777508 -icon-service-Service-Group-Relationships.svg +1 -0
  1972. package/dist/viewer/azure-icons/new icons/032130874-icon-service-Logic-Apps-Template.svg +1 -0
  1973. package/dist/viewer/azure-icons/new icons/033112809-icon-service-promethus.svg +1 -0
  1974. package/dist/viewer/azure-icons/new icons/03425-icon-service-external-id.svg +1 -0
  1975. package/dist/viewer/azure-icons/new icons/034251-icon-service-external-id-modified.svg +1 -0
  1976. package/dist/viewer/azure-icons/new icons/03495-icon-service-Azure-Consumption-Commitment.svg +1 -0
  1977. package/dist/viewer/azure-icons/new icons/03521-icon-service-Edge-Storage-Accelerator.svg +1 -0
  1978. package/dist/viewer/azure-icons/new icons/03565-icon-service-SQL-Database-Fleet-Manager.svg +1 -0
  1979. package/dist/viewer/azure-icons/new icons/03633-icon-service-Breeze.svg +1 -0
  1980. package/dist/viewer/azure-icons/new icons/03643-icon-service-Network-Foundation-Hub.svg +1 -0
  1981. package/dist/viewer/azure-icons/new icons/03650-icon-service-Network-Security-Hub.svg +1 -0
  1982. package/dist/viewer/azure-icons/new icons/03656-icon-service-Hybrid-Connectivity-Hub.svg +1 -0
  1983. package/dist/viewer/azure-icons/new icons/03675-icon-service-Azure-Managed-Redis.svg +1 -0
  1984. package/dist/viewer/azure-icons/new icons/03687-icon-service-AI-at-Edge.svg +1 -0
  1985. package/dist/viewer/azure-icons/new icons/03694-icon-service-VPNClientWindows.svg +1 -0
  1986. package/dist/viewer/azure-icons/new icons/03755-icon-service-Planetary-Computer-Pro.svg +1 -0
  1987. package/dist/viewer/azure-icons/other/00327-icon-service-Azure-Virtual-Desktop.svg +1 -0
  1988. package/dist/viewer/azure-icons/other/00412-icon-service-SSH-Keys.svg +1 -0
  1989. package/dist/viewer/azure-icons/other/00469-icon-service-Internet-Analyzer-Profiles.svg +1 -0
  1990. package/dist/viewer/azure-icons/other/00559-icon-service-Azure-Cloud-Shell.svg +1 -0
  1991. package/dist/viewer/azure-icons/other/00712-icon-service-Video-Analyzers.svg +1 -0
  1992. package/dist/viewer/azure-icons/other/00903-icon-service-ExpressRoute-Direct.svg +2 -0
  1993. package/dist/viewer/azure-icons/other/00913-icon-service-Cost-Export.svg +1 -0
  1994. package/dist/viewer/azure-icons/other/00968-icon-service-Azure-Communication-Services.svg +2 -0
  1995. package/dist/viewer/azure-icons/other/00970-icon-service-Peering-Service.svg +1 -0
  1996. package/dist/viewer/azure-icons/other/01001-icon-service-Azure-Network-Function-Manager-Functions.svg +1 -0
  1997. package/dist/viewer/azure-icons/other/01085-icon-service-Log-Analytics-Query-Pack.svg +1 -0
  1998. package/dist/viewer/azure-icons/other/01088-icon-service-Arc-Kubernetes.svg +1 -0
  1999. package/dist/viewer/azure-icons/other/01219-icon-service-Azure-VMware-Solution.svg +1 -0
  2000. package/dist/viewer/azure-icons/other/01285-icon-service-Peerings.svg +1 -0
  2001. package/dist/viewer/azure-icons/other/01757-icon-service-Dashboard-Hub.svg +2 -0
  2002. package/dist/viewer/azure-icons/other/01800-icon-service-Azure-Video-Indexer.svg +1 -0
  2003. package/dist/viewer/azure-icons/other/01846-icon-service-AVS-VM.svg +1 -0
  2004. package/dist/viewer/azure-icons/other/01848-icon-service-Arc-PostgreSQL .svg +1 -0
  2005. package/dist/viewer/azure-icons/other/01849-icon-service-Arc-SQL-Managed-Instance.svg +1 -0
  2006. package/dist/viewer/azure-icons/other/01850-icon-service-Arc-SQL-Server.svg +1 -0
  2007. package/dist/viewer/azure-icons/other/01857-icon-service-Data-Collection-Rules.svg +2 -0
  2008. package/dist/viewer/azure-icons/other/02200-icon-service-Resource-Mover.svg +2 -0
  2009. package/dist/viewer/azure-icons/other/02223-icon-service-Azure-Chaos-Studio.svg +1 -0
  2010. package/dist/viewer/azure-icons/other/02237-icon-service-Network-Managers.svg +2 -0
  2011. package/dist/viewer/azure-icons/other/02322-icon-service-Dedicated-HSM.svg +1 -0
  2012. package/dist/viewer/azure-icons/other/02323-icon-service-Modular-Data-Center.svg +2 -0
  2013. package/dist/viewer/azure-icons/other/02340-icon-service-Template-Specs.svg +2 -0
  2014. package/dist/viewer/azure-icons/other/02356-icon-service-Arc-Data-services.svg +2 -0
  2015. package/dist/viewer/azure-icons/other/02360-icon-service-Azure-Backup-Center.svg +1 -0
  2016. package/dist/viewer/azure-icons/other/02361-icon-service-Backup-Vault.svg +1 -0
  2017. package/dist/viewer/azure-icons/other/02475-icon-service-Device-Update-IoT-Hub.svg +1 -0
  2018. package/dist/viewer/azure-icons/other/02486-icon-service-Fiji.svg +1 -0
  2019. package/dist/viewer/azure-icons/other/02488-icon-service-Azure-Monitor-Dashboard.svg +1 -0
  2020. package/dist/viewer/azure-icons/other/02503-icon-service-SCVMM-Management-Servers.svg +1 -0
  2021. package/dist/viewer/azure-icons/other/02505-icon-service-Cloud-Services-(extended-support).svg +2 -0
  2022. package/dist/viewer/azure-icons/other/02507-icon-service-Azure-Support-Center-Blue.svg +1 -0
  2023. package/dist/viewer/azure-icons/other/02515-icon-service-Web-App-+-Database.svg +1 -0
  2024. package/dist/viewer/azure-icons/other/02518-icon-service-Azure-HPC-Workbenches.svg +1 -0
  2025. package/dist/viewer/azure-icons/other/02560-icon-service-Disk-Pool.svg +1 -0
  2026. package/dist/viewer/azure-icons/other/02561-icon-service-Bare-Metal-Infrastructure.svg +1 -0
  2027. package/dist/viewer/azure-icons/other/02573-icon-service-Connected-Vehicle-Platform.svg +1 -0
  2028. package/dist/viewer/azure-icons/other/02579-icon-service-Private-Endpoints.svg +1 -0
  2029. package/dist/viewer/azure-icons/other/02602-icon-service-Open-Supply-Chain-Platform.svg +1 -0
  2030. package/dist/viewer/azure-icons/other/02625-icon-service-Aquila.svg +1 -0
  2031. package/dist/viewer/azure-icons/other/02638-icon-service-Reserved-Capacity.svg +1 -0
  2032. package/dist/viewer/azure-icons/other/02654-icon-service-Custom-IP-Prefix.svg +1 -0
  2033. package/dist/viewer/azure-icons/other/02658-icon-service-FHIR-Service.svg +1 -0
  2034. package/dist/viewer/azure-icons/other/02660-icon-service-MedTech-Service.svg +1 -0
  2035. package/dist/viewer/azure-icons/other/02663-icon-service-Managed-Instance-Apache-Cassandra.svg +1 -0
  2036. package/dist/viewer/azure-icons/other/02668-icon-service-Confidential-Ledgers.svg +1 -0
  2037. package/dist/viewer/azure-icons/other/02681-icon-service-Entra-Identity-Licenses.svg +1 -0
  2038. package/dist/viewer/azure-icons/other/02691-icon-service-Test-Base.svg +1 -0
  2039. package/dist/viewer/azure-icons/other/02697-icon-service-Azure-Orbital.svg +1 -0
  2040. package/dist/viewer/azure-icons/other/02732-icon-service-Capacity-Reservation-Groups.svg +1 -0
  2041. package/dist/viewer/azure-icons/other/02733-icon-service-Windows-Notification-Services.svg +1 -0
  2042. package/dist/viewer/azure-icons/other/02740-icon-service-Azure-Network-Function-Manager.svg +1 -0
  2043. package/dist/viewer/azure-icons/other/02793-icon-service-Mission-Landing-Zone.svg +1 -0
  2044. package/dist/viewer/azure-icons/other/02794-icon-service-Mobile-Networks.svg +1 -0
  2045. package/dist/viewer/azure-icons/other/02805-icon-service-VM-App-Definitions.svg +1 -0
  2046. package/dist/viewer/azure-icons/other/02806-icon-service-VM-App-Versions.svg +1 -0
  2047. package/dist/viewer/azure-icons/other/02810-icon-service-Azure-Edge-Hardware-Center.svg +1 -0
  2048. package/dist/viewer/azure-icons/other/02819-icon-service-Resource-Guard.svg +1 -0
  2049. package/dist/viewer/azure-icons/other/02828-icon-service-Ceres.svg +1 -0
  2050. package/dist/viewer/azure-icons/other/02842-icon-service-Azurite.svg +1 -0
  2051. package/dist/viewer/azure-icons/other/02846-icon-service-Update-Management-Center.svg +1 -0
  2052. package/dist/viewer/azure-icons/other/02864-icon-service-Azure-Compute-Galleries.svg +1 -0
  2053. package/dist/viewer/azure-icons/other/02865-icon-service-Community-Images.svg +1 -0
  2054. package/dist/viewer/azure-icons/other/02866-icon-service-VM-Image-Version.svg +1 -0
  2055. package/dist/viewer/azure-icons/other/02880-icon-service-Savings-Plans.svg +1 -0
  2056. package/dist/viewer/azure-icons/other/02884-icon-service-Worker-Container-App.svg +1 -0
  2057. package/dist/viewer/azure-icons/other/02905-icon-service-Azure-Managed-Grafana.svg +1 -0
  2058. package/dist/viewer/azure-icons/other/02908-icon-service-Targets-Management.svg +1 -0
  2059. package/dist/viewer/azure-icons/other/02909-icon-service-Storage-Functions.svg +1 -0
  2060. package/dist/viewer/azure-icons/other/02922-icon-service-Sonic-Dash.svg +1 -0
  2061. package/dist/viewer/azure-icons/other/02931-icon-service-Compliance-Center.svg +1 -0
  2062. package/dist/viewer/azure-icons/other/02939-icon-service-Network-Security-Perimeters.svg +1 -0
  2063. package/dist/viewer/azure-icons/other/02944-icon-service-Azure-Load-Testing.svg +1 -0
  2064. package/dist/viewer/azure-icons/other/02949-icon-service-Virtual-Visits-Builder.svg +1 -0
  2065. package/dist/viewer/azure-icons/other/02951-icon-service-Azure-Quotas.svg +1 -0
  2066. package/dist/viewer/azure-icons/other/02989-icon-service-Container-Apps-Environments.svg +1 -0
  2067. package/dist/viewer/azure-icons/other/03071-icon-service-App-Compliance-Automation.svg +1 -0
  2068. package/dist/viewer/azure-icons/other/03089-icon-service-Virtual-Instance-for-SAP.svg +1 -0
  2069. package/dist/viewer/azure-icons/other/03090-icon-service-Azure-Center-for-SAP.svg +1 -0
  2070. package/dist/viewer/azure-icons/other/03091-icon-service-Azure-Storage-Mover.svg +1 -0
  2071. package/dist/viewer/azure-icons/other/03092-icon-service-Central-Service-Instance-For-SAP.svg +1 -0
  2072. package/dist/viewer/azure-icons/other/03134-icon-service-Kubernetes-Fleet-Manager.svg +1 -0
  2073. package/dist/viewer/azure-icons/other/03137-icon-service-Express-Route-Traffic-Collector.svg +1 -0
  2074. package/dist/viewer/azure-icons/other/03175-icon-service-Database-Instance-For-SAP.svg +1 -0
  2075. package/dist/viewer/azure-icons/other/03190-icon-service-Elastic-SAN.svg +1 -0
  2076. package/dist/viewer/azure-icons/other/03250-icon-service-Microsoft-Dev-Box.svg +1 -0
  2077. package/dist/viewer/azure-icons/other/03251-icon-service-Azure-Deployment-Environments.svg +1 -0
  2078. package/dist/viewer/azure-icons/other/03308-icon-service-Azure-Dev-Tunnels.svg +1 -0
  2079. package/dist/viewer/azure-icons/other/03314-icon-service-Azure-Sustainability.svg +1 -0
  2080. package/dist/viewer/azure-icons/other/03361-icon-service-IcM-Troubleshooting.svg +1 -0
  2081. package/dist/viewer/azure-icons/other/03365-icon-service-OSConfig.svg +1 -0
  2082. package/dist/viewer/azure-icons/other/03394-icon-service-Virtual-Enclaves.svg +1 -0
  2083. package/dist/viewer/azure-icons/other/03399-icon-service-AKS-Istio.svg +1 -0
  2084. package/dist/viewer/azure-icons/other/03402-icon-service-Defender-CM-Local-Manager.svg +1 -0
  2085. package/dist/viewer/azure-icons/other/03403-icon-service-Defender-External-Management.svg +1 -0
  2086. package/dist/viewer/azure-icons/other/03404-icon-service-Defender-Freezer-Monitor.svg +1 -0
  2087. package/dist/viewer/azure-icons/other/03405-icon-service-Defender-Historian.svg +1 -0
  2088. package/dist/viewer/azure-icons/other/03406-icon-service-Defender-HMI.svg +1 -0
  2089. package/dist/viewer/azure-icons/other/03407-icon-service-Defender-Marquee.svg +1 -0
  2090. package/dist/viewer/azure-icons/other/03408-icon-service-Defender-Robot-Controller.svg +1 -0
  2091. package/dist/viewer/azure-icons/other/03409-icon-service-Defender-Sensor.svg +1 -0
  2092. package/dist/viewer/azure-icons/other/03410-icon-service-Defender-Slot.svg +1 -0
  2093. package/dist/viewer/azure-icons/other/03411-icon-service-Defender-Web-Guiding-System.svg +1 -0
  2094. package/dist/viewer/azure-icons/other/03412-icon-service-Defender-DCS-Controller.svg +1 -0
  2095. package/dist/viewer/azure-icons/other/03413-icon-service-Defender-Distributer-Control-System.svg +1 -0
  2096. package/dist/viewer/azure-icons/other/03414-icon-service-Defender-Engineering-Station.svg +1 -0
  2097. package/dist/viewer/azure-icons/other/03415-icon-service-Defender-Industrial-Packaging-System.svg +1 -0
  2098. package/dist/viewer/azure-icons/other/03416-icon-service-Defender-Industrial-Printer.svg +1 -0
  2099. package/dist/viewer/azure-icons/other/03417-icon-service-Defender-Industrial-Scale-System.svg +1 -0
  2100. package/dist/viewer/azure-icons/other/03418-icon-service-Defender-Industrial-Robot.svg +1 -0
  2101. package/dist/viewer/azure-icons/other/03419-icon-service-Defender-Meter.svg +1 -0
  2102. package/dist/viewer/azure-icons/other/03420-icon-service-Defender-PLC.svg +1 -0
  2103. package/dist/viewer/azure-icons/other/03421-icon-service-Defender-Pneumatic-Device.svg +1 -0
  2104. package/dist/viewer/azure-icons/other/03422-icon-service-Defender-Programable-Board.svg +1 -0
  2105. package/dist/viewer/azure-icons/other/03423-icon-service-Defender-Relay.svg +1 -0
  2106. package/dist/viewer/azure-icons/other/03424-icon-service-Defender-RTU.svg +1 -0
  2107. package/dist/viewer/azure-icons/other/03468-icon-service-HDI-AKS-Cluster.svg +1 -0
  2108. package/dist/viewer/azure-icons/other/03528-icon-service-Monitor-Health-Models.svg +1 -0
  2109. package/dist/viewer/azure-icons/other/03563-icon-service-WAC-Installer.svg +1 -0
  2110. package/dist/viewer/azure-icons/other/10018-icon-service-Azure-A.svg +1 -0
  2111. package/dist/viewer/azure-icons/other/10077-icon-service-Local-Network-Gateways.svg +1 -0
  2112. package/dist/viewer/azure-icons/other/10117-icon-service-Edge-Management.svg +1 -0
  2113. package/dist/viewer/azure-icons/other/10139-icon-service-Instance-Pools.svg +1 -0
  2114. package/dist/viewer/azure-icons/other/10190-icon-service-Azure-Sphere.svg +1 -0
  2115. package/dist/viewer/azure-icons/other/10232-icon-service-App-Registrations.svg +1 -0
  2116. package/dist/viewer/azure-icons/other/10334-icon-service-Exchange-On-Premises-Access.svg +1 -0
  2117. package/dist/viewer/azure-icons/other/10355-icon-service-WAC.svg +1 -0
  2118. package/dist/viewer/azure-icons/other/10422-icon-service-AzureAttestation.svg +1 -0
  2119. package/dist/viewer/azure-icons/other/10778-icon-service-RTOS.svg +1 -0
  2120. package/dist/viewer/azure-icons/other/10846-icon-service-Web-Jobs.svg +1 -0
  2121. package/dist/viewer/azure-icons/security/00378-icon-service-Detonation.svg +1 -0
  2122. package/dist/viewer/azure-icons/security/02247-icon-service-Microsoft-Defender-for-IoT.svg +2 -0
  2123. package/dist/viewer/azure-icons/security/03336-icon-service-Microsoft-Defender-EASM.svg +1 -0
  2124. package/dist/viewer/azure-icons/security/03340-icon-service-Identity-Secure-Score.svg +1 -0
  2125. package/dist/viewer/azure-icons/security/03341-icon-service-Entra-Identity-Risky-Signins.svg +1 -0
  2126. package/dist/viewer/azure-icons/security/03342-icon-service-Entra-Identity-Risky-Users.svg +1 -0
  2127. package/dist/viewer/azure-icons/security/03344-icon-service-Multifactor-Authentication.svg +1 -0
  2128. package/dist/viewer/azure-icons/security/10229-icon-service-Azure-Information-Protection.svg +1 -0
  2129. package/dist/viewer/azure-icons/security/10233-icon-service-Conditional-Access.svg +1 -0
  2130. package/dist/viewer/azure-icons/security/10241-icon-service-Microsoft-Defender-for-Cloud.svg +1 -0
  2131. package/dist/viewer/azure-icons/security/10244-icon-service-Application-Security-Groups.svg +1 -0
  2132. package/dist/viewer/azure-icons/security/10245-icon-service-Key-Vaults.svg +1 -0
  2133. package/dist/viewer/azure-icons/security/10248-icon-service-Azure-Sentinel.svg +1 -0
  2134. package/dist/viewer/azure-icons/security/10433-icon-service-User-Settings.svg +1 -0
  2135. package/dist/viewer/azure-icons/security/10572-icon-service-ExtendedSecurityUpdates.svg +1 -0
  2136. package/dist/viewer/azure-icons/storage/00017-icon-service-Recovery-Services-Vaults.svg +1 -0
  2137. package/dist/viewer/azure-icons/storage/00691-icon-service-Azure-Databox-Gateway.svg +1 -0
  2138. package/dist/viewer/azure-icons/storage/00776-icon-service-Azure-HCP-Cache.svg +1 -0
  2139. package/dist/viewer/azure-icons/storage/03502-icon-service-Storage-Actions.svg +1 -0
  2140. package/dist/viewer/azure-icons/storage/03549-icon-service-Managed-File-Shares.svg +1 -0
  2141. package/dist/viewer/azure-icons/storage/10086-icon-service-Storage-Accounts.svg +1 -0
  2142. package/dist/viewer/azure-icons/storage/10087-icon-service-Storage-Accounts-(Classic).svg +1 -0
  2143. package/dist/viewer/azure-icons/storage/10089-icon-service-StorSimple-Device-Managers.svg +1 -0
  2144. package/dist/viewer/azure-icons/storage/10090-icon-service-Data-Lake-Storage-Gen1.svg +1 -0
  2145. package/dist/viewer/azure-icons/storage/10091-icon-service-Storage-Explorer.svg +1 -0
  2146. package/dist/viewer/azure-icons/storage/10092-icon-service-StorSimple-Data-Managers.svg +1 -0
  2147. package/dist/viewer/azure-icons/storage/10093-icon-service-Storage-Sync-Services.svg +1 -0
  2148. package/dist/viewer/azure-icons/storage/10094-icon-service-Data-Box.svg +1 -0
  2149. package/dist/viewer/azure-icons/storage/10095-icon-service-Azure-Stack-Edge.svg +1 -0
  2150. package/dist/viewer/azure-icons/storage/10096-icon-service-Azure-NetApp-Files.svg +1 -0
  2151. package/dist/viewer/azure-icons/storage/10097-icon-service-Data-Share-Invitations.svg +1 -0
  2152. package/dist/viewer/azure-icons/storage/10098-icon-service-Data-Shares.svg +1 -0
  2153. package/dist/viewer/azure-icons/storage/10100-icon-service-Import-Export-Jobs.svg +1 -0
  2154. package/dist/viewer/azure-icons/storage/10400-icon-service-Azure-Fileshares.svg +1 -0
  2155. package/dist/viewer/azure-icons/web/00046-icon-service-App-Service-Plans.svg +1 -0
  2156. package/dist/viewer/azure-icons/web/00049-icon-service-App-Service-Certificates.svg +1 -0
  2157. package/dist/viewer/azure-icons/web/00050-icon-service-App-Service-Domains.svg +1 -0
  2158. package/dist/viewer/azure-icons/web/01007-icon-service-Static-Apps.svg +1 -0
  2159. package/dist/viewer/azure-icons/web/03291-icon-service-API-Center.svg +1 -0
  2160. package/dist/viewer/azure-icons/web/03335-icon-service-Power-Platform.svg +1 -0
  2161. package/dist/viewer/azure-icons/web/03397-icon-service-App-Space.svg +1 -0
  2162. package/dist/viewer/azure-icons/web/03595-icon-service-App-Space-Component.svg +1 -0
  2163. package/dist/viewer/azure-icons/web/10035-icon-service-App-Services.svg +1 -0
  2164. package/dist/viewer/azure-icons/web/10042-icon-service-API-Management-Services.svg +1 -0
  2165. package/dist/viewer/azure-icons/web/10044-icon-service-Cognitive-Search.svg +1 -0
  2166. package/dist/viewer/azure-icons/web/10047-icon-service-App-Service-Environments.svg +1 -0
  2167. package/dist/viewer/azure-icons/web/10048-icon-service-API-Connections.svg +1 -0
  2168. package/dist/viewer/azure-icons/web/10052-icon-service-SignalR.svg +1 -0
  2169. package/dist/viewer/azure-icons/web/10053-icon-service-Notification-Hub-Namespaces.svg +1 -0
  2170. package/dist/viewer/azure-icons/web/10073-icon-service-Front-Door-and-CDN-Profiles.svg +1 -0
  2171. package/dist/viewer/azure-icons/web/10162-icon-service-Cognitive-Services.svg +1 -0
  2172. package/dist/viewer/azure-icons/web/10309-icon-service-Azure-Media-Service.svg +1 -0
  2173. package/dist/viewer/azure-icons/web/10370-icon-service-Azure-Spring-Apps.svg +1 -0
  2174. package/dist/viewer/azure-icons.json +5546 -0
  2175. package/dist/viewer/gcp-icons/cloud-functions.svg +4 -0
  2176. package/dist/viewer/gcp-icons/cloud-sql.svg +6 -0
  2177. package/dist/viewer/gcp-icons/cloud-storage.svg +6 -0
  2178. package/dist/viewer/gcp-icons/compute-engine.svg +8 -0
  2179. package/dist/viewer/gcp-icons/gke.svg +6 -0
  2180. package/dist/viewer/gcp-icons/google-cloud.svg +6 -0
  2181. package/dist/viewer/gcp-icons/load-balancing.svg +7 -0
  2182. package/dist/viewer/gcp-icons/memorystore.svg +4 -0
  2183. package/dist/viewer/gcp-icons/pubsub.svg +8 -0
  2184. package/dist/viewer/gcp-icons/services/SOURCE.md +14 -0
  2185. package/dist/viewer/gcp-icons/services/access_context_manager/access_context_manager.svg +1 -0
  2186. package/dist/viewer/gcp-icons/services/administration/administration.svg +21 -0
  2187. package/dist/viewer/gcp-icons/services/advanced_agent_modeling/advanced_agent_modeling.svg +12 -0
  2188. package/dist/viewer/gcp-icons/services/advanced_solutions_lab/advanced_solutions_lab.svg +1 -0
  2189. package/dist/viewer/gcp-icons/services/agent_assist/agent_assist.svg +1 -0
  2190. package/dist/viewer/gcp-icons/services/ai_hub/ai_hub.svg +1 -0
  2191. package/dist/viewer/gcp-icons/services/ai_platform/ai_platform.svg +1 -0
  2192. package/dist/viewer/gcp-icons/services/ai_platform_unified/ai_platform_unified.svg +1 -0
  2193. package/dist/viewer/gcp-icons/services/analytics_hub/analytics_hub.svg +1 -0
  2194. package/dist/viewer/gcp-icons/services/anthos/anthos.svg +17 -0
  2195. package/dist/viewer/gcp-icons/services/anthos_config_management/anthos_config_management.svg +1 -0
  2196. package/dist/viewer/gcp-icons/services/anthos_service_mesh/anthos_service_mesh.svg +5 -0
  2197. package/dist/viewer/gcp-icons/services/api/api.svg +17 -0
  2198. package/dist/viewer/gcp-icons/services/api_analytics/api_analytics.svg +1 -0
  2199. package/dist/viewer/gcp-icons/services/api_monetization/api_monetization.svg +1 -0
  2200. package/dist/viewer/gcp-icons/services/apigee_api_platform/apigee_api_platform.svg +1 -0
  2201. package/dist/viewer/gcp-icons/services/apigee_sense/apigee_sense.svg +1 -0
  2202. package/dist/viewer/gcp-icons/services/app_engine/app_engine.svg +1 -0
  2203. package/dist/viewer/gcp-icons/services/artifact_registry/artifact_registry.svg +30 -0
  2204. package/dist/viewer/gcp-icons/services/asset_inventory/asset_inventory.svg +1 -0
  2205. package/dist/viewer/gcp-icons/services/assured_workloads/assured_workloads.svg +1 -0
  2206. package/dist/viewer/gcp-icons/services/automl/automl.svg +1 -0
  2207. package/dist/viewer/gcp-icons/services/automl_natural_language/automl_natural_language.svg +11 -0
  2208. package/dist/viewer/gcp-icons/services/automl_tables/automl_tables.svg +1 -0
  2209. package/dist/viewer/gcp-icons/services/automl_translation/automl_translation.svg +1 -0
  2210. package/dist/viewer/gcp-icons/services/automl_video_intelligence/automl_video_intelligence.svg +1 -0
  2211. package/dist/viewer/gcp-icons/services/automl_vision/automl_vision.svg +1 -0
  2212. package/dist/viewer/gcp-icons/services/bare_metal_solutions/bare_metal_solutions.svg +1 -0
  2213. package/dist/viewer/gcp-icons/services/batch/batch.svg +3 -0
  2214. package/dist/viewer/gcp-icons/services/beyondcorp/beyondcorp.svg +1 -0
  2215. package/dist/viewer/gcp-icons/services/bigquery/bigquery.svg +1 -0
  2216. package/dist/viewer/gcp-icons/services/bigtable/bigtable.svg +1 -0
  2217. package/dist/viewer/gcp-icons/services/billing/billing.svg +19 -0
  2218. package/dist/viewer/gcp-icons/services/binary_authorization/binary_authorization.svg +1 -0
  2219. package/dist/viewer/gcp-icons/services/catalog/catalog.svg +14 -0
  2220. package/dist/viewer/gcp-icons/services/certificate_authority_service/certificate_authority_service.svg +13 -0
  2221. package/dist/viewer/gcp-icons/services/certificate_manager/certificate_manager.svg +1 -0
  2222. package/dist/viewer/gcp-icons/services/cloud_api_gateway/cloud_api_gateway.svg +7 -0
  2223. package/dist/viewer/gcp-icons/services/cloud_apis/cloud_apis.svg +1 -0
  2224. package/dist/viewer/gcp-icons/services/cloud_armor/cloud_armor.svg +1 -0
  2225. package/dist/viewer/gcp-icons/services/cloud_asset_inventory/cloud_asset_inventory.svg +9 -0
  2226. package/dist/viewer/gcp-icons/services/cloud_audit_logs/cloud_audit_logs.svg +1 -0
  2227. package/dist/viewer/gcp-icons/services/cloud_build/cloud_build.svg +1 -0
  2228. package/dist/viewer/gcp-icons/services/cloud_cdn/cloud_cdn.svg +1 -0
  2229. package/dist/viewer/gcp-icons/services/cloud_code/cloud_code.svg +1 -0
  2230. package/dist/viewer/gcp-icons/services/cloud_composer/cloud_composer.svg +1 -0
  2231. package/dist/viewer/gcp-icons/services/cloud_data_fusion/cloud_data_fusion.svg +1 -0
  2232. package/dist/viewer/gcp-icons/services/cloud_deploy/cloud_deploy.svg +5 -0
  2233. package/dist/viewer/gcp-icons/services/cloud_deployment_manager/cloud_deployment_manager.svg +1 -0
  2234. package/dist/viewer/gcp-icons/services/cloud_dns/cloud_dns.svg +1 -0
  2235. package/dist/viewer/gcp-icons/services/cloud_domains/cloud_domains.svg +1 -0
  2236. package/dist/viewer/gcp-icons/services/cloud_ekm/cloud_ekm.svg +5 -0
  2237. package/dist/viewer/gcp-icons/services/cloud_endpoints/cloud_endpoints.svg +1 -0
  2238. package/dist/viewer/gcp-icons/services/cloud_external_ip_addresses/cloud_external_ip_addresses.svg +1 -0
  2239. package/dist/viewer/gcp-icons/services/cloud_firewall_rules/cloud_firewall_rules.svg +1 -0
  2240. package/dist/viewer/gcp-icons/services/cloud_for_marketing/cloud_for_marketing.svg +5 -0
  2241. package/dist/viewer/gcp-icons/services/cloud_functions/cloud_functions.svg +1 -0
  2242. package/dist/viewer/gcp-icons/services/cloud_generic/cloud_generic.svg +5 -0
  2243. package/dist/viewer/gcp-icons/services/cloud_gpu/cloud_gpu.svg +1 -0
  2244. package/dist/viewer/gcp-icons/services/cloud_healthcare_api/cloud_healthcare_api.svg +1 -0
  2245. package/dist/viewer/gcp-icons/services/cloud_healthcare_marketplace/cloud_healthcare_marketplace.svg +11 -0
  2246. package/dist/viewer/gcp-icons/services/cloud_hsm/cloud_hsm.svg +1 -0
  2247. package/dist/viewer/gcp-icons/services/cloud_ids/cloud_ids.svg +1 -0
  2248. package/dist/viewer/gcp-icons/services/cloud_inference_api/cloud_inference_api.svg +1 -0
  2249. package/dist/viewer/gcp-icons/services/cloud_interconnect/cloud_interconnect.svg +1 -0
  2250. package/dist/viewer/gcp-icons/services/cloud_jobs_api/cloud_jobs_api.svg +1 -0
  2251. package/dist/viewer/gcp-icons/services/cloud_load_balancing/cloud_load_balancing.svg +1 -0
  2252. package/dist/viewer/gcp-icons/services/cloud_logging/cloud_logging.svg +1 -0
  2253. package/dist/viewer/gcp-icons/services/cloud_media_edge/cloud_media_edge.svg +1 -0
  2254. package/dist/viewer/gcp-icons/services/cloud_monitoring/cloud_monitoring.svg +1 -0
  2255. package/dist/viewer/gcp-icons/services/cloud_nat/cloud_nat.svg +1 -0
  2256. package/dist/viewer/gcp-icons/services/cloud_natural_language_api/cloud_natural_language_api.svg +1 -0
  2257. package/dist/viewer/gcp-icons/services/cloud_network/cloud_network.svg +1 -0
  2258. package/dist/viewer/gcp-icons/services/cloud_ops/cloud_ops.svg +17 -0
  2259. package/dist/viewer/gcp-icons/services/cloud_optimization_ai/cloud_optimization_ai.svg +24 -0
  2260. package/dist/viewer/gcp-icons/services/cloud_optimization_ai_-_fleet_routing_api/cloud_optimization_ai_-_fleet_routing_api.svg +32 -0
  2261. package/dist/viewer/gcp-icons/services/cloud_router/cloud_router.svg +1 -0
  2262. package/dist/viewer/gcp-icons/services/cloud_routes/cloud_routes.svg +1 -0
  2263. package/dist/viewer/gcp-icons/services/cloud_run/cloud_run.svg +1 -0
  2264. package/dist/viewer/gcp-icons/services/cloud_run_for_anthos/cloud_run_for_anthos.svg +1 -0
  2265. package/dist/viewer/gcp-icons/services/cloud_scheduler/cloud_scheduler.svg +1 -0
  2266. package/dist/viewer/gcp-icons/services/cloud_security_scanner/cloud_security_scanner.svg +1 -0
  2267. package/dist/viewer/gcp-icons/services/cloud_shell/cloud_shell.svg +1 -0
  2268. package/dist/viewer/gcp-icons/services/cloud_spanner/cloud_spanner.svg +1 -0
  2269. package/dist/viewer/gcp-icons/services/cloud_sql/cloud_sql.svg +1 -0
  2270. package/dist/viewer/gcp-icons/services/cloud_storage/cloud_storage.svg +1 -0
  2271. package/dist/viewer/gcp-icons/services/cloud_tasks/cloud_tasks.svg +1 -0
  2272. package/dist/viewer/gcp-icons/services/cloud_test_lab/cloud_test_lab.svg +1 -0
  2273. package/dist/viewer/gcp-icons/services/cloud_tpu/cloud_tpu.svg +1 -0
  2274. package/dist/viewer/gcp-icons/services/cloud_translation_api/cloud_translation_api.svg +1 -0
  2275. package/dist/viewer/gcp-icons/services/cloud_vision_api/cloud_vision_api.svg +1 -0
  2276. package/dist/viewer/gcp-icons/services/cloud_vpn/cloud_vpn.svg +1 -0
  2277. package/dist/viewer/gcp-icons/services/compute_engine/compute_engine.svg +1 -0
  2278. package/dist/viewer/gcp-icons/services/configuration_management/configuration_management.svg +1 -0
  2279. package/dist/viewer/gcp-icons/services/connectivity_test/connectivity_test.svg +6 -0
  2280. package/dist/viewer/gcp-icons/services/connectors/connectors.svg +1 -0
  2281. package/dist/viewer/gcp-icons/services/contact_center_ai/contact_center_ai.svg +1 -0
  2282. package/dist/viewer/gcp-icons/services/container_optimized_os/container_optimized_os.svg +1 -0
  2283. package/dist/viewer/gcp-icons/services/container_registry/container_registry.svg +1 -0
  2284. package/dist/viewer/gcp-icons/services/data_catalog/data_catalog.svg +1 -0
  2285. package/dist/viewer/gcp-icons/services/data_labeling/data_labeling.svg +1 -0
  2286. package/dist/viewer/gcp-icons/services/data_layers/data_layers.svg +1 -0
  2287. package/dist/viewer/gcp-icons/services/data_loss_prevention_api/data_loss_prevention_api.svg +1 -0
  2288. package/dist/viewer/gcp-icons/services/data_qna/data_qna.svg +1 -0
  2289. package/dist/viewer/gcp-icons/services/data_studio/data_studio.svg +1 -0
  2290. package/dist/viewer/gcp-icons/services/data_transfer/data_transfer.svg +1 -0
  2291. package/dist/viewer/gcp-icons/services/database_migration_service/database_migration_service.svg +1 -0
  2292. package/dist/viewer/gcp-icons/services/dataflow/dataflow.svg +1 -0
  2293. package/dist/viewer/gcp-icons/services/datalab/datalab.svg +5 -0
  2294. package/dist/viewer/gcp-icons/services/dataplex/dataplex.svg +8 -0
  2295. package/dist/viewer/gcp-icons/services/datapol/datapol.svg +1 -0
  2296. package/dist/viewer/gcp-icons/services/dataprep/dataprep.svg +1 -0
  2297. package/dist/viewer/gcp-icons/services/dataproc/dataproc.svg +1 -0
  2298. package/dist/viewer/gcp-icons/services/dataproc_metastore/dataproc_metastore.svg +1 -0
  2299. package/dist/viewer/gcp-icons/services/datashare/datashare.svg +9 -0
  2300. package/dist/viewer/gcp-icons/services/datastore/datastore.svg +1 -0
  2301. package/dist/viewer/gcp-icons/services/datastream/datastream.svg +16 -0
  2302. package/dist/viewer/gcp-icons/services/debugger/debugger.svg +21 -0
  2303. package/dist/viewer/gcp-icons/services/developer_portal/developer_portal.svg +1 -0
  2304. package/dist/viewer/gcp-icons/services/dialogflow/dialogflow.svg +1 -0
  2305. package/dist/viewer/gcp-icons/services/dialogflow_cx/dialogflow_cx.svg +1 -0
  2306. package/dist/viewer/gcp-icons/services/dialogflow_insights/dialogflow_insights.svg +1 -0
  2307. package/dist/viewer/gcp-icons/services/document_ai/document_ai.svg +1 -0
  2308. package/dist/viewer/gcp-icons/services/early_access_center/early_access_center.svg +1 -0
  2309. package/dist/viewer/gcp-icons/services/error_reporting/error_reporting.svg +1 -0
  2310. package/dist/viewer/gcp-icons/services/eventarc/eventarc.svg +1 -0
  2311. package/dist/viewer/gcp-icons/services/filestore/filestore.svg +1 -0
  2312. package/dist/viewer/gcp-icons/services/financial_services_marketplace/financial_services_marketplace.svg +11 -0
  2313. package/dist/viewer/gcp-icons/services/firestore/firestore.svg +1 -0
  2314. package/dist/viewer/gcp-icons/services/fleet_engine/fleet_engine.svg +1 -0
  2315. package/dist/viewer/gcp-icons/services/free_trial/free_trial.svg +18 -0
  2316. package/dist/viewer/gcp-icons/services/game_servers/game_servers.svg +27 -0
  2317. package/dist/viewer/gcp-icons/services/gce_systems_management/gce_systems_management.svg +5 -0
  2318. package/dist/viewer/gcp-icons/services/genomics/genomics.svg +1 -0
  2319. package/dist/viewer/gcp-icons/services/gke_on-prem/gke_on-prem.svg +1 -0
  2320. package/dist/viewer/gcp-icons/services/google_cloud_marketplace/google_cloud_marketplace.svg +25 -0
  2321. package/dist/viewer/gcp-icons/services/google_kubernetes_engine/google_kubernetes_engine.svg +1 -0
  2322. package/dist/viewer/gcp-icons/services/google_maps_platform/google_maps_platform.svg +12 -0
  2323. package/dist/viewer/gcp-icons/services/healthcare_nlp_api/healthcare_nlp_api.svg +1 -0
  2324. package/dist/viewer/gcp-icons/services/home/home.svg +13 -0
  2325. package/dist/viewer/gcp-icons/services/identity-aware_proxy/identity-aware_proxy.svg +1 -0
  2326. package/dist/viewer/gcp-icons/services/identity_and_access_management/identity_and_access_management.svg +1 -0
  2327. package/dist/viewer/gcp-icons/services/identity_platform/identity_platform.svg +1 -0
  2328. package/dist/viewer/gcp-icons/services/iot_core/iot_core.svg +1 -0
  2329. package/dist/viewer/gcp-icons/services/iot_edge/iot_edge.svg +1 -0
  2330. package/dist/viewer/gcp-icons/services/key_access_justifications/key_access_justifications.svg +1 -0
  2331. package/dist/viewer/gcp-icons/services/key_management_service/key_management_service.svg +1 -0
  2332. package/dist/viewer/gcp-icons/services/kuberun/kuberun.svg +13 -0
  2333. package/dist/viewer/gcp-icons/services/launcher/launcher.svg +18 -0
  2334. package/dist/viewer/gcp-icons/services/local_ssd/local_ssd.svg +5 -0
  2335. package/dist/viewer/gcp-icons/services/looker/looker.svg +15 -0
  2336. package/dist/viewer/gcp-icons/services/managed_service_for_microsoft_active_directory/managed_service_for_microsoft_active_directory.svg +1 -0
  2337. package/dist/viewer/gcp-icons/services/media_translation_api/media_translation_api.svg +1 -0
  2338. package/dist/viewer/gcp-icons/services/memorystore/memorystore.svg +1 -0
  2339. package/dist/viewer/gcp-icons/services/migrate_for_anthos/migrate_for_anthos.svg +5 -0
  2340. package/dist/viewer/gcp-icons/services/migrate_for_compute_engine/migrate_for_compute_engine.svg +5 -0
  2341. package/dist/viewer/gcp-icons/services/my_cloud/my_cloud.svg +26 -0
  2342. package/dist/viewer/gcp-icons/services/network_connectivity_center/network_connectivity_center.svg +1 -0
  2343. package/dist/viewer/gcp-icons/services/network_intelligence_center/network_intelligence_center.svg +5 -0
  2344. package/dist/viewer/gcp-icons/services/network_security/network_security.svg +1 -0
  2345. package/dist/viewer/gcp-icons/services/network_tiers/network_tiers.svg +1 -0
  2346. package/dist/viewer/gcp-icons/services/network_topology/network_topology.svg +5 -0
  2347. package/dist/viewer/gcp-icons/services/onboarding/onboarding.svg +17 -0
  2348. package/dist/viewer/gcp-icons/services/os_configuration_management/os_configuration_management.svg +5 -0
  2349. package/dist/viewer/gcp-icons/services/os_inventory_management/os_inventory_management.svg +11 -0
  2350. package/dist/viewer/gcp-icons/services/os_patch_management/os_patch_management.svg +5 -0
  2351. package/dist/viewer/gcp-icons/services/partner_interconnect/partner_interconnect.svg +1 -0
  2352. package/dist/viewer/gcp-icons/services/partner_portal/partner_portal.svg +21 -0
  2353. package/dist/viewer/gcp-icons/services/performance_dashboard/performance_dashboard.svg +5 -0
  2354. package/dist/viewer/gcp-icons/services/permissions/permissions.svg +14 -0
  2355. package/dist/viewer/gcp-icons/services/persistent_disk/persistent_disk.svg +1 -0
  2356. package/dist/viewer/gcp-icons/services/phishing_protection/phishing_protection.svg +1 -0
  2357. package/dist/viewer/gcp-icons/services/policy_analyzer/policy_analyzer.svg +5 -0
  2358. package/dist/viewer/gcp-icons/services/premium_network_tier/premium_network_tier.svg +1 -0
  2359. package/dist/viewer/gcp-icons/services/private_connectivity/private_connectivity.svg +1 -0
  2360. package/dist/viewer/gcp-icons/services/private_service_connect/private_service_connect.svg +1 -0
  2361. package/dist/viewer/gcp-icons/services/producer_portal/producer_portal.svg +13 -0
  2362. package/dist/viewer/gcp-icons/services/profiler/profiler.svg +1 -0
  2363. package/dist/viewer/gcp-icons/services/project/project.svg +20 -0
  2364. package/dist/viewer/gcp-icons/services/pubsub/pubsub.svg +1 -0
  2365. package/dist/viewer/gcp-icons/services/quantum_engine/quantum_engine.svg +1 -0
  2366. package/dist/viewer/gcp-icons/services/quotas/quotas.svg +1 -0
  2367. package/dist/viewer/gcp-icons/services/real-world_insights/real-world_insights.svg +11 -0
  2368. package/dist/viewer/gcp-icons/services/recommendations_ai/recommendations_ai.svg +1 -0
  2369. package/dist/viewer/gcp-icons/services/release_notes/release_notes.svg +1 -0
  2370. package/dist/viewer/gcp-icons/services/retail_api/retail_api.svg +1 -0
  2371. package/dist/viewer/gcp-icons/services/risk_manager/risk_manager.svg +1 -0
  2372. package/dist/viewer/gcp-icons/services/runtime_config/runtime_config.svg +1 -0
  2373. package/dist/viewer/gcp-icons/services/secret_manager/secret_manager.svg +7 -0
  2374. package/dist/viewer/gcp-icons/services/security/security.svg +12 -0
  2375. package/dist/viewer/gcp-icons/services/security_command_center/security_command_center.svg +1 -0
  2376. package/dist/viewer/gcp-icons/services/security_health_advisor/security_health_advisor.svg +39 -0
  2377. package/dist/viewer/gcp-icons/services/security_key_enforcement/security_key_enforcement.svg +1 -0
  2378. package/dist/viewer/gcp-icons/services/service_discovery/service_discovery.svg +1 -0
  2379. package/dist/viewer/gcp-icons/services/speech-to-text/speech-to-text.svg +1 -0
  2380. package/dist/viewer/gcp-icons/services/stackdriver/stackdriver.svg +1 -0
  2381. package/dist/viewer/gcp-icons/services/standard_network_tier/standard_network_tier.svg +5 -0
  2382. package/dist/viewer/gcp-icons/services/stream_suite/stream_suite.svg +11 -0
  2383. package/dist/viewer/gcp-icons/services/support/support.svg +12 -0
  2384. package/dist/viewer/gcp-icons/services/tensorflow_enterprise/tensorflow_enterprise.svg +5 -0
  2385. package/dist/viewer/gcp-icons/services/text-to-speech/text-to-speech.svg +1 -0
  2386. package/dist/viewer/gcp-icons/services/tools_for_powershell/tools_for_powershell.svg +1 -0
  2387. package/dist/viewer/gcp-icons/services/trace/trace.svg +1 -0
  2388. package/dist/viewer/gcp-icons/services/traffic_director/traffic_director.svg +1 -0
  2389. package/dist/viewer/gcp-icons/services/transfer/transfer.svg +7 -0
  2390. package/dist/viewer/gcp-icons/services/transfer_appliance/transfer_appliance.svg +1 -0
  2391. package/dist/viewer/gcp-icons/services/user_preferences/user_preferences.svg +19 -0
  2392. package/dist/viewer/gcp-icons/services/vertexai/vertexai.svg +1 -0
  2393. package/dist/viewer/gcp-icons/services/video_intelligence_api/video_intelligence_api.svg +1 -0
  2394. package/dist/viewer/gcp-icons/services/virtual_private_cloud/virtual_private_cloud.svg +1 -0
  2395. package/dist/viewer/gcp-icons/services/visual_inspection/visual_inspection.svg +1 -0
  2396. package/dist/viewer/gcp-icons/services/vmware_engine/vmware_engine.svg +1 -0
  2397. package/dist/viewer/gcp-icons/services/web_risk/web_risk.svg +1 -0
  2398. package/dist/viewer/gcp-icons/services/web_security_scanner/web_security_scanner.svg +1 -0
  2399. package/dist/viewer/gcp-icons/services/workflows/workflows.svg +1 -0
  2400. package/dist/viewer/gcp-icons/services/workload_identity_pool/workload_identity_pool.svg +1 -0
  2401. package/dist/viewer/gcp-icons/vpc-network.svg +10 -0
  2402. package/dist/viewer/gcp-icons.json +1730 -0
  2403. package/dist/viewer/icons/icon-black-256.png +0 -0
  2404. package/dist/viewer/icons/icon-black-512.png +0 -0
  2405. package/dist/viewer/icons/icon-blue-128.png +0 -0
  2406. package/dist/viewer/icons/icon-blue-256.png +0 -0
  2407. package/dist/viewer/icons/icon-blue-512.png +0 -0
  2408. package/dist/viewer/icons/icon-dark-128.png +0 -0
  2409. package/dist/viewer/icons/icon-dark-256.png +0 -0
  2410. package/dist/viewer/icons/icon-dark-32.png +0 -0
  2411. package/dist/viewer/icons/icon-dark-512.png +0 -0
  2412. package/dist/viewer/icons/icon-dark-64.png +0 -0
  2413. package/dist/viewer/icons/icon-white-128.png +0 -0
  2414. package/dist/viewer/icons/icon-white-256.png +0 -0
  2415. package/dist/viewer/icons/icon-white-512.png +0 -0
  2416. package/dist/viewer/icons/logo-dark@2x.png +0 -0
  2417. package/dist/viewer/icons/logo-light@2x.png +0 -0
  2418. package/dist/viewer/icons/logo-stacked-dark@2x.png +0 -0
  2419. package/dist/viewer/icons/mark-mono-black-256.png +0 -0
  2420. package/dist/viewer/icons/mark-mono-white-256.png +0 -0
  2421. package/dist/viewer/icons/mark-on-dark-256.png +0 -0
  2422. package/dist/viewer/icons/mark-on-light-256.png +0 -0
  2423. package/dist/viewer/icons/og-card-1200x630.png +0 -0
  2424. package/dist/viewer/index.html +56 -0
  2425. package/dist/viewer/kubernetes-icons/NOTICE.md +16 -0
  2426. package/dist/viewer/kubernetes-icons/control-plane/api.svg +97 -0
  2427. package/dist/viewer/kubernetes-icons/control-plane/c-c-m.svg +97 -0
  2428. package/dist/viewer/kubernetes-icons/control-plane/c-m.svg +97 -0
  2429. package/dist/viewer/kubernetes-icons/control-plane/k-proxy.svg +97 -0
  2430. package/dist/viewer/kubernetes-icons/control-plane/kubelet.svg +97 -0
  2431. package/dist/viewer/kubernetes-icons/control-plane/sched.svg +97 -0
  2432. package/dist/viewer/kubernetes-icons/infrastructure/control-plane.svg +109 -0
  2433. package/dist/viewer/kubernetes-icons/infrastructure/etcd.svg +102 -0
  2434. package/dist/viewer/kubernetes-icons/infrastructure/node.svg +97 -0
  2435. package/dist/viewer/kubernetes-icons/resources/c-role.svg +114 -0
  2436. package/dist/viewer/kubernetes-icons/resources/cm.svg +154 -0
  2437. package/dist/viewer/kubernetes-icons/resources/crb.svg +96 -0
  2438. package/dist/viewer/kubernetes-icons/resources/crd.svg +96 -0
  2439. package/dist/viewer/kubernetes-icons/resources/cronjob.svg +106 -0
  2440. package/dist/viewer/kubernetes-icons/resources/deploy.svg +105 -0
  2441. package/dist/viewer/kubernetes-icons/resources/ds.svg +120 -0
  2442. package/dist/viewer/kubernetes-icons/resources/ep.svg +202 -0
  2443. package/dist/viewer/kubernetes-icons/resources/group.svg +96 -0
  2444. package/dist/viewer/kubernetes-icons/resources/hpa.svg +116 -0
  2445. package/dist/viewer/kubernetes-icons/resources/ing.svg +97 -0
  2446. package/dist/viewer/kubernetes-icons/resources/job.svg +144 -0
  2447. package/dist/viewer/kubernetes-icons/resources/limits.svg +109 -0
  2448. package/dist/viewer/kubernetes-icons/resources/netpol.svg +97 -0
  2449. package/dist/viewer/kubernetes-icons/resources/ns.svg +98 -0
  2450. package/dist/viewer/kubernetes-icons/resources/pod.svg +116 -0
  2451. package/dist/viewer/kubernetes-icons/resources/psp.svg +121 -0
  2452. package/dist/viewer/kubernetes-icons/resources/pv.svg +110 -0
  2453. package/dist/viewer/kubernetes-icons/resources/pvc.svg +96 -0
  2454. package/dist/viewer/kubernetes-icons/resources/quota.svg +107 -0
  2455. package/dist/viewer/kubernetes-icons/resources/rb.svg +137 -0
  2456. package/dist/viewer/kubernetes-icons/resources/role.svg +122 -0
  2457. package/dist/viewer/kubernetes-icons/resources/rs.svg +115 -0
  2458. package/dist/viewer/kubernetes-icons/resources/sa.svg +97 -0
  2459. package/dist/viewer/kubernetes-icons/resources/sc.svg +140 -0
  2460. package/dist/viewer/kubernetes-icons/resources/secret.svg +141 -0
  2461. package/dist/viewer/kubernetes-icons/resources/sts.svg +133 -0
  2462. package/dist/viewer/kubernetes-icons/resources/svc.svg +130 -0
  2463. package/dist/viewer/kubernetes-icons/resources/user.svg +96 -0
  2464. package/dist/viewer/kubernetes-icons/resources/vol.svg +110 -0
  2465. package/dist/viewer/kubernetes-icons.json +314 -0
  2466. package/dist/viewer/placeholder.svg +1 -0
  2467. package/package.json +173 -1
package/dist/bin.mjs ADDED
@@ -0,0 +1,4583 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { Command, InvalidArgumentError, Option } from "@commander-js/extra-typings";
4
+ import { checkbox, confirm, input, select } from "@inquirer/prompts";
5
+ import { AGENT_LABELS, AGENT_NAMES, AgentError, AgentLimitError, agentTool, analyzeReview, fetchReview, fileIconPath, lensSettingsSchema, listRuns, readLocalReview, readRun, readSettings, runAgent, saveSettings } from "@uigraph/lens/agents";
6
+ import { LogLevels, consola } from "consola";
7
+ import { execFile, spawn } from "node:child_process";
8
+ import fs from "node:fs/promises";
9
+ import os from "node:os";
10
+ import path from "node:path";
11
+ import { inspect, promisify } from "node:util";
12
+ import open from "open";
13
+ import pc from "picocolors";
14
+ import fs$1, { existsSync, readFileSync, readdirSync } from "node:fs";
15
+ import { AstToUiConverter, DynamoEditorSchema, MongoEditorSchema, SqlToAstParser, contextSchema, convertDynamoSchemaToAst, convertMermaidToReactFlow, convertMermaidToReactFlowWithContext, convertMongoSchemaToAst, convertReactFlowToC4UiGraph, convertReactFlowToSequenceUiGraph, convertUiGraphToMermaid, isC4ReactFlowDiagram, isSequenceDiagram } from "@uigraph/sdk";
16
+ import { GraphQLError, Kind, NoSchemaIntrospectionCustomRule, buildSchema, execute, getOperationAST, parse, print, specifiedRules, validate } from "graphql";
17
+ import { createHash, randomUUID } from "node:crypto";
18
+ import { glob } from "tinyglobby";
19
+ import { isMap, isScalar, isSeq, parse as parse$1, parseDocument, stringify, visit } from "yaml";
20
+ import { z } from "zod";
21
+ import { setTimeout as setTimeout$1 } from "node:timers/promises";
22
+ import http from "node:http";
23
+ import { fileURLToPath } from "node:url";
24
+ //#region src/artifacts/yaml-edit.ts
25
+ function applyEdits(source, edits) {
26
+ return [...edits].sort((a, b) => b.start - a.start).reduce((text, edit) => text.slice(0, edit.start) + edit.text + text.slice(edit.end), source);
27
+ }
28
+ async function readYaml(root, file) {
29
+ const { realPath } = await resolveRepositoryFile(root, file);
30
+ const source = await fs.readFile(realPath, "utf8");
31
+ return {
32
+ source,
33
+ document: parseDocument(source)
34
+ };
35
+ }
36
+ function nodeRange(node, what) {
37
+ const range = node?.range;
38
+ if (range === void 0 || range === null) throw new Error(`Cannot locate ${what} in the YAML file`);
39
+ return range;
40
+ }
41
+ function column(source, position) {
42
+ return position - (source.lastIndexOf("\n", position - 1) + 1);
43
+ }
44
+ function lineStart(source, position) {
45
+ return source.lastIndexOf("\n", position - 1) + 1;
46
+ }
47
+ function renderBlock(value, indent) {
48
+ return stringify(value, { lineWidth: 0 }).trimEnd().split("\n").map((line, index) => index === 0 ? line : " ".repeat(indent) + line).join("\n");
49
+ }
50
+ function replaceScalar(node, value) {
51
+ if (!isScalar(node)) throw new Error(`Expected a YAML scalar to replace with "${value}"`);
52
+ const [start, end] = nodeRange(node, "a scalar");
53
+ return {
54
+ start,
55
+ end,
56
+ text: stringify(value, { lineWidth: 0 }).trimEnd()
57
+ };
58
+ }
59
+ function replaceItem(source, node, value) {
60
+ if (!isMap(node) || node.flow === true) throw new Error("Expected a block mapping in the YAML file");
61
+ const [start, end] = nodeRange(node, "an entry");
62
+ const trailingNewline = source[end - 1] === "\n" ? "\n" : "";
63
+ return {
64
+ start,
65
+ end,
66
+ text: renderBlock(value, column(source, start)) + trailingNewline
67
+ };
68
+ }
69
+ function setField(source, map, key, value) {
70
+ if (!isMap(map) || map.flow === true) throw new Error(`Expected a block mapping to set "${key}"`);
71
+ const existing = map.get(key, true);
72
+ if (isScalar(existing) && (typeof value === "string" || typeof value === "number")) return replaceScalar(existing, value);
73
+ if (existing !== void 0) throw new Error(`Cannot replace the "${key}" field in place`);
74
+ const first = map.items[0]?.key;
75
+ if (first === void 0) throw new Error(`Cannot add "${key}" to an empty mapping`);
76
+ const indent = column(source, nodeRange(first, "a key")[0]);
77
+ const end = nodeRange(map, "a mapping")[1];
78
+ return {
79
+ start: end,
80
+ end,
81
+ text: `${source[end - 1] === "\n" ? "" : "\n"}${" ".repeat(indent)}${renderBlock({ [key]: value }, indent)}\n`
82
+ };
83
+ }
84
+ function appendItem(source, document, path, value) {
85
+ const sequence = document.getIn(path, true);
86
+ if (isSeq(sequence) && sequence.flow !== true) {
87
+ const range = nodeRange(sequence, path.join("."));
88
+ const indent = column(source, range[0]);
89
+ const needsNewline = source[range[1] - 1] === "\n" ? "" : "\n";
90
+ return {
91
+ start: range[1],
92
+ end: range[1],
93
+ text: `${needsNewline}${" ".repeat(indent)}- ${renderBlock(value, indent + 2)}\n`
94
+ };
95
+ }
96
+ const key = path.at(-1);
97
+ if (typeof key !== "string") throw new Error(`Cannot add an item to ${path.join(".")}`);
98
+ const parent = path.length === 1 ? document.contents : document.getIn(path.slice(0, -1), true);
99
+ if (!isMap(parent) || parent.flow === true) throw new Error(`Cannot add an item to ${path.join(".")}`);
100
+ const pair = parent.items.find((item) => isScalar(item.key) && item.key.value === key);
101
+ if (pair !== void 0) {
102
+ if (!isSeq(pair.value) || pair.value.items.length > 0) throw new Error(`${path.join(".")} must be a list`);
103
+ const keyColumn = column(source, nodeRange(pair.key, key)[0]);
104
+ const [valueStart, end] = nodeRange(pair.value, key);
105
+ return {
106
+ start: source.lastIndexOf(":", valueStart) + 1,
107
+ end,
108
+ text: `\n${" ".repeat(keyColumn + 2)}- ${renderBlock(value, keyColumn + 4)}`
109
+ };
110
+ }
111
+ return setField(source, parent, key, [value]);
112
+ }
113
+ function removeItem(source, document, path, index) {
114
+ const sequence = document.getIn(path, true);
115
+ if (!isSeq(sequence) || sequence.flow === true) throw new Error(`${path.join(".")} must be a block list`);
116
+ const item = sequence.items[index];
117
+ if (item === void 0) throw new Error(`${path.join(".")} has no item ${index}`);
118
+ if (sequence.items.length > 1) {
119
+ const [start, , end] = nodeRange(item, "an item");
120
+ return {
121
+ start: lineStart(source, start),
122
+ end,
123
+ text: ""
124
+ };
125
+ }
126
+ const [start, , end] = nodeRange(sequence, path.join("."));
127
+ return {
128
+ start: source.lastIndexOf(":", start) + 1,
129
+ end,
130
+ text: " []\n"
131
+ };
132
+ }
133
+ function findItemIndex(document, path, name) {
134
+ const sequence = document.getIn(path, true);
135
+ if (!isSeq(sequence)) throw new Error(`${path.join(".")} must be a list`);
136
+ const index = sequence.items.findIndex((item) => isMap(item) && item.get("name") === name);
137
+ if (index === -1) throw new Error(`${path.join(".")} has no entry named "${name}"`);
138
+ return index;
139
+ }
140
+ //#endregion
141
+ //#region src/artifacts/docs.ts
142
+ const DOC_EXTENSIONS$1 = {
143
+ pdf: ".pdf",
144
+ html: ".html",
145
+ markdown: ".md",
146
+ txt: ".txt"
147
+ };
148
+ async function loadValid(root, configFile) {
149
+ const { db, errors } = await loadArtifacts(root, configFile);
150
+ if (errors.length > 0) throw new Error(`The .uigraph artifacts are invalid:\n${errors.join("\n")}`);
151
+ return db;
152
+ }
153
+ async function exists(file) {
154
+ return fs.lstat(file).then(() => true, (error) => {
155
+ if (error.code === "ENOENT") return false;
156
+ throw error;
157
+ });
158
+ }
159
+ async function createDoc(root, configFile, file, input, data) {
160
+ const db = await loadValid(root, configFile);
161
+ if ([...db.docs, ...db.standaloneDocs].some((doc) => doc.file === file && doc.entry.name === input.name)) throw new Error(`Another doc in ${file} is named "${input.name}"`);
162
+ const extension = DOC_EXTENSIONS$1[input.fileType];
163
+ if (extension === void 0) throw new Error(`Unsupported doc type "${input.fileType}"`);
164
+ const base = slugify(input.name);
165
+ if (base === "") throw new Error("The doc name must contain a letter or digit");
166
+ let docPath = `.uigraph/docs/${base}${extension}`;
167
+ for (let suffix = 2; await exists(path.join(root, docPath)); suffix++) docPath = `.uigraph/docs/${base}-${suffix}${extension}`;
168
+ await writeArtifactFile(root, docPath, data);
169
+ const { source, document } = await readYaml(root, file);
170
+ await writeArtifactFile(root, file, applyEdits(source, [appendItem(source, document, ["docs"], {
171
+ name: input.name,
172
+ path: docPath,
173
+ fileType: input.fileType,
174
+ ...input.description === "" ? {} : { description: input.description }
175
+ })]));
176
+ return docPath;
177
+ }
178
+ async function deleteDoc(root, configFile, file, name) {
179
+ const db = await loadValid(root, configFile);
180
+ const allDocs = [...db.docs, ...db.standaloneDocs];
181
+ const doc = allDocs.find((d) => d.file === file && d.entry.name === name);
182
+ if (doc === void 0) throw new Error(`No doc named "${name}" in ${file}`);
183
+ const { source, document } = await readYaml(root, file);
184
+ await writeArtifactFile(root, file, applyEdits(source, [removeItem(source, document, ["docs"], findItemIndex(document, ["docs"], name))]));
185
+ const stillUsed = allDocs.some((d) => d !== doc && d.entry.path === doc.entry.path);
186
+ if (isArtifactPath(doc.entry.path) && !stillUsed) await deleteArtifactFile(root, doc.entry.path);
187
+ }
188
+ //#endregion
189
+ //#region src/artifacts/maps.ts
190
+ const IMAGE_EXTENSIONS = {
191
+ "image/png": ".png",
192
+ "image/jpeg": ".jpg",
193
+ "image/webp": ".webp",
194
+ "image/gif": ".gif"
195
+ };
196
+ async function createMap(root, configFile, file, input) {
197
+ await loadValid(root, configFile);
198
+ const { source, document } = await readYaml(root, file);
199
+ await writeArtifactFile(root, file, applyEdits(source, [appendItem(source, document, ["maps"], {
200
+ name: input.name,
201
+ ...input.description === "" ? {} : { description: input.description }
202
+ })]));
203
+ }
204
+ async function editMap(root, configFile, file, name, edit) {
205
+ await loadValid(root, configFile);
206
+ const { source, document } = await readYaml(root, file);
207
+ const index = findItemIndex(document, ["maps"], name);
208
+ const node = document.getIn(["maps", index], true);
209
+ if (!isMap(node)) throw new Error(`maps[${name}] must be a mapping`);
210
+ const next = edit(node.toJSON());
211
+ await writeArtifactFile(root, file, applyEdits(source, [next === null ? removeItem(source, document, ["maps"], index) : replaceItem(source, node, next)]));
212
+ }
213
+ async function editCanvas(root, edit) {
214
+ const present = await exists(path.join(root, CANVAS_FILE));
215
+ let canvas = {};
216
+ if (present) {
217
+ const { realPath } = await resolveRepositoryFile(root, CANVAS_FILE);
218
+ canvas = canvasFileSchema.parse(JSON.parse(await fs.readFile(realPath, "utf8")));
219
+ }
220
+ const before = JSON.stringify(canvas);
221
+ edit(canvas);
222
+ if (JSON.stringify(canvas) === before) return;
223
+ if (Object.keys(canvas).length === 0) {
224
+ if (present) await deleteArtifactFile(root, CANVAS_FILE);
225
+ return;
226
+ }
227
+ await writeArtifactFile(root, CANVAS_FILE, `${JSON.stringify(canvas, null, 2)}\n`);
228
+ }
229
+ async function retargetLinks(root, from, to) {
230
+ await editCanvas(root, (canvas) => {
231
+ for (const mapCanvas of Object.values(canvas)) for (const frameCanvas of Object.values(mapCanvas.frames ?? {})) {
232
+ if (frameCanvas.links === void 0) continue;
233
+ frameCanvas.links = frameCanvas.links.flatMap((link) => {
234
+ if (!(link.map === from.map && (from.frame === void 0 || link.frame === from.frame))) return [link];
235
+ if (to === null) return [];
236
+ return [{
237
+ ...link,
238
+ map: to.map,
239
+ ...from.frame === void 0 ? {} : { frame: to.frame }
240
+ }];
241
+ });
242
+ }
243
+ });
244
+ }
245
+ async function writeFrameImage(root, mapName, frameName, upload) {
246
+ const extension = IMAGE_EXTENSIONS[upload.contentType];
247
+ if (extension === void 0) throw new Error("Frame images must be PNG, JPEG, WebP or GIF files");
248
+ const directory = `.uigraph/maps/${slugify(mapName)}`;
249
+ const base = slugify(frameName);
250
+ let imagePath = `${directory}/${base}${extension}`;
251
+ for (let suffix = 2; await exists(path.join(root, imagePath)); suffix++) imagePath = `${directory}/${base}-${suffix}${extension}`;
252
+ await writeArtifactFile(root, imagePath, upload.data);
253
+ return imagePath;
254
+ }
255
+ async function deleteUnusedImages(root, configFile, imagePaths) {
256
+ const db = await loadValid(root, configFile);
257
+ const used = new Set(db.maps.flatMap((map) => map.frames.flatMap(({ frame }) => frame.screenshotAssetId ?? [])));
258
+ for (const imagePath of imagePaths) if (isArtifactPath(imagePath) && !used.has(imagePath)) await deleteArtifactFile(root, imagePath);
259
+ }
260
+ //#endregion
261
+ //#region src/artifacts/diagram-images.ts
262
+ const DIAGRAM_IMAGE_EXTENSIONS = {
263
+ ...IMAGE_EXTENSIONS,
264
+ "image/svg+xml": ".svg"
265
+ };
266
+ function imageDirectory(diagramPath) {
267
+ return `${path.posix.dirname(diagramPath)}/images`;
268
+ }
269
+ async function listDiagramImages(root, diagramPath) {
270
+ const directory = imageDirectory(diagramPath);
271
+ const entries = await fs.readdir(path.join(root, directory), { withFileTypes: true }).catch((error) => {
272
+ if (error.code === "ENOENT") return [];
273
+ throw error;
274
+ });
275
+ const extensions = new Set(Object.values(DIAGRAM_IMAGE_EXTENSIONS));
276
+ const images = [];
277
+ for (const entry of entries) if (entry.isFile() && extensions.has(path.extname(entry.name).toLowerCase())) {
278
+ const imagePath = `${directory}/${entry.name}`;
279
+ const stat = await fs.stat(path.join(root, imagePath));
280
+ images.push({
281
+ imagePath,
282
+ createdAt: stat.birthtime.toISOString()
283
+ });
284
+ }
285
+ return images.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
286
+ }
287
+ async function writeDiagramImage(root, diagramPath, fileName, upload) {
288
+ const extension = DIAGRAM_IMAGE_EXTENSIONS[upload.contentType];
289
+ if (extension === void 0) throw new Error("Diagram images must be PNG, JPEG, WebP, GIF or SVG files");
290
+ const directory = imageDirectory(diagramPath);
291
+ const base = slugify(path.parse(fileName).name);
292
+ if (base === "") throw new Error("The image file name must contain a letter or digit");
293
+ let imagePath = `${directory}/${base}${extension}`;
294
+ for (let suffix = 2; await exists(path.join(root, imagePath)); suffix++) imagePath = `${directory}/${base}-${suffix}${extension}`;
295
+ await writeArtifactFile(root, imagePath, upload.data);
296
+ return imagePath;
297
+ }
298
+ //#endregion
299
+ //#region src/artifacts/write.ts
300
+ const MAX_WRITE_BYTES = 2e6;
301
+ const MAX_UPLOAD_BYTES = 5e7;
302
+ function isArtifactPath(relativePath) {
303
+ return relativePath === ".uigraph.yaml" || relativePath.startsWith(".uigraph/");
304
+ }
305
+ function toArtifactPath(requested) {
306
+ const relativePath = path.posix.normalize(requested.replaceAll("\\", "/")).replace(/^\.\//, "");
307
+ if (path.posix.isAbsolute(relativePath) || relativePath.split("/").includes("..")) throw new Error(`Path must be relative to the repository: ${requested}`);
308
+ if (!isArtifactPath(relativePath) || relativePath.endsWith("/")) throw new Error(`Only ${ROOT_CONFIG} and files under .uigraph/ can be written: ${requested}`);
309
+ return relativePath;
310
+ }
311
+ async function deleteArtifactFile(root, requested) {
312
+ const relativePath = toArtifactPath(requested);
313
+ let current = root;
314
+ for (const segment of relativePath.split("/")) {
315
+ current = path.join(current, segment);
316
+ if ((await fs.lstat(current)).isSymbolicLink()) throw new Error(`Refusing to delete through a symbolic link: ${relativePath}`);
317
+ }
318
+ await fs.rm(current);
319
+ const artifactRoot = path.join(root, ".uigraph");
320
+ for (let directory = path.dirname(current); directory.startsWith(`${artifactRoot}${path.sep}`); directory = path.dirname(directory)) {
321
+ if ((await fs.readdir(directory)).length > 0) return;
322
+ await fs.rmdir(directory);
323
+ }
324
+ }
325
+ async function writeArtifactFile(root, requested, content) {
326
+ const relativePath = toArtifactPath(requested);
327
+ const limit = typeof content === "string" ? MAX_WRITE_BYTES : MAX_UPLOAD_BYTES;
328
+ if (Buffer.byteLength(content) > limit) throw new Error(`Content is larger than ${limit} bytes`);
329
+ const segments = relativePath.split("/");
330
+ let current = root;
331
+ for (const [index, segment] of segments.entries()) {
332
+ current = path.join(current, segment);
333
+ const isLast = index === segments.length - 1;
334
+ const stat = await fs.lstat(current).catch((error) => {
335
+ if (error.code === "ENOENT") return null;
336
+ throw error;
337
+ });
338
+ if (stat === null) {
339
+ if (!isLast) await fs.mkdir(current);
340
+ continue;
341
+ }
342
+ if (stat.isSymbolicLink()) throw new Error(`Refusing to write through a symbolic link: ${relativePath}`);
343
+ if (!isLast && !stat.isDirectory()) throw new Error(`Not a directory: ${segments.slice(0, index + 1).join("/")}`);
344
+ if (isLast && !stat.isFile()) throw new Error(`Not a file: ${relativePath}`);
345
+ }
346
+ const temporary = path.join(path.dirname(current), `.${path.basename(current)}.${randomUUID()}.tmp`);
347
+ await fs.writeFile(temporary, content, { flag: "wx" });
348
+ await fs.rename(temporary, current);
349
+ return relativePath;
350
+ }
351
+ function exportDiagram(nodes, edges) {
352
+ if (isC4ReactFlowDiagram(nodes)) return convertReactFlowToC4UiGraph(nodes, edges);
353
+ if (isSequenceDiagram(nodes)) return convertReactFlowToSequenceUiGraph(nodes, edges);
354
+ return convertUiGraphToMermaid({
355
+ nodes,
356
+ edges
357
+ });
358
+ }
359
+ async function saveDiagram(root, configFile, diagramId, input) {
360
+ const { db, errors } = await loadArtifacts(root, configFile);
361
+ if (errors.length > 0) throw new Error(`The .uigraph artifacts are invalid:\n${errors.join("\n")}`);
362
+ const diagram = db.diagrams.find((d) => d.entity.id === diagramId);
363
+ if (diagram === void 0) throw new Error(`Diagram ${diagramId} not found`);
364
+ const name = input.name === void 0 || input.name === null || input.name.trim() === "" ? diagram.entry.name : input.name.trim();
365
+ if (db.diagrams.some((d) => d.file === diagram.file && d.entity.id !== diagramId && d.entry.name === name)) throw new Error(`Another diagram in ${diagram.file} is named "${name}"`);
366
+ let contextPath = diagram.entry.contextPath;
367
+ if (input.content !== void 0 && input.content !== null) {
368
+ const parsed = JSON.parse(input.content);
369
+ if (!Array.isArray(parsed.nodes) || !Array.isArray(parsed.edges)) throw new Error("Diagram content must have nodes and edges arrays");
370
+ const next = exportDiagram(parsed.nodes, parsed.edges);
371
+ const previous = exportDiagram(diagram.flow.nodes, diagram.flow.edges);
372
+ if (JSON.stringify(next) !== JSON.stringify(previous)) {
373
+ contextPath ??= path.posix.join(path.posix.dirname(diagram.entry.path), "context.json");
374
+ await writeArtifactFile(root, diagram.entry.path, next.mermaid);
375
+ await writeArtifactFile(root, contextPath, `${JSON.stringify(next.context, null, 2)}\n`);
376
+ }
377
+ }
378
+ if (name !== diagram.entry.name || contextPath !== diagram.entry.contextPath) {
379
+ const { source, document } = await readYaml(root, diagram.file);
380
+ const entry = document.getIn(["architectureDiagrams", diagram.index], true);
381
+ if (!isMap(entry) || entry.flow === true) throw new Error(`${diagram.file}: architectureDiagrams[${diagram.index}] must be a block mapping`);
382
+ const edits = [];
383
+ if (name !== diagram.entry.name) edits.push(replaceScalar(entry.get("name", true), name));
384
+ if (contextPath !== diagram.entry.contextPath) {
385
+ const pathPair = entry.items.find((pair) => isScalar(pair.key) && pair.key.value === "path");
386
+ const key = pathPair?.key;
387
+ const value = pathPair?.value;
388
+ if (!key?.range || !value?.range) throw new Error(`${diagram.file}: architectureDiagrams[${diagram.index}] has no path`);
389
+ const indent = key.range[0] - source.lastIndexOf("\n", key.range[0]) - 1;
390
+ edits.push({
391
+ start: value.range[1],
392
+ end: value.range[1],
393
+ text: `\n${" ".repeat(indent)}contextPath: ${stringify(contextPath, { lineWidth: 0 }).trimEnd()}`
394
+ });
395
+ }
396
+ await writeArtifactFile(root, diagram.file, applyEdits(source, edits));
397
+ }
398
+ const mermaid = await fs.readFile(path.join(root, diagram.entry.path), "utf8");
399
+ const context = contextPath === void 0 ? "" : await fs.readFile(path.join(root, contextPath), "utf8");
400
+ return {
401
+ id: diagramId,
402
+ name,
403
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
404
+ contentHash: contentHash(mermaid, context)
405
+ };
406
+ }
407
+ async function createDiagram(root, configFile, file, name) {
408
+ const { db, errors } = await loadArtifacts(root, configFile);
409
+ if (errors.length > 0) throw new Error(`The .uigraph artifacts are invalid:\n${errors.join("\n")}`);
410
+ if (db.diagrams.some((d) => d.file === file && d.entry.name === name)) throw new Error(`Another diagram in ${file} is named "${name}"`);
411
+ const base = slugify(name);
412
+ if (base === "") throw new Error("The diagram name must contain a letter or digit");
413
+ let folder = base;
414
+ for (let suffix = 2; db.diagrams.some((d) => d.entity.id === folder) || await fs.lstat(path.join(root, ".uigraph/diagrams", folder)).then(() => true, (error) => {
415
+ if (error.code === "ENOENT") return false;
416
+ throw error;
417
+ }); suffix++) folder = `${base}-${suffix}`;
418
+ const entry = {
419
+ name,
420
+ path: `.uigraph/diagrams/${folder}/${folder}.mmd`,
421
+ contextPath: `.uigraph/diagrams/${folder}/context.json`
422
+ };
423
+ const empty = convertUiGraphToMermaid({
424
+ nodes: [],
425
+ edges: []
426
+ });
427
+ await writeArtifactFile(root, entry.path, empty.mermaid);
428
+ await writeArtifactFile(root, entry.contextPath, `${JSON.stringify(empty.context, null, 2)}\n`);
429
+ const { source, document } = await readYaml(root, file);
430
+ await writeArtifactFile(root, file, applyEdits(source, [appendItem(source, document, ["architectureDiagrams"], entry)]));
431
+ return folder;
432
+ }
433
+ async function deleteDiagram(root, configFile, diagramId) {
434
+ const { db, errors } = await loadArtifacts(root, configFile);
435
+ if (errors.length > 0) throw new Error(`The .uigraph artifacts are invalid:\n${errors.join("\n")}`);
436
+ const diagram = db.diagrams.find((d) => d.entity.id === diagramId);
437
+ if (diagram === void 0) throw new Error(`Diagram ${diagramId} not found`);
438
+ const images = await listDiagramImages(root, diagram.entry.path);
439
+ const { source, document } = await readYaml(root, diagram.file);
440
+ await writeArtifactFile(root, diagram.file, applyEdits(source, [removeItem(source, document, ["architectureDiagrams"], diagram.index)]));
441
+ for (const file of [
442
+ diagram.entry.path,
443
+ diagram.entry.contextPath,
444
+ ...images.map((image) => image.imagePath)
445
+ ]) if (file !== void 0 && isArtifactPath(file)) await deleteArtifactFile(root, file);
446
+ }
447
+ async function renameDiagramReferences(root, files, serviceName, oldName, newName) {
448
+ for (const file of files) {
449
+ const { source, document } = await readYaml(root, file);
450
+ const edits = [];
451
+ visit(document, { Map(_, map) {
452
+ if (map.get("serviceName") === serviceName && map.get("architectureDiagramName") === oldName) edits.push(replaceScalar(map.get("architectureDiagramName", true), newName));
453
+ } });
454
+ if (edits.length > 0) await writeArtifactFile(root, file, applyEdits(source, edits));
455
+ }
456
+ }
457
+ const diagramCandidateSchema = z.object({
458
+ id: z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "Use a kebab-case id").max(48).describe("Kebab-case id. It becomes the diagram directory name under .uigraph/diagrams/."),
459
+ name: z.string().min(1).max(60).describe("Plain display name that says what the diagram shows"),
460
+ type: z.enum([
461
+ "flowchart",
462
+ "sequenceDiagram",
463
+ "stateDiagram-v2",
464
+ "C4Container",
465
+ "C4Component"
466
+ ]).describe("Mermaid diagram type"),
467
+ summary: z.string().min(1).max(160).describe("One line saying what the diagram shows"),
468
+ evidence: z.array(z.string().min(1)).min(1).max(4).describe("Repository-relative files that prove this flow or structure exists"),
469
+ recommended: z.boolean().describe("Pre-selected for the owner")
470
+ });
471
+ const docCandidateSchema = z.object({
472
+ path: z.string().min(1).describe("Repository-relative path of an existing Markdown or HTML document"),
473
+ name: z.string().min(1).max(60).describe("Plain display name, such as \"Deployment guide\""),
474
+ summary: z.string().min(1).max(160).describe("One line saying what the document covers")
475
+ });
476
+ function findPlanProblems(diagrams) {
477
+ const problems = [];
478
+ const seen = /* @__PURE__ */ new Set();
479
+ for (const { id } of diagrams) {
480
+ if (seen.has(id)) problems.push(`Duplicate id: ${id}`);
481
+ seen.add(id);
482
+ }
483
+ const recommended = diagrams.filter((diagram) => diagram.recommended).length;
484
+ if (recommended < 1 || recommended > 8) problems.push(`Mark between 1 and 8 diagrams as recommended (found ${recommended})`);
485
+ return problems;
486
+ }
487
+ function formatApprovedDiagrams(selection, existing) {
488
+ const lines = [];
489
+ if (selection.diagrams.length === 0) lines.push("The owner approved no new architecture diagrams. Do not generate any new architecture diagram.");
490
+ else {
491
+ lines.push("Approved diagrams. Generate exactly these under architectureDiagrams, each at .uigraph/diagrams/<id>/<id>.mmd with a context.json, using the listed Mermaid type. Do not generate any other new diagram:");
492
+ for (const diagram of selection.diagrams) lines.push(`- ${diagram.id} | ${diagram.name} | ${diagram.type} | ${diagram.summary} | evidence: ${diagram.evidence.join(", ")}`);
493
+ }
494
+ if (selection.docs.length > 0) {
495
+ lines.push("Approved existing documents. Add each one under docs with the listed name and its current path, and set fileType to markdown or html. Do not copy, move, or rewrite these files. This replaces the rule in references/docs.md that existing repository documents are never doc artifacts:");
496
+ for (const doc of selection.docs) lines.push(`- ${doc.path} | ${doc.name} | ${doc.summary}`);
497
+ }
498
+ if (existing.length > 0) lines.push(`Diagrams already in the repository (keep them and update them when the code changed): ${existing.join(", ")}.`);
499
+ if (selection.focus !== null) lines.push(`The owner asked you to focus on: "${selection.focus}". If this names a flow the code shows, add one diagram for it. If the code does not show it, leave it out and say so in your summary. Never invent a flow.`);
500
+ return lines.join("\n");
501
+ }
502
+ //#endregion
503
+ //#region src/analysis/repo-access.ts
504
+ const EXCLUDED_DIRECTORIES = [
505
+ ".git",
506
+ "node_modules",
507
+ "dist",
508
+ "build",
509
+ "out",
510
+ ".next",
511
+ ".nuxt",
512
+ ".turbo",
513
+ ".cache",
514
+ "coverage",
515
+ "target",
516
+ "vendor",
517
+ ".venv",
518
+ "venv",
519
+ "__pycache__",
520
+ ".terraform",
521
+ ".claude"
522
+ ];
523
+ const SECRET_FILE_PATTERNS = [
524
+ /^\.env(\..+)?$/,
525
+ /\.(pem|key|p12|pfx|jks|keystore|crt|cer|der)$/,
526
+ /^id_(rsa|dsa|ecdsa|ed25519)/,
527
+ /^credentials/,
528
+ /^secrets?\./,
529
+ /^\.npmrc$/,
530
+ /^\.netrc$/,
531
+ /^\.pypirc$/,
532
+ /\.tfstate(\.backup)?$/
533
+ ];
534
+ const ALLOWED_ENV_FILES = [
535
+ ".env.example",
536
+ ".env.sample",
537
+ ".env.template"
538
+ ];
539
+ const IGNORE_GLOBS = EXCLUDED_DIRECTORIES.map((dir) => `**/${dir}/**`);
540
+ const MAX_READ_BYTES = 2e5;
541
+ const MAX_READ_LINES = 2e3;
542
+ const MAX_LIST_RESULTS = 2e3;
543
+ const MAX_SEARCH_MATCHES = 200;
544
+ const MAX_SEARCH_FILE_BYTES = 1e6;
545
+ function isExcludedPath(relativePath) {
546
+ const segments = relativePath.split("/");
547
+ if (segments.some((segment) => EXCLUDED_DIRECTORIES.includes(segment))) return true;
548
+ const fileName = segments[segments.length - 1];
549
+ if (ALLOWED_ENV_FILES.includes(fileName)) return false;
550
+ return SECRET_FILE_PATTERNS.some((pattern) => pattern.test(fileName));
551
+ }
552
+ async function resolveRepositoryFile(root, requested) {
553
+ const normalized = path.posix.normalize(requested.replaceAll("\\", "/"));
554
+ if (normalized === ".." || normalized.startsWith("../") || path.isAbsolute(normalized)) throw new Error(`Path must be relative to the repository: ${requested}`);
555
+ const relativePath = normalized.replace(/^\.\//, "");
556
+ if (isExcludedPath(relativePath)) throw new Error(`Path is excluded from analysis: ${relativePath}`);
557
+ const absolutePath = path.join(root, relativePath);
558
+ const realPath = await fs.realpath(absolutePath);
559
+ if (realPath !== root && !realPath.startsWith(root + path.sep)) throw new Error(`Path resolves outside the repository: ${relativePath}`);
560
+ return {
561
+ relativePath,
562
+ realPath,
563
+ stat: await fs.stat(realPath)
564
+ };
565
+ }
566
+ async function listRepositoryFiles(root, pattern) {
567
+ const files = await glob(pattern, {
568
+ cwd: root,
569
+ ignore: IGNORE_GLOBS,
570
+ dot: true,
571
+ followSymbolicLinks: false,
572
+ onlyFiles: true
573
+ });
574
+ const allowed = [];
575
+ for (const file of files.sort()) {
576
+ if (isExcludedPath(file)) continue;
577
+ if ((await fs.lstat(path.join(root, file))).isSymbolicLink()) continue;
578
+ allowed.push(file);
579
+ }
580
+ return allowed;
581
+ }
582
+ function isBinary(buffer) {
583
+ return buffer.subarray(0, 8e3).includes(0);
584
+ }
585
+ function textResult(text) {
586
+ return { content: [{
587
+ type: "text",
588
+ text
589
+ }] };
590
+ }
591
+ function errorResult(error) {
592
+ return {
593
+ content: [{
594
+ type: "text",
595
+ text: error instanceof Error ? error.message : String(error)
596
+ }],
597
+ isError: true
598
+ };
599
+ }
600
+ function createRepositoryTools(root, skill, onToolUse, plan) {
601
+ const onSubmit = plan?.onSubmit;
602
+ const listFiles = agentTool("list_files", "List repository files matching a glob pattern. Generated directories and secret files are never listed.", { pattern: z.string().default("**/*").describe("Glob relative to the repository root, e.g. src/**/*.ts") }, async ({ pattern }) => {
603
+ onToolUse({
604
+ tool: "list_files",
605
+ pattern
606
+ });
607
+ try {
608
+ const files = await listRepositoryFiles(root, pattern);
609
+ const shown = files.slice(0, MAX_LIST_RESULTS);
610
+ const more = files.length > shown.length ? `\n… ${files.length - shown.length} more files; narrow the pattern` : "";
611
+ return textResult(shown.length === 0 ? "No files matched." : shown.join("\n") + more);
612
+ } catch (error) {
613
+ return errorResult(error);
614
+ }
615
+ });
616
+ const readFile = agentTool("read_file", "Read a repository text file. Lines are prefixed with their line numbers.", {
617
+ path: z.string().describe("Repository-relative file path"),
618
+ offset: z.number().int().min(1).default(1).describe("First line to read, 1-based"),
619
+ limit: z.number().int().min(1).max(MAX_READ_LINES).default(MAX_READ_LINES).describe("Maximum number of lines to read")
620
+ }, async ({ path: requested, offset, limit }) => {
621
+ onToolUse({
622
+ tool: "read_file",
623
+ path: requested
624
+ });
625
+ try {
626
+ const { realPath, stat } = await resolveRepositoryFile(root, requested);
627
+ if (!stat.isFile()) return errorResult(`Not a file: ${requested}`);
628
+ const handle = await fs.open(realPath, "r");
629
+ const buffer = Buffer.alloc(Math.min(stat.size, MAX_READ_BYTES));
630
+ await handle.read(buffer, 0, buffer.length, 0);
631
+ await handle.close();
632
+ if (isBinary(buffer)) return errorResult(`Binary file skipped: ${requested}`);
633
+ return textResult(buffer.toString("utf8").split("\n").slice(offset - 1, offset - 1 + limit).map((line, index) => `${offset + index}\t${line}`).join("\n") + (stat.size > MAX_READ_BYTES ? `\n… file truncated at ${MAX_READ_BYTES} bytes` : ""));
634
+ } catch (error) {
635
+ return errorResult(error);
636
+ }
637
+ });
638
+ const search = agentTool("search", "Search repository text files with a JavaScript regular expression. Returns path:line: text matches.", {
639
+ pattern: z.string().describe("JavaScript regular expression"),
640
+ glob: z.string().default("**/*").describe("Glob limiting which files are searched"),
641
+ caseInsensitive: z.boolean().default(false)
642
+ }, async ({ pattern, glob: fileGlob, caseInsensitive }) => {
643
+ onToolUse({
644
+ tool: "search",
645
+ pattern,
646
+ glob: fileGlob
647
+ });
648
+ try {
649
+ const regex = new RegExp(pattern, caseInsensitive ? "i" : "");
650
+ const files = await listRepositoryFiles(root, fileGlob);
651
+ const matches = [];
652
+ for (const file of files) {
653
+ const absolutePath = path.join(root, file);
654
+ if ((await fs.stat(absolutePath)).size > MAX_SEARCH_FILE_BYTES) continue;
655
+ const buffer = await fs.readFile(absolutePath);
656
+ if (isBinary(buffer)) continue;
657
+ const lines = buffer.toString("utf8").split("\n");
658
+ for (let index = 0; index < lines.length; index++) {
659
+ if (regex.test(lines[index])) matches.push(`${file}:${index + 1}: ${lines[index].trim().slice(0, 300)}`);
660
+ if (matches.length >= MAX_SEARCH_MATCHES) break;
661
+ }
662
+ if (matches.length >= MAX_SEARCH_MATCHES) {
663
+ matches.push(`… stopped at ${MAX_SEARCH_MATCHES} matches`);
664
+ break;
665
+ }
666
+ }
667
+ return textResult(matches.length === 0 ? "No matches." : matches.join("\n"));
668
+ } catch (error) {
669
+ return errorResult(error);
670
+ }
671
+ });
672
+ const writeFile = agentTool("write_file", "Create or replace a UIGraph artifact. Only .uigraph.yaml and files under .uigraph/ can be written.", {
673
+ path: z.string().describe("Repository-relative path: .uigraph.yaml or .uigraph/..."),
674
+ content: z.string().describe("Complete file content")
675
+ }, async ({ path: requested, content }) => {
676
+ onToolUse({
677
+ tool: "write_file",
678
+ path: requested
679
+ });
680
+ try {
681
+ return textResult(`Wrote ${await writeArtifactFile(root, requested, content)}`);
682
+ } catch (error) {
683
+ return errorResult(error);
684
+ }
685
+ });
686
+ const validateArtifacts = agentTool("validate_artifacts", "Load .uigraph.yaml and every artifact it references the way the UIGraph viewer does, and list every problem found.", {}, async () => {
687
+ onToolUse({ tool: "validate_artifacts" });
688
+ const { errors } = await loadArtifacts(root);
689
+ return textResult(errors.length === 0 ? "All artifacts are valid." : errors.map((error) => `- ${error}`).join("\n"));
690
+ });
691
+ const readSkillFile = agentTool("read_skill_file", "Read a file from the UIGraph skill, e.g. references/uigraph-yaml-schema.md or assets/templates/context-example.json.", { path: z.string().describe("Path relative to the skill directory") }, async ({ path: requested }) => {
692
+ onToolUse({
693
+ tool: "read_skill_file",
694
+ path: requested
695
+ });
696
+ const content = skill.get(path.posix.normalize(requested.replaceAll("\\", "/")).replace(/^\.\//, ""));
697
+ if (content === void 0) return errorResult(`The skill has no file ${requested}`);
698
+ return textResult(content);
699
+ });
700
+ function createSubmitPlanTool(submit) {
701
+ return agentTool("submit_diagram_plan", "Submit the architecture diagrams worth generating and the existing documents worth adding for this repository. Call it exactly once, when you finish exploring.", {
702
+ diagrams: z.array(diagramCandidateSchema).min(1).max(15),
703
+ docs: z.array(docCandidateSchema).max(10)
704
+ }, async ({ diagrams, docs }) => {
705
+ onToolUse({
706
+ tool: "submit_diagram_plan",
707
+ count: diagrams.length
708
+ });
709
+ try {
710
+ const problems = findPlanProblems(diagrams);
711
+ for (const diagram of diagrams) for (const file of diagram.evidence) try {
712
+ const { stat } = await resolveRepositoryFile(root, file);
713
+ if (!stat.isFile()) problems.push(`${diagram.id}: evidence is not a file: ${file}`);
714
+ } catch {
715
+ problems.push(`${diagram.id}: evidence file not found: ${file}`);
716
+ }
717
+ for (const doc of docs) {
718
+ if (!/\.(md|markdown|html?)$/i.test(doc.path)) {
719
+ problems.push(`${doc.path}: not a Markdown or HTML document`);
720
+ continue;
721
+ }
722
+ try {
723
+ const { stat } = await resolveRepositoryFile(root, doc.path);
724
+ if (!stat.isFile()) problems.push(`${doc.path}: document is not a file`);
725
+ } catch {
726
+ problems.push(`${doc.path}: document not found`);
727
+ }
728
+ }
729
+ if (problems.length > 0) return errorResult(`The plan was not accepted. Fix these and submit again:\n${problems.map((problem) => `- ${problem}`).join("\n")}`);
730
+ submit({
731
+ diagrams,
732
+ docs
733
+ });
734
+ return textResult("Plan received. Stop here.");
735
+ } catch (error) {
736
+ return errorResult(error);
737
+ }
738
+ });
739
+ }
740
+ return onSubmit === void 0 ? [
741
+ listFiles,
742
+ readFile,
743
+ search,
744
+ writeFile,
745
+ validateArtifacts,
746
+ readSkillFile
747
+ ] : [
748
+ listFiles,
749
+ readFile,
750
+ search,
751
+ readSkillFile,
752
+ createSubmitPlanTool(onSubmit)
753
+ ];
754
+ }
755
+ //#endregion
756
+ //#region src/artifacts/load.ts
757
+ const ROOT_CONFIG = ".uigraph.yaml";
758
+ const ORG_ID = "local";
759
+ const ACTOR_ID = "uigraph";
760
+ const MAX_FILE_BYTES = 2e6;
761
+ const HTTP_METHODS = [
762
+ "get",
763
+ "put",
764
+ "post",
765
+ "delete",
766
+ "patch",
767
+ "options",
768
+ "head",
769
+ "trace"
770
+ ];
771
+ const DOC_FILE_TYPES = [
772
+ "pdf",
773
+ "html",
774
+ "markdown",
775
+ "doc",
776
+ "txt",
777
+ "image",
778
+ "video",
779
+ "audio",
780
+ "other"
781
+ ];
782
+ const DOC_EXTENSIONS = {
783
+ ".pdf": "pdf",
784
+ ".html": "html",
785
+ ".htm": "html",
786
+ ".md": "markdown",
787
+ ".markdown": "markdown",
788
+ ".doc": "doc",
789
+ ".docx": "doc",
790
+ ".txt": "txt",
791
+ ".png": "image",
792
+ ".jpg": "image",
793
+ ".jpeg": "image",
794
+ ".gif": "image",
795
+ ".webp": "image",
796
+ ".svg": "image",
797
+ ".mp4": "video",
798
+ ".mov": "video",
799
+ ".webm": "video",
800
+ ".mp3": "audio",
801
+ ".wav": "audio",
802
+ ".ogg": "audio",
803
+ ".m4a": "audio"
804
+ };
805
+ const DATABASE_DIALECTS = [
806
+ "postgres",
807
+ "mysql",
808
+ "sqlite",
809
+ "other",
810
+ "dynamodb",
811
+ "mongodb"
812
+ ];
813
+ const queryEntrySchema = z.looseObject({
814
+ name: z.string().min(1),
815
+ database: z.string().min(1),
816
+ path: z.string().min(1).optional(),
817
+ queryText: z.string().min(1).optional(),
818
+ description: z.string().optional(),
819
+ tags: z.array(z.string()).optional()
820
+ });
821
+ const queryFileSchema = z.looseObject({ queries: z.array(queryEntrySchema).default([]) });
822
+ const componentRefSchema = z.looseObject({
823
+ componentId: z.string().min(1),
824
+ componentLinkId: z.string().optional(),
825
+ serviceName: z.string().optional(),
826
+ apiGroupName: z.string().optional(),
827
+ operationId: z.string().optional(),
828
+ testPackName: z.string().optional(),
829
+ docName: z.string().optional(),
830
+ architectureDiagramName: z.string().optional(),
831
+ modalFields: z.array(z.looseObject({
832
+ componentFieldId: z.string(),
833
+ label: z.string().optional(),
834
+ type: z.string().optional(),
835
+ data: z.array(z.unknown()).optional()
836
+ })).optional()
837
+ });
838
+ const mapSchema = z.looseObject({
839
+ name: z.string().min(1),
840
+ description: z.string().optional(),
841
+ frames: z.array(z.looseObject({
842
+ name: z.string().min(1),
843
+ description: z.string().optional(),
844
+ imagePath: z.string().min(1).optional(),
845
+ focalPoints: z.array(z.looseObject({
846
+ name: z.string().min(1),
847
+ x: z.number(),
848
+ y: z.number(),
849
+ visibility: z.string().optional(),
850
+ color: z.string().optional(),
851
+ components: z.array(componentRefSchema).optional()
852
+ })).optional()
853
+ })).optional()
854
+ });
855
+ const CANVAS_FILE = ".uigraph/maps/canvas.json";
856
+ const canvasPointSchema = z.object({
857
+ x: z.number(),
858
+ y: z.number()
859
+ });
860
+ const canvasFileSchema = z.record(z.string(), z.object({
861
+ zoom: z.number().optional(),
862
+ navigationX: z.number().optional(),
863
+ navigationY: z.number().optional(),
864
+ framePositions: z.record(z.string(), canvasPointSchema).optional(),
865
+ frames: z.record(z.string(), z.object({
866
+ groups: z.array(canvasPointSchema.extend({
867
+ name: z.string(),
868
+ description: z.string(),
869
+ width: z.number(),
870
+ height: z.number()
871
+ })).optional(),
872
+ links: z.array(canvasPointSchema.extend({
873
+ kind: z.enum(["frame", "map"]),
874
+ map: z.string(),
875
+ frame: z.string().optional(),
876
+ label: z.string()
877
+ })).optional()
878
+ })).optional()
879
+ }));
880
+ const configSchema = z.looseObject({
881
+ version: z.literal(1),
882
+ service: z.looseObject({
883
+ name: z.string().min(1),
884
+ category: z.string().min(1),
885
+ description: z.string().min(1),
886
+ repository: z.looseObject({
887
+ provider: z.string(),
888
+ url: z.string()
889
+ }).optional(),
890
+ ownership: z.looseObject({ team: z.string().min(1) }).optional(),
891
+ labels: z.array(z.string()).optional(),
892
+ integrations: z.looseObject({
893
+ slack: z.looseObject({ url: z.string() }).optional(),
894
+ jira: z.looseObject({ url: z.string() }).optional()
895
+ }).optional()
896
+ }).optional(),
897
+ apis: z.array(z.looseObject({
898
+ name: z.string().min(1),
899
+ type: z.enum([
900
+ "openapi",
901
+ "graphql",
902
+ "grpc"
903
+ ]),
904
+ path: z.string().min(1)
905
+ })).default([]),
906
+ dependencies: z.array(z.looseObject({
907
+ name: z.string().min(1),
908
+ service: z.string().min(1),
909
+ direction: z.enum(["upstream", "downstream"]),
910
+ criticality: z.enum(["hard", "soft"]),
911
+ type: z.enum([
912
+ "http",
913
+ "graphql",
914
+ "grpc",
915
+ "database"
916
+ ]).optional(),
917
+ description: z.string().optional(),
918
+ apiGroupName: z.string().optional(),
919
+ apiEndpointNames: z.array(z.string().min(1)).optional(),
920
+ databaseName: z.string().optional()
921
+ })).default([]),
922
+ architectureDiagrams: z.array(z.looseObject({
923
+ name: z.string().min(1),
924
+ path: z.string().min(1),
925
+ contextPath: z.string().min(1).optional()
926
+ })).default([]),
927
+ docs: z.array(z.looseObject({
928
+ name: z.string().min(1),
929
+ path: z.string().min(1),
930
+ fileType: z.enum(DOC_FILE_TYPES).optional(),
931
+ description: z.string().optional()
932
+ })).default([]),
933
+ databases: z.array(z.looseObject({
934
+ name: z.string().min(1),
935
+ dialect: z.enum(DATABASE_DIALECTS),
936
+ dbType: z.string().optional(),
937
+ schemaPath: z.string().min(1)
938
+ })).default([]),
939
+ queries: z.array(queryEntrySchema).default([]),
940
+ queryFiles: z.array(z.string().min(1)).default([]),
941
+ maps: z.array(mapSchema).default([])
942
+ });
943
+ const PROTOCOL_LABELS = {
944
+ openapi: "REST",
945
+ graphql: "GraphQL",
946
+ grpc: "gRPC"
947
+ };
948
+ function slugify(value) {
949
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
950
+ }
951
+ function describe(error) {
952
+ return error instanceof Error ? error.message : String(error);
953
+ }
954
+ function contentHash(...parts) {
955
+ const hash = createHash("sha256");
956
+ for (const part of parts) hash.update(part);
957
+ return hash.digest("hex");
958
+ }
959
+ async function readArtifactFile(root, relativePath) {
960
+ const { realPath, stat } = await resolveRepositoryFile(root, relativePath);
961
+ if (!stat.isFile()) throw new Error(`Not a file: ${relativePath}`);
962
+ if (stat.size > MAX_FILE_BYTES) throw new Error(`File is larger than ${MAX_FILE_BYTES} bytes: ${relativePath}`);
963
+ return {
964
+ text: await fs.readFile(realPath, "utf8"),
965
+ updatedAt: stat.mtime.toISOString()
966
+ };
967
+ }
968
+ function parseOpenApi(text) {
969
+ const spec = parse$1(text);
970
+ if (spec === null || typeof spec !== "object") throw new Error("not an OpenAPI document");
971
+ return Object.entries(spec.paths ?? {}).flatMap(([route, operations]) => HTTP_METHODS.filter((method) => operations[method] !== void 0).map((method) => {
972
+ const operation = operations[method];
973
+ return {
974
+ method: method.toUpperCase(),
975
+ path: route,
976
+ operationId: typeof operation.operationId === "string" ? operation.operationId : `${method.toUpperCase()} ${route}`,
977
+ summary: typeof operation.summary === "string" ? operation.summary : "",
978
+ description: typeof operation.description === "string" ? operation.description : "",
979
+ parameters: "[]"
980
+ };
981
+ }));
982
+ }
983
+ function parseGraphQLSchema(text) {
984
+ return parse(text).definitions.flatMap((definition) => {
985
+ if (definition.kind !== Kind.OBJECT_TYPE_DEFINITION && definition.kind !== Kind.OBJECT_TYPE_EXTENSION || ![
986
+ "Query",
987
+ "Mutation",
988
+ "Subscription"
989
+ ].includes(definition.name.value)) return [];
990
+ return (definition.fields ?? []).map((field) => {
991
+ const args = field.arguments === void 0 || field.arguments.length === 0 ? "" : `(${field.arguments.map((arg) => `${arg.name.value}: ${print(arg.type)}`).join(", ")})`;
992
+ return {
993
+ method: definition.name.value,
994
+ path: `${field.name.value}${args}: ${print(field.type)}`,
995
+ operationId: field.name.value,
996
+ summary: "",
997
+ description: field.description?.value ?? "",
998
+ parameters: "[]"
999
+ };
1000
+ });
1001
+ });
1002
+ }
1003
+ function parseProto(text) {
1004
+ const packageName = /^\s*package\s+([\w.]+)\s*;/m.exec(text)?.[1] ?? "";
1005
+ const services = [...text.matchAll(/\bservice\s+(\w+)\s*\{/g)];
1006
+ return [...text.matchAll(/\brpc\s+(\w+)\s*\(\s*(stream\s+)?[\w.]+\s*\)\s*returns\s*\(\s*(stream\s+)?[\w.]+\s*\)/g)].map((rpc) => {
1007
+ const service = services.filter((match) => match.index < rpc.index).pop();
1008
+ if (service === void 0) throw new Error(`rpc ${rpc[1]} is outside a service`);
1009
+ const clientStream = rpc[2] !== void 0;
1010
+ const serverStream = rpc[3] !== void 0;
1011
+ const qualifiedService = packageName === "" ? service[1] : `${packageName}.${service[1]}`;
1012
+ return {
1013
+ method: clientStream && serverStream ? "bidirectional" : clientStream ? "client_streaming" : serverStream ? "server_streaming" : "unary",
1014
+ path: `${qualifiedService}/${rpc[1]}`,
1015
+ operationId: rpc[1],
1016
+ summary: "",
1017
+ description: "",
1018
+ parameters: JSON.stringify({
1019
+ packageName,
1020
+ serviceName: service[1]
1021
+ })
1022
+ };
1023
+ });
1024
+ }
1025
+ function parseApiSpec(type, text) {
1026
+ if (type === "openapi") return parseOpenApi(text);
1027
+ if (type === "graphql") return parseGraphQLSchema(text);
1028
+ if (type === "grpc") return parseProto(text);
1029
+ throw new Error(`Unknown API type: ${String(type)}`);
1030
+ }
1031
+ async function convertDiagram(mermaid, context) {
1032
+ if (context === void 0) return convertMermaidToReactFlow(mermaid);
1033
+ return convertMermaidToReactFlowWithContext(mermaid, contextSchema.parse(context), { repositionNodes: true });
1034
+ }
1035
+ function parseDatabaseSchema(dialect, text) {
1036
+ if (dialect === "dynamodb") {
1037
+ const table = DynamoEditorSchema.parse(JSON.parse(text));
1038
+ return {
1039
+ sdkDialect: dialect,
1040
+ ast: convertDynamoSchemaToAst(table),
1041
+ sourceContent: table,
1042
+ noSQLSchema: { dynamo: { table } }
1043
+ };
1044
+ }
1045
+ if (dialect === "mongodb") {
1046
+ const schema = MongoEditorSchema.parse(JSON.parse(text));
1047
+ return {
1048
+ sdkDialect: dialect,
1049
+ ast: convertMongoSchemaToAst(schema),
1050
+ sourceContent: schema,
1051
+ noSQLSchema: { mongo: { collections: schema.collections } }
1052
+ };
1053
+ }
1054
+ const sdkDialect = dialect === "postgres" ? "postgresql" : dialect === "other" ? SqlToAstParser.detectDialect(text) : dialect;
1055
+ return {
1056
+ sdkDialect,
1057
+ ast: new SqlToAstParser(sdkDialect).parse(text),
1058
+ sourceContent: void 0,
1059
+ noSQLSchema: null
1060
+ };
1061
+ }
1062
+ function toTables(ast) {
1063
+ return ast.tables.map((table) => ({
1064
+ name: table.name,
1065
+ columns: table.columns.map((column) => ({
1066
+ name: column.name,
1067
+ type: column.dataType.name,
1068
+ nullable: column.nullable,
1069
+ description: column.comment || null,
1070
+ isPrimaryKey: table.constraints.some((c) => c.type === "primary_key" && c.columns.includes(column.name))
1071
+ })),
1072
+ indexes: []
1073
+ }));
1074
+ }
1075
+ function toServiceEntity(id, service, updatedAt) {
1076
+ return {
1077
+ id,
1078
+ orgId: ORG_ID,
1079
+ folderId: null,
1080
+ teamId: null,
1081
+ name: service.name,
1082
+ description: service.description,
1083
+ status: "active",
1084
+ tier: "tier3",
1085
+ category: service.category,
1086
+ language: "",
1087
+ gitRepoUrl: service.repository?.url ?? null,
1088
+ jiraProjectUrl: service.integrations?.jira?.url ?? null,
1089
+ slackChannelUrl: service.integrations?.slack?.url ?? null,
1090
+ lastCommitSha: null,
1091
+ labels: service.labels ?? [],
1092
+ metadata: "{}",
1093
+ docLinks: null,
1094
+ createdBy: ACTOR_ID,
1095
+ updatedBy: null,
1096
+ stats: {
1097
+ serviceId: id,
1098
+ endpointCount: 0,
1099
+ diagramCount: 0,
1100
+ dbTableCount: 0,
1101
+ docCount: 0,
1102
+ testCaseCount: 0
1103
+ },
1104
+ createdAt: updatedAt,
1105
+ updatedAt
1106
+ };
1107
+ }
1108
+ async function loadArtifacts(root, configFile = ROOT_CONFIG) {
1109
+ const errors = [];
1110
+ const configFiles = [configFile];
1111
+ if (configFile === ".uigraph.yaml") configFiles.push(...(await glob(".uigraph/services/*.yaml", {
1112
+ cwd: root,
1113
+ dot: true,
1114
+ onlyFiles: true,
1115
+ followSymbolicLinks: false
1116
+ })).sort());
1117
+ const configs = [];
1118
+ for (const file of configFiles) try {
1119
+ const { text, updatedAt } = await readArtifactFile(root, file);
1120
+ const parsed = configSchema.safeParse(parse$1(text));
1121
+ if (!parsed.success) {
1122
+ for (const issue of parsed.error.issues) errors.push(`${file}: ${issue.path.join(".") || "root"}: ${issue.message}`);
1123
+ continue;
1124
+ }
1125
+ configs.push({
1126
+ file,
1127
+ config: parsed.data,
1128
+ updatedAt
1129
+ });
1130
+ } catch (error) {
1131
+ errors.push(`${file}: ${describe(error)}`);
1132
+ }
1133
+ for (const { file, config } of configs) if (config.service === void 0) {
1134
+ if (config.apis.length > 0 || config.dependencies.length > 0 || config.databases.length > 0 || config.queries.length > 0 || config.queryFiles.length > 0) errors.push(`${file}: apis, dependencies, databases and queries require a service block`);
1135
+ }
1136
+ const services = [];
1137
+ const serviceFiles = [];
1138
+ const serviceIdByName = /* @__PURE__ */ new Map();
1139
+ for (const { file, config, updatedAt } of configs) {
1140
+ if (config.service === void 0) continue;
1141
+ const id = slugify(config.service.name);
1142
+ if (serviceIdByName.has(config.service.name) || services.some((s) => s.id === id)) {
1143
+ errors.push(`${file}: duplicate service "${config.service.name}"`);
1144
+ continue;
1145
+ }
1146
+ serviceIdByName.set(config.service.name, id);
1147
+ services.push(toServiceEntity(id, config.service, updatedAt));
1148
+ serviceFiles.push({
1149
+ serviceId: id,
1150
+ file
1151
+ });
1152
+ }
1153
+ const apiGroups = [];
1154
+ for (const { file, config, updatedAt } of configs) {
1155
+ if (config.service === void 0) continue;
1156
+ const serviceId = serviceIdByName.get(config.service.name);
1157
+ if (serviceId === void 0) continue;
1158
+ for (const api of config.apis) {
1159
+ let text;
1160
+ let endpoints;
1161
+ try {
1162
+ text = (await readArtifactFile(root, api.path)).text;
1163
+ endpoints = parseApiSpec(api.type, text);
1164
+ } catch (error) {
1165
+ errors.push(`${file}: apis[${api.name}]: ${describe(error)}`);
1166
+ continue;
1167
+ }
1168
+ const id = slugify(`${serviceId}-${api.name}`);
1169
+ const hash = contentHash(text);
1170
+ const fileName = path.posix.basename(api.path);
1171
+ apiGroups.push({
1172
+ group: {
1173
+ id,
1174
+ serviceId,
1175
+ orgId: ORG_ID,
1176
+ name: api.name,
1177
+ version: "1",
1178
+ label: null,
1179
+ protocol: PROTOCOL_LABELS[api.type],
1180
+ specKey: fileName,
1181
+ specHash: hash,
1182
+ createdBy: ACTOR_ID,
1183
+ updatedBy: null,
1184
+ createdAt: updatedAt,
1185
+ updatedAt
1186
+ },
1187
+ version: {
1188
+ id: `${id}-v1`,
1189
+ orgId: ORG_ID,
1190
+ apiGroupId: id,
1191
+ versionNumber: 1,
1192
+ label: null,
1193
+ specKey: fileName,
1194
+ specHash: hash,
1195
+ isAutoVersion: false,
1196
+ createdBy: ACTOR_ID,
1197
+ createdAt: updatedAt
1198
+ },
1199
+ spec: api.type === "openapi" ? {
1200
+ fileName,
1201
+ content: text
1202
+ } : null,
1203
+ endpoints: endpoints.map((endpoint, index) => ({
1204
+ id: slugify(`${id}-${endpoint.method}-${endpoint.path}`),
1205
+ apiGroupId: id,
1206
+ serviceId,
1207
+ orgId: ORG_ID,
1208
+ operationId: endpoint.operationId,
1209
+ method: endpoint.method,
1210
+ path: endpoint.path,
1211
+ summary: endpoint.summary,
1212
+ description: endpoint.description,
1213
+ tags: [],
1214
+ parameters: endpoint.parameters,
1215
+ requestBody: "{}",
1216
+ responses: "{}",
1217
+ exampleRequests: "[]",
1218
+ exampleResponses: "[]",
1219
+ order: index,
1220
+ sla: null,
1221
+ createdBy: ACTOR_ID,
1222
+ updatedBy: null,
1223
+ createdAt: updatedAt,
1224
+ updatedAt
1225
+ }))
1226
+ });
1227
+ }
1228
+ }
1229
+ const diagrams = [];
1230
+ const diagramIds = /* @__PURE__ */ new Set();
1231
+ const serviceDiagrams = [];
1232
+ for (const { file, config } of configs) {
1233
+ const serviceId = config.service === void 0 ? void 0 : serviceIdByName.get(config.service.name);
1234
+ for (const [index, entry] of config.architectureDiagrams.entries()) {
1235
+ const where = `${file}: architectureDiagrams[${entry.name}]`;
1236
+ const id = slugify(path.posix.basename(path.posix.dirname(entry.path)));
1237
+ if (diagramIds.has(id)) {
1238
+ errors.push(`${where}: another diagram already uses the folder "${id}"`);
1239
+ continue;
1240
+ }
1241
+ let mermaid;
1242
+ let contextText;
1243
+ let updatedAt;
1244
+ let flow;
1245
+ try {
1246
+ const mermaidFile = await readArtifactFile(root, entry.path);
1247
+ mermaid = mermaidFile.text;
1248
+ updatedAt = mermaidFile.updatedAt;
1249
+ contextText = entry.contextPath === void 0 ? void 0 : (await readArtifactFile(root, entry.contextPath)).text;
1250
+ const context = contextText === void 0 ? void 0 : JSON.parse(contextText);
1251
+ flow = await convertDiagram(mermaid, context);
1252
+ } catch (error) {
1253
+ errors.push(`${where}: ${describe(error)}`);
1254
+ continue;
1255
+ }
1256
+ if (flow.nodes.length === 0 && !/^flowchart (TB|TD|BT|RL|LR)$/.test(mermaid.trim())) {
1257
+ errors.push(`${where}: the Mermaid source could not be converted; check its syntax`);
1258
+ continue;
1259
+ }
1260
+ const hash = contentHash(mermaid, contextText ?? "");
1261
+ const entity = {
1262
+ id,
1263
+ orgId: ORG_ID,
1264
+ folderId: null,
1265
+ teamId: null,
1266
+ name: entry.name,
1267
+ description: null,
1268
+ contentKey: entry.path,
1269
+ contentHash: hash,
1270
+ content: JSON.stringify({
1271
+ nodes: flow.nodes,
1272
+ edges: flow.edges,
1273
+ dataSources: [],
1274
+ components: [],
1275
+ viewport: null
1276
+ }),
1277
+ previewAssetId: null,
1278
+ previewImageUrl: null,
1279
+ previewContentHash: null,
1280
+ previewStatus: "none",
1281
+ createdBy: ACTOR_ID,
1282
+ updatedBy: null,
1283
+ createdByCommitHash: null,
1284
+ updatedByCommitHash: null,
1285
+ createdByActor: null,
1286
+ updatedByActor: null,
1287
+ createdAt: updatedAt,
1288
+ updatedAt
1289
+ };
1290
+ diagramIds.add(id);
1291
+ diagrams.push({
1292
+ entity,
1293
+ file,
1294
+ index,
1295
+ entry,
1296
+ flow,
1297
+ mermaid
1298
+ });
1299
+ if (serviceId !== void 0) serviceDiagrams.push({
1300
+ serviceId,
1301
+ diagramId: id,
1302
+ orgId: ORG_ID,
1303
+ createdBy: ACTOR_ID,
1304
+ updatedBy: null,
1305
+ createdAt: updatedAt,
1306
+ updatedAt,
1307
+ diagram: entity
1308
+ });
1309
+ }
1310
+ }
1311
+ const docs = [];
1312
+ const standaloneDocs = [];
1313
+ const docIds = /* @__PURE__ */ new Set();
1314
+ for (const { file, config } of configs) {
1315
+ const serviceId = config.service === void 0 ? null : serviceIdByName.get(config.service.name);
1316
+ if (serviceId === void 0) continue;
1317
+ const names = /* @__PURE__ */ new Set();
1318
+ for (const [index, entry] of config.docs.entries()) {
1319
+ const where = `${file}: docs[${entry.name}]`;
1320
+ if (names.has(entry.name)) {
1321
+ errors.push(`${where}: duplicate doc name`);
1322
+ continue;
1323
+ }
1324
+ names.add(entry.name);
1325
+ let stat;
1326
+ try {
1327
+ stat = (await resolveRepositoryFile(root, entry.path)).stat;
1328
+ } catch (error) {
1329
+ errors.push(`${where}: ${describe(error)}`);
1330
+ continue;
1331
+ }
1332
+ if (!stat.isFile()) {
1333
+ errors.push(`${where}: not a file: ${entry.path}`);
1334
+ continue;
1335
+ }
1336
+ const updatedAt = stat.mtime.toISOString();
1337
+ const base = slugify(`${serviceId ?? "doc"}-${entry.name}`);
1338
+ let id = base;
1339
+ for (let suffix = 2; docIds.has(id); suffix++) id = `${base}-${suffix}`;
1340
+ docIds.add(id);
1341
+ const doc = {
1342
+ id,
1343
+ orgId: ORG_ID,
1344
+ folderId: null,
1345
+ teamId: null,
1346
+ fileAssetId: entry.path,
1347
+ fileUrl: null,
1348
+ fileName: entry.name,
1349
+ serviceName: config.service?.name ?? null,
1350
+ fileType: entry.fileType ?? DOC_EXTENSIONS[path.posix.extname(entry.path).toLowerCase()] ?? "other",
1351
+ description: entry.description ?? "",
1352
+ contentHash: `${stat.size}-${stat.mtimeMs}`,
1353
+ createdBy: ACTOR_ID,
1354
+ updatedBy: null,
1355
+ createdAt: updatedAt,
1356
+ updatedAt
1357
+ };
1358
+ if (serviceId === null) {
1359
+ standaloneDocs.push({
1360
+ file,
1361
+ index,
1362
+ entry,
1363
+ doc
1364
+ });
1365
+ continue;
1366
+ }
1367
+ docs.push({
1368
+ file,
1369
+ index,
1370
+ entry,
1371
+ serviceDoc: {
1372
+ serviceId,
1373
+ docId: doc.id,
1374
+ orgId: ORG_ID,
1375
+ createdBy: ACTOR_ID,
1376
+ updatedBy: null,
1377
+ createdAt: updatedAt,
1378
+ updatedAt,
1379
+ doc
1380
+ }
1381
+ });
1382
+ }
1383
+ }
1384
+ const databases = [];
1385
+ const queries = [];
1386
+ for (const { file, config, updatedAt: configUpdatedAt } of configs) {
1387
+ if (config.service === void 0) continue;
1388
+ const serviceId = serviceIdByName.get(config.service.name);
1389
+ if (serviceId === void 0) continue;
1390
+ const databaseIds = /* @__PURE__ */ new Map();
1391
+ for (const [index, entry] of config.databases.entries()) {
1392
+ const where = `${file}: databases[${entry.name}]`;
1393
+ if (databaseIds.has(entry.name)) {
1394
+ errors.push(`${where}: duplicate database name`);
1395
+ continue;
1396
+ }
1397
+ let text;
1398
+ let updatedAt;
1399
+ let parsed;
1400
+ try {
1401
+ ({text, updatedAt} = await readArtifactFile(root, entry.schemaPath));
1402
+ parsed = parseDatabaseSchema(entry.dialect, text);
1403
+ } catch (error) {
1404
+ errors.push(`${where}: ${describe(error)}`);
1405
+ continue;
1406
+ }
1407
+ const id = slugify(`${serviceId}-${entry.name}`);
1408
+ databaseIds.set(entry.name, id);
1409
+ const diagramId = `db-${id}`;
1410
+ const flow = AstToUiConverter.toReactFlow(parsed.ast, entry.name);
1411
+ const hash = contentHash(text);
1412
+ const diagram = {
1413
+ id: diagramId,
1414
+ orgId: ORG_ID,
1415
+ folderId: null,
1416
+ teamId: null,
1417
+ name: `${entry.name} Schema Diagram`,
1418
+ description: null,
1419
+ contentKey: entry.schemaPath,
1420
+ contentHash: hash,
1421
+ content: JSON.stringify({
1422
+ nodes: flow.nodes,
1423
+ edges: flow.edges,
1424
+ dataSources: [{
1425
+ id,
1426
+ name: entry.name,
1427
+ dialect: parsed.sdkDialect,
1428
+ schemaAst: parsed.ast,
1429
+ sourceType: "file",
1430
+ sourceContent: parsed.sourceContent,
1431
+ createdAt: Date.parse(updatedAt),
1432
+ modifiedAt: null
1433
+ }],
1434
+ components: [],
1435
+ viewport: null
1436
+ }),
1437
+ previewAssetId: null,
1438
+ previewImageUrl: null,
1439
+ previewContentHash: null,
1440
+ previewStatus: "none",
1441
+ createdBy: ACTOR_ID,
1442
+ updatedBy: null,
1443
+ createdByCommitHash: null,
1444
+ updatedByCommitHash: null,
1445
+ createdByActor: null,
1446
+ updatedByActor: null,
1447
+ createdAt: updatedAt,
1448
+ updatedAt
1449
+ };
1450
+ databases.push({
1451
+ file,
1452
+ index,
1453
+ entry,
1454
+ diagram,
1455
+ serviceDb: {
1456
+ id,
1457
+ serviceId,
1458
+ orgId: ORG_ID,
1459
+ dbName: entry.name,
1460
+ dbType: entry.dbType ?? entry.dialect,
1461
+ dialect: entry.dialect,
1462
+ schemaJson: "{}",
1463
+ tables: parsed.noSQLSchema === null ? toTables(parsed.ast) : [],
1464
+ noSQLSchema: parsed.noSQLSchema,
1465
+ dbDiagramId: diagramId,
1466
+ pgDumpFileId: null,
1467
+ source: "cli",
1468
+ sourceTs: null,
1469
+ createdBy: ACTOR_ID,
1470
+ updatedBy: null,
1471
+ createdByCommitHash: null,
1472
+ updatedByCommitHash: null,
1473
+ createdByActor: null,
1474
+ updatedByActor: null,
1475
+ createdAt: updatedAt,
1476
+ updatedAt
1477
+ }
1478
+ });
1479
+ }
1480
+ const entries = config.queries.map((entry, index) => ({
1481
+ source: file,
1482
+ index,
1483
+ entry
1484
+ }));
1485
+ for (const queryFile of config.queryFiles) try {
1486
+ const { text } = await readArtifactFile(root, queryFile);
1487
+ const parsed = queryFileSchema.safeParse(parse$1(text));
1488
+ if (!parsed.success) {
1489
+ for (const issue of parsed.error.issues) errors.push(`${queryFile}: ${issue.path.join(".") || "root"}: ${issue.message}`);
1490
+ continue;
1491
+ }
1492
+ entries.push(...parsed.data.queries.map((entry, index) => ({
1493
+ source: queryFile,
1494
+ index,
1495
+ entry
1496
+ })));
1497
+ } catch (error) {
1498
+ errors.push(`${file}: queryFiles[${queryFile}]: ${describe(error)}`);
1499
+ }
1500
+ const queryIds = /* @__PURE__ */ new Set();
1501
+ for (const { source, index, entry } of entries) {
1502
+ const where = `${source}: queries[${entry.name}]`;
1503
+ const serviceDbId = databaseIds.get(entry.database);
1504
+ if (serviceDbId === void 0) {
1505
+ errors.push(`${where}: unknown database "${entry.database}"`);
1506
+ continue;
1507
+ }
1508
+ const id = slugify(`${serviceDbId}-${entry.name}`);
1509
+ if (queryIds.has(id)) {
1510
+ errors.push(`${where}: duplicate query name`);
1511
+ continue;
1512
+ }
1513
+ let queryText;
1514
+ let updatedAt;
1515
+ try {
1516
+ if (entry.path !== void 0 && entry.queryText === void 0) ({text: queryText, updatedAt} = await readArtifactFile(root, entry.path));
1517
+ else if (entry.path === void 0 && entry.queryText !== void 0) {
1518
+ queryText = entry.queryText;
1519
+ updatedAt = configUpdatedAt;
1520
+ } else throw new Error("set exactly one of path or queryText");
1521
+ } catch (error) {
1522
+ errors.push(`${where}: ${describe(error)}`);
1523
+ continue;
1524
+ }
1525
+ queryIds.add(id);
1526
+ queries.push({
1527
+ file: source,
1528
+ index,
1529
+ entry,
1530
+ savedQuery: {
1531
+ id,
1532
+ orgId: ORG_ID,
1533
+ serviceDbId,
1534
+ folderId: null,
1535
+ scope: "TEAM",
1536
+ ownerUserId: null,
1537
+ teamId: null,
1538
+ title: entry.name,
1539
+ description: entry.description ?? "",
1540
+ queryText,
1541
+ tags: entry.tags ?? [],
1542
+ source: "cli",
1543
+ createdBy: ACTOR_ID,
1544
+ updatedBy: null,
1545
+ createdByCommitHash: null,
1546
+ updatedByCommitHash: null,
1547
+ createdByActor: null,
1548
+ updatedByActor: null,
1549
+ createdAt: updatedAt,
1550
+ updatedAt
1551
+ }
1552
+ });
1553
+ }
1554
+ }
1555
+ let canvas = {};
1556
+ try {
1557
+ const parsed = canvasFileSchema.safeParse(JSON.parse((await readArtifactFile(root, CANVAS_FILE)).text));
1558
+ if (parsed.success) canvas = parsed.data;
1559
+ else for (const issue of parsed.error.issues) errors.push(`${CANVAS_FILE}: ${issue.path.join(".") || "root"}: ${issue.message}`);
1560
+ } catch (error) {
1561
+ if (error.code !== "ENOENT") errors.push(`${CANVAS_FILE}: ${describe(error)}`);
1562
+ }
1563
+ const maps = [];
1564
+ const mapIds = /* @__PURE__ */ new Set();
1565
+ for (const { file, config, updatedAt } of configs) for (const [index, entry] of config.maps.entries()) {
1566
+ const where = `${file}: maps[${entry.name}]`;
1567
+ const id = slugify(entry.name);
1568
+ if (mapIds.has(id)) {
1569
+ errors.push(`${where}: another map has the same name`);
1570
+ continue;
1571
+ }
1572
+ mapIds.add(id);
1573
+ const mapCanvas = canvas[entry.name] ?? {};
1574
+ const frames = [];
1575
+ const frameIds = /* @__PURE__ */ new Set();
1576
+ for (const [frameIndex, frameEntry] of (entry.frames ?? []).entries()) {
1577
+ const frameWhere = `${where}: frames[${frameEntry.name}]`;
1578
+ const frameId = `${id}--${slugify(frameEntry.name)}`;
1579
+ if (frameIds.has(frameId)) {
1580
+ errors.push(`${frameWhere}: another frame has the same name`);
1581
+ continue;
1582
+ }
1583
+ frameIds.add(frameId);
1584
+ let imageHash = null;
1585
+ if (frameEntry.imagePath !== void 0) try {
1586
+ const { stat } = await resolveRepositoryFile(root, frameEntry.imagePath);
1587
+ if (!stat.isFile()) throw new Error(`Not a file: ${frameEntry.imagePath}`);
1588
+ imageHash = `${stat.size}-${stat.mtimeMs}`;
1589
+ } catch (error) {
1590
+ errors.push(`${frameWhere}: ${describe(error)}`);
1591
+ continue;
1592
+ }
1593
+ const pointNames = /* @__PURE__ */ new Set();
1594
+ const focalPoints = [];
1595
+ for (const [pointIndex, point] of (frameEntry.focalPoints ?? []).entries()) {
1596
+ if (pointNames.has(point.name)) {
1597
+ errors.push(`${frameWhere}: focalPoints[${point.name}]: another focal point has the same name`);
1598
+ continue;
1599
+ }
1600
+ pointNames.add(point.name);
1601
+ const pointId = `${frameId}--p${pointIndex}`;
1602
+ focalPoints.push({
1603
+ point: {
1604
+ id: pointId,
1605
+ frameId,
1606
+ orgId: ORG_ID,
1607
+ name: point.name,
1608
+ locationX: point.x,
1609
+ locationY: point.y,
1610
+ visibility: point.visibility ?? "public",
1611
+ color: point.color ?? null,
1612
+ isActive: true,
1613
+ createdBy: ACTOR_ID,
1614
+ updatedBy: null,
1615
+ createdByCommitHash: null,
1616
+ updatedByCommitHash: null,
1617
+ createdAt: updatedAt,
1618
+ updatedAt
1619
+ },
1620
+ components: (point.components ?? []).map((ref, refIndex) => ({
1621
+ ref,
1622
+ meta: {
1623
+ id: `${pointId}--c${refIndex}`,
1624
+ focalPointId: pointId,
1625
+ orgId: ORG_ID,
1626
+ frameId,
1627
+ componentId: ref.componentId,
1628
+ componentLinkDiagramId: null,
1629
+ componentLinkApiEndpointId: null,
1630
+ componentLinkTestPackId: null,
1631
+ componentLinkServiceDocId: null,
1632
+ componentModalFields: (ref.modalFields ?? []).map((field, order) => ({
1633
+ componentFieldId: field.componentFieldId,
1634
+ label: field.label ?? null,
1635
+ type: field.type ?? null,
1636
+ required: null,
1637
+ isReadonly: null,
1638
+ data: field.data ?? null,
1639
+ options: null,
1640
+ order
1641
+ })),
1642
+ createdBy: ACTOR_ID,
1643
+ updatedBy: null,
1644
+ createdByCommitHash: null,
1645
+ updatedByCommitHash: null,
1646
+ createdAt: updatedAt,
1647
+ updatedAt
1648
+ }
1649
+ }))
1650
+ });
1651
+ }
1652
+ const frameCanvas = mapCanvas.frames?.[frameEntry.name] ?? {};
1653
+ frames.push({
1654
+ name: frameEntry.name,
1655
+ frame: {
1656
+ id: frameId,
1657
+ mapId: id,
1658
+ orgId: ORG_ID,
1659
+ parentFrameId: null,
1660
+ name: frameEntry.name,
1661
+ description: frameEntry.description ?? "",
1662
+ templateType: "default",
1663
+ screenshotAssetId: frameEntry.imagePath ?? null,
1664
+ screenshotImageUrl: null,
1665
+ screenshotContentHash: imageHash,
1666
+ status: "active",
1667
+ order: frameIndex,
1668
+ source: "cli",
1669
+ focalPointCount: focalPoints.length,
1670
+ createdBy: ACTOR_ID,
1671
+ updatedBy: null,
1672
+ createdByCommitHash: null,
1673
+ updatedByCommitHash: null,
1674
+ createdByActor: null,
1675
+ updatedByActor: null,
1676
+ createdAt: updatedAt,
1677
+ updatedAt
1678
+ },
1679
+ focalPoints,
1680
+ groups: (frameCanvas.groups ?? []).map((group, groupIndex) => ({
1681
+ id: `${frameId}--g${groupIndex}`,
1682
+ frameId,
1683
+ orgId: ORG_ID,
1684
+ name: group.name,
1685
+ description: group.description,
1686
+ locationX: group.x,
1687
+ locationY: group.y,
1688
+ width: group.width,
1689
+ height: group.height,
1690
+ order: groupIndex,
1691
+ isActive: true,
1692
+ createdBy: ACTOR_ID,
1693
+ updatedBy: null,
1694
+ createdAt: updatedAt,
1695
+ updatedAt
1696
+ })),
1697
+ links: (frameCanvas.links ?? []).map((link, linkIndex) => ({
1698
+ target: {
1699
+ map: link.map,
1700
+ frame: link.frame
1701
+ },
1702
+ link: {
1703
+ id: `${frameId}--l${linkIndex}`,
1704
+ frameId,
1705
+ orgId: ORG_ID,
1706
+ kind: link.kind,
1707
+ targetFrameId: null,
1708
+ targetMapId: null,
1709
+ label: link.label,
1710
+ locationX: link.x,
1711
+ locationY: link.y,
1712
+ isActive: true,
1713
+ createdBy: ACTOR_ID,
1714
+ updatedBy: null,
1715
+ createdAt: updatedAt,
1716
+ updatedAt
1717
+ }
1718
+ }))
1719
+ });
1720
+ }
1721
+ maps.push({
1722
+ file,
1723
+ index,
1724
+ entry,
1725
+ canvas: mapCanvas,
1726
+ frames,
1727
+ map: {
1728
+ id,
1729
+ orgId: ORG_ID,
1730
+ folderId: null,
1731
+ teamId: null,
1732
+ name: entry.name,
1733
+ description: entry.description ?? "",
1734
+ status: "active",
1735
+ createdBy: ACTOR_ID,
1736
+ updatedBy: null,
1737
+ createdByCommitHash: null,
1738
+ updatedByCommitHash: null,
1739
+ createdAt: updatedAt,
1740
+ updatedAt,
1741
+ previewImgUrls: []
1742
+ }
1743
+ });
1744
+ }
1745
+ const dependencies = [];
1746
+ for (const { file, config } of configs) {
1747
+ if (config.service === void 0) continue;
1748
+ const service = services.find((s) => s.id === serviceIdByName.get(config.service.name));
1749
+ if (service === void 0) continue;
1750
+ const names = /* @__PURE__ */ new Set();
1751
+ for (const dependency of config.dependencies) {
1752
+ const where = `${file}: dependencies[${dependency.name}]`;
1753
+ if (names.has(dependency.name)) errors.push(`${where}: duplicate dependency name`);
1754
+ names.add(dependency.name);
1755
+ if (dependency.service === config.service.name) errors.push(`${where}: a service cannot depend on itself`);
1756
+ const endpointNames = dependency.apiEndpointNames ?? [];
1757
+ if (new Set(endpointNames).size !== endpointNames.length) errors.push(`${where}: apiEndpointNames must be unique`);
1758
+ const target = services.find((s) => s.id === slugify(dependency.service));
1759
+ dependencies.push({
1760
+ id: slugify(`${service.id}-${dependency.name}`),
1761
+ name: dependency.name,
1762
+ service: toDependencyService(service),
1763
+ dependency: target === void 0 ? null : toDependencyService(target),
1764
+ dependencyName: dependency.service,
1765
+ direction: dependency.direction,
1766
+ type: dependency.type ?? null,
1767
+ criticality: dependency.criticality,
1768
+ description: dependency.description ?? null,
1769
+ apiGroupName: dependency.apiGroupName ?? null,
1770
+ apiEndpointNames: endpointNames,
1771
+ databaseName: dependency.databaseName ?? null
1772
+ });
1773
+ }
1774
+ }
1775
+ for (const service of services) {
1776
+ service.stats.endpointCount = apiGroups.filter(({ group }) => group.serviceId === service.id).reduce((count, { endpoints }) => count + endpoints.length, 0);
1777
+ service.stats.diagramCount = serviceDiagrams.filter((link) => link.serviceId === service.id).length;
1778
+ service.stats.docCount = docs.filter(({ serviceDoc }) => serviceDoc.serviceId === service.id).length;
1779
+ service.stats.dbTableCount = databases.filter(({ serviceDb }) => serviceDb.serviceId === service.id).reduce((count, { serviceDb }) => count + serviceDb.tables.length, 0);
1780
+ }
1781
+ return {
1782
+ errors,
1783
+ db: {
1784
+ configFiles: configs.map(({ file }) => file),
1785
+ services,
1786
+ serviceFiles,
1787
+ apiGroups,
1788
+ diagrams,
1789
+ serviceDiagrams,
1790
+ docs,
1791
+ standaloneDocs,
1792
+ databases,
1793
+ queries,
1794
+ maps,
1795
+ dependencies
1796
+ }
1797
+ };
1798
+ }
1799
+ function toDependencyService(service) {
1800
+ return {
1801
+ id: service.id,
1802
+ name: service.name,
1803
+ description: service.description,
1804
+ status: service.status,
1805
+ tier: service.tier,
1806
+ category: service.category,
1807
+ language: service.language,
1808
+ gitRepoUrl: service.gitRepoUrl,
1809
+ updatedAt: service.updatedAt,
1810
+ metadata: null
1811
+ };
1812
+ }
1813
+ //#endregion
1814
+ //#region src/version.ts
1815
+ const { version } = createRequire(import.meta.url)("../package.json");
1816
+ const VERSION = version;
1817
+ const BUILD_ID = createHash("sha1").update(readFileSync(new URL(import.meta.url))).digest("hex").slice(0, 8);
1818
+ //#endregion
1819
+ //#region src/analysis/skill.ts
1820
+ const REPOSITORY = "uigraph-oss/skills";
1821
+ const SKILL_DIRECTORY = "skills/uigraph/";
1822
+ const SKILL_SOURCE = `github.com/${REPOSITORY}`;
1823
+ async function fetchOk(url) {
1824
+ const response = await fetch(url);
1825
+ if (!response.ok) throw new Error(`${url} responded ${response.status}`);
1826
+ return response;
1827
+ }
1828
+ async function downloadSkill() {
1829
+ const tree = await (await fetchOk(`https://api.github.com/repos/${REPOSITORY}/git/trees/main?recursive=1`)).json();
1830
+ if (tree.truncated) throw new Error(`The file list of ${SKILL_SOURCE} is truncated`);
1831
+ const paths = tree.tree.filter((entry) => entry.type === "blob" && entry.path.startsWith(SKILL_DIRECTORY)).map((entry) => entry.path);
1832
+ const files = /* @__PURE__ */ new Map();
1833
+ await Promise.all(paths.map(async (filePath) => {
1834
+ const response = await fetchOk(`https://raw.githubusercontent.com/${REPOSITORY}/${tree.sha}/${filePath}`);
1835
+ files.set(filePath.slice(15), await response.text());
1836
+ }));
1837
+ const instructions = files.get("SKILL.md");
1838
+ if (instructions === void 0) throw new Error(`${SKILL_SOURCE} has no ${SKILL_DIRECTORY}SKILL.md`);
1839
+ return {
1840
+ instructions: instructions.replace(/^---\n[\s\S]*?\n---\n/, ""),
1841
+ files
1842
+ };
1843
+ }
1844
+ //#endregion
1845
+ //#region src/analysis/analyze.ts
1846
+ const PROMPT = fs$1.readFileSync(new URL("./prompt.md", import.meta.url), "utf8");
1847
+ const PLAN_PROMPT = fs$1.readFileSync(new URL("./plan-prompt.md", import.meta.url), "utf8");
1848
+ const PLAN_MAX_TURNS = 100;
1849
+ var AnalysisError = class extends Error {};
1850
+ var AnalysisCancelledError = class extends Error {};
1851
+ var AnalysisLimitError = class extends AnalysisError {};
1852
+ function describeToolEvent(event) {
1853
+ if (event.tool === "list_files") return `list ${event.pattern}`;
1854
+ if (event.tool === "read_file") return `read ${event.path}`;
1855
+ if (event.tool === "search") return `search ${event.pattern} ${pc.dim(`in ${event.glob}`)}`;
1856
+ if (event.tool === "write_file") return pc.green(`write ${event.path}`);
1857
+ if (event.tool === "validate_artifacts") return "validate";
1858
+ if (event.tool === "read_skill_file") return `skill ${event.path}`;
1859
+ if (event.tool === "submit_diagram_plan") return pc.green(`plan ${event.count} diagram candidates`);
1860
+ throw new Error(`Unknown tool event: ${JSON.stringify(event)}`);
1861
+ }
1862
+ function describeUsage(outcome) {
1863
+ return `${outcome.tokens.toLocaleString()} tokens${outcome.costUsd === null ? "" : ` · ~$${outcome.costUsd.toFixed(2)} estimated`}`;
1864
+ }
1865
+ async function runSession(root, skill, prompt, abortController, settings, mode = "generate") {
1866
+ let toolCalls = 0;
1867
+ const tools = createRepositoryTools(root, skill.files, (event) => {
1868
+ toolCalls++;
1869
+ console.log(pc.dim(` ${String(toolCalls).padStart(3)} `) + describeToolEvent(event));
1870
+ }, mode === "generate" ? void 0 : { onSubmit: mode.onPlan });
1871
+ let outcome;
1872
+ try {
1873
+ outcome = await runAgent({
1874
+ agent: settings.agent,
1875
+ cwd: root,
1876
+ systemPrompt: mode === "generate" ? `${PROMPT}\n# UIGraph skill\n\nThe skill below was written for interactive use. The run instructions above override its approval workflow, and its file references resolve through \`read_skill_file\`.\n\n${skill.instructions}` : PLAN_PROMPT,
1877
+ prompt,
1878
+ tools,
1879
+ signal: abortController.signal,
1880
+ model: settings.model,
1881
+ maxBudgetUsd: settings.maxBudgetUsd,
1882
+ maxTurns: mode === "generate" ? void 0 : PLAN_MAX_TURNS,
1883
+ clientApp: `uigraph/${VERSION}`,
1884
+ log: consola.debug
1885
+ });
1886
+ } catch (error) {
1887
+ if (abortController.signal.aborted) throw new AnalysisCancelledError("Analysis cancelled");
1888
+ if (error instanceof AgentLimitError) throw new AnalysisLimitError(error.message, { cause: error });
1889
+ if (error instanceof AgentError) throw new AnalysisError(error.message, { cause: error });
1890
+ throw error;
1891
+ }
1892
+ if (abortController.signal.aborted) throw new AnalysisCancelledError("Analysis cancelled");
1893
+ return outcome;
1894
+ }
1895
+ function printErrors(errors) {
1896
+ for (const error of errors.slice(0, 30)) console.log(pc.yellow(` • ${error}`));
1897
+ if (errors.length > 30) console.log(pc.yellow(` • … ${errors.length - 30} more`));
1898
+ }
1899
+ async function loadSkill() {
1900
+ console.log(pc.dim(` Downloading the UIGraph skill from ${SKILL_SOURCE}`));
1901
+ try {
1902
+ return await downloadSkill();
1903
+ } catch (error) {
1904
+ throw new AnalysisError(`Could not download the UIGraph skill from ${SKILL_SOURCE}: ${error instanceof Error ? error.message : String(error)}`);
1905
+ }
1906
+ }
1907
+ async function listExistingDiagrams(root) {
1908
+ return (await fs$1.promises.readdir(path.join(root, ".uigraph", "diagrams"), { withFileTypes: true }).catch((error) => {
1909
+ if (error.code === "ENOENT") return [];
1910
+ throw error;
1911
+ })).filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort();
1912
+ }
1913
+ async function planDiagrams(root, repositoryName, skill, abortController, settings) {
1914
+ const startedAt = Date.now();
1915
+ const existing = await listExistingDiagrams(root);
1916
+ const captured = { submission: null };
1917
+ let outcome;
1918
+ try {
1919
+ outcome = await runSession(root, skill, [`Propose the architecture diagrams worth generating and the existing documents worth adding for the repository "${repositoryName}" in the working directory.`, existing.length === 0 ? "No diagrams exist yet." : `These diagrams already exist, so do not propose them again: ${existing.join(", ")}.`].join("\n"), abortController, settings, { onPlan: (submission) => {
1920
+ captured.submission = submission;
1921
+ } });
1922
+ } catch (error) {
1923
+ if (error instanceof AnalysisLimitError) {
1924
+ consola.debug(`Planning stopped: ${inspect(error)}`);
1925
+ return null;
1926
+ }
1927
+ throw error;
1928
+ }
1929
+ if (captured.submission === null) return null;
1930
+ return {
1931
+ ...captured.submission,
1932
+ seconds: Math.round((Date.now() - startedAt) / 1e3),
1933
+ usage: outcome
1934
+ };
1935
+ }
1936
+ async function generateArtifacts(root, repositoryName, gitRemote, update, abortController, skill, selection, settings) {
1937
+ const startedAt = Date.now();
1938
+ const existing = await listExistingDiagrams(root);
1939
+ let outcome = await runSession(root, skill, [
1940
+ update ? `Update the existing UIGraph artifacts of the repository "${repositoryName}" in the working directory so they match the current code. Read the existing .uigraph.yaml and .uigraph/ files first and keep what is still correct.` : `Generate UIGraph artifacts for the repository "${repositoryName}" in the working directory.`,
1941
+ gitRemote === null ? "The CLI found no usable git remote." : `The repository's git remote is ${gitRemote}.`,
1942
+ ...selection === null ? [] : [formatApprovedDiagrams(selection, existing)]
1943
+ ].join("\n"), abortController, settings);
1944
+ let { errors } = await loadArtifacts(root);
1945
+ if (errors.length > 0) {
1946
+ console.log(pc.yellow(`\nThe artifacts have ${errors.length} problem(s). Asking ${AGENT_LABELS[settings.agent]} to repair them once:`));
1947
+ printErrors(errors);
1948
+ console.log();
1949
+ outcome = await runSession(root, skill, [
1950
+ "The UIGraph artifacts failed validation. Fix every problem below, re-reading files where needed, and run validate_artifacts until it passes. Remove findings you cannot support with evidence rather than guessing.",
1951
+ "",
1952
+ ...errors.map((error) => `- ${error}`)
1953
+ ].join("\n"), abortController, settings);
1954
+ errors = (await loadArtifacts(root)).errors;
1955
+ }
1956
+ if (errors.length > 0) {
1957
+ printErrors(errors);
1958
+ throw new AnalysisError(`The artifacts are still invalid after one repair attempt (${errors.length} problem(s)).`);
1959
+ }
1960
+ const seconds = Math.round((Date.now() - startedAt) / 1e3);
1961
+ console.log(pc.dim(`\n ${seconds}s · ${describeUsage(outcome)}`));
1962
+ }
1963
+ //#endregion
1964
+ //#region src/banner.ts
1965
+ const NAME = "UIGraph";
1966
+ const WEBSITE = "https://uigraph.app";
1967
+ const TAGLINE = "Map your project into services, APIs and diagrams";
1968
+ function blue(text) {
1969
+ return pc.isColorSupported ? `\x1b[38;2;59;107;255m${text}\x1b[39m` : text;
1970
+ }
1971
+ const MARK = [[
1972
+ 0,
1973
+ 0,
1974
+ pc.white("⏺")
1975
+ ]];
1976
+ for (let col = 1; col < 5; col++) MARK.push([
1977
+ 0,
1978
+ col,
1979
+ blue("━")
1980
+ ]);
1981
+ MARK.push([
1982
+ 0,
1983
+ 5,
1984
+ blue("⏺")
1985
+ ]);
1986
+ MARK.push([
1987
+ 1,
1988
+ 5,
1989
+ blue("┃")
1990
+ ]);
1991
+ MARK.push([
1992
+ 2,
1993
+ 5,
1994
+ blue("⏺")
1995
+ ]);
1996
+ for (let col = 4; col > 0; col--) MARK.push([
1997
+ 2,
1998
+ col,
1999
+ blue("━")
2000
+ ]);
2001
+ MARK.push([
2002
+ 2,
2003
+ 0,
2004
+ blue("⏺")
2005
+ ]);
2006
+ MARK.push([
2007
+ 1,
2008
+ 0,
2009
+ blue("┃")
2010
+ ]);
2011
+ function imageProtocol() {
2012
+ const program = process.env.TERM_PROGRAM;
2013
+ if (program === "iTerm.app" || program === "WezTerm") return "iterm";
2014
+ if (program === "ghostty" || process.env.TERM === "xterm-kitty" || process.env.KITTY_WINDOW_ID) return "kitty";
2015
+ return null;
2016
+ }
2017
+ function logoImage(protocol) {
2018
+ const file = fs$1.readFileSync(new URL("./uigraph-mark.png", import.meta.url));
2019
+ const png = file.toString("base64");
2020
+ if (protocol === "iterm") return `\x1b]1337;File=inline=1;size=${file.length};height=3;preserveAspectRatio=1:${png}\x07`;
2021
+ const chunks = png.match(/.{1,4096}/g);
2022
+ return chunks.map((chunk, index) => {
2023
+ const more = index < chunks.length - 1 ? 1 : 0;
2024
+ return `\x1b_G${index === 0 ? `a=T,f=100,r=3,C=1,q=2,m=${more}` : `m=${more}`};${chunk}\x1b\\`;
2025
+ }).join("");
2026
+ }
2027
+ function render(frame, markFrames) {
2028
+ const grid = Array.from({ length: 3 }, () => Array(6).fill(" "));
2029
+ for (const [row, col, char] of MARK.slice(0, Math.min(frame, markFrames))) grid[row][col] = char;
2030
+ const letters = Math.max(0, frame - markFrames);
2031
+ const done = letters > 7;
2032
+ const text = [
2033
+ pc.bold(NAME.slice(0, letters)) + (done ? pc.dim(` v${VERSION}`) : ""),
2034
+ done ? blue(WEBSITE) : "",
2035
+ done ? pc.dim(TAGLINE) : ""
2036
+ ];
2037
+ return grid.map((cells, row) => ` ${cells.join("")} ${text[row]}\x1b[K`).join("\n");
2038
+ }
2039
+ async function showBanner() {
2040
+ if (!process.stdout.isTTY) return;
2041
+ const protocol = imageProtocol();
2042
+ const markFrames = protocol ? 0 : MARK.length;
2043
+ const frames = markFrames + 7 + 1;
2044
+ process.stdout.write("\n");
2045
+ for (let frame = 1; frame <= frames; frame++) {
2046
+ process.stdout.write(`${frame === 1 ? "" : "\x1B[2A\r"}${render(frame, markFrames)}`);
2047
+ if (frame === frames && protocol) process.stdout.write(`\x1b7\x1b[2A\r\x1b[2C${logoImage(protocol)}\x1b8`);
2048
+ await setTimeout$1(20);
2049
+ }
2050
+ process.stdout.write("\n");
2051
+ }
2052
+ //#endregion
2053
+ //#region src/guidance/guidance.ts
2054
+ const TEMPLATE = readFileSync(new URL("./agents.md", import.meta.url), "utf8");
2055
+ const AGENT_FILES = ["CLAUDE.md", "AGENTS.md"];
2056
+ const GUIDANCE_FILE = ".uigraph/AGENTS.md";
2057
+ const REFERENCE = `## UIGraph
2058
+
2059
+ If your change adds or changes API endpoints, database schemas, calls to other services, or a flow shown in a diagram, read \`${GUIDANCE_FILE}\` and follow it.
2060
+ `;
2061
+ async function writeGuidance(root) {
2062
+ await writeArtifactFile(root, GUIDANCE_FILE, TEMPLATE);
2063
+ const files = [];
2064
+ for (const file of AGENT_FILES) {
2065
+ const target = path.join(root, file);
2066
+ const text = await fs.readFile(target, "utf8").catch((error) => {
2067
+ if (error.code === "ENOENT") return null;
2068
+ throw error;
2069
+ });
2070
+ if (text === null) continue;
2071
+ files.push(file);
2072
+ if (text.includes(".uigraph/AGENTS.md")) continue;
2073
+ if (text === "" || text.endsWith("\n\n")) await fs.appendFile(target, REFERENCE);
2074
+ else if (text.endsWith("\n")) await fs.appendFile(target, `\n${REFERENCE}`);
2075
+ else await fs.appendFile(target, `\n\n${REFERENCE}`);
2076
+ }
2077
+ if (files.length === 0) {
2078
+ await fs.writeFile(path.join(root, "AGENTS.md"), REFERENCE, { flag: "wx" });
2079
+ files.push("AGENTS.md");
2080
+ }
2081
+ return files;
2082
+ }
2083
+ //#endregion
2084
+ //#region src/workspace.ts
2085
+ const WORKSPACE_CONFIG = ".uigraph/workspace.yaml";
2086
+ const COMPONENT_API_CONTRACT_ID = "component_api-contract";
2087
+ const COMPONENT_FLOW_DIAGRAM_ID = "component_backend-flow-diagram";
2088
+ const COMPONENT_SUPPORT_KB_ID = "component_support-kb-troubleshooting";
2089
+ const REGISTRY = ".uigraph/registry.yaml";
2090
+ const PREFERENCES = ".uigraph/preferences.yaml";
2091
+ const WORKSPACE_ID = "workspace";
2092
+ const registrySchema = z.object({ projects: z.array(z.string().min(1)) });
2093
+ const preferencesSchema = z.object({ agentGuidance: z.object({ declined: z.array(z.string().min(1)) }) });
2094
+ function homeRoot() {
2095
+ return fs.realpath(os.homedir());
2096
+ }
2097
+ async function readOptional(file) {
2098
+ return fs.readFile(file, "utf8").catch((error) => {
2099
+ if (error.code === "ENOENT") return null;
2100
+ throw error;
2101
+ });
2102
+ }
2103
+ async function readRegistry(home) {
2104
+ const text = await readOptional(path.join(home, REGISTRY));
2105
+ if (text === null) return [];
2106
+ return registrySchema.parse(parse$1(text)).projects;
2107
+ }
2108
+ async function registerProject$1(root) {
2109
+ const home = await homeRoot();
2110
+ const projects = await readRegistry(home);
2111
+ if (projects.includes(root)) return;
2112
+ await writeArtifactFile(home, REGISTRY, stringify({ projects: [...projects, root] }));
2113
+ }
2114
+ async function unregisterProject(root) {
2115
+ const home = await homeRoot();
2116
+ const projects = await readRegistry(home);
2117
+ if (!projects.includes(root)) throw new Error(`${root} is not registered`);
2118
+ await writeArtifactFile(home, REGISTRY, stringify({ projects: projects.filter((project) => project !== root) }));
2119
+ }
2120
+ async function readDeclinedGuidance(home) {
2121
+ const text = await readOptional(path.join(home, PREFERENCES));
2122
+ if (text === null) return [];
2123
+ return preferencesSchema.parse(parse$1(text)).agentGuidance.declined;
2124
+ }
2125
+ async function isGuidanceDeclined(root) {
2126
+ return (await readDeclinedGuidance(await homeRoot())).includes(root);
2127
+ }
2128
+ async function setGuidanceDeclined(root, declined) {
2129
+ const home = await homeRoot();
2130
+ const others = (await readDeclinedGuidance(home)).filter((project) => project !== root);
2131
+ await writeArtifactFile(home, PREFERENCES, stringify({ agentGuidance: { declined: declined ? [...others, root] : others } }));
2132
+ }
2133
+ async function syncProject(root) {
2134
+ await registerProject$1(root);
2135
+ const { skipped, workspace } = await loadWorkspace();
2136
+ const problem = skipped.find((entry) => entry.root === root);
2137
+ if (problem !== void 0) return {
2138
+ synced: false,
2139
+ reason: problem.reason
2140
+ };
2141
+ if (workspace.projects.find((entry) => entry.root === root) === void 0) return {
2142
+ synced: false,
2143
+ reason: "is not part of the workspace"
2144
+ };
2145
+ return {
2146
+ synced: true,
2147
+ services: workspace.services.length
2148
+ };
2149
+ }
2150
+ async function listRegisteredProjects() {
2151
+ const home = await homeRoot();
2152
+ const { skipped, workspace } = await loadWorkspace();
2153
+ return (await readRegistry(home)).map((root) => ({
2154
+ root,
2155
+ problem: skipped.find((entry) => entry.root === root)?.reason ?? null,
2156
+ services: workspace.services.filter((service) => workspace.projects.find((project) => project.root === root)?.serviceIds.includes(service.id)).map((service) => ({
2157
+ id: service.id,
2158
+ name: service.name
2159
+ }))
2160
+ }));
2161
+ }
2162
+ async function ensureWorkspaceConfig(home) {
2163
+ if (await readOptional(path.join(home, ".uigraph/workspace.yaml")) === null) await writeArtifactFile(home, WORKSPACE_CONFIG, "version: 1\n");
2164
+ }
2165
+ function dropServices(db, ids) {
2166
+ db.services = db.services.filter((service) => !ids.has(service.id));
2167
+ db.serviceFiles = db.serviceFiles.filter((link) => !ids.has(link.serviceId));
2168
+ db.apiGroups = db.apiGroups.filter(({ group }) => !ids.has(group.serviceId));
2169
+ db.serviceDiagrams = db.serviceDiagrams.filter((link) => !ids.has(link.serviceId));
2170
+ db.docs = db.docs.filter(({ serviceDoc }) => !ids.has(serviceDoc.serviceId));
2171
+ const droppedDatabases = new Set(db.databases.filter(({ serviceDb }) => ids.has(serviceDb.serviceId)).map(({ serviceDb }) => serviceDb.id));
2172
+ db.databases = db.databases.filter(({ serviceDb }) => !droppedDatabases.has(serviceDb.id));
2173
+ db.queries = db.queries.filter(({ savedQuery }) => !droppedDatabases.has(savedQuery.serviceDbId));
2174
+ db.dependencies = db.dependencies.filter((dependency) => !ids.has(dependency.service.id));
2175
+ }
2176
+ async function loadWorkspace() {
2177
+ const home = await homeRoot();
2178
+ const warnings = [];
2179
+ const skipped = [];
2180
+ function skip(root, reason) {
2181
+ skipped.push({
2182
+ root,
2183
+ reason
2184
+ });
2185
+ warnings.push(`${root} ${reason}`);
2186
+ }
2187
+ const projects = [];
2188
+ if (await readOptional(path.join(home, ".uigraph/workspace.yaml")) !== null) projects.push({
2189
+ id: WORKSPACE_ID,
2190
+ root: home,
2191
+ configFile: WORKSPACE_CONFIG
2192
+ });
2193
+ const ids = new Set(projects.map((p) => p.id));
2194
+ for (const root of await readRegistry(home)) {
2195
+ const base = slugify(path.basename(root));
2196
+ let id = base;
2197
+ for (let suffix = 2; ids.has(id); suffix++) id = `${base}-${suffix}`;
2198
+ ids.add(id);
2199
+ if (await readOptional(path.join(root, ".uigraph.yaml")) === null) {
2200
+ skip(root, `has no ${ROOT_CONFIG} and was skipped`);
2201
+ continue;
2202
+ }
2203
+ projects.push({
2204
+ id,
2205
+ root,
2206
+ configFile: ROOT_CONFIG
2207
+ });
2208
+ }
2209
+ const loaded = [];
2210
+ const services = [];
2211
+ const serviceFiles = [];
2212
+ const apiGroups = [];
2213
+ const diagrams = [];
2214
+ const serviceDiagrams = [];
2215
+ const docs = [];
2216
+ const standaloneDocs = [];
2217
+ const databases = [];
2218
+ const queries = [];
2219
+ const maps = [];
2220
+ const files = /* @__PURE__ */ new Map();
2221
+ const dependencies = [];
2222
+ const candidates = [];
2223
+ for (const project of projects) {
2224
+ const { db, errors } = await loadArtifacts(project.root, project.configFile);
2225
+ if (errors.length > 0) {
2226
+ skip(project.root, `has invalid artifacts and was skipped:\n${errors.map((error) => ` • ${error}`).join("\n")}`);
2227
+ continue;
2228
+ }
2229
+ candidates.push({
2230
+ project,
2231
+ db
2232
+ });
2233
+ }
2234
+ const owners = /* @__PURE__ */ new Map();
2235
+ for (const { project, db } of candidates) for (const service of db.services) {
2236
+ const primary = db.serviceFiles.find((link) => link.serviceId === service.id)?.file === project.configFile;
2237
+ const current = owners.get(service.id);
2238
+ if (current === void 0 || primary && !current.primary) owners.set(service.id, {
2239
+ root: project.root,
2240
+ primary
2241
+ });
2242
+ }
2243
+ for (const { project, db } of candidates) {
2244
+ const conflict = db.services.find((service) => {
2245
+ const owner = owners.get(service.id);
2246
+ return db.serviceFiles.find((link) => link.serviceId === service.id)?.file === project.configFile && owner?.root !== project.root;
2247
+ });
2248
+ if (conflict !== void 0) {
2249
+ skip(project.root, `was skipped because the service "${conflict.name}" is already defined by ${owners.get(conflict.id)?.root ?? "another project"}. A service can only be defined in one repository.`);
2250
+ continue;
2251
+ }
2252
+ const droppedIds = new Set(db.services.filter((service) => owners.get(service.id)?.root !== project.root).map((service) => service.id));
2253
+ if (droppedIds.size > 0) dropServices(db, droppedIds);
2254
+ loaded.push({
2255
+ ...project,
2256
+ configFiles: db.configFiles,
2257
+ serviceIds: db.services.map((service) => service.id)
2258
+ });
2259
+ services.push(...db.services);
2260
+ serviceFiles.push(...db.serviceFiles.map((link) => ({
2261
+ ...link,
2262
+ project
2263
+ })));
2264
+ apiGroups.push(...db.apiGroups);
2265
+ for (const diagram of db.diagrams) {
2266
+ const localId = diagram.entity.id;
2267
+ diagram.entity.id = `${project.id}--${localId}`;
2268
+ diagrams.push({
2269
+ ...diagram,
2270
+ project,
2271
+ localId
2272
+ });
2273
+ for (const { imagePath } of await listDiagramImages(project.root, diagram.entry.path)) files.set(`/files/${project.id}/${imagePath}`, {
2274
+ root: project.root,
2275
+ path: imagePath
2276
+ });
2277
+ }
2278
+ serviceDiagrams.push(...db.serviceDiagrams.map((link) => ({
2279
+ ...link,
2280
+ diagramId: link.diagram.id
2281
+ })));
2282
+ for (const doc of db.docs) {
2283
+ const url = `/files/${project.id}/${doc.entry.path}`;
2284
+ doc.serviceDoc.doc.fileUrl = url;
2285
+ files.set(url, {
2286
+ root: project.root,
2287
+ path: doc.entry.path
2288
+ });
2289
+ docs.push({
2290
+ ...doc,
2291
+ project
2292
+ });
2293
+ }
2294
+ for (const doc of db.standaloneDocs) {
2295
+ const url = `/files/${project.id}/${doc.entry.path}`;
2296
+ doc.doc.id = `${project.id}--${doc.doc.id}`;
2297
+ doc.doc.fileUrl = url;
2298
+ files.set(url, {
2299
+ root: project.root,
2300
+ path: doc.entry.path
2301
+ });
2302
+ standaloneDocs.push({
2303
+ ...doc,
2304
+ project
2305
+ });
2306
+ }
2307
+ for (const database of db.databases) {
2308
+ database.diagram.id = `${project.id}--${database.diagram.id}`;
2309
+ database.serviceDb.dbDiagramId = database.diagram.id;
2310
+ databases.push({
2311
+ ...database,
2312
+ project
2313
+ });
2314
+ }
2315
+ queries.push(...db.queries.map((query) => ({
2316
+ ...query,
2317
+ project
2318
+ })));
2319
+ for (const map of db.maps) {
2320
+ const prefix = `${project.id}--`;
2321
+ map.map.id = prefix + map.map.id;
2322
+ for (const { frame, focalPoints, groups, links } of map.frames) {
2323
+ frame.id = prefix + frame.id;
2324
+ frame.mapId = map.map.id;
2325
+ if (frame.screenshotAssetId !== null) {
2326
+ const url = `/files/${project.id}/${frame.screenshotAssetId}`;
2327
+ files.set(url, {
2328
+ root: project.root,
2329
+ path: frame.screenshotAssetId
2330
+ });
2331
+ frame.screenshotImageUrl = `${url}?v=${frame.screenshotContentHash}`;
2332
+ }
2333
+ for (const { point, components } of focalPoints) {
2334
+ point.id = prefix + point.id;
2335
+ point.frameId = frame.id;
2336
+ for (const { meta } of components) {
2337
+ meta.id = prefix + meta.id;
2338
+ meta.focalPointId = point.id;
2339
+ meta.frameId = frame.id;
2340
+ }
2341
+ }
2342
+ for (const group of groups) {
2343
+ group.id = prefix + group.id;
2344
+ group.frameId = frame.id;
2345
+ }
2346
+ for (const { link } of links) {
2347
+ link.id = prefix + link.id;
2348
+ link.frameId = frame.id;
2349
+ }
2350
+ }
2351
+ map.map.previewImgUrls = map.frames.flatMap(({ frame }) => frame.screenshotImageUrl ?? []).slice(0, 4);
2352
+ maps.push({
2353
+ ...map,
2354
+ project
2355
+ });
2356
+ }
2357
+ dependencies.push(...db.dependencies);
2358
+ }
2359
+ for (const dependency of dependencies) {
2360
+ const target = services.find((s) => s.id === slugify(dependency.dependencyName));
2361
+ dependency.dependency = target === void 0 ? null : toDependencyService(target);
2362
+ }
2363
+ for (const map of maps) for (const { links, focalPoints } of map.frames) {
2364
+ for (const { target, link } of links) {
2365
+ const targetMap = maps.find((m) => m.map.name === target.map);
2366
+ link.targetMapId = targetMap?.map.id ?? null;
2367
+ link.targetFrameId = target.frame === void 0 ? null : targetMap?.frames.find((f) => f.name === target.frame)?.frame.id ?? null;
2368
+ }
2369
+ for (const { components } of focalPoints) for (const { ref, meta } of components) {
2370
+ const service = services.find((s) => s.name === ref.serviceName);
2371
+ if (service === void 0) continue;
2372
+ if (ref.componentId === "component_api-contract") meta.componentLinkApiEndpointId = apiGroups.find(({ group }) => group.serviceId === service.id && group.name === ref.apiGroupName)?.endpoints.find((endpoint) => endpoint.operationId === ref.operationId)?.id ?? null;
2373
+ else if (ref.componentId === "component_backend-flow-diagram") meta.componentLinkDiagramId = serviceDiagrams.find((link) => link.serviceId === service.id && link.diagram.name === ref.architectureDiagramName)?.diagramId ?? null;
2374
+ else if (ref.componentId === "component_support-kb-troubleshooting") meta.componentLinkServiceDocId = docs.find((doc) => doc.serviceDoc.serviceId === service.id && doc.entry.name === ref.docName)?.serviceDoc.docId ?? null;
2375
+ }
2376
+ }
2377
+ const projectCount = loaded.filter((p) => p.id !== WORKSPACE_ID).length;
2378
+ return {
2379
+ warnings,
2380
+ skipped,
2381
+ workspace: {
2382
+ home,
2383
+ projects: loaded,
2384
+ name: `${projectCount} ${projectCount === 1 ? "project" : "projects"}`,
2385
+ services,
2386
+ serviceFiles,
2387
+ apiGroups,
2388
+ diagrams,
2389
+ serviceDiagrams,
2390
+ docs,
2391
+ standaloneDocs,
2392
+ databases,
2393
+ queries,
2394
+ maps,
2395
+ files,
2396
+ dependencies
2397
+ }
2398
+ };
2399
+ }
2400
+ //#endregion
2401
+ //#region src/lock.ts
2402
+ const LOCK_FILE = path.join(".uigraph", "viewer.lock.json");
2403
+ const lockSchema = z.object({
2404
+ pid: z.number().int().positive(),
2405
+ port: z.number().int().min(1).max(65535)
2406
+ });
2407
+ async function lockPath() {
2408
+ return path.join(await homeRoot(), LOCK_FILE);
2409
+ }
2410
+ function isAlive(pid) {
2411
+ try {
2412
+ process.kill(pid, 0);
2413
+ return true;
2414
+ } catch (error) {
2415
+ return error.code === "EPERM";
2416
+ }
2417
+ }
2418
+ async function readViewerLock() {
2419
+ const file = await lockPath();
2420
+ const text = await fs.readFile(file, "utf8").catch(() => null);
2421
+ if (text === null) return null;
2422
+ let lock;
2423
+ try {
2424
+ lock = lockSchema.parse(JSON.parse(text));
2425
+ } catch {
2426
+ await fs.rm(file, { force: true });
2427
+ return null;
2428
+ }
2429
+ if (!isAlive(lock.pid)) {
2430
+ await fs.rm(file, { force: true });
2431
+ return null;
2432
+ }
2433
+ return lock;
2434
+ }
2435
+ async function writeViewerLock(lock) {
2436
+ const file = await lockPath();
2437
+ await fs.mkdir(path.dirname(file), { recursive: true });
2438
+ await fs.writeFile(file, JSON.stringify(lock), { mode: 384 });
2439
+ }
2440
+ async function removeViewerLock(pid) {
2441
+ if ((await readViewerLock())?.pid === pid) await fs.rm(await lockPath(), { force: true });
2442
+ }
2443
+ //#endregion
2444
+ //#region src/artifacts/databases.ts
2445
+ const DIALECTS = {
2446
+ postgresql: "postgres",
2447
+ postgres: "postgres",
2448
+ mysql: "mysql",
2449
+ sqlite: "sqlite",
2450
+ dynamodb: "dynamodb",
2451
+ mongodb: "mongodb"
2452
+ };
2453
+ async function createDatabase(root, configFile, file, input, content) {
2454
+ if ((await loadValid(root, configFile)).databases.some((d) => d.file === file && d.entry.name.toLowerCase() === input.name.toLowerCase())) throw new Error(`Another database in ${file} is named "${input.name}"`);
2455
+ const dialect = DIALECTS[input.dialect];
2456
+ if (dialect === void 0) throw new Error(`Unsupported database type "${input.dialect}"`);
2457
+ parseDatabaseSchema(dialect, content);
2458
+ const base = slugify(input.name);
2459
+ if (base === "") throw new Error("The database name must contain a letter or digit");
2460
+ const extension = dialect === "dynamodb" || dialect === "mongodb" ? ".json" : ".sql";
2461
+ let schemaPath = `.uigraph/db/${base}${extension}`;
2462
+ for (let suffix = 2; await exists(path.join(root, schemaPath)); suffix++) schemaPath = `.uigraph/db/${base}-${suffix}${extension}`;
2463
+ await writeArtifactFile(root, schemaPath, content);
2464
+ const { source, document } = await readYaml(root, file);
2465
+ await writeArtifactFile(root, file, applyEdits(source, [appendItem(source, document, ["databases"], {
2466
+ name: input.name,
2467
+ dialect,
2468
+ schemaPath
2469
+ })]));
2470
+ return schemaPath;
2471
+ }
2472
+ async function deleteDatabase(root, configFile, file, name) {
2473
+ const db = await loadValid(root, configFile);
2474
+ const database = db.databases.find((d) => d.file === file && d.entry.name === name);
2475
+ if (database === void 0) throw new Error(`No database named "${name}" in ${file}`);
2476
+ const usedBy = db.queries.filter((q) => q.savedQuery.serviceDbId === database.serviceDb.id);
2477
+ if (usedBy.length > 0) throw new Error(`Remove the queries that use "${name}" first: ${usedBy.map((q) => q.entry.name).join(", ")}`);
2478
+ const { source, document } = await readYaml(root, file);
2479
+ await writeArtifactFile(root, file, applyEdits(source, [removeItem(source, document, ["databases"], findItemIndex(document, ["databases"], name))]));
2480
+ const stillUsed = db.databases.some((d) => d !== database && d.entry.schemaPath === database.entry.schemaPath);
2481
+ if (isArtifactPath(database.entry.schemaPath) && !stillUsed) await deleteArtifactFile(root, database.entry.schemaPath);
2482
+ }
2483
+ //#endregion
2484
+ //#region src/artifacts/queries.ts
2485
+ async function findDatabase$1(root, configFile, serviceDbId) {
2486
+ const db = await loadValid(root, configFile);
2487
+ const database = db.databases.find((d) => d.serviceDb.id === serviceDbId);
2488
+ if (database === void 0) throw new Error(`Database ${serviceDbId} not found`);
2489
+ return {
2490
+ db,
2491
+ database
2492
+ };
2493
+ }
2494
+ function assertNameFree(db, serviceDbId, name, exceptId) {
2495
+ const id = slugify(`${serviceDbId}-${name}`);
2496
+ if (db.queries.some((q) => q.savedQuery.id === id && q.savedQuery.id !== exceptId)) throw new Error(`Another query on this database is named "${name}"`);
2497
+ return id;
2498
+ }
2499
+ function optionalFields(input) {
2500
+ return {
2501
+ ...input.description === "" ? {} : { description: input.description },
2502
+ ...input.tags.length === 0 ? {} : { tags: input.tags }
2503
+ };
2504
+ }
2505
+ async function createQuery(root, configFile, serviceDbId, input) {
2506
+ const { db, database } = await findDatabase$1(root, configFile, serviceDbId);
2507
+ const id = assertNameFree(db, serviceDbId, input.name, null);
2508
+ const { source, document } = await readYaml(root, database.file);
2509
+ await writeArtifactFile(root, database.file, applyEdits(source, [appendItem(source, document, ["queries"], {
2510
+ name: input.name,
2511
+ database: database.entry.name,
2512
+ queryText: input.queryText,
2513
+ ...optionalFields(input)
2514
+ })]));
2515
+ return id;
2516
+ }
2517
+ async function updateQuery(root, configFile, queryId, input) {
2518
+ const db = await loadValid(root, configFile);
2519
+ const query = db.queries.find((q) => q.savedQuery.id === queryId);
2520
+ if (query === void 0) throw new Error(`Query ${queryId} not found`);
2521
+ const id = assertNameFree(db, query.savedQuery.serviceDbId, input.name, queryId);
2522
+ const { description, tags, queryText, path, ...rest } = query.entry;
2523
+ if (path !== void 0) {
2524
+ if (!isArtifactPath(path)) throw new Error(`The query file ${path} is outside .uigraph and cannot be edited`);
2525
+ await writeArtifactFile(root, path, input.queryText);
2526
+ }
2527
+ const { source, document } = await readYaml(root, query.file);
2528
+ await writeArtifactFile(root, query.file, applyEdits(source, [replaceItem(source, document.getIn(["queries", query.index], true), {
2529
+ ...rest,
2530
+ name: input.name,
2531
+ ...path === void 0 ? { queryText: input.queryText } : { path },
2532
+ ...optionalFields(input)
2533
+ })]));
2534
+ return id;
2535
+ }
2536
+ async function deleteQuery(root, configFile, queryId) {
2537
+ const db = await loadValid(root, configFile);
2538
+ const query = db.queries.find((q) => q.savedQuery.id === queryId);
2539
+ if (query === void 0) throw new Error(`Query ${queryId} not found`);
2540
+ const { source, document } = await readYaml(root, query.file);
2541
+ await writeArtifactFile(root, query.file, applyEdits(source, [removeItem(source, document, ["queries"], query.index)]));
2542
+ const path = query.entry.path;
2543
+ const stillUsed = db.queries.some((q) => q !== query && q.entry.path === path);
2544
+ if (path !== void 0 && isArtifactPath(path) && !stillUsed) await deleteArtifactFile(root, path);
2545
+ }
2546
+ //#endregion
2547
+ //#region src/uploads.ts
2548
+ const pending = /* @__PURE__ */ new Set();
2549
+ const uploads = /* @__PURE__ */ new Map();
2550
+ function createUpload() {
2551
+ const assetId = randomUUID();
2552
+ pending.add(assetId);
2553
+ return {
2554
+ assetId,
2555
+ uploadUrl: `/uploads/${assetId}`
2556
+ };
2557
+ }
2558
+ function isPendingUpload(assetId) {
2559
+ return pending.has(assetId);
2560
+ }
2561
+ function storeUpload(assetId, data, contentType) {
2562
+ if (!pending.delete(assetId)) throw new Error(`Unknown upload ${assetId}`);
2563
+ uploads.set(assetId, {
2564
+ data,
2565
+ contentType
2566
+ });
2567
+ }
2568
+ function takeUpload(assetId) {
2569
+ const upload = uploads.get(assetId);
2570
+ if (upload === void 0) throw new Error(`The upload ${assetId} was not found; upload the file again`);
2571
+ uploads.delete(assetId);
2572
+ return upload;
2573
+ }
2574
+ //#endregion
2575
+ //#region src/graphql/resolvers.ts
2576
+ const MAX_DEPENDENCY_DEPTH = 10;
2577
+ function toDiagramImage(projectId, diagramId, imagePath, createdAt, order) {
2578
+ return {
2579
+ diagramImageId: imagePath,
2580
+ diagramId,
2581
+ orgId: ORG_ID,
2582
+ assetId: imagePath,
2583
+ imageUrl: `/files/${projectId}/${imagePath}`,
2584
+ fileName: imagePath.split("/").at(-1),
2585
+ order,
2586
+ createdBy: ACTOR_ID,
2587
+ createdAt
2588
+ };
2589
+ }
2590
+ function notFound(kind, id) {
2591
+ throw new GraphQLError(`${kind} ${id} not found`);
2592
+ }
2593
+ function findApiGroup(db, serviceId, apiGroupId) {
2594
+ return db.apiGroups.find(({ group }) => group.id === apiGroupId && group.serviceId === serviceId) ?? notFound("API group", apiGroupId);
2595
+ }
2596
+ function sortItems(items, sortBy, sortDir) {
2597
+ if (sortBy === "name") {
2598
+ const sorted = [...items].sort((a, b) => a.name.localeCompare(b.name));
2599
+ if (sortDir === "desc") return sorted.reverse();
2600
+ return sorted;
2601
+ }
2602
+ if (sortBy === null || sortBy === void 0 || sortBy === "created" || sortBy === "updated") return items;
2603
+ throw new GraphQLError(`Unsupported sort: ${sortBy}`);
2604
+ }
2605
+ function page(items, args) {
2606
+ const search = args.search?.trim().toLowerCase() ?? "";
2607
+ const matching = search === "" ? items : items.filter((item) => item.name.toLowerCase().includes(search));
2608
+ const sorted = sortItems(matching, args.sortBy, args.sortDir);
2609
+ const offset = args.offset ?? 0;
2610
+ return {
2611
+ items: args.limit === null || args.limit === void 0 ? sorted.slice(offset) : sorted.slice(offset, offset + args.limit),
2612
+ totalCount: matching.length
2613
+ };
2614
+ }
2615
+ function walkDependencies(db, serviceId, direction) {
2616
+ const { dependencies } = db;
2617
+ const ownSide = direction === "upstream" ? "downstream" : "upstream";
2618
+ const otherSide = direction === "upstream" ? "upstream" : "downstream";
2619
+ const visited = /* @__PURE__ */ new Set([serviceId]);
2620
+ let frontier = [serviceId];
2621
+ for (let depth = 0; depth < MAX_DEPENDENCY_DEPTH && frontier.length > 0; depth++) {
2622
+ const next = [];
2623
+ for (const current of frontier) for (const row of dependencies) {
2624
+ if (row.dependency === null) continue;
2625
+ const neighbour = row.service.id === current && row.direction === ownSide ? row.dependency.id : row.dependency.id === current && row.direction === otherSide ? row.service.id : null;
2626
+ if (neighbour !== null && !visited.has(neighbour)) {
2627
+ visited.add(neighbour);
2628
+ next.push(neighbour);
2629
+ }
2630
+ }
2631
+ frontier = next;
2632
+ }
2633
+ return dependencies.filter((row) => visited.has(row.service.id) && (row.dependency === null || visited.has(row.dependency.id)));
2634
+ }
2635
+ async function findCreatedDiagram(projectRoot, localId) {
2636
+ const { workspace } = await loadWorkspace();
2637
+ const diagram = workspace.diagrams.find((d) => d.project.root === projectRoot && d.localId === localId);
2638
+ if (diagram === void 0) throw new GraphQLError(`The new diagram ${localId} could not be loaded`);
2639
+ return diagram;
2640
+ }
2641
+ function requireName(name) {
2642
+ if (name === null || name === void 0 || name.trim() === "") throw new GraphQLError("A name is required");
2643
+ return name.trim();
2644
+ }
2645
+ function findServiceFile(db, serviceId) {
2646
+ return db.serviceFiles.find((s) => s.serviceId === serviceId) ?? notFound("Service", serviceId);
2647
+ }
2648
+ function findDatabase(db, serviceId, id) {
2649
+ return db.databases.find((d) => d.serviceDb.serviceId === serviceId && d.serviceDb.id === id) ?? notFound("Database", id);
2650
+ }
2651
+ function toQueryInput(input) {
2652
+ const queryText = input.queryText?.trim() ?? "";
2653
+ if (queryText === "") throw new GraphQLError("The query text is required");
2654
+ return {
2655
+ name: requireName(input.title),
2656
+ description: input.description?.trim() ?? "",
2657
+ queryText,
2658
+ tags: input.tags ?? []
2659
+ };
2660
+ }
2661
+ async function findSavedQuery(id) {
2662
+ const { workspace } = await loadWorkspace();
2663
+ return workspace.queries.find((q) => q.savedQuery.id === id)?.savedQuery ?? notFound("Query", id);
2664
+ }
2665
+ const COMPONENTS = [
2666
+ {
2667
+ componentId: COMPONENT_API_CONTRACT_ID,
2668
+ name: "API Contract",
2669
+ description: "Link an API operation of a service"
2670
+ },
2671
+ {
2672
+ componentId: COMPONENT_FLOW_DIAGRAM_ID,
2673
+ name: "Flow Diagram",
2674
+ description: "Link an architecture diagram of a service"
2675
+ },
2676
+ {
2677
+ componentId: COMPONENT_SUPPORT_KB_ID,
2678
+ name: "Documentation",
2679
+ description: "Link a doc of a service"
2680
+ }
2681
+ ].map((component, order) => ({
2682
+ ...component,
2683
+ type: "link",
2684
+ category: "Links",
2685
+ tags: [],
2686
+ slug: component.componentId,
2687
+ previewImageJpg: "",
2688
+ isActive: true,
2689
+ order,
2690
+ componentFields: [],
2691
+ createdAt: (/* @__PURE__ */ new Date(0)).toISOString(),
2692
+ updatedAt: (/* @__PURE__ */ new Date(0)).toISOString()
2693
+ }));
2694
+ function findMap(db, id) {
2695
+ return db.maps.find((m) => m.map.id === id) ?? notFound("Map", id);
2696
+ }
2697
+ function findFrame(db, mapId, id) {
2698
+ const map = findMap(db, mapId);
2699
+ return {
2700
+ map,
2701
+ frame: map.frames.find((f) => f.frame.id === id) ?? notFound("Frame", id)
2702
+ };
2703
+ }
2704
+ function findFocalPoint(db, mapId, frameId, id) {
2705
+ const { map, frame } = findFrame(db, mapId, frameId);
2706
+ return {
2707
+ map,
2708
+ frame,
2709
+ focalPoint: frame.focalPoints.find((p) => p.point.id === id) ?? notFound("Focal point", id)
2710
+ };
2711
+ }
2712
+ function requireSlug(name) {
2713
+ if (slugify(name) === "") throw new GraphQLError("The name must contain a letter or digit");
2714
+ return name;
2715
+ }
2716
+ function assertMapNameFree(db, name, exceptId) {
2717
+ if (db.maps.some((m) => m.map.id !== exceptId && slugify(m.entry.name) === slugify(name))) throw new GraphQLError(`Another map is named "${name}"`);
2718
+ }
2719
+ function frameIn(entry, name) {
2720
+ return entry.frames?.find((f) => f.name === name) ?? notFound("Frame", name);
2721
+ }
2722
+ function pointIn(frame, name) {
2723
+ return frame.focalPoints?.find((p) => p.name === name) ?? notFound("Focal point", name);
2724
+ }
2725
+ function editMapOf(map, edit) {
2726
+ return editMap(map.project.root, map.project.configFile, map.file, map.entry.name, edit);
2727
+ }
2728
+ function editFrameCanvas(map, frameName, edit) {
2729
+ return editCanvas(map.project.root, (canvas) => {
2730
+ const mapCanvas = canvas[map.entry.name] ??= {};
2731
+ const frames = mapCanvas.frames ??= {};
2732
+ edit(frames[frameName] ??= {});
2733
+ });
2734
+ }
2735
+ function itemAt(items, id, kind) {
2736
+ const index = Number(id.slice(id.lastIndexOf("--") + 2).slice(1));
2737
+ if (items?.[index] === void 0) notFound(kind, id);
2738
+ return {
2739
+ items,
2740
+ index
2741
+ };
2742
+ }
2743
+ function toCanvas(map) {
2744
+ const positions = Object.fromEntries(map.frames.flatMap(({ name, frame }) => {
2745
+ const position = map.canvas.framePositions?.[name];
2746
+ return position === void 0 ? [] : [[frame.id, position]];
2747
+ }));
2748
+ return {
2749
+ mapId: map.map.id,
2750
+ orgId: ORG_ID,
2751
+ zoom: map.canvas.zoom ?? 1,
2752
+ navigationX: map.canvas.navigationX ?? 0,
2753
+ navigationY: map.canvas.navigationY ?? 0,
2754
+ framePositions: JSON.stringify(positions),
2755
+ updatedAt: map.map.updatedAt
2756
+ };
2757
+ }
2758
+ function serviceName(db, serviceId) {
2759
+ return (db.services.find((s) => s.id === serviceId) ?? notFound("Service", serviceId)).name;
2760
+ }
2761
+ function toLinkTarget(db, input) {
2762
+ if (input.kind === "frame") {
2763
+ for (const map of db.maps) {
2764
+ const frame = map.frames.find((f) => f.frame.id === input.targetFrameId);
2765
+ if (frame !== void 0) return {
2766
+ map: map.entry.name,
2767
+ frame: frame.name
2768
+ };
2769
+ }
2770
+ return notFound("Frame", String(input.targetFrameId));
2771
+ }
2772
+ if (input.kind === "map") return { map: findMap(db, String(input.targetMapId)).entry.name };
2773
+ throw new GraphQLError(`Unsupported link kind: ${input.kind}`);
2774
+ }
2775
+ function toModalFields(fields) {
2776
+ return fields.map((field) => {
2777
+ if (!field.componentFieldId) throw new GraphQLError("Every component field needs a componentFieldId");
2778
+ return {
2779
+ componentFieldId: field.componentFieldId,
2780
+ ...field.label ? { label: field.label } : {},
2781
+ ...field.type ? { type: field.type } : {},
2782
+ ...field.data ? { data: field.data } : {}
2783
+ };
2784
+ });
2785
+ }
2786
+ function toComponentRef(db, componentId, input) {
2787
+ if (input.componentLinkTestPackId) throw new GraphQLError("Test packs are not available in uigraph");
2788
+ const ref = { componentId };
2789
+ if (input.componentLinkApiEndpointId) {
2790
+ const id = input.componentLinkApiEndpointId;
2791
+ const group = db.apiGroups.find(({ endpoints }) => endpoints.some((e) => e.id === id)) ?? notFound("Endpoint", id);
2792
+ const endpoint = group.endpoints.find((e) => e.id === id) ?? notFound("Endpoint", id);
2793
+ if (endpoint.operationId === "") throw new GraphQLError(`${endpoint.method} ${endpoint.path} has no operationId, so it cannot be linked`);
2794
+ ref.serviceName = serviceName(db, group.group.serviceId);
2795
+ ref.apiGroupName = group.group.name;
2796
+ ref.operationId = endpoint.operationId;
2797
+ } else if (input.componentLinkDiagramId) {
2798
+ const link = db.serviceDiagrams.find((l) => l.diagramId === input.componentLinkDiagramId);
2799
+ if (link === void 0) throw new GraphQLError("Only service diagrams can be linked to a focal point");
2800
+ ref.serviceName = serviceName(db, link.serviceId);
2801
+ ref.architectureDiagramName = link.diagram.name;
2802
+ } else if (input.componentLinkServiceDocId) {
2803
+ const doc = db.docs.find((d) => d.serviceDoc.docId === input.componentLinkServiceDocId) ?? notFound("Doc", input.componentLinkServiceDocId);
2804
+ ref.serviceName = serviceName(db, doc.serviceDoc.serviceId);
2805
+ ref.docName = doc.entry.name;
2806
+ } else throw new GraphQLError("Choose the API operation, diagram or doc to link");
2807
+ if (input.componentModalFields && input.componentModalFields.length > 0) ref.modalFields = toModalFields(input.componentModalFields);
2808
+ return ref;
2809
+ }
2810
+ function createRootValue(db) {
2811
+ const diagrams = db.diagrams.map((d) => d.entity);
2812
+ return {
2813
+ me: () => ({
2814
+ userId: "local-user",
2815
+ orgId: ORG_ID,
2816
+ email: "",
2817
+ name: os.userInfo().username,
2818
+ login: "local",
2819
+ kind: "user",
2820
+ isServerAdmin: false,
2821
+ authProvider: "local",
2822
+ avatarUrl: null
2823
+ }),
2824
+ myOrgs: () => [{
2825
+ id: ORG_ID,
2826
+ name: db.name,
2827
+ logoUrl: null,
2828
+ role: "editor",
2829
+ active: true,
2830
+ onboardingDone: true
2831
+ }],
2832
+ features: () => ({
2833
+ github: false,
2834
+ slack: false,
2835
+ enterprise: false,
2836
+ billingUrl: null
2837
+ }),
2838
+ teams: () => [],
2839
+ members: () => [],
2840
+ comments: () => [],
2841
+ serviceDBs: ({ serviceId }) => db.databases.filter((d) => d.serviceDb.serviceId === serviceId).map((d) => d.serviceDb),
2842
+ serviceDB: ({ serviceId, id }) => findDatabase(db, serviceId, id).serviceDb,
2843
+ savedQueries: ({ serviceDbId, scope }) => scope === "TEAM" ? db.queries.filter((q) => q.savedQuery.serviceDbId === serviceDbId).map((q) => q.savedQuery) : [],
2844
+ createSavedQuery: async ({ serviceId, serviceDbId, input }) => {
2845
+ const database = findDatabase(db, serviceId, serviceDbId);
2846
+ return findSavedQuery(await createQuery(database.project.root, database.project.configFile, serviceDbId, toQueryInput(input)));
2847
+ },
2848
+ updateSavedQuery: async ({ serviceId, serviceDbId, id, input }) => {
2849
+ const database = findDatabase(db, serviceId, serviceDbId);
2850
+ return findSavedQuery(await updateQuery(database.project.root, database.project.configFile, id, toQueryInput(input)));
2851
+ },
2852
+ deleteSavedQuery: async ({ serviceId, serviceDbId, id }) => {
2853
+ const database = findDatabase(db, serviceId, serviceDbId);
2854
+ await deleteQuery(database.project.root, database.project.configFile, id);
2855
+ return true;
2856
+ },
2857
+ createServiceDB: async ({ serviceId, input }) => {
2858
+ const name = requireName(input.dbName);
2859
+ if (!input.schemaContent) throw new GraphQLError("A schema file is required");
2860
+ const link = findServiceFile(db, serviceId);
2861
+ const schemaPath = await createDatabase(link.project.root, link.project.configFile, link.file, {
2862
+ name,
2863
+ dialect: input.dialect ?? ""
2864
+ }, input.schemaContent);
2865
+ const { workspace } = await loadWorkspace();
2866
+ return workspace.databases.find((d) => d.project.root === link.project.root && d.entry.schemaPath === schemaPath)?.serviceDb ?? notFound("Database", schemaPath);
2867
+ },
2868
+ deleteServiceDB: async ({ serviceId, id }) => {
2869
+ const database = findDatabase(db, serviceId, id);
2870
+ await deleteDatabase(database.project.root, database.project.configFile, database.file, database.entry.name);
2871
+ return true;
2872
+ },
2873
+ componentLinkUsages: () => [],
2874
+ maps: (args) => {
2875
+ if (args.folderId || args.teamId) return {
2876
+ items: [],
2877
+ totalCount: 0
2878
+ };
2879
+ return page(db.maps.map((m) => m.map), args);
2880
+ },
2881
+ map: ({ id }) => findMap(db, id).map,
2882
+ frames: (args) => page(findMap(db, args.mapId).frames.map((f) => f.frame), args),
2883
+ frame: ({ mapId, id }) => findFrame(db, mapId, id).frame.frame,
2884
+ frameById: ({ id }) => db.maps.flatMap((m) => m.frames).find((f) => f.frame.id === id)?.frame ?? notFound("Frame", id),
2885
+ focalPoints: ({ mapId, frameId }) => findFrame(db, mapId, frameId).frame.focalPoints.map((p) => p.point),
2886
+ focalPointMeta: (args) => findFocalPoint(db, args.mapId, args.frameId, args.focalPointId).focalPoint.components.map((c) => c.meta),
2887
+ frameGroups: ({ mapId, frameId }) => findFrame(db, mapId, frameId).frame.groups,
2888
+ frameLinks: ({ mapId, frameId }) => findFrame(db, mapId, frameId).frame.links.map((l) => l.link),
2889
+ canvas: ({ mapId }) => toCanvas(findMap(db, mapId)),
2890
+ createMap: async ({ input }) => {
2891
+ const name = requireSlug(requireName(input.name));
2892
+ if (!input.serviceId) throw new GraphQLError("Choose the service whose repository stores this map");
2893
+ assertMapNameFree(db, name);
2894
+ const link = findServiceFile(db, input.serviceId);
2895
+ await createMap(link.project.root, link.project.configFile, link.file, {
2896
+ name,
2897
+ description: input.description?.trim() ?? ""
2898
+ });
2899
+ const { workspace } = await loadWorkspace();
2900
+ return workspace.maps.find((m) => m.project.root === link.project.root && m.entry.name === name)?.map ?? notFound("Map", name);
2901
+ },
2902
+ updateMap: async ({ id, input }) => {
2903
+ const map = findMap(db, id);
2904
+ const oldName = map.entry.name;
2905
+ const name = input.name === null || input.name === void 0 ? oldName : requireSlug(requireName(input.name));
2906
+ assertMapNameFree(db, name, id);
2907
+ await editMapOf(map, (entry) => {
2908
+ entry.name = name;
2909
+ if (input.description !== null && input.description !== void 0) {
2910
+ const description = input.description.trim();
2911
+ if (description === "") delete entry.description;
2912
+ else entry.description = description;
2913
+ }
2914
+ return entry;
2915
+ });
2916
+ if (name !== oldName) {
2917
+ await editCanvas(map.project.root, (canvas) => {
2918
+ if (canvas[oldName] !== void 0) {
2919
+ canvas[name] = canvas[oldName];
2920
+ delete canvas[oldName];
2921
+ }
2922
+ });
2923
+ for (const project of db.projects) await retargetLinks(project.root, { map: oldName }, { map: name });
2924
+ }
2925
+ const { workspace } = await loadWorkspace();
2926
+ return workspace.maps.find((m) => m.project.root === map.project.root && m.entry.name === name)?.map ?? notFound("Map", name);
2927
+ },
2928
+ deleteMap: async ({ id }) => {
2929
+ const map = findMap(db, id);
2930
+ await editMapOf(map, () => null);
2931
+ await deleteUnusedImages(map.project.root, map.project.configFile, map.frames.flatMap((f) => f.frame.screenshotAssetId ?? []));
2932
+ await editCanvas(map.project.root, (canvas) => {
2933
+ delete canvas[map.entry.name];
2934
+ });
2935
+ for (const project of db.projects) await retargetLinks(project.root, { map: map.entry.name }, null);
2936
+ return true;
2937
+ },
2938
+ createFrame: async ({ mapId, input }) => {
2939
+ const map = findMap(db, mapId);
2940
+ const name = requireSlug(requireName(input.name));
2941
+ if (map.frames.some((f) => slugify(f.name) === slugify(name))) throw new GraphQLError(`Another frame in this map is named "${name}"`);
2942
+ const imagePath = input.screenshotAssetId ? await writeFrameImage(map.project.root, map.entry.name, name, takeUpload(input.screenshotAssetId)) : void 0;
2943
+ const description = input.description?.trim() ?? "";
2944
+ await editMapOf(map, (entry) => {
2945
+ entry.frames = [...entry.frames ?? [], {
2946
+ name,
2947
+ ...description === "" ? {} : { description },
2948
+ ...imagePath === void 0 ? {} : { imagePath }
2949
+ }];
2950
+ return entry;
2951
+ });
2952
+ const { workspace } = await loadWorkspace();
2953
+ return findMap(workspace, mapId).frames.find((f) => f.name === name)?.frame ?? notFound("Frame", name);
2954
+ },
2955
+ updateFrame: async ({ mapId, id, input }) => {
2956
+ if (input.order !== null && input.order !== void 0) throw new GraphQLError("Reordering frames is not supported");
2957
+ const { map, frame } = findFrame(db, mapId, id);
2958
+ const oldName = frame.name;
2959
+ const name = input.name === null || input.name === void 0 ? oldName : requireSlug(requireName(input.name));
2960
+ if (map.frames.some((f) => f !== frame && slugify(f.name) === slugify(name))) throw new GraphQLError(`Another frame in this map is named "${name}"`);
2961
+ const oldImage = frame.frame.screenshotAssetId;
2962
+ const imagePath = input.screenshotAssetId ? await writeFrameImage(map.project.root, map.entry.name, name, takeUpload(input.screenshotAssetId)) : void 0;
2963
+ await editMapOf(map, (entry) => {
2964
+ const target = frameIn(entry, oldName);
2965
+ target.name = name;
2966
+ if (input.description !== null && input.description !== void 0) {
2967
+ const description = input.description.trim();
2968
+ if (description === "") delete target.description;
2969
+ else target.description = description;
2970
+ }
2971
+ if (imagePath !== void 0) target.imagePath = imagePath;
2972
+ return entry;
2973
+ });
2974
+ if (imagePath !== void 0 && oldImage !== null) await deleteUnusedImages(map.project.root, map.project.configFile, [oldImage]);
2975
+ if (name !== oldName) {
2976
+ await editCanvas(map.project.root, (canvas) => {
2977
+ const mapCanvas = canvas[map.entry.name];
2978
+ for (const record of [mapCanvas?.framePositions, mapCanvas?.frames]) if (record?.[oldName] !== void 0) {
2979
+ record[name] = record[oldName];
2980
+ delete record[oldName];
2981
+ }
2982
+ });
2983
+ for (const project of db.projects) await retargetLinks(project.root, {
2984
+ map: map.entry.name,
2985
+ frame: oldName
2986
+ }, {
2987
+ map: map.entry.name,
2988
+ frame: name
2989
+ });
2990
+ }
2991
+ const { workspace } = await loadWorkspace();
2992
+ return findMap(workspace, mapId).frames.find((f) => f.name === name)?.frame ?? notFound("Frame", name);
2993
+ },
2994
+ deleteFrame: async ({ mapId, id }) => {
2995
+ const { map, frame } = findFrame(db, mapId, id);
2996
+ await editMapOf(map, (entry) => {
2997
+ entry.frames = entry.frames?.filter((f) => f.name !== frame.name);
2998
+ return entry;
2999
+ });
3000
+ if (frame.frame.screenshotAssetId !== null) await deleteUnusedImages(map.project.root, map.project.configFile, [frame.frame.screenshotAssetId]);
3001
+ await editCanvas(map.project.root, (canvas) => {
3002
+ delete canvas[map.entry.name]?.framePositions?.[frame.name];
3003
+ delete canvas[map.entry.name]?.frames?.[frame.name];
3004
+ });
3005
+ for (const project of db.projects) await retargetLinks(project.root, {
3006
+ map: map.entry.name,
3007
+ frame: frame.name
3008
+ }, null);
3009
+ return true;
3010
+ },
3011
+ createFocalPoint: async ({ mapId, frameId, input }) => {
3012
+ const { map, frame } = findFrame(db, mapId, frameId);
3013
+ const name = requireName(input.name);
3014
+ if (input.locationX === null || input.locationX === void 0) throw new GraphQLError("A focal point needs a location");
3015
+ if (input.locationY === null || input.locationY === void 0) throw new GraphQLError("A focal point needs a location");
3016
+ const x = input.locationX;
3017
+ const y = input.locationY;
3018
+ await editMapOf(map, (entry) => {
3019
+ const target = frameIn(entry, frame.name);
3020
+ if (target.focalPoints?.some((p) => p.name === name)) throw new GraphQLError(`Another focal point is named "${name}"`);
3021
+ target.focalPoints = [...target.focalPoints ?? [], {
3022
+ name,
3023
+ x,
3024
+ y,
3025
+ visibility: input.visibility ?? "public",
3026
+ ...input.color ? { color: input.color } : {}
3027
+ }];
3028
+ return entry;
3029
+ });
3030
+ const { workspace } = await loadWorkspace();
3031
+ return findFrame(workspace, mapId, frameId).frame.focalPoints.find((p) => p.point.name === name)?.point ?? notFound("Focal point", name);
3032
+ },
3033
+ updateFocalPoint: async ({ mapId, frameId, id, input }) => {
3034
+ const { map, frame, focalPoint } = findFocalPoint(db, mapId, frameId, id);
3035
+ const oldName = focalPoint.point.name;
3036
+ const name = input.name === null || input.name === void 0 ? oldName : requireName(input.name);
3037
+ await editMapOf(map, (entry) => {
3038
+ const target = frameIn(entry, frame.name);
3039
+ if (name !== oldName && target.focalPoints?.some((p) => p.name === name)) throw new GraphQLError(`Another focal point is named "${name}"`);
3040
+ const point = pointIn(target, oldName);
3041
+ point.name = name;
3042
+ if (input.locationX !== null && input.locationX !== void 0) point.x = input.locationX;
3043
+ if (input.locationY !== null && input.locationY !== void 0) point.y = input.locationY;
3044
+ if (input.visibility) point.visibility = input.visibility;
3045
+ if (input.color) point.color = input.color;
3046
+ return entry;
3047
+ });
3048
+ const { workspace } = await loadWorkspace();
3049
+ return findFocalPoint(workspace, mapId, frameId, id).focalPoint.point;
3050
+ },
3051
+ deleteFocalPoint: async ({ mapId, frameId, id }) => {
3052
+ const { map, frame, focalPoint } = findFocalPoint(db, mapId, frameId, id);
3053
+ await editMapOf(map, (entry) => {
3054
+ const target = frameIn(entry, frame.name);
3055
+ target.focalPoints = target.focalPoints?.filter((p) => p.name !== focalPoint.point.name);
3056
+ return entry;
3057
+ });
3058
+ return true;
3059
+ },
3060
+ upsertCanvas: async ({ mapId, input }) => {
3061
+ const map = findMap(db, mapId);
3062
+ const positions = input.framePositions === null || input.framePositions === void 0 ? void 0 : Object.fromEntries(Object.entries(JSON.parse(input.framePositions)).map(([frameId, position]) => [(map.frames.find((f) => f.frame.id === frameId) ?? notFound("Frame", frameId)).name, {
3063
+ x: position.x,
3064
+ y: position.y
3065
+ }]));
3066
+ await editCanvas(map.project.root, (canvas) => {
3067
+ const mapCanvas = canvas[map.entry.name] ??= {};
3068
+ if (input.zoom !== null && input.zoom !== void 0) mapCanvas.zoom = input.zoom;
3069
+ if (input.navigationX !== null && input.navigationX !== void 0) mapCanvas.navigationX = input.navigationX;
3070
+ if (input.navigationY !== null && input.navigationY !== void 0) mapCanvas.navigationY = input.navigationY;
3071
+ if (positions !== void 0) mapCanvas.framePositions = positions;
3072
+ });
3073
+ const { workspace } = await loadWorkspace();
3074
+ return toCanvas(findMap(workspace, mapId));
3075
+ },
3076
+ createFrameGroup: async ({ mapId, frameId, input }) => {
3077
+ const { map, frame } = findFrame(db, mapId, frameId);
3078
+ const name = requireName(input.name);
3079
+ await editFrameCanvas(map, frame.name, (frameCanvas) => {
3080
+ frameCanvas.groups = [...frameCanvas.groups ?? [], {
3081
+ name,
3082
+ description: input.description?.trim() ?? "",
3083
+ x: input.locationX ?? 0,
3084
+ y: input.locationY ?? 0,
3085
+ width: input.width ?? 0,
3086
+ height: input.height ?? 0
3087
+ }];
3088
+ });
3089
+ const { workspace } = await loadWorkspace();
3090
+ return findFrame(workspace, mapId, frameId).frame.groups.at(-1);
3091
+ },
3092
+ updateFrameGroup: async ({ mapId, frameId, id, input }) => {
3093
+ const { map, frame } = findFrame(db, mapId, frameId);
3094
+ await editFrameCanvas(map, frame.name, (frameCanvas) => {
3095
+ const { items, index } = itemAt(frameCanvas.groups, id, "Frame group");
3096
+ const group = items[index];
3097
+ items[index] = {
3098
+ name: input.name === null || input.name === void 0 ? group.name : requireName(input.name),
3099
+ description: input.description?.trim() ?? group.description,
3100
+ x: input.locationX ?? group.x,
3101
+ y: input.locationY ?? group.y,
3102
+ width: input.width ?? group.width,
3103
+ height: input.height ?? group.height
3104
+ };
3105
+ });
3106
+ const { workspace } = await loadWorkspace();
3107
+ return findFrame(workspace, mapId, frameId).frame.groups.find((g) => g.id === id) ?? notFound("Frame group", id);
3108
+ },
3109
+ deleteFrameGroup: async ({ mapId, frameId, id }) => {
3110
+ const { map, frame } = findFrame(db, mapId, frameId);
3111
+ await editFrameCanvas(map, frame.name, (frameCanvas) => {
3112
+ const { items, index } = itemAt(frameCanvas.groups, id, "Frame group");
3113
+ items.splice(index, 1);
3114
+ });
3115
+ return true;
3116
+ },
3117
+ createFrameLink: async ({ mapId, frameId, input }) => {
3118
+ const { map, frame } = findFrame(db, mapId, frameId);
3119
+ const target = toLinkTarget(db, input);
3120
+ await editFrameCanvas(map, frame.name, (frameCanvas) => {
3121
+ frameCanvas.links = [...frameCanvas.links ?? [], {
3122
+ kind: input.kind === "frame" ? "frame" : "map",
3123
+ ...target,
3124
+ label: input.label ?? "",
3125
+ x: input.locationX ?? 0,
3126
+ y: input.locationY ?? 0
3127
+ }];
3128
+ });
3129
+ const { workspace } = await loadWorkspace();
3130
+ return findFrame(workspace, mapId, frameId).frame.links.at(-1)?.link;
3131
+ },
3132
+ updateFrameLink: async ({ mapId, frameId, id, input }) => {
3133
+ const { map, frame } = findFrame(db, mapId, frameId);
3134
+ const target = input.kind === null || input.kind === void 0 ? void 0 : toLinkTarget(db, input);
3135
+ await editFrameCanvas(map, frame.name, (frameCanvas) => {
3136
+ const { items, index } = itemAt(frameCanvas.links, id, "Frame link");
3137
+ const link = items[index];
3138
+ items[index] = {
3139
+ kind: target === void 0 ? link.kind : input.kind === "frame" ? "frame" : "map",
3140
+ ...target === void 0 ? {
3141
+ map: link.map,
3142
+ frame: link.frame
3143
+ } : target,
3144
+ label: input.label ?? link.label,
3145
+ x: input.locationX ?? link.x,
3146
+ y: input.locationY ?? link.y
3147
+ };
3148
+ });
3149
+ const { workspace } = await loadWorkspace();
3150
+ return findFrame(workspace, mapId, frameId).frame.links.find((l) => l.link.id === id)?.link ?? notFound("Frame link", id);
3151
+ },
3152
+ deleteFrameLink: async ({ mapId, frameId, id }) => {
3153
+ const { map, frame } = findFrame(db, mapId, frameId);
3154
+ await editFrameCanvas(map, frame.name, (frameCanvas) => {
3155
+ const { items, index } = itemAt(frameCanvas.links, id, "Frame link");
3156
+ items.splice(index, 1);
3157
+ });
3158
+ return true;
3159
+ },
3160
+ createFocalPointMeta: async ({ mapId, frameId, focalPointId, input }) => {
3161
+ const { map, frame, focalPoint } = findFocalPoint(db, mapId, frameId, focalPointId);
3162
+ const ref = toComponentRef(db, requireName(input.componentId), input);
3163
+ await editMapOf(map, (entry) => {
3164
+ const point = pointIn(frameIn(entry, frame.name), focalPoint.point.name);
3165
+ point.components = [...point.components ?? [], ref];
3166
+ return entry;
3167
+ });
3168
+ const { workspace } = await loadWorkspace();
3169
+ return findFocalPoint(workspace, mapId, frameId, focalPointId).focalPoint.components.at(-1)?.meta;
3170
+ },
3171
+ updateFocalPointMeta: async ({ mapId, frameId, focalPointId, id, input }) => {
3172
+ if (input.componentLinkDiagramId || input.componentLinkApiEndpointId || input.componentLinkTestPackId || input.componentLinkServiceDocId) throw new GraphQLError("Only the fields of a component can be updated");
3173
+ const { map, frame, focalPoint } = findFocalPoint(db, mapId, frameId, focalPointId);
3174
+ await editMapOf(map, (entry) => {
3175
+ const { items, index } = itemAt(pointIn(frameIn(entry, frame.name), focalPoint.point.name).components, id, "Component");
3176
+ const component = items[index];
3177
+ if (input.componentId && input.componentId !== component.componentId) throw new GraphQLError("The component of a link cannot be changed");
3178
+ if (input.componentModalFields === null || input.componentModalFields === void 0 || input.componentModalFields.length === 0) delete component.modalFields;
3179
+ else component.modalFields = toModalFields(input.componentModalFields);
3180
+ return entry;
3181
+ });
3182
+ const { workspace } = await loadWorkspace();
3183
+ return findFocalPoint(workspace, mapId, frameId, focalPointId).focalPoint.components.find((c) => c.meta.id === id)?.meta ?? notFound("Component", id);
3184
+ },
3185
+ deleteFocalPointMeta: async ({ mapId, frameId, focalPointId, id }) => {
3186
+ const { map, frame, focalPoint } = findFocalPoint(db, mapId, frameId, focalPointId);
3187
+ await editMapOf(map, (entry) => {
3188
+ const point = pointIn(frameIn(entry, frame.name), focalPoint.point.name);
3189
+ const { items, index } = itemAt(point.components, id, "Component");
3190
+ items.splice(index, 1);
3191
+ if (items.length === 0) delete point.components;
3192
+ return entry;
3193
+ });
3194
+ return true;
3195
+ },
3196
+ serviceGitHubRepository: () => null,
3197
+ githubApp: () => null,
3198
+ diagramImages: async ({ diagramId }) => {
3199
+ const diagram = db.diagrams.find((d) => d.entity.id === diagramId) ?? notFound("Diagram", diagramId);
3200
+ return (await listDiagramImages(diagram.project.root, diagram.entry.path)).map(({ imagePath, createdAt }, order) => toDiagramImage(diagram.project.id, diagramId, imagePath, createdAt, order));
3201
+ },
3202
+ diagramVersions: () => [],
3203
+ diagramVersionContent: ({ versionId }) => notFound("Diagram version", versionId),
3204
+ components: () => ({
3205
+ components: COMPONENTS,
3206
+ customComponents: []
3207
+ }),
3208
+ services: (args) => {
3209
+ if (args.folderId || args.teamId) return {
3210
+ items: [],
3211
+ totalCount: 0
3212
+ };
3213
+ return page(db.services, args);
3214
+ },
3215
+ service: ({ id }) => db.services.find((s) => s.id === id) ?? notFound("Service", id),
3216
+ apiGroups: ({ serviceId }) => db.apiGroups.filter(({ group }) => group.serviceId === serviceId).map(({ group }) => group),
3217
+ apiGroup: ({ serviceId, id }) => findApiGroup(db, serviceId, id).group,
3218
+ apiGroupVersions: (args) => [findApiGroup(db, args.serviceId, args.apiGroupId).version],
3219
+ apiEndpoints: (args) => findApiGroup(db, args.serviceId, args.apiGroupId).endpoints,
3220
+ apiEndpointById: ({ id }) => db.apiGroups.flatMap(({ endpoints }) => endpoints).find((e) => e.id === id) ?? notFound("Endpoint", id),
3221
+ apiGroupSpec: (args) => {
3222
+ const { group, spec } = findApiGroup(db, args.serviceId, args.apiGroupId);
3223
+ if (spec === null) throw new GraphQLError(`${group.name} has no spec file`);
3224
+ return {
3225
+ apiGroupId: group.id,
3226
+ ...spec
3227
+ };
3228
+ },
3229
+ dependencies: (args) => db.dependencies.filter((row) => row.service.id === args.serviceId && (!args.direction || args.direction === "all" || row.direction === args.direction) && (!args.criticality || row.criticality === args.criticality)),
3230
+ dependencyGraph: () => db.dependencies,
3231
+ serviceDependencyGraph: ({ serviceId }) => {
3232
+ const seen = /* @__PURE__ */ new Set();
3233
+ return [...walkDependencies(db, serviceId, "upstream"), ...walkDependencies(db, serviceId, "downstream")].filter((row) => {
3234
+ if (seen.has(row.id)) return false;
3235
+ seen.add(row.id);
3236
+ return true;
3237
+ });
3238
+ },
3239
+ diagrams: (args) => {
3240
+ if (args.folderId || args.teamId) return {
3241
+ items: [],
3242
+ totalCount: 0
3243
+ };
3244
+ const { serviceDiagrams } = db;
3245
+ return page(args.serviceId ? serviceDiagrams.filter((link) => link.serviceId === args.serviceId).map((link) => link.diagram) : diagrams, args);
3246
+ },
3247
+ diagram: ({ id }) => diagrams.find((d) => d.id === id) ?? db.databases.find((d) => d.diagram.id === id)?.diagram ?? notFound("Diagram", id),
3248
+ serviceDocs: ({ serviceId }) => db.docs.filter((d) => d.serviceDoc.serviceId === serviceId).map((d) => d.serviceDoc),
3249
+ serviceDocById: ({ id }) => db.docs.find((d) => d.serviceDoc.docId === id)?.serviceDoc ?? notFound("Doc", id),
3250
+ doc: ({ id }) => db.docs.find((d) => d.serviceDoc.docId === id)?.serviceDoc.doc ?? db.standaloneDocs.find((d) => d.doc.id === id)?.doc ?? notFound("Doc", id),
3251
+ docs: (args) => {
3252
+ if (args.folderId || args.teamId) return {
3253
+ items: [],
3254
+ totalCount: 0
3255
+ };
3256
+ return page([...db.docs.map((d) => d.serviceDoc.doc), ...db.standaloneDocs.map((d) => d.doc)].map((doc) => ({
3257
+ ...doc,
3258
+ name: doc.fileName
3259
+ })), args);
3260
+ },
3261
+ createDoc: async ({ input }) => {
3262
+ const name = requireName(input.fileName);
3263
+ if (!input.fileAssetId) throw new GraphQLError("Upload a file first");
3264
+ await ensureWorkspaceConfig(db.home);
3265
+ const docPath = await createDoc(db.home, WORKSPACE_CONFIG, WORKSPACE_CONFIG, {
3266
+ name,
3267
+ fileType: input.fileType ?? "",
3268
+ description: input.description?.trim() ?? ""
3269
+ }, takeUpload(input.fileAssetId).data);
3270
+ const { workspace } = await loadWorkspace();
3271
+ return workspace.standaloneDocs.find((d) => d.project.root === db.home && d.entry.path === docPath)?.doc ?? notFound("Doc", docPath);
3272
+ },
3273
+ deleteDoc: async ({ id }) => {
3274
+ const doc = db.docs.find((d) => d.serviceDoc.docId === id) ?? db.standaloneDocs.find((d) => d.doc.id === id) ?? notFound("Doc", id);
3275
+ await deleteDoc(doc.project.root, doc.project.configFile, doc.file, doc.entry.name);
3276
+ return true;
3277
+ },
3278
+ createAssetUpload: () => createUpload(),
3279
+ createDiagramImage: async ({ diagramId, input }) => {
3280
+ const diagram = db.diagrams.find((d) => d.entity.id === diagramId) ?? notFound("Diagram", diagramId);
3281
+ const imagePath = await writeDiagramImage(diagram.project.root, diagram.entry.path, requireName(input.fileName), takeUpload(input.assetId));
3282
+ const images = await listDiagramImages(diagram.project.root, diagram.entry.path);
3283
+ const order = images.findIndex((image) => image.imagePath === imagePath);
3284
+ return toDiagramImage(diagram.project.id, diagramId, imagePath, images[order].createdAt, order);
3285
+ },
3286
+ createServiceDoc: async ({ serviceId, input }) => {
3287
+ const name = requireName(input.fileName);
3288
+ if (!input.fileAssetId) throw new GraphQLError("Upload a file first");
3289
+ const link = findServiceFile(db, serviceId);
3290
+ const docPath = await createDoc(link.project.root, link.project.configFile, link.file, {
3291
+ name,
3292
+ fileType: input.fileType ?? "",
3293
+ description: input.description?.trim() ?? ""
3294
+ }, takeUpload(input.fileAssetId).data);
3295
+ const { workspace } = await loadWorkspace();
3296
+ return workspace.docs.find((d) => d.project.root === link.project.root && d.entry.path === docPath)?.serviceDoc ?? notFound("Doc", docPath);
3297
+ },
3298
+ deleteServiceDoc: async ({ serviceId, docId }) => {
3299
+ const doc = db.docs.find((d) => d.serviceDoc.serviceId === serviceId && d.serviceDoc.docId === docId) ?? notFound("Doc", docId);
3300
+ await deleteDoc(doc.project.root, doc.project.configFile, doc.file, doc.entry.name);
3301
+ return true;
3302
+ },
3303
+ serviceDiagrams: ({ serviceId }) => db.serviceDiagrams.filter((link) => link.serviceId === serviceId),
3304
+ updateDiagram: async ({ id, input }) => {
3305
+ const diagram = db.diagrams.find((d) => d.entity.id === id) ?? notFound("Diagram", id);
3306
+ const saved = await saveDiagram(diagram.project.root, diagram.project.configFile, diagram.localId, input);
3307
+ const link = db.serviceDiagrams.find((l) => l.diagramId === id);
3308
+ const service = db.services.find((s) => s.id === link?.serviceId);
3309
+ const oldName = diagram.entry.name;
3310
+ const newName = saved.name;
3311
+ if (service !== void 0 && newName !== oldName) for (const project of db.projects) await renameDiagramReferences(project.root, project.configFiles, service.name, oldName, newName);
3312
+ return {
3313
+ ...saved,
3314
+ id
3315
+ };
3316
+ },
3317
+ createDiagram: async ({ input }) => {
3318
+ const name = requireName(input.name);
3319
+ await ensureWorkspaceConfig(db.home);
3320
+ const localId = await createDiagram(db.home, WORKSPACE_CONFIG, WORKSPACE_CONFIG, name);
3321
+ return (await findCreatedDiagram(db.home, localId)).entity;
3322
+ },
3323
+ createServiceDiagram: async ({ serviceId, input }) => {
3324
+ const name = requireName(input.name);
3325
+ const link = findServiceFile(db, serviceId);
3326
+ const localId = await createDiagram(link.project.root, link.project.configFile, link.file, name);
3327
+ const diagram = await findCreatedDiagram(link.project.root, localId);
3328
+ return {
3329
+ serviceId,
3330
+ diagramId: diagram.entity.id,
3331
+ orgId: ORG_ID,
3332
+ createdBy: diagram.entity.createdBy,
3333
+ updatedBy: null,
3334
+ createdAt: diagram.entity.createdAt,
3335
+ updatedAt: diagram.entity.updatedAt,
3336
+ diagram: diagram.entity
3337
+ };
3338
+ },
3339
+ deleteDiagram: async ({ id }) => {
3340
+ const diagram = db.diagrams.find((d) => d.entity.id === id) ?? notFound("Diagram", id);
3341
+ await deleteDiagram(diagram.project.root, diagram.project.configFile, diagram.localId);
3342
+ return true;
3343
+ },
3344
+ deleteService: async ({ id }) => {
3345
+ const link = findServiceFile(db, id);
3346
+ if (link.project.configFile === ".uigraph/workspace.yaml") throw new GraphQLError(`Services defined in ${WORKSPACE_CONFIG} cannot be removed`);
3347
+ await unregisterProject(link.project.root);
3348
+ return true;
3349
+ }
3350
+ };
3351
+ }
3352
+ //#endregion
3353
+ //#region src/lens.ts
3354
+ var LensRequestError = class extends Error {};
3355
+ const activeRuns = /* @__PURE__ */ new Map();
3356
+ async function dataDirectory() {
3357
+ return path.join(await homeRoot(), ".uigraph", "lens");
3358
+ }
3359
+ async function resolveGitHubToken() {
3360
+ const environmentToken = process.env.GITHUB_TOKEN?.trim() || process.env.GH_TOKEN?.trim();
3361
+ if (environmentToken) return environmentToken;
3362
+ const token = await promisify(execFile)("gh", ["auth", "token"], { timeout: 1e4 }).then(({ stdout }) => stdout.trim(), () => "");
3363
+ if (token === "") throw new LensRequestError("GitHub authentication is required. Set GITHUB_TOKEN or GH_TOKEN, or sign in with `gh auth login`, then restart the viewer.");
3364
+ return token;
3365
+ }
3366
+ async function startLensRun(request, regenerate, agent, model) {
3367
+ if (agent === void 0 && model !== void 0) throw new LensRequestError("A model can only be set together with an agent.");
3368
+ let review;
3369
+ let source;
3370
+ try {
3371
+ if (request.type === "github") {
3372
+ const token = await resolveGitHubToken();
3373
+ review = await fetchReview({
3374
+ pullRequest: request.pullRequest,
3375
+ token
3376
+ });
3377
+ source = {
3378
+ type: "github",
3379
+ token
3380
+ };
3381
+ } else {
3382
+ const local = await readLocalReview(request);
3383
+ review = local.review;
3384
+ source = {
3385
+ type: "local",
3386
+ repositoryPath: local.repositoryPath
3387
+ };
3388
+ }
3389
+ } catch (error) {
3390
+ throw new LensRequestError(error instanceof Error ? error.message : String(error));
3391
+ }
3392
+ const label = review.pullRequest.number === null ? `${review.repository.fullName} ${review.pullRequest.base.branch}..${review.pullRequest.head.branch}` : `${review.repository.fullName}#${review.pullRequest.number}`;
3393
+ const settings = await readSettings(await dataDirectory());
3394
+ const stop = new AbortController();
3395
+ const ticket = { answer: null };
3396
+ const states = analyzeReview({
3397
+ review,
3398
+ source,
3399
+ dataDirectory: await dataDirectory(),
3400
+ services: await readServiceGraph(),
3401
+ settings: agent === void 0 ? settings : {
3402
+ ...settings,
3403
+ agent,
3404
+ model: model ?? ""
3405
+ },
3406
+ regenerate,
3407
+ signal: stop.signal,
3408
+ askTicket: () => new Promise((resolve) => {
3409
+ ticket.answer = resolve;
3410
+ }),
3411
+ log: (message) => consola.debug(`Lens ${label} ${message}`)
3412
+ });
3413
+ const first = await states.next();
3414
+ if (first.done) throw new Error("Lens ended without reporting any progress.");
3415
+ const runId = first.value.runId;
3416
+ const run = {
3417
+ review,
3418
+ analysis: first.value,
3419
+ stop,
3420
+ ticket,
3421
+ subscribers: /* @__PURE__ */ new Set(),
3422
+ finished: Promise.resolve()
3423
+ };
3424
+ activeRuns.set(runId, run);
3425
+ console.log(`${pc.cyan("Lens")} ${label} ${pc.dim(runId)}`);
3426
+ run.finished = (async () => {
3427
+ try {
3428
+ for await (const analysis of states) {
3429
+ for (const [id, stage] of Object.entries(analysis.stages)) if (stage.status !== run.analysis.stages[id].status) consola.debug(`Lens ${label} ${id} ${stage.status}`);
3430
+ run.analysis = analysis;
3431
+ for (const subscriber of run.subscribers) subscriber.update(analysis);
3432
+ }
3433
+ console.log(`${pc.cyan("Lens")} ${label} finished ${pc.dim(runId)}`);
3434
+ } catch (error) {
3435
+ console.error(`${pc.red("Lens")} ${label} failed: ${error instanceof Error ? error.message : String(error)}`);
3436
+ consola.debug(inspect(error));
3437
+ } finally {
3438
+ activeRuns.delete(runId);
3439
+ for (const subscriber of run.subscribers) subscriber.end();
3440
+ }
3441
+ })();
3442
+ return runId;
3443
+ }
3444
+ async function getLensSettings() {
3445
+ return readSettings(await dataDirectory());
3446
+ }
3447
+ async function saveLensSettings(settings) {
3448
+ await saveSettings(await dataDirectory(), settings);
3449
+ }
3450
+ function stopLensRun(runId) {
3451
+ const run = activeRuns.get(runId);
3452
+ if (!run) return false;
3453
+ run.stop.abort();
3454
+ return true;
3455
+ }
3456
+ function answerLensTicket(runId, keys) {
3457
+ const run = activeRuns.get(runId);
3458
+ const candidates = run?.analysis.ticketCandidates ?? null;
3459
+ if (!run || run.ticket.answer === null || candidates === null) return false;
3460
+ if (new Set(keys).size !== keys.length || !keys.every((key) => candidates.some((candidate) => candidate.key === key))) return false;
3461
+ run.ticket.answer(keys);
3462
+ run.ticket.answer = null;
3463
+ return true;
3464
+ }
3465
+ async function stopAllLensRuns() {
3466
+ const runs = [...activeRuns.values()];
3467
+ for (const run of runs) run.stop.abort();
3468
+ await Promise.all(runs.map((run) => run.finished));
3469
+ }
3470
+ async function listLensRuns() {
3471
+ const saved = await listRuns(await dataDirectory());
3472
+ return [...[...activeRuns.values()].map((run) => ({
3473
+ ...run,
3474
+ running: true
3475
+ })), ...saved.filter((run) => !activeRuns.has(run.analysis.runId)).map((run) => ({
3476
+ ...run,
3477
+ running: false
3478
+ }))].map((run) => ({
3479
+ runId: run.analysis.runId,
3480
+ repository: run.review.repository.fullName,
3481
+ number: run.review.pullRequest.number,
3482
+ title: run.review.pullRequest.title,
3483
+ status: readStatus(run.analysis, run.running),
3484
+ updatedAt: Object.values(run.analysis.stages).flatMap((stage) => [stage.startedAt, stage.completedAt]).reduce((latest, time) => time !== null && time > latest ? time : latest, run.review.fetchedAt)
3485
+ })).sort((first, second) => second.updatedAt.localeCompare(first.updatedAt));
3486
+ }
3487
+ async function getLensRun(runId) {
3488
+ const active = activeRuns.get(runId);
3489
+ if (active) return {
3490
+ review: active.review,
3491
+ analysis: active.analysis,
3492
+ running: true
3493
+ };
3494
+ const saved = await readRun(await dataDirectory(), runId);
3495
+ if (!saved) return null;
3496
+ return {
3497
+ review: saved.review,
3498
+ analysis: saved.analysis,
3499
+ running: false
3500
+ };
3501
+ }
3502
+ function subscribeToLensRun(runId, subscriber) {
3503
+ const run = activeRuns.get(runId);
3504
+ if (!run) return null;
3505
+ run.subscribers.add(subscriber);
3506
+ return () => {
3507
+ run.subscribers.delete(subscriber);
3508
+ };
3509
+ }
3510
+ function readStatus(analysis, running) {
3511
+ if (running) return "running";
3512
+ return Object.values(analysis.stages).every((stage) => stage.status === "done" || stage.status === "skipped") ? "done" : "failed";
3513
+ }
3514
+ async function readServiceGraph() {
3515
+ const { workspace } = await loadWorkspace();
3516
+ return {
3517
+ services: workspace.services.map((service) => ({
3518
+ name: service.name,
3519
+ endpoints: workspace.apiGroups.filter(({ group }) => group.serviceId === service.id).flatMap(({ endpoints }) => endpoints.map((endpoint) => ({
3520
+ method: endpoint.method,
3521
+ path: endpoint.path,
3522
+ operationId: endpoint.operationId
3523
+ }))),
3524
+ databases: workspace.databases.filter(({ serviceDb }) => serviceDb.serviceId === service.id).map(({ serviceDb }) => serviceDb.dbName),
3525
+ diagrams: workspace.diagrams.filter(({ entity }) => workspace.serviceDiagrams.some((link) => link.serviceId === service.id && link.diagramId === entity.id)).map(({ entity, mermaid }) => ({
3526
+ name: entity.name,
3527
+ mermaid
3528
+ })),
3529
+ docs: workspace.docs.filter(({ serviceDoc }) => serviceDoc.serviceId === service.id).map(({ serviceDoc }) => ({
3530
+ name: serviceDoc.doc.fileName,
3531
+ description: serviceDoc.doc.description
3532
+ }))
3533
+ })),
3534
+ links: workspace.dependencies.map((dependency) => {
3535
+ const target = dependency.dependency?.name ?? dependency.dependencyName;
3536
+ const link = {
3537
+ type: dependency.type,
3538
+ criticality: dependency.criticality,
3539
+ endpoints: dependency.apiEndpointNames,
3540
+ database: dependency.databaseName,
3541
+ description: dependency.description
3542
+ };
3543
+ if (dependency.direction === "downstream") return {
3544
+ consumer: dependency.service.name,
3545
+ provider: target,
3546
+ ...link
3547
+ };
3548
+ if (dependency.direction === "upstream") return {
3549
+ consumer: target,
3550
+ provider: dependency.service.name,
3551
+ ...link
3552
+ };
3553
+ throw new Error(`Unknown dependency direction: ${String(dependency.direction)}`);
3554
+ })
3555
+ };
3556
+ }
3557
+ //#endregion
3558
+ //#region src/server.ts
3559
+ function resolveAssetRoot(bundled, source) {
3560
+ const bundledRoot = fileURLToPath(new URL(bundled, import.meta.url));
3561
+ return existsSync(bundledRoot) ? bundledRoot : fileURLToPath(new URL(source, import.meta.url));
3562
+ }
3563
+ const VIEWER_ROOT = resolveAssetRoot("./viewer/", "../dist/viewer/");
3564
+ const SCHEMA_ROOT = resolveAssetRoot("./schema/", "./graphql/schema/");
3565
+ const MAX_BODY_BYTES = 1e7;
3566
+ const SUPPORTED_MUTATIONS = [
3567
+ "updateDiagram",
3568
+ "createDiagram",
3569
+ "createServiceDiagram",
3570
+ "deleteDiagram",
3571
+ "deleteService",
3572
+ "createAssetUpload",
3573
+ "createDiagramImage",
3574
+ "createDoc",
3575
+ "deleteDoc",
3576
+ "createServiceDoc",
3577
+ "deleteServiceDoc",
3578
+ "createServiceDB",
3579
+ "deleteServiceDB",
3580
+ "createSavedQuery",
3581
+ "updateSavedQuery",
3582
+ "deleteSavedQuery",
3583
+ "createMap",
3584
+ "updateMap",
3585
+ "deleteMap",
3586
+ "createFrame",
3587
+ "updateFrame",
3588
+ "deleteFrame",
3589
+ "createFocalPoint",
3590
+ "updateFocalPoint",
3591
+ "deleteFocalPoint",
3592
+ "upsertCanvas",
3593
+ "createFrameGroup",
3594
+ "updateFrameGroup",
3595
+ "deleteFrameGroup",
3596
+ "createFrameLink",
3597
+ "updateFrameLink",
3598
+ "deleteFrameLink",
3599
+ "createFocalPointMeta",
3600
+ "updateFocalPointMeta",
3601
+ "deleteFocalPointMeta"
3602
+ ];
3603
+ const DEFAULT_PORT = 7357;
3604
+ const HEALTH_PATH = "/__uigraph";
3605
+ const INFO_PATH = "/__uigraph/info";
3606
+ const HEALTH_BODY = "uigraph";
3607
+ const HEALTH_TIMEOUT_MS = 1500;
3608
+ const LENS_RUN_PATH = /^\/api\/lens\/runs\/([\w-]+)(\/events|\/stop|\/ticket)?$/;
3609
+ const lensStartSchema = z.object({
3610
+ request: z.discriminatedUnion("type", [z.object({
3611
+ type: z.literal("github"),
3612
+ pullRequest: z.string().min(1)
3613
+ }), z.object({
3614
+ type: z.literal("local"),
3615
+ directory: z.string().min(1),
3616
+ base: z.string().min(1),
3617
+ target: z.string().min(1)
3618
+ })]),
3619
+ regenerate: z.boolean(),
3620
+ agent: z.enum(AGENT_NAMES).optional(),
3621
+ model: z.string().trim().min(1).max(200).optional()
3622
+ });
3623
+ const lensTicketSchema = z.object({ keys: z.array(z.string().min(1)) });
3624
+ function serverUrl(port) {
3625
+ return `http://127.0.0.1:${port}/`;
3626
+ }
3627
+ var HttpError = class extends Error {
3628
+ status;
3629
+ constructor(status, message) {
3630
+ super(message);
3631
+ this.status = status;
3632
+ }
3633
+ };
3634
+ const schema = buildSchema(readdirSync(SCHEMA_ROOT).filter((file) => file.endsWith(".graphqls")).map((file) => readFileSync(path.join(SCHEMA_ROOT, file), "utf8")).join("\n"));
3635
+ const CONTENT_TYPES = {
3636
+ ".html": "text/html; charset=utf-8",
3637
+ ".js": "text/javascript; charset=utf-8",
3638
+ ".css": "text/css; charset=utf-8",
3639
+ ".json": "application/json; charset=utf-8",
3640
+ ".md": "text/markdown; charset=utf-8",
3641
+ ".markdown": "text/markdown; charset=utf-8",
3642
+ ".txt": "text/plain; charset=utf-8",
3643
+ ".pdf": "application/pdf",
3644
+ ".htm": "text/html; charset=utf-8",
3645
+ ".jpeg": "image/jpeg",
3646
+ ".mp4": "video/mp4",
3647
+ ".mov": "video/quicktime",
3648
+ ".webm": "video/webm",
3649
+ ".mp3": "audio/mpeg",
3650
+ ".wav": "audio/wav",
3651
+ ".ogg": "audio/ogg",
3652
+ ".m4a": "audio/mp4",
3653
+ ".svg": "image/svg+xml",
3654
+ ".png": "image/png",
3655
+ ".jpg": "image/jpeg",
3656
+ ".gif": "image/gif",
3657
+ ".webp": "image/webp",
3658
+ ".ico": "image/x-icon",
3659
+ ".woff": "font/woff",
3660
+ ".woff2": "font/woff2",
3661
+ ".ttf": "font/ttf"
3662
+ };
3663
+ async function listViewerAssets() {
3664
+ const entries = await fs.readdir(VIEWER_ROOT, {
3665
+ recursive: true,
3666
+ withFileTypes: true
3667
+ });
3668
+ const assets = /* @__PURE__ */ new Map();
3669
+ for (const entry of entries) {
3670
+ if (!entry.isFile()) continue;
3671
+ const absolutePath = path.join(entry.parentPath, entry.name);
3672
+ const urlPath = "/" + path.relative(VIEWER_ROOT, absolutePath).split(path.sep).join("/");
3673
+ assets.set(urlPath, absolutePath);
3674
+ }
3675
+ if (!assets.has("/index.html")) throw new Error(`The prebuilt viewer is missing from ${VIEWER_ROOT}. Reinstall uigraph.`);
3676
+ return assets;
3677
+ }
3678
+ function contentType(file) {
3679
+ return CONTENT_TYPES[path.extname(file).toLowerCase()] ?? "application/octet-stream";
3680
+ }
3681
+ async function readBody(request, limit) {
3682
+ const chunks = [];
3683
+ let size = 0;
3684
+ for await (const chunk of request) {
3685
+ size += chunk.length;
3686
+ if (size > limit) throw new HttpError(413, "Request body is too large");
3687
+ chunks.push(chunk);
3688
+ }
3689
+ return Buffer.concat(chunks);
3690
+ }
3691
+ const reportedWarnings = /* @__PURE__ */ new Set();
3692
+ async function runGraphQL(body) {
3693
+ const request = JSON.parse(body);
3694
+ const document = parse(request.query);
3695
+ const validationErrors = validate(schema, document, [...specifiedRules, NoSchemaIntrospectionCustomRule]);
3696
+ if (validationErrors.length > 0) return { errors: validationErrors };
3697
+ const operation = getOperationAST(document, request.operationName);
3698
+ if (operation === null || operation === void 0) return { errors: [new GraphQLError("No operation to execute")] };
3699
+ if (operation.operation === "subscription") return { errors: [new GraphQLError("Not supported in uigraph")] };
3700
+ if (operation.operation === "mutation" && !operation.selectionSet.selections.every((selection) => selection.kind === Kind.FIELD && SUPPORTED_MUTATIONS.includes(selection.name.value))) return { errors: [new GraphQLError("Not supported in uigraph")] };
3701
+ const { workspace, warnings } = await loadWorkspace();
3702
+ for (const warning of warnings) if (!reportedWarnings.has(warning)) {
3703
+ reportedWarnings.add(warning);
3704
+ console.log(pc.yellow(`⚠ ${warning}`));
3705
+ }
3706
+ return execute({
3707
+ schema,
3708
+ document,
3709
+ rootValue: createRootValue(workspace),
3710
+ variableValues: request.variables,
3711
+ operationName: request.operationName
3712
+ });
3713
+ }
3714
+ function respondWithError(response, status, message) {
3715
+ if (response.headersSent) {
3716
+ response.destroy();
3717
+ return;
3718
+ }
3719
+ response.writeHead(status, {
3720
+ "X-Content-Type-Options": "nosniff",
3721
+ "Cache-Control": "no-store"
3722
+ }).end(message);
3723
+ }
3724
+ async function getViewerInfo(port) {
3725
+ if (!await isServerRunning(port)) return null;
3726
+ try {
3727
+ const response = await fetch(new URL(INFO_PATH, serverUrl(port)), { signal: AbortSignal.timeout(HEALTH_TIMEOUT_MS) });
3728
+ if (!response.ok) return "legacy";
3729
+ const body = await response.json();
3730
+ return typeof body.version === "string" && typeof body.build === "string" && typeof body.pid === "number" ? {
3731
+ version: body.version,
3732
+ build: body.build,
3733
+ pid: body.pid
3734
+ } : "legacy";
3735
+ } catch {
3736
+ return "legacy";
3737
+ }
3738
+ }
3739
+ async function isServerRunning(port) {
3740
+ try {
3741
+ const response = await fetch(new URL(HEALTH_PATH, serverUrl(port)), { signal: AbortSignal.timeout(HEALTH_TIMEOUT_MS) });
3742
+ return response.ok && await response.text() === HEALTH_BODY;
3743
+ } catch {
3744
+ return false;
3745
+ }
3746
+ }
3747
+ async function startServer(port) {
3748
+ const assets = await listViewerAssets();
3749
+ const allowedHosts = [`127.0.0.1:${port}`, `localhost:${port}`];
3750
+ const server = http.createServer((request, response) => {
3751
+ (async () => {
3752
+ const securityHeaders = {
3753
+ "X-Content-Type-Options": "nosniff",
3754
+ "Referrer-Policy": "no-referrer",
3755
+ "X-Frame-Options": "DENY",
3756
+ "Content-Security-Policy": "frame-ancestors 'none'",
3757
+ "Cache-Control": "no-store"
3758
+ };
3759
+ if (!allowedHosts.includes(request.headers.host ?? "")) {
3760
+ response.writeHead(403, securityHeaders).end("Forbidden");
3761
+ return;
3762
+ }
3763
+ const url = new URL(request.url ?? "/", "http://localhost");
3764
+ const pathname = decodeURIComponent(url.pathname);
3765
+ if (pathname === INFO_PATH) {
3766
+ response.writeHead(200, {
3767
+ ...securityHeaders,
3768
+ "Content-Type": "application/json"
3769
+ }).end(JSON.stringify({
3770
+ version: VERSION,
3771
+ build: BUILD_ID,
3772
+ pid: process.pid
3773
+ }));
3774
+ return;
3775
+ }
3776
+ if (pathname === HEALTH_PATH) {
3777
+ response.writeHead(200, securityHeaders).end(HEALTH_BODY);
3778
+ return;
3779
+ }
3780
+ if (pathname === "/graphql") {
3781
+ if (request.method !== "POST") {
3782
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3783
+ return;
3784
+ }
3785
+ if (request.headers.origin !== `http://${request.headers.host}`) {
3786
+ response.writeHead(403, securityHeaders).end("Forbidden");
3787
+ return;
3788
+ }
3789
+ if (!(request.headers["content-type"] ?? "").startsWith("application/json")) {
3790
+ response.writeHead(415, securityHeaders).end("Unsupported Media Type");
3791
+ return;
3792
+ }
3793
+ const result = await runGraphQL((await readBody(request, MAX_BODY_BYTES)).toString("utf8"));
3794
+ response.writeHead(200, {
3795
+ ...securityHeaders,
3796
+ "Content-Type": CONTENT_TYPES[".json"]
3797
+ }).end(JSON.stringify(result));
3798
+ return;
3799
+ }
3800
+ if (pathname.startsWith("/api/lens/")) {
3801
+ if (request.headers.origin !== void 0 && request.headers.origin !== `http://${request.headers.host}`) {
3802
+ response.writeHead(403, securityHeaders).end("Forbidden");
3803
+ return;
3804
+ }
3805
+ await handleLensRequest(request, response, pathname, securityHeaders);
3806
+ return;
3807
+ }
3808
+ if (pathname === "/api/projects") {
3809
+ if (request.method !== "GET") {
3810
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3811
+ return;
3812
+ }
3813
+ if (request.headers.origin !== void 0 && request.headers.origin !== `http://${request.headers.host}`) {
3814
+ response.writeHead(403, securityHeaders).end("Forbidden");
3815
+ return;
3816
+ }
3817
+ response.writeHead(200, {
3818
+ ...securityHeaders,
3819
+ "Content-Type": CONTENT_TYPES[".json"]
3820
+ }).end(JSON.stringify(await listRegisteredProjects()));
3821
+ return;
3822
+ }
3823
+ if (pathname.startsWith("/uploads/")) {
3824
+ const assetId = pathname.slice(9);
3825
+ if (request.method !== "PUT") {
3826
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3827
+ return;
3828
+ }
3829
+ if (request.headers.origin !== `http://${request.headers.host}`) {
3830
+ response.writeHead(403, securityHeaders).end("Forbidden");
3831
+ return;
3832
+ }
3833
+ if (!isPendingUpload(assetId)) {
3834
+ response.writeHead(404, securityHeaders).end("Not Found");
3835
+ return;
3836
+ }
3837
+ storeUpload(assetId, await readBody(request, MAX_UPLOAD_BYTES), request.headers["content-type"] ?? "");
3838
+ response.writeHead(200, securityHeaders).end();
3839
+ return;
3840
+ }
3841
+ if (request.method !== "GET" && request.method !== "HEAD") {
3842
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3843
+ return;
3844
+ }
3845
+ if (pathname.startsWith("/files/")) {
3846
+ const { workspace } = await loadWorkspace();
3847
+ const served = workspace.files.get(pathname);
3848
+ if (served === void 0) {
3849
+ response.writeHead(404, securityHeaders).end("Not Found");
3850
+ return;
3851
+ }
3852
+ const { realPath } = await resolveRepositoryFile(served.root, served.path);
3853
+ const body = await fs.readFile(realPath);
3854
+ const scriptable = [
3855
+ ".html",
3856
+ ".htm",
3857
+ ".svg"
3858
+ ].includes(path.extname(realPath).toLowerCase());
3859
+ response.writeHead(200, {
3860
+ ...securityHeaders,
3861
+ "Content-Type": contentType(realPath),
3862
+ ...scriptable ? { "Content-Security-Policy": "sandbox" } : {}
3863
+ }).end(request.method === "HEAD" ? void 0 : body);
3864
+ return;
3865
+ }
3866
+ const file = assets.get(pathname) ?? assets.get("/index.html");
3867
+ const body = await fs.readFile(file);
3868
+ response.writeHead(200, {
3869
+ ...securityHeaders,
3870
+ "Content-Type": contentType(file)
3871
+ }).end(request.method === "HEAD" ? void 0 : body);
3872
+ })().catch((error) => {
3873
+ const status = error instanceof HttpError ? error.status : 500;
3874
+ if (error instanceof SyntaxError) {
3875
+ respondWithError(response, 400, "Bad Request");
3876
+ return;
3877
+ }
3878
+ if (status === 500) console.error(`[uigraph] ${request.method} ${request.url}: ${error instanceof Error ? error.stack ?? error.message : String(error)}`);
3879
+ respondWithError(response, status, status === 413 ? "Payload Too Large" : "Internal Server Error");
3880
+ });
3881
+ });
3882
+ await new Promise((resolve, reject) => {
3883
+ server.once("error", (error) => {
3884
+ if (error.code === "EADDRINUSE") {
3885
+ reject(/* @__PURE__ */ new Error(`Port ${port} is in use by another program. Choose another with --port.`));
3886
+ return;
3887
+ }
3888
+ reject(error);
3889
+ });
3890
+ server.listen(port, "127.0.0.1", () => resolve());
3891
+ });
3892
+ return { async close() {
3893
+ await stopAllLensRuns();
3894
+ await new Promise((resolve) => {
3895
+ server.close(() => resolve());
3896
+ server.closeAllConnections();
3897
+ });
3898
+ } };
3899
+ }
3900
+ async function handleLensRequest(request, response, pathname, securityHeaders) {
3901
+ function sendJson(status, value) {
3902
+ response.writeHead(status, {
3903
+ ...securityHeaders,
3904
+ "Content-Type": CONTENT_TYPES[".json"]
3905
+ }).end(JSON.stringify(value));
3906
+ }
3907
+ if (pathname === "/api/lens/file-icon") {
3908
+ if (request.method !== "GET") {
3909
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3910
+ return;
3911
+ }
3912
+ const query = new URL(request.url ?? "/", "http://localhost").searchParams;
3913
+ const name = query.get("name");
3914
+ const kind = query.get("kind");
3915
+ if (name === null || kind !== "file" && kind !== "folder" && kind !== "folder-open") {
3916
+ sendJson(400, { error: "name and kind are required" });
3917
+ return;
3918
+ }
3919
+ response.writeHead(200, {
3920
+ ...securityHeaders,
3921
+ "Content-Type": CONTENT_TYPES[".svg"],
3922
+ "Content-Security-Policy": "sandbox",
3923
+ "Cache-Control": "max-age=86400"
3924
+ }).end(await fs.readFile(fileIconPath(name, kind)));
3925
+ return;
3926
+ }
3927
+ if (pathname === "/api/lens/settings") {
3928
+ if (request.method === "GET") {
3929
+ sendJson(200, await getLensSettings());
3930
+ return;
3931
+ }
3932
+ if (request.method !== "PUT") {
3933
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3934
+ return;
3935
+ }
3936
+ if (!(request.headers["content-type"] ?? "").startsWith("application/json")) {
3937
+ response.writeHead(415, securityHeaders).end("Unsupported Media Type");
3938
+ return;
3939
+ }
3940
+ const settings = lensSettingsSchema.safeParse(JSON.parse((await readBody(request, MAX_BODY_BYTES)).toString("utf8")));
3941
+ if (!settings.success) {
3942
+ sendJson(400, { error: settings.error.message });
3943
+ return;
3944
+ }
3945
+ await saveLensSettings(settings.data);
3946
+ sendJson(200, settings.data);
3947
+ return;
3948
+ }
3949
+ if (pathname === "/api/lens/runs") {
3950
+ if (request.method === "GET") {
3951
+ sendJson(200, await listLensRuns());
3952
+ return;
3953
+ }
3954
+ if (request.method !== "POST") {
3955
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3956
+ return;
3957
+ }
3958
+ if (!(request.headers["content-type"] ?? "").startsWith("application/json")) {
3959
+ response.writeHead(415, securityHeaders).end("Unsupported Media Type");
3960
+ return;
3961
+ }
3962
+ const input = lensStartSchema.safeParse(JSON.parse((await readBody(request, MAX_BODY_BYTES)).toString("utf8")));
3963
+ if (!input.success) {
3964
+ sendJson(400, { error: "Expected { request, regenerate, agent?, model? }." });
3965
+ return;
3966
+ }
3967
+ try {
3968
+ sendJson(200, { runId: await startLensRun(input.data.request, input.data.regenerate, input.data.agent, input.data.model) });
3969
+ } catch (error) {
3970
+ if (error instanceof LensRequestError) {
3971
+ sendJson(400, { error: error.message });
3972
+ return;
3973
+ }
3974
+ throw error;
3975
+ }
3976
+ return;
3977
+ }
3978
+ const match = LENS_RUN_PATH.exec(pathname);
3979
+ if (match === null) {
3980
+ response.writeHead(404, securityHeaders).end("Not Found");
3981
+ return;
3982
+ }
3983
+ const runId = match[1];
3984
+ const action = match[2];
3985
+ if (action === "/stop") {
3986
+ if (request.method !== "POST") {
3987
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3988
+ return;
3989
+ }
3990
+ sendJson(stopLensRun(runId) ? 200 : 404, {});
3991
+ return;
3992
+ }
3993
+ if (action === "/ticket") {
3994
+ if (request.method !== "POST") {
3995
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
3996
+ return;
3997
+ }
3998
+ if (!(request.headers["content-type"] ?? "").startsWith("application/json")) {
3999
+ response.writeHead(415, securityHeaders).end("Unsupported Media Type");
4000
+ return;
4001
+ }
4002
+ const input = lensTicketSchema.safeParse(JSON.parse((await readBody(request, MAX_BODY_BYTES)).toString("utf8")));
4003
+ if (!input.success) {
4004
+ sendJson(400, { error: "Expected { keys }." });
4005
+ return;
4006
+ }
4007
+ sendJson(answerLensTicket(runId, input.data.keys) ? 200 : 409, {});
4008
+ return;
4009
+ }
4010
+ if (request.method !== "GET") {
4011
+ response.writeHead(405, securityHeaders).end("Method Not Allowed");
4012
+ return;
4013
+ }
4014
+ const run = await getLensRun(runId);
4015
+ if (run === null) {
4016
+ response.writeHead(404, securityHeaders).end("Not Found");
4017
+ return;
4018
+ }
4019
+ if (action === void 0) {
4020
+ sendJson(200, run);
4021
+ return;
4022
+ }
4023
+ if (action !== "/events") throw new Error(`Unknown Lens action: ${action}`);
4024
+ response.writeHead(200, {
4025
+ ...securityHeaders,
4026
+ "Content-Type": "text/event-stream; charset=utf-8",
4027
+ Connection: "keep-alive"
4028
+ });
4029
+ response.write(`data: ${JSON.stringify(run.analysis)}\n\n`);
4030
+ const unsubscribe = subscribeToLensRun(runId, {
4031
+ update: (analysis) => {
4032
+ response.write(`data: ${JSON.stringify(analysis)}\n\n`);
4033
+ },
4034
+ end: () => response.end("event: end\ndata:\n\n")
4035
+ });
4036
+ if (unsubscribe === null) {
4037
+ response.end("event: end\ndata:\n\n");
4038
+ return;
4039
+ }
4040
+ request.on("close", unsubscribe);
4041
+ }
4042
+ //#endregion
4043
+ //#region src/bin.ts
4044
+ const ARTIFACT_ENTRIES = [ROOT_CONFIG, ".uigraph"];
4045
+ if (process.env.UIGRAPH_DEBUG === "1") consola.level = LogLevels.debug;
4046
+ var UsageError = class extends Error {};
4047
+ function fail(message, exitCode = 1) {
4048
+ console.error(pc.red(`✖ ${message}`));
4049
+ process.exit(exitCode);
4050
+ }
4051
+ async function withCancellation(message, work) {
4052
+ const abortController = new AbortController();
4053
+ let signals = 0;
4054
+ function onSignal() {
4055
+ signals++;
4056
+ if (signals > 1) {
4057
+ console.error(pc.red("\nForced exit."));
4058
+ process.exit(130);
4059
+ }
4060
+ console.log(pc.yellow(`\n${message} (press Ctrl+C again to force quit)`));
4061
+ abortController.abort();
4062
+ }
4063
+ process.on("SIGINT", onSignal);
4064
+ process.on("SIGTERM", onSignal);
4065
+ try {
4066
+ return await work(abortController);
4067
+ } finally {
4068
+ process.off("SIGINT", onSignal);
4069
+ process.off("SIGTERM", onSignal);
4070
+ }
4071
+ }
4072
+ async function resolveRepository(input) {
4073
+ const requested = path.resolve(input ?? process.cwd());
4074
+ let realPath;
4075
+ try {
4076
+ realPath = await fs.realpath(requested);
4077
+ } catch {
4078
+ throw new UsageError(`Repository not found: ${requested}`);
4079
+ }
4080
+ if (!(await fs.stat(realPath)).isDirectory()) throw new UsageError(`Not a directory: ${realPath}`);
4081
+ return realPath;
4082
+ }
4083
+ function describeLimits(settings) {
4084
+ if (settings.maxBudgetUsd !== void 0) return ` • Each Claude session is capped at $${settings.maxBudgetUsd.toFixed(2)}.`;
4085
+ if (settings.agent === "claude") return " • No spending cap is set (see --max-budget); usage counts against your Claude plan or API account.";
4086
+ return ` • Usage counts against your ${AGENT_LABELS[settings.agent]} plan or API account.`;
4087
+ }
4088
+ async function chooseAgent(agent, question) {
4089
+ if (agent !== void 0) return agent;
4090
+ if (!process.stdin.isTTY) throw new UsageError(`Choose an agent with --agent (${AGENT_NAMES.join(", ")}).`);
4091
+ return select({
4092
+ message: question,
4093
+ choices: AGENT_NAMES.map((name) => ({
4094
+ name: AGENT_LABELS[name],
4095
+ value: name
4096
+ }))
4097
+ });
4098
+ }
4099
+ async function confirmAnalysis(root, settings) {
4100
+ const agent = AGENT_LABELS[settings.agent];
4101
+ console.log([
4102
+ "",
4103
+ `${pc.bold("uigraph")} will generate UIGraph artifacts for ${pc.cyan(root)} with ${agent}.`,
4104
+ "",
4105
+ ` • ${agent} reads selected repository files (manifests, source, configs) and sends`,
4106
+ settings.agent === "opencode" ? " their contents to its model provider, using provider API keys from your environment." : ` their contents to its model provider, using your ${agent} login or API key.`,
4107
+ ` • ${agent} first proposes which diagrams to generate and which existing docs to add,`,
4108
+ " and you choose. Nothing is written until you do.",
4109
+ ` • ${agent} writes ${ROOT_CONFIG} and files under .uigraph/ in the repository. Nothing else`,
4110
+ " is changed. If generation fails, the previous artifacts are restored.",
4111
+ describeLimits(settings),
4112
+ ""
4113
+ ].join("\n"));
4114
+ if (await confirm({
4115
+ message: "Continue?",
4116
+ default: false
4117
+ })) return true;
4118
+ console.log(pc.yellow(`Cancelled. Nothing was sent to ${agent}.`));
4119
+ return false;
4120
+ }
4121
+ async function promptForDiagrams(candidates, preselected, docCandidates, agent) {
4122
+ const diagrams = await checkbox({
4123
+ message: `${AGENT_LABELS[agent]} found ${candidates.length} ${candidates.length === 1 ? "diagram" : "diagrams"} worth generating. Pick the ones to generate.`,
4124
+ choices: candidates.map((diagram) => ({
4125
+ name: `${diagram.name} ${pc.cyan(diagram.type)}`,
4126
+ value: diagram,
4127
+ checked: preselected.has(diagram.id),
4128
+ description: `${diagram.summary}\nevidence: ${diagram.evidence.join(", ")}`
4129
+ })),
4130
+ pageSize: candidates.length
4131
+ });
4132
+ const docs = docCandidates.length === 0 ? [] : await checkbox({
4133
+ message: `${AGENT_LABELS[agent]} found ${docCandidates.length} existing ${docCandidates.length === 1 ? "document" : "documents"} in the repository. Pick the ones to add to the viewer.`,
4134
+ choices: docCandidates.map((doc) => ({
4135
+ name: `${doc.name} ${pc.cyan(doc.path)}`,
4136
+ value: doc,
4137
+ checked: true,
4138
+ description: doc.summary
4139
+ })),
4140
+ pageSize: docCandidates.length
4141
+ });
4142
+ const focus = (await input({ message: "Anything in particular to focus on? (optional, press Enter to skip)" })).trim();
4143
+ return {
4144
+ diagrams,
4145
+ docs,
4146
+ focus: focus === "" ? null : focus
4147
+ };
4148
+ }
4149
+ async function chooseDiagrams(root, skill, settings) {
4150
+ console.log(pc.bold("\nLooking for diagrams worth generating…\n"));
4151
+ let plan;
4152
+ try {
4153
+ plan = await withCancellation("Cancelling…", (abortController) => planDiagrams(root, path.basename(root), skill, abortController, settings));
4154
+ } catch (error) {
4155
+ if (error instanceof AnalysisCancelledError) fail("Cancelled. Nothing was written.", 130);
4156
+ if (error instanceof AnalysisError) fail(`${error.message}\n Nothing was written.`);
4157
+ throw error;
4158
+ }
4159
+ if (plan === null) {
4160
+ console.log(pc.yellow("\nCould not build a diagram plan. Generating the default set instead."));
4161
+ return null;
4162
+ }
4163
+ console.log(pc.dim(`\n ${plan.diagrams.length} diagram and ${plan.docs.length} document candidates · ${plan.seconds}s · ${describeUsage(plan.usage)}`));
4164
+ const recommended = new Set(plan.diagrams.filter((diagram) => diagram.recommended).map(({ id }) => id));
4165
+ return promptForDiagrams(plan.diagrams, recommended, plan.docs, settings.agent);
4166
+ }
4167
+ async function downloadSkillOrFail() {
4168
+ try {
4169
+ return await loadSkill();
4170
+ } catch (error) {
4171
+ if (error instanceof AnalysisError) fail(error.message);
4172
+ throw error;
4173
+ }
4174
+ }
4175
+ async function countAnalyzableFiles(root) {
4176
+ const files = await listRepositoryFiles(root, "**/*");
4177
+ if (files.length === 0) fail("The repository has no analyzable files (generated directories and secret files are skipped). Nothing was sent to an agent.");
4178
+ return files.length;
4179
+ }
4180
+ async function findGitRemote(root) {
4181
+ const remote = await promisify(execFile)("git", [
4182
+ "-C",
4183
+ root,
4184
+ "remote",
4185
+ "get-url",
4186
+ "origin"
4187
+ ], { timeout: 1e4 }).then(({ stdout }) => stdout.trim(), () => null);
4188
+ if (remote === null) return null;
4189
+ const match = /^(?:https:\/\/|ssh:\/\/git@|git@)(github\.com|gitlab\.com|bitbucket\.org)[:/](.+?)(?:\.git)?\/?$/.exec(remote);
4190
+ if (match === null) return null;
4191
+ return `https://${match[1]}/${match[2]}`;
4192
+ }
4193
+ async function pathExists(file) {
4194
+ return fs.lstat(file).then(() => true, (error) => {
4195
+ if (error.code === "ENOENT") return false;
4196
+ throw error;
4197
+ });
4198
+ }
4199
+ async function backupArtifacts(root) {
4200
+ const backup = await fs.mkdtemp(path.join(os.tmpdir(), "uigraph-"));
4201
+ for (const entry of ARTIFACT_ENTRIES) if (await pathExists(path.join(root, entry))) await fs.cp(path.join(root, entry), path.join(backup, entry), {
4202
+ recursive: true,
4203
+ verbatimSymlinks: true
4204
+ });
4205
+ return backup;
4206
+ }
4207
+ async function restoreArtifacts(root, backup) {
4208
+ for (const entry of ARTIFACT_ENTRIES) {
4209
+ await fs.rm(path.join(root, entry), {
4210
+ recursive: true,
4211
+ force: true
4212
+ });
4213
+ if (await pathExists(path.join(backup, entry))) await fs.cp(path.join(backup, entry), path.join(root, entry), {
4214
+ recursive: true,
4215
+ verbatimSymlinks: true
4216
+ });
4217
+ }
4218
+ }
4219
+ async function runGeneration(root, fileCount, update, skill, selection, settings) {
4220
+ const gitRemote = await findGitRemote(root);
4221
+ const backup = await backupArtifacts(root);
4222
+ console.log(pc.bold(`\nGenerating artifacts from ${fileCount} ${fileCount === 1 ? "file" : "files"} with ${AGENT_LABELS[settings.agent]}…\n`));
4223
+ try {
4224
+ await withCancellation("Cancelling generation…", (abortController) => generateArtifacts(root, path.basename(root), gitRemote, update, abortController, skill, selection, settings));
4225
+ console.log(pc.green(`\n✔ Artifacts written to ${ROOT_CONFIG} and .uigraph/`));
4226
+ } catch (error) {
4227
+ await restoreArtifacts(root, backup);
4228
+ if (error instanceof AnalysisCancelledError) fail("Generation cancelled. The previous artifacts were restored.", 130);
4229
+ if (error instanceof AnalysisError) fail(`${error.message}\n The previous artifacts were restored.`);
4230
+ throw error;
4231
+ } finally {
4232
+ await fs.rm(backup, {
4233
+ recursive: true,
4234
+ force: true
4235
+ });
4236
+ }
4237
+ }
4238
+ function printSummary(db) {
4239
+ const endpoints = db.apiGroups.reduce((count, { endpoints }) => count + endpoints.length, 0);
4240
+ console.log(pc.dim(` ${db.services.length} services · ${endpoints} endpoints · ${db.dependencies.length} dependencies · ${db.diagrams.length} diagrams`));
4241
+ }
4242
+ async function generate(root, hasArtifacts, options) {
4243
+ const fileCount = await countAnalyzableFiles(root);
4244
+ const settings = {
4245
+ agent: await chooseAgent(options.agent, "Which agent should generate the artifacts?"),
4246
+ model: options.model,
4247
+ maxBudgetUsd: options.maxBudgetUsd
4248
+ };
4249
+ if (settings.agent !== "claude" && settings.maxBudgetUsd !== void 0) throw new UsageError(`--max-budget only works with Claude. ${AGENT_LABELS[settings.agent]} does not support a spending cap.`);
4250
+ if (!await confirmAnalysis(root, settings)) return false;
4251
+ const skill = await downloadSkillOrFail();
4252
+ await runGeneration(root, fileCount, hasArtifacts, skill, await chooseDiagrams(root, skill, settings), settings);
4253
+ return true;
4254
+ }
4255
+ async function registerProject(root, port) {
4256
+ const { db, errors } = await loadArtifacts(root);
4257
+ if (errors.length > 0) {
4258
+ console.error(pc.red(`✖ The UIGraph artifacts are invalid:\n${errors.map((error) => ` • ${error}`).join("\n")}\n Fix them or run "uigraph generate --update".`));
4259
+ return false;
4260
+ }
4261
+ printSummary(db);
4262
+ return reportSync(root, await syncProject(root), port);
4263
+ }
4264
+ async function offerGuidance(root, hasGuidance) {
4265
+ const accepted = await confirm({
4266
+ message: hasGuidance ? "Update the UIGraph instructions for coding agents?" : "Add UIGraph instructions for coding agents?",
4267
+ default: true
4268
+ });
4269
+ await setGuidanceDeclined(root, !accepted);
4270
+ if (!accepted) {
4271
+ console.log(pc.dim(" Run \"uigraph init\" to add them later."));
4272
+ return;
4273
+ }
4274
+ const files = await writeGuidance(root);
4275
+ console.log(pc.green(`✔ Wrote ${GUIDANCE_FILE} and linked it from ${files.join(" and ")}`));
4276
+ }
4277
+ function reportSync(root, result, port) {
4278
+ if (result.synced) {
4279
+ console.log(pc.green(`✔ Registered with the viewer (${serverUrl(port)})`));
4280
+ return true;
4281
+ }
4282
+ console.error(pc.red(`✖ The viewer will not show this repository. ${root} ${result.reason}`));
4283
+ return false;
4284
+ }
4285
+ const STALE_HELP = "Run \"uigraph restart\" to replace it.";
4286
+ async function findListeningPid(port) {
4287
+ const pid = await promisify(execFile)("lsof", [
4288
+ "-ti",
4289
+ `tcp:${port}`,
4290
+ "-sTCP:LISTEN"
4291
+ ], { timeout: 5e3 }).then(({ stdout }) => Number.parseInt(stdout.split("\n")[0] ?? "", 10), () => NaN);
4292
+ return Number.isInteger(pid) && pid > 0 ? pid : null;
4293
+ }
4294
+ async function stopViewerProcess(port) {
4295
+ const lock = await readViewerLock();
4296
+ const pid = lock !== null && lock.port === port ? lock.pid : await findListeningPid(port);
4297
+ if (pid === null || pid === process.pid) return false;
4298
+ try {
4299
+ process.kill(pid, "SIGTERM");
4300
+ } catch {
4301
+ return false;
4302
+ }
4303
+ for (let waited = 0; waited < 5e3; waited += 100) {
4304
+ if (!await isServerRunning(port)) return true;
4305
+ await new Promise((resolve) => setTimeout(resolve, 100));
4306
+ }
4307
+ return false;
4308
+ }
4309
+ async function describeStaleViewer(port) {
4310
+ const info = await getViewerInfo(port);
4311
+ if (info === null) return null;
4312
+ if (info === "legacy") return "An older uigraph viewer is running and may not show your changes.";
4313
+ return info.build === BUILD_ID ? null : `A viewer from a different build (${info.version}, ${info.build}) is running and may not show your changes.`;
4314
+ }
4315
+ async function viewerLogPath() {
4316
+ return path.join(await homeRoot(), ".uigraph", "viewer.log");
4317
+ }
4318
+ async function startViewer(port, mode) {
4319
+ await showBanner();
4320
+ const url = serverUrl(port);
4321
+ const stale = await describeStaleViewer(port);
4322
+ if (stale !== null) {
4323
+ console.log(pc.yellow(`${stale} Restarting it.`));
4324
+ if (!await stopViewerProcess(port)) fail(`Could not stop it. Stop whatever listens on port ${port} (lsof -ti :${port} | xargs kill), then run this command again.`);
4325
+ }
4326
+ if (await isServerRunning(port)) {
4327
+ console.log(`\n${pc.bold("UIGraph viewer")} is already running at ${pc.cyan(url)}`);
4328
+ return null;
4329
+ }
4330
+ if (mode === "background") {
4331
+ const logFile = await viewerLogPath();
4332
+ await fs.mkdir(path.dirname(logFile), { recursive: true });
4333
+ const log = await fs.open(logFile, "a");
4334
+ await log.write(`\n--- ${(/* @__PURE__ */ new Date()).toISOString()} uigraph ${VERSION} ---\n`);
4335
+ spawn(process.execPath, [
4336
+ ...process.execArgv,
4337
+ process.argv[1],
4338
+ "start",
4339
+ "--port",
4340
+ String(port)
4341
+ ], {
4342
+ detached: true,
4343
+ stdio: [
4344
+ "ignore",
4345
+ log.fd,
4346
+ log.fd
4347
+ ]
4348
+ }).unref();
4349
+ await log.close();
4350
+ for (let waited = 0; !await isServerRunning(port); waited += 100) {
4351
+ if (waited >= 1e4) fail(`The viewer did not start in the background. See ${logFile}, or run "uigraph start" to see why.`);
4352
+ await new Promise((resolve) => setTimeout(resolve, 100));
4353
+ }
4354
+ console.log(`\n${pc.bold("UIGraph viewer")} running in the background at ${pc.cyan(url)}`);
4355
+ console.log(pc.dim(` Logs: ${logFile}`));
4356
+ console.log(pc.dim(" Run \"uigraph stop\" to stop it.\n"));
4357
+ return null;
4358
+ }
4359
+ const server = await startServer(port);
4360
+ await writeViewerLock({
4361
+ pid: process.pid,
4362
+ port
4363
+ });
4364
+ console.log(`\n${pc.bold("UIGraph viewer")} running at ${pc.cyan(url)}\n`);
4365
+ return server;
4366
+ }
4367
+ function holdViewer(server) {
4368
+ console.log(pc.dim("\nPress Ctrl+C to stop.\n"));
4369
+ let stopping = false;
4370
+ async function stop() {
4371
+ if (stopping) process.exit(0);
4372
+ stopping = true;
4373
+ await server.close();
4374
+ await removeViewerLock(process.pid);
4375
+ console.log(pc.dim("\nViewer stopped."));
4376
+ process.exit(0);
4377
+ }
4378
+ process.on("SIGINT", () => void stop());
4379
+ process.on("SIGTERM", () => void stop());
4380
+ }
4381
+ async function openBrowser(url) {
4382
+ try {
4383
+ await open(url);
4384
+ } catch {
4385
+ console.log(pc.yellow(`Could not open a browser. Open ${url} manually.`));
4386
+ }
4387
+ }
4388
+ async function resolvePullRequest(input) {
4389
+ if (!/^\d+$/.test(input)) return input;
4390
+ const remote = await findGitRemote(process.cwd());
4391
+ if (remote === null || !remote.startsWith("https://github.com/")) throw new UsageError("A bare pull request number needs a GitHub origin remote in the current directory. Pass a pull request URL or owner/repo#number instead.");
4392
+ return `${remote}/pull/${input}`;
4393
+ }
4394
+ async function lens(request, regenerate, agent, model, port, noOpen) {
4395
+ const viewer = await startViewer(port, "foreground");
4396
+ const response = await fetch(`${serverUrl(port)}api/lens/runs`, {
4397
+ method: "POST",
4398
+ headers: { "Content-Type": "application/json" },
4399
+ body: JSON.stringify({
4400
+ request,
4401
+ regenerate,
4402
+ agent,
4403
+ model
4404
+ })
4405
+ });
4406
+ const text = await response.text();
4407
+ if (response.ok) {
4408
+ const { runId } = JSON.parse(text);
4409
+ const url = `${serverUrl(port)}lens/${runId}`;
4410
+ console.log(`${pc.bold("Lens")} review at ${pc.cyan(url)}`);
4411
+ if (!noOpen) await openBrowser(url);
4412
+ } else {
4413
+ const isJson = (response.headers.get("content-type") ?? "").startsWith("application/json");
4414
+ console.error(pc.red(`✖ ${isJson ? JSON.parse(text).error : text}`));
4415
+ process.exitCode = 1;
4416
+ }
4417
+ if (viewer !== null) holdViewer(viewer);
4418
+ }
4419
+ async function status(port) {
4420
+ const lock = await readViewerLock();
4421
+ const effectivePort = lock?.port ?? port;
4422
+ if (await isServerRunning(effectivePort)) {
4423
+ console.log(`UIGraph viewer is running at ${pc.cyan(serverUrl(effectivePort))}${lock === null ? "" : pc.dim(` (pid ${lock.pid})`)}`);
4424
+ console.log(pc.dim(` Logs: ${await viewerLogPath()}`));
4425
+ const stale = await describeStaleViewer(effectivePort);
4426
+ if (stale !== null) console.log(pc.yellow(` ${stale}\n ${STALE_HELP}`));
4427
+ } else {
4428
+ console.log("UIGraph viewer is not running.");
4429
+ process.exitCode = 1;
4430
+ }
4431
+ const projects = await listRegisteredProjects();
4432
+ if (projects.length === 0) {
4433
+ console.log(pc.dim("No repositories are registered."));
4434
+ return;
4435
+ }
4436
+ console.log(pc.bold("\nRegistered repositories"));
4437
+ for (const { root, problem } of projects) console.log(problem === null ? ` ${pc.green("✔")} ${root}` : ` ${pc.red("✖")} ${root}\n ${problem}`);
4438
+ }
4439
+ async function stopViewer(port) {
4440
+ const lock = await readViewerLock();
4441
+ if (lock === null) {
4442
+ if (await isServerRunning(port)) {
4443
+ if (await stopViewerProcess(port)) {
4444
+ console.log(`Stopped the UIGraph viewer on port ${port}.`);
4445
+ return;
4446
+ }
4447
+ console.error(pc.red(`✖ A viewer is running on port ${port} but could not be stopped. Try: lsof -ti :${port} | xargs kill`));
4448
+ process.exitCode = 1;
4449
+ return;
4450
+ }
4451
+ console.log("UIGraph viewer is not running.");
4452
+ return;
4453
+ }
4454
+ if (await stopViewerProcess(lock.port)) {
4455
+ console.log(`Stopped the UIGraph viewer (pid ${lock.pid}).`);
4456
+ return;
4457
+ }
4458
+ console.error(pc.red(`✖ The UIGraph viewer (pid ${lock.pid}) could not be stopped. Try: kill ${lock.pid}`));
4459
+ process.exitCode = 1;
4460
+ }
4461
+ function parseNumber(min, max, integer) {
4462
+ return (raw) => {
4463
+ const value = Number(raw);
4464
+ if (raw.trim() === "" || !Number.isFinite(value) || value < min || value > max || integer && !Number.isInteger(value)) throw new InvalidArgumentError(`Expected ${integer ? "an integer" : "a number"} between ${min} and ${max}.`);
4465
+ return value;
4466
+ };
4467
+ }
4468
+ const parsePort = parseNumber(1, 65535, true);
4469
+ const parseBudget = parseNumber(.01, 1e4, false);
4470
+ function agentOption() {
4471
+ return new Option("--agent <name>", "Coding agent to use").choices(AGENT_NAMES);
4472
+ }
4473
+ function portOption() {
4474
+ return new Option("--port <number>", "Viewer port").env("UIGRAPH_PORT").default(DEFAULT_PORT).argParser(parsePort);
4475
+ }
4476
+ const program = new Command().name("uigraph").description("Generate UIGraph artifacts for a repository with a coding agent (Claude Code,\nCodex, OpenCode, Pi or Cursor) and browse every registered repository in one\nlocal viewer.").version(VERSION, "-v, --version").option("--debug", "Print stack traces, agent output and Lens progress (also UIGRAPH_DEBUG=1)").showHelpAfterError("(run uigraph --help for usage)").addHelpText("after", "\nA repository literally named \"open\", \"init\", \"generate\", \"sync\", \"start\",\n\"status\", \"stop\", \"restart\" or \"lens\" can be passed as ./start.").hook("preAction", () => {
4477
+ if (program.opts().debug === true) {
4478
+ process.env.UIGRAPH_DEBUG = "1";
4479
+ consola.level = LogLevels.debug;
4480
+ }
4481
+ });
4482
+ program.command("open", { isDefault: true }).description("Start the viewer, offer to generate artifacts if there are none, and open it (default)").argument("[repository]", "Repository path (default: current directory)").addOption(agentOption()).option("--model <name>", "Model to use for generation, in the agent's own format").option("--max-budget <usd>", "Spending cap per Claude session (planning, generation and repair each get one). Claude only", parseBudget).addOption(portOption()).option("--no-open", "Do not open a browser").action(async (repository, options) => {
4483
+ const root = await resolveRepository(repository);
4484
+ await startViewer(options.port, "background");
4485
+ const hasArtifacts = await pathExists(path.join(root, ROOT_CONFIG));
4486
+ let generated = false;
4487
+ if (hasArtifacts) {
4488
+ console.log(`Opening the UIGraph artifacts in ${pc.cyan(root)}`);
4489
+ console.log(pc.dim(" Run \"uigraph generate --update\" to update them."));
4490
+ } else if (!process.stdin.isTTY) console.log(`${root} has no UIGraph artifacts. Run "uigraph generate" in a terminal to generate them.`);
4491
+ else if (await confirm({
4492
+ message: `${root} has no UIGraph artifacts. Generate them with an agent?`,
4493
+ default: true
4494
+ })) generated = await generate(root, false, {
4495
+ agent: options.agent,
4496
+ model: options.model,
4497
+ maxBudgetUsd: options.maxBudget
4498
+ });
4499
+ const synced = hasArtifacts || generated ? await registerProject(root, options.port) : true;
4500
+ if (process.stdin.isTTY && (hasArtifacts || generated) && !await pathExists(path.join(root, ".uigraph/AGENTS.md")) && !await isGuidanceDeclined(root)) await offerGuidance(root, false);
4501
+ if (options.open) await openBrowser(serverUrl(options.port));
4502
+ if (!synced) process.exitCode = 1;
4503
+ });
4504
+ program.command("init").description("Generate artifacts if there are none, then add or update the instructions for coding agents").argument("[repository]", "Repository path (default: current directory)").addOption(agentOption()).option("--model <name>", "Model to use for generation, in the agent's own format").option("--max-budget <usd>", "Spending cap per Claude session (planning, generation and repair each get one). Claude only", parseBudget).action(async (repository, options) => {
4505
+ const root = await resolveRepository(repository);
4506
+ if (!process.stdin.isTTY) throw new UsageError("\"uigraph init\" needs a terminal.");
4507
+ if (!await pathExists(path.join(root, ".uigraph.yaml"))) {
4508
+ if (!await generate(root, false, {
4509
+ agent: options.agent,
4510
+ model: options.model,
4511
+ maxBudgetUsd: options.maxBudget
4512
+ })) {
4513
+ process.exitCode = 130;
4514
+ return;
4515
+ }
4516
+ }
4517
+ const synced = await registerProject(root, parsePort(process.env.UIGRAPH_PORT ?? String(7357)));
4518
+ await offerGuidance(root, await pathExists(path.join(root, GUIDANCE_FILE)));
4519
+ if (!synced) process.exitCode = 1;
4520
+ });
4521
+ program.command("generate").description("Generate artifacts, or update them after asking, then exit").argument("[repository]", "Repository path (default: current directory)").option("--update", "Regenerate existing artifacts without asking").addOption(agentOption()).option("--model <name>", "Model to use for generation, in the agent's own format").option("--max-budget <usd>", "Spending cap per Claude session (planning, generation and repair each get one). Claude only", parseBudget).action(async (repository, options) => {
4522
+ const root = await resolveRepository(repository);
4523
+ if (!process.stdin.isTTY) throw new UsageError("\"uigraph generate\" needs a terminal.");
4524
+ const hasArtifacts = await pathExists(path.join(root, ROOT_CONFIG));
4525
+ if (hasArtifacts && options.update !== true && !await confirm({
4526
+ message: `${root} already has UIGraph artifacts. Update them?`,
4527
+ default: false
4528
+ })) {
4529
+ console.log("Nothing was changed.");
4530
+ return;
4531
+ }
4532
+ if (!await generate(root, hasArtifacts, {
4533
+ agent: options.agent,
4534
+ model: options.model,
4535
+ maxBudgetUsd: options.maxBudget
4536
+ })) {
4537
+ process.exitCode = 130;
4538
+ return;
4539
+ }
4540
+ if (!await registerProject(root, parsePort(process.env.UIGRAPH_PORT ?? String(7357)))) process.exitCode = 1;
4541
+ });
4542
+ program.command("sync").description("Show the artifacts of a repository in the viewer, then exit").argument("[repository]", "Repository path (default: current directory)").action(async (repository) => {
4543
+ const root = await resolveRepository(repository);
4544
+ if (!await pathExists(path.join(root, ".uigraph.yaml"))) throw new UsageError(`${root} has no UIGraph artifacts. Run "uigraph generate" to generate them.`);
4545
+ if (!await registerProject(root, parsePort(process.env.UIGRAPH_PORT ?? String(7357)))) process.exitCode = 1;
4546
+ });
4547
+ program.command("start").description("Start the viewer").addOption(portOption()).action(async (options) => {
4548
+ const viewer = await startViewer(options.port, "foreground");
4549
+ if (viewer !== null) holdViewer(viewer);
4550
+ });
4551
+ program.command("status").description("Show the viewer and every registered repository").addOption(portOption()).action((options) => status(options.port));
4552
+ program.command("stop").description("Stop a running viewer").addOption(portOption()).action((options) => stopViewer(options.port));
4553
+ program.command("restart").description("Stop a running viewer and start it in this terminal").addOption(portOption()).action(async (options) => {
4554
+ await stopViewer(options.port);
4555
+ if (process.exitCode === 1) return;
4556
+ const viewer = await startViewer(options.port, "foreground");
4557
+ if (viewer !== null) holdViewer(viewer);
4558
+ });
4559
+ program.command("lens").description("Review a GitHub pull request, or two branches, with Lens").argument("[pull-request]", "Pull request URL, owner/repo#number, or a number in the current repository").option("--base <branch>", "Branch or commit to compare against").option("--target <branch>", "Branch or commit to review").option("--regenerate", "Run a new review instead of reusing a completed one").addOption(agentOption()).option("--model <name>", "Model to use, in the agent's own format (default: the agent's default)").addOption(portOption()).option("--no-open", "Do not open a browser").action(async (pullRequest, options) => {
4560
+ let request;
4561
+ if (pullRequest !== void 0) {
4562
+ if (options.base !== void 0 || options.target !== void 0) throw new UsageError("Pass a pull request, or --base with --target, not both.");
4563
+ request = {
4564
+ type: "github",
4565
+ pullRequest: await resolvePullRequest(pullRequest)
4566
+ };
4567
+ } else if (options.base !== void 0 && options.target !== void 0) request = {
4568
+ type: "local",
4569
+ directory: process.cwd(),
4570
+ base: options.base,
4571
+ target: options.target
4572
+ };
4573
+ else throw new UsageError("Pass a pull request, or both --base and --target.");
4574
+ await lens(request, options.regenerate === true, await chooseAgent(options.agent, "Which agent should run the review?"), options.model, options.port, !options.open);
4575
+ });
4576
+ program.parseAsync().catch((error) => {
4577
+ if (error instanceof Error && error.name === "ExitPromptError") fail("Cancelled.", 130);
4578
+ if (error instanceof UsageError) fail(`${error.message}\n\nRun uigraph --help for usage.`);
4579
+ if (consola.level >= LogLevels.debug) fail(inspect(error));
4580
+ fail(`${error instanceof Error ? error.message : String(error)}\n Run with --debug for details.`);
4581
+ });
4582
+ //#endregion
4583
+ export {};