@legionworks/facet 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/LICENSE-MIT +23 -0
  3. package/README.md +158 -0
  4. package/dist/gallery/chunk-4g8rem85.css +656 -0
  5. package/dist/gallery/chunk-c6s9k9ty.js +5970 -0
  6. package/dist/gallery/frame/artifact.css +8424 -0
  7. package/dist/gallery/frame/chunks/abnfDiagram-N423BO3Z-jj74szbm.js +155 -0
  8. package/dist/gallery/frame/chunks/architecture-TIHT7OUA-cvdjn7dt.js +10 -0
  9. package/dist/gallery/frame/chunks/architectureDiagram-T3A2C74G-n4z77eg6.js +8675 -0
  10. package/dist/gallery/frame/chunks/blockDiagram-VBNYF7ZC-7xsqzrd1.js +3529 -0
  11. package/dist/gallery/frame/chunks/c4Diagram-5PPSVZJV-z2zjs7wx.js +2413 -0
  12. package/dist/gallery/frame/chunks/classDiagram-JCYQIIEL-ve8rngqp.js +47 -0
  13. package/dist/gallery/frame/chunks/classDiagram-v2-OCEON4UE-8cfaxb8z.js +47 -0
  14. package/dist/gallery/frame/chunks/cose-bilkent-JH36ORCC-sn92qexx.js +4822 -0
  15. package/dist/gallery/frame/chunks/cynefin-VYW2F7L2-tqjv913d.js +10 -0
  16. package/dist/gallery/frame/chunks/cynefinDiagram-MW4NZA55-c1c0dj12.js +500 -0
  17. package/dist/gallery/frame/chunks/dagre-VZM6K2ZE-7tyg4yt2.js +476 -0
  18. package/dist/gallery/frame/chunks/diagram-7IWD3JNH-y4eng9sc.js +526 -0
  19. package/dist/gallery/frame/chunks/diagram-B4RE2ZJO-rn3p7j5h.js +673 -0
  20. package/dist/gallery/frame/chunks/diagram-LBJQPF4R-w4a2cm9q.js +255 -0
  21. package/dist/gallery/frame/chunks/diagram-Q27KOJAE-aqc2v7wy.js +575 -0
  22. package/dist/gallery/frame/chunks/diagram-UB23O5K3-xncy8nyd.js +355 -0
  23. package/dist/gallery/frame/chunks/ebnfDiagram-BXEA7PRR-acwgxz16.js +175 -0
  24. package/dist/gallery/frame/chunks/erDiagram-JOGREHBK-mzp5nswt.js +1332 -0
  25. package/dist/gallery/frame/chunks/eventmodeling-45OFAUF4-sg07qr0c.js +10 -0
  26. package/dist/gallery/frame/chunks/flowDiagram-UKHOOZJN-2e5ygs44.js +29 -0
  27. package/dist/gallery/frame/chunks/ganttDiagram-PKOTCBZU-p2hhh7hr.js +2620 -0
  28. package/dist/gallery/frame/chunks/gitGraph-TEB2WS4Q-j6kw0naa.js +10 -0
  29. package/dist/gallery/frame/chunks/gitGraphDiagram-DS77QQ5N-4z9z8wjm.js +1347 -0
  30. package/dist/gallery/frame/chunks/info-DKCQHKI2-mpt80jd3.js +10 -0
  31. package/dist/gallery/frame/chunks/infoDiagram-6WML65LV-5rqm3mgg.js +65 -0
  32. package/dist/gallery/frame/chunks/ishikawaDiagram-WSZJBQD7-b51z96jy.js +975 -0
  33. package/dist/gallery/frame/chunks/journeyDiagram-NVQOT4AX-9jbfp0pk.js +1272 -0
  34. package/dist/gallery/frame/chunks/kanban-definition-27J2QSJJ-4x0vx4se.js +1116 -0
  35. package/dist/gallery/frame/chunks/katex-xfgk95tv.js +14034 -0
  36. package/dist/gallery/frame/chunks/markdown-1s5vwkf2.js +9 -0
  37. package/dist/gallery/frame/chunks/markdown-2h6bwsms.js +3239 -0
  38. package/dist/gallery/frame/chunks/markdown-2x113yh8.js +107 -0
  39. package/dist/gallery/frame/chunks/markdown-30b7rwmp.js +1943 -0
  40. package/dist/gallery/frame/chunks/markdown-356bfj4g.js +2031 -0
  41. package/dist/gallery/frame/chunks/markdown-44n9ea69.js +2406 -0
  42. package/dist/gallery/frame/chunks/markdown-56enrf2r.js +39 -0
  43. package/dist/gallery/frame/chunks/markdown-5avymm8t.js +725 -0
  44. package/dist/gallery/frame/chunks/markdown-6r4svars.js +33 -0
  45. package/dist/gallery/frame/chunks/markdown-6zz8efx2.js +24 -0
  46. package/dist/gallery/frame/chunks/markdown-7jp6prnb.js +19 -0
  47. package/dist/gallery/frame/chunks/markdown-809k7q41.js +55 -0
  48. package/dist/gallery/frame/chunks/markdown-82xmzhzd.js +1076 -0
  49. package/dist/gallery/frame/chunks/markdown-92n37gd4.js +7627 -0
  50. package/dist/gallery/frame/chunks/markdown-ag2sssf8.js +36 -0
  51. package/dist/gallery/frame/chunks/markdown-b4s7ntq2.js +19 -0
  52. package/dist/gallery/frame/chunks/markdown-c9k0fvp1.js +100 -0
  53. package/dist/gallery/frame/chunks/markdown-ceefymn8.js +125 -0
  54. package/dist/gallery/frame/chunks/markdown-d1wfbs70.js +243 -0
  55. package/dist/gallery/frame/chunks/markdown-dy5sgjhc.js +11022 -0
  56. package/dist/gallery/frame/chunks/markdown-dz3z5w30.js +30868 -0
  57. package/dist/gallery/frame/chunks/markdown-eg6ngz7y.js +30340 -0
  58. package/dist/gallery/frame/chunks/markdown-ff5wvb43.js +1149 -0
  59. package/dist/gallery/frame/chunks/markdown-ffg06nfz.js +86 -0
  60. package/dist/gallery/frame/chunks/markdown-fvfncadf.js +472 -0
  61. package/dist/gallery/frame/chunks/markdown-gvyszqpv.js +19 -0
  62. package/dist/gallery/frame/chunks/markdown-gx1p0ew0.js +88 -0
  63. package/dist/gallery/frame/chunks/markdown-gxye5frz.js +65 -0
  64. package/dist/gallery/frame/chunks/markdown-h7pzv34e.js +105 -0
  65. package/dist/gallery/frame/chunks/markdown-hab789t9.js +47 -0
  66. package/dist/gallery/frame/chunks/markdown-hjp6sj8t.js +125 -0
  67. package/dist/gallery/frame/chunks/markdown-jka64qgp.js +1993 -0
  68. package/dist/gallery/frame/chunks/markdown-k8xkn8mw.js +56 -0
  69. package/dist/gallery/frame/chunks/markdown-m7frq8x8.js +112 -0
  70. package/dist/gallery/frame/chunks/markdown-p740v4qm.js +36 -0
  71. package/dist/gallery/frame/chunks/markdown-pxfeh231.js +57 -0
  72. package/dist/gallery/frame/chunks/markdown-pzgd8z3s.js +87 -0
  73. package/dist/gallery/frame/chunks/markdown-qx3cngz2.js +1673 -0
  74. package/dist/gallery/frame/chunks/markdown-rawhfvvc.js +85 -0
  75. package/dist/gallery/frame/chunks/markdown-rd8w0ng9.js +49 -0
  76. package/dist/gallery/frame/chunks/markdown-rm2yxfjj.js +2773 -0
  77. package/dist/gallery/frame/chunks/markdown-s1jatrnk.js +993 -0
  78. package/dist/gallery/frame/chunks/markdown-sgfg5vvq.js +59 -0
  79. package/dist/gallery/frame/chunks/markdown-t4ethv9d.js +409 -0
  80. package/dist/gallery/frame/chunks/markdown-tnmabqvz.js +36 -0
  81. package/dist/gallery/frame/chunks/markdown-tvdpppw8.js +5292 -0
  82. package/dist/gallery/frame/chunks/markdown-v0x27twr.js +22 -0
  83. package/dist/gallery/frame/chunks/markdown-v14td68x.js +36 -0
  84. package/dist/gallery/frame/chunks/markdown-w6sgd54z.js +36 -0
  85. package/dist/gallery/frame/chunks/markdown-xw8dsk8b.js +2125 -0
  86. package/dist/gallery/frame/chunks/markdown-y18mve73.js +85 -0
  87. package/dist/gallery/frame/chunks/markdown-yengsms5.js +427 -0
  88. package/dist/gallery/frame/chunks/markdown-z1wc0v0d.js +1826 -0
  89. package/dist/gallery/frame/chunks/markdown-zazx9h4n.js +329 -0
  90. package/dist/gallery/frame/chunks/mermaid-de7p4v0x.js +30 -0
  91. package/dist/gallery/frame/chunks/mindmap-definition-FAOFIHXS-ra44cbem.js +1216 -0
  92. package/dist/gallery/frame/chunks/packet-7NZHBO7P-xppm5913.js +10 -0
  93. package/dist/gallery/frame/chunks/pegDiagram-VL7TDLO6-a2a4wg03.js +163 -0
  94. package/dist/gallery/frame/chunks/pie-RZYD4A2V-hnbxk152.js +10 -0
  95. package/dist/gallery/frame/chunks/pieDiagram-7S7Q4E2Y-f1vxjtmx.js +311 -0
  96. package/dist/gallery/frame/chunks/quadrantDiagram-CIZ2JOQS-ywafa6kh.js +1390 -0
  97. package/dist/gallery/frame/chunks/radar-I7S5WNFK-ewqd27se.js +10 -0
  98. package/dist/gallery/frame/chunks/railroad-3IZDKUUU-5hy4bdx3.js +10 -0
  99. package/dist/gallery/frame/chunks/railroad-abnf-AHOZXSZD-bh5sxz0d.js +10 -0
  100. package/dist/gallery/frame/chunks/railroad-ebnf-EBAXGLYW-6b9c3zeh.js +10 -0
  101. package/dist/gallery/frame/chunks/railroad-peg-LSFZ7HO6-avc8v39s.js +10 -0
  102. package/dist/gallery/frame/chunks/railroadDiagram-AXF67PYL-qc61wax4.js +131 -0
  103. package/dist/gallery/frame/chunks/requirementDiagram-LRYGKXZP-9bs4786c.js +1295 -0
  104. package/dist/gallery/frame/chunks/sankeyDiagram-W5VNT64P-awt1em8b.js +1339 -0
  105. package/dist/gallery/frame/chunks/sequenceDiagram-SI44F4Z6-qaf9mz3t.js +4324 -0
  106. package/dist/gallery/frame/chunks/sizeCapture-X5ZJPWSS-9fq685xd.js +64 -0
  107. package/dist/gallery/frame/chunks/stateDiagram-OKZ733FA-vx7a7hh0.js +456 -0
  108. package/dist/gallery/frame/chunks/stateDiagram-v2-UEYNNEHI-x4m6ws5t.js +46 -0
  109. package/dist/gallery/frame/chunks/swimlanes-SLNWSIFB-e4mxm1gh.js +8287 -0
  110. package/dist/gallery/frame/chunks/swimlanesDiagram-ULZ7WXOC-0h93e2qq.js +42 -0
  111. package/dist/gallery/frame/chunks/timeline-definition-Z64GVDOM-wp0bhbzg.js +1549 -0
  112. package/dist/gallery/frame/chunks/treeView-QDETBFTQ-hcx7n0vt.js +10 -0
  113. package/dist/gallery/frame/chunks/treemap-6X3UGDF4-av02skdw.js +10 -0
  114. package/dist/gallery/frame/chunks/vennDiagram-T6HMQDX7-pmvk1p7n.js +2566 -0
  115. package/dist/gallery/frame/chunks/wardley-OPB4EBWU-njsp6e40.js +10 -0
  116. package/dist/gallery/frame/chunks/wardleyDiagram-T6FBY63Y-eggmnv4z.js +979 -0
  117. package/dist/gallery/frame/chunks/xychartDiagram-ELKLHX3M-q40tnpe5.js +1954 -0
  118. package/dist/gallery/frame/frame.css +183 -0
  119. package/dist/gallery/frame/runtime/chart.js +42744 -0
  120. package/dist/gallery/frame/runtime/html.js +14 -0
  121. package/dist/gallery/frame/runtime/markdown.js +1403 -0
  122. package/dist/gallery/frame/runtime/mermaid.js +32 -0
  123. package/dist/gallery/frame/runtime/svg.js +14 -0
  124. package/dist/gallery/frame/runtime/tsx.js +52 -0
  125. package/dist/gallery/index.html +104 -0
  126. package/docs/reference/cli.md +163 -0
  127. package/docs/reference/export.md +106 -0
  128. package/docs/reference/html.md +215 -0
  129. package/docs/reference/http.md +85 -0
  130. package/docs/reference/mcp.md +78 -0
  131. package/docs/reference/security.md +119 -0
  132. package/docs/reference/storage.md +93 -0
  133. package/docs/reference/tsx.md +101 -0
  134. package/docs/reference/validation.md +212 -0
  135. package/package.json +89 -0
  136. package/scripts/build-gallery.ts +127 -0
  137. package/scripts/launch-netns.sh +67 -0
  138. package/skills/facet/SKILL.md +100 -0
  139. package/src/cli/client.ts +311 -0
  140. package/src/cli/commands/create.ts +49 -0
  141. package/src/cli/commands/doctor.ts +249 -0
  142. package/src/cli/commands/export.ts +179 -0
  143. package/src/cli/commands/instantiate.ts +35 -0
  144. package/src/cli/commands/list.ts +49 -0
  145. package/src/cli/commands/open.ts +75 -0
  146. package/src/cli/commands/pin.ts +39 -0
  147. package/src/cli/commands/promote.ts +49 -0
  148. package/src/cli/commands/publish.ts +122 -0
  149. package/src/cli/commands/read-back.ts +56 -0
  150. package/src/cli/commands/status.ts +114 -0
  151. package/src/cli/commands/watch.ts +146 -0
  152. package/src/cli/main.ts +522 -0
  153. package/src/cli/output.ts +106 -0
  154. package/src/cli/parser.ts +376 -0
  155. package/src/cli/presenter.ts +212 -0
  156. package/src/cli/service-metadata.ts +134 -0
  157. package/src/cli/spawn-service.ts +326 -0
  158. package/src/css.d.ts +4 -0
  159. package/src/gallery-web/app.ts +1581 -0
  160. package/src/gallery-web/export-menu.ts +121 -0
  161. package/src/gallery-web/export.ts +112 -0
  162. package/src/gallery-web/favicon.ts +54 -0
  163. package/src/gallery-web/frame/entries/chart.ts +6 -0
  164. package/src/gallery-web/frame/entries/html.ts +6 -0
  165. package/src/gallery-web/frame/entries/markdown.ts +6 -0
  166. package/src/gallery-web/frame/entries/mermaid.ts +6 -0
  167. package/src/gallery-web/frame/entries/svg.ts +6 -0
  168. package/src/gallery-web/frame/entries/tsx.ts +6 -0
  169. package/src/gallery-web/frame/frame-payload.ts +91 -0
  170. package/src/gallery-web/frame/renderer-validation.ts +13 -0
  171. package/src/gallery-web/frame/renderers/chart.ts +182 -0
  172. package/src/gallery-web/frame/renderers/dompurify-shim.ts +112 -0
  173. package/src/gallery-web/frame/renderers/html.ts +48 -0
  174. package/src/gallery-web/frame/renderers/markdown.ts +81 -0
  175. package/src/gallery-web/frame/renderers/mermaid.ts +120 -0
  176. package/src/gallery-web/frame/renderers/registry.ts +260 -0
  177. package/src/gallery-web/frame/renderers/svg.ts +393 -0
  178. package/src/gallery-web/frame/renderers/tsx.ts +61 -0
  179. package/src/gallery-web/frame/runtime.ts +501 -0
  180. package/src/gallery-web/frame/styles/artifact.css +8424 -0
  181. package/src/gallery-web/frame/styles/frame.css +183 -0
  182. package/src/gallery-web/frame/styles/html-source.css +23 -0
  183. package/src/gallery-web/frame/view-box.ts +33 -0
  184. package/src/gallery-web/frame-html.ts +72 -0
  185. package/src/gallery-web/index.html +104 -0
  186. package/src/gallery-web/session.ts +107 -0
  187. package/src/gallery-web/sse-client.ts +212 -0
  188. package/src/gallery-web/styles/app.css +420 -0
  189. package/src/gallery-web/styles/tokens.css +112 -0
  190. package/src/gallery-web/styles/verdict.css +186 -0
  191. package/src/gallery-web/swap.ts +64 -0
  192. package/src/gallery-web/theme.ts +40 -0
  193. package/src/gallery-web/view-state.ts +93 -0
  194. package/src/harness-adapters/claude-code/README.md +10 -0
  195. package/src/harness-adapters/claude-code/facet.sh +4 -0
  196. package/src/harness-adapters/codex/README.md +10 -0
  197. package/src/harness-adapters/codex/facet.sh +4 -0
  198. package/src/harness-adapters/mcp/README.md +13 -0
  199. package/src/harness-adapters/mcp/cli-bridge.ts +216 -0
  200. package/src/harness-adapters/mcp/main.ts +15 -0
  201. package/src/harness-adapters/mcp/server.ts +164 -0
  202. package/src/harness-adapters/mcp/tool-schemas.ts +53 -0
  203. package/src/harness-adapters/opencode/README.md +10 -0
  204. package/src/harness-adapters/opencode/facet.sh +4 -0
  205. package/src/runtime/compiled-entrypoints.ts +69 -0
  206. package/src/service/dispatcher.ts +717 -0
  207. package/src/service/export.ts +218 -0
  208. package/src/service/http-utils.ts +55 -0
  209. package/src/service/lexical/expectations.ts +210 -0
  210. package/src/service/lifecycle/idle-controller.ts +125 -0
  211. package/src/service/lifecycle/orphan-cleanup.ts +128 -0
  212. package/src/service/lifecycle/process-lock.ts +235 -0
  213. package/src/service/main.ts +136 -0
  214. package/src/service/process.ts +240 -0
  215. package/src/service/router-guards.ts +239 -0
  216. package/src/service/router.ts +627 -0
  217. package/src/service/security/auth.ts +168 -0
  218. package/src/service/security/host-origin.ts +138 -0
  219. package/src/service/security/http-guards.ts +13 -0
  220. package/src/service/security/leases.ts +182 -0
  221. package/src/service/security/token-store.ts +138 -0
  222. package/src/service/server.ts +356 -0
  223. package/src/service/store/database.ts +61 -0
  224. package/src/service/store/evidence-retention.ts +234 -0
  225. package/src/service/store/migrations.ts +167 -0
  226. package/src/service/store/repository-lifecycle.ts +121 -0
  227. package/src/service/store/repository.ts +732 -0
  228. package/src/service/store/schema.ts +218 -0
  229. package/src/service/stored-verdict.ts +97 -0
  230. package/src/service/stream.ts +301 -0
  231. package/src/service/verdict-enrichment.ts +45 -0
  232. package/src/shared/build/frame-bundle-plugins.ts +61 -0
  233. package/src/shared/build-mode.ts +28 -0
  234. package/src/shared/config/evidence-read.ts +98 -0
  235. package/src/shared/config/limits.ts +56 -0
  236. package/src/shared/config/paths.ts +96 -0
  237. package/src/shared/contracts/artifact-types.ts +2 -0
  238. package/src/shared/contracts/artifact.ts +98 -0
  239. package/src/shared/contracts/commands/_shared.ts +59 -0
  240. package/src/shared/contracts/commands/guards.ts +86 -0
  241. package/src/shared/contracts/commands/index.ts +204 -0
  242. package/src/shared/contracts/commands/names.ts +35 -0
  243. package/src/shared/contracts/commands/requests.ts +149 -0
  244. package/src/shared/contracts/commands/results.ts +200 -0
  245. package/src/shared/contracts/envelope.ts +140 -0
  246. package/src/shared/contracts/events.ts +41 -0
  247. package/src/shared/contracts/observed-counts.ts +19 -0
  248. package/src/shared/contracts/renderers.ts +6 -0
  249. package/src/shared/contracts/validation.ts +296 -0
  250. package/src/shared/errors/facet-error.ts +127 -0
  251. package/src/shared/errors/store-error.ts +68 -0
  252. package/src/shared/evidence-image.ts +37 -0
  253. package/src/shared/export.ts +31 -0
  254. package/src/shared/html/policy.ts +108 -0
  255. package/src/shared/html/style-vocabulary.ts +352 -0
  256. package/src/shared/logging/logger.ts +108 -0
  257. package/src/shared/logging/redact.ts +49 -0
  258. package/src/shared/security/frozen-csp.ts +13 -0
  259. package/src/shared/storage-version.ts +2 -0
  260. package/src/shared/tsx/execution.ts +29 -0
  261. package/src/shared/tsx/import-policy.ts +94 -0
  262. package/src/shared/util/dir-permissions.ts +94 -0
  263. package/src/shared/util/mermaid-nodes.ts +230 -0
  264. package/src/shared/util/process.ts +67 -0
  265. package/src/shared/util/time.ts +21 -0
  266. package/src/shared/version.ts +3 -0
  267. package/src/validation/sandbox/limits.ts +41 -0
  268. package/src/validation/sandbox/netns.ts +177 -0
  269. package/src/validation/tier0/chart.ts +177 -0
  270. package/src/validation/tier0/dom-shim.ts +54 -0
  271. package/src/validation/tier0/html.ts +408 -0
  272. package/src/validation/tier0/markdown.ts +285 -0
  273. package/src/validation/tier0/mermaid.ts +98 -0
  274. package/src/validation/tier0/runner.ts +504 -0
  275. package/src/validation/tier0/svg.ts +321 -0
  276. package/src/validation/tier0/tsx/allowlist-resolver.ts +77 -0
  277. package/src/validation/tier0/tsx/ast-policy-capabilities.ts +238 -0
  278. package/src/validation/tier0/tsx/ast-policy-shared.ts +71 -0
  279. package/src/validation/tier0/tsx/ast-policy.ts +181 -0
  280. package/src/validation/tier0/tsx/compiler.ts +156 -0
  281. package/src/validation/tier0/worker-dispatch.ts +211 -0
  282. package/src/validation/tier0/worker-entry.ts +96 -0
  283. package/src/validation/tier0/worker-input.ts +75 -0
  284. package/src/validation/tier1/browser-process.ts +147 -0
  285. package/src/validation/tier1/cdp-pipe.ts +281 -0
  286. package/src/validation/tier1/entries/chart.ts +5 -0
  287. package/src/validation/tier1/entries/html.ts +6 -0
  288. package/src/validation/tier1/entries/markdown.ts +5 -0
  289. package/src/validation/tier1/entries/mermaid.ts +5 -0
  290. package/src/validation/tier1/entries/svg.ts +5 -0
  291. package/src/validation/tier1/entries/tsx.ts +5 -0
  292. package/src/validation/tier1/frame-target.ts +162 -0
  293. package/src/validation/tier1/harness-entry.ts +261 -0
  294. package/src/validation/tier1/harness.ts +215 -0
  295. package/src/validation/tier1/isolated-probe.ts +94 -0
  296. package/src/validation/tier1/launcher.ts +177 -0
  297. package/src/validation/tier1/limits.ts +80 -0
  298. package/src/validation/tier1/nonce.ts +17 -0
  299. package/src/validation/tier1/protocol-probe.ts +519 -0
  300. package/src/validation/tier1/runner.ts +1122 -0
  301. package/src/validation/tier1/verdict.ts +246 -0
  302. package/src/validation/tier1/webp.ts +69 -0
  303. package/templates/README.md +88 -0
  304. package/templates/bar-compare.vl.json +63 -0
  305. package/templates/capacity-report.tsx +102 -0
  306. package/templates/decision-record.md +24 -0
  307. package/templates/deployment-state.mmd +40 -0
  308. package/templates/exemplar.md +91 -0
  309. package/templates/facet-story.tsx +799 -0
  310. package/templates/fleet-dashboard.html +141 -0
  311. package/templates/html-release-ledger.html +91 -0
  312. package/templates/html-status-report.html +114 -0
  313. package/templates/incident-console.tsx +147 -0
  314. package/templates/legion-boundaries.mmd +23 -0
  315. package/templates/legion-flow.mmd +15 -0
  316. package/templates/legion-sequence.mmd +14 -0
  317. package/templates/legion-state.mmd +7 -0
  318. package/templates/metric-card.svg +29 -0
  319. package/templates/observability-map.svg +101 -0
  320. package/templates/pipeline-audit.md +108 -0
  321. package/templates/release-metrics.vl.json +98 -0
  322. package/templates/service-topology.mmd +47 -0
  323. package/templates/status-report.md +32 -0
  324. package/templates/system-map.svg +53 -0
  325. package/templates/timeseries.vl.json +71 -0
  326. package/templates/tsx-interactive-counter.tsx +19 -0
  327. package/templates/tsx-status-report.tsx +31 -0
@@ -0,0 +1,36 @@
1
+ import {
2
+ AbstractMermaidTokenBuilder,
3
+ CommonValueConverter,
4
+ CynefinGrammarGeneratedModule,
5
+ EmptyFileSystem,
6
+ MermaidGeneratedSharedModule,
7
+ __name,
8
+ createDefaultCoreModule,
9
+ createDefaultSharedCoreModule,
10
+ inject
11
+ } from "./markdown-dz3z5w30.js";
12
+
13
+ // node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-OSBZ3O6U.mjs
14
+ var CynefinTokenBuilder = class extends AbstractMermaidTokenBuilder {
15
+ static {
16
+ __name(this, "CynefinTokenBuilder");
17
+ }
18
+ constructor() {
19
+ super(["cynefin-beta"]);
20
+ }
21
+ };
22
+ var CynefinModule = {
23
+ parser: {
24
+ TokenBuilder: /* @__PURE__ */ __name(() => new CynefinTokenBuilder, "TokenBuilder"),
25
+ ValueConverter: /* @__PURE__ */ __name(() => new CommonValueConverter, "ValueConverter")
26
+ }
27
+ };
28
+ function createCynefinServices(context = EmptyFileSystem) {
29
+ const shared = inject(createDefaultSharedCoreModule(context), MermaidGeneratedSharedModule);
30
+ const Cynefin = inject(createDefaultCoreModule({ shared }), CynefinGrammarGeneratedModule, CynefinModule);
31
+ shared.ServiceRegistry.register(Cynefin);
32
+ return { shared, Cynefin };
33
+ }
34
+ __name(createCynefinServices, "createCynefinServices");
35
+
36
+ export { CynefinModule, createCynefinServices };
@@ -0,0 +1,19 @@
1
+ import {
2
+ __name
3
+ } from "./markdown-1s5vwkf2.js";
4
+
5
+ // node_modules/mermaid/dist/chunks/mermaid.core/chunk-JWPE2WC7.mjs
6
+ function populateCommonDb(ast, db) {
7
+ if (ast.accDescr) {
8
+ db.setAccDescription?.(ast.accDescr);
9
+ }
10
+ if (ast.accTitle) {
11
+ db.setAccTitle?.(ast.accTitle);
12
+ }
13
+ if (ast.title) {
14
+ db.setDiagramTitle?.(ast.title);
15
+ }
16
+ }
17
+ __name(populateCommonDb, "populateCommonDb");
18
+
19
+ export { populateCommonDb };
@@ -0,0 +1,100 @@
1
+ import {
2
+ getConfig2
3
+ } from "./markdown-92n37gd4.js";
4
+ import {
5
+ __name
6
+ } from "./markdown-1s5vwkf2.js";
7
+
8
+ // node_modules/mermaid/dist/chunks/mermaid.core/chunk-W5SLKNZC.mjs
9
+ var solidStateFill = /* @__PURE__ */ __name((color) => {
10
+ const { handDrawnSeed } = getConfig2();
11
+ return {
12
+ fill: color,
13
+ hachureAngle: 120,
14
+ hachureGap: 4,
15
+ fillWeight: 2,
16
+ roughness: 0.7,
17
+ stroke: color,
18
+ seed: handDrawnSeed
19
+ };
20
+ }, "solidStateFill");
21
+ var compileStyles = /* @__PURE__ */ __name((node) => {
22
+ const stylesMap = styles2Map([
23
+ ...node.cssCompiledStyles || [],
24
+ ...node.cssStyles || [],
25
+ ...node.labelStyle || []
26
+ ]);
27
+ return { stylesMap, stylesArray: [...stylesMap] };
28
+ }, "compileStyles");
29
+ var styles2Map = /* @__PURE__ */ __name((styles) => {
30
+ const styleMap = /* @__PURE__ */ new Map;
31
+ styles.forEach((style) => {
32
+ const [key, value] = style.split(":");
33
+ styleMap.set(key.trim(), value?.trim());
34
+ });
35
+ return styleMap;
36
+ }, "styles2Map");
37
+ var isLabelStyle = /* @__PURE__ */ __name((key) => {
38
+ return key === "color" || key === "font-size" || key === "font-family" || key === "font-weight" || key === "font-style" || key === "text-decoration" || key === "text-align" || key === "text-transform" || key === "line-height" || key === "letter-spacing" || key === "word-spacing" || key === "text-shadow" || key === "text-overflow" || key === "white-space" || key === "word-wrap" || key === "word-break" || key === "overflow-wrap" || key === "hyphens";
39
+ }, "isLabelStyle");
40
+ var styles2String = /* @__PURE__ */ __name((node) => {
41
+ const { stylesArray } = compileStyles(node);
42
+ const labelStyles = [];
43
+ const nodeStyles = [];
44
+ const borderStyles = [];
45
+ const backgroundStyles = [];
46
+ stylesArray.forEach((style) => {
47
+ const key = style[0];
48
+ if (isLabelStyle(key)) {
49
+ labelStyles.push(style.join(":") + " !important");
50
+ } else {
51
+ nodeStyles.push(style.join(":") + " !important");
52
+ if (key.includes("stroke")) {
53
+ borderStyles.push(style.join(":") + " !important");
54
+ }
55
+ if (key === "fill") {
56
+ backgroundStyles.push(style.join(":") + " !important");
57
+ }
58
+ }
59
+ });
60
+ return {
61
+ labelStyles: labelStyles.join(";"),
62
+ nodeStyles: nodeStyles.join(";"),
63
+ stylesArray,
64
+ borderStyles,
65
+ backgroundStyles
66
+ };
67
+ }, "styles2String");
68
+ var userNodeOverrides = /* @__PURE__ */ __name((node, options) => {
69
+ const { themeVariables, handDrawnSeed } = getConfig2();
70
+ const { nodeBorder, mainBkg } = themeVariables;
71
+ const { stylesMap } = compileStyles(node);
72
+ const result = Object.assign({
73
+ roughness: 0.7,
74
+ fill: stylesMap.get("fill") || mainBkg,
75
+ fillStyle: "hachure",
76
+ fillWeight: 4,
77
+ hachureGap: 5.2,
78
+ stroke: stylesMap.get("stroke") || nodeBorder,
79
+ seed: handDrawnSeed,
80
+ strokeWidth: stylesMap.get("stroke-width")?.replace("px", "") || 1.3,
81
+ fillLineDash: [0, 0],
82
+ strokeLineDash: getStrokeDashArray(stylesMap.get("stroke-dasharray"))
83
+ }, options);
84
+ return result;
85
+ }, "userNodeOverrides");
86
+ var getStrokeDashArray = /* @__PURE__ */ __name((strokeDasharrayStyle) => {
87
+ if (!strokeDasharrayStyle) {
88
+ return [0, 0];
89
+ }
90
+ const dashArray = strokeDasharrayStyle.trim().split(/\s+/).map(Number);
91
+ if (dashArray.length === 1) {
92
+ const val = isNaN(dashArray[0]) ? 0 : dashArray[0];
93
+ return [val, val];
94
+ }
95
+ const first = isNaN(dashArray[0]) ? 0 : dashArray[0];
96
+ const second = isNaN(dashArray[1]) ? 0 : dashArray[1];
97
+ return [first, second];
98
+ }, "getStrokeDashArray");
99
+
100
+ export { solidStateFill, compileStyles, isLabelStyle, styles2String, userNodeOverrides };
@@ -0,0 +1,125 @@
1
+ import {
2
+ __name
3
+ } from "./markdown-dz3z5w30.js";
4
+ import {
5
+ __require
6
+ } from "./markdown-809k7q41.js";
7
+
8
+ // node_modules/@mermaid-js/parser/dist/mermaid-parser.core.mjs
9
+ var parsers = {};
10
+ var initializers = {
11
+ info: /* @__PURE__ */ __name(async () => {
12
+ const { createInfoServices: createInfoServices2 } = await import("./info-DKCQHKI2-mpt80jd3.js");
13
+ const parser = createInfoServices2().Info.parser.LangiumParser;
14
+ parsers.info = parser;
15
+ }, "info"),
16
+ packet: /* @__PURE__ */ __name(async () => {
17
+ const { createPacketServices: createPacketServices2 } = await import("./packet-7NZHBO7P-xppm5913.js");
18
+ const parser = createPacketServices2().Packet.parser.LangiumParser;
19
+ parsers.packet = parser;
20
+ }, "packet"),
21
+ pie: /* @__PURE__ */ __name(async () => {
22
+ const { createPieServices: createPieServices2 } = await import("./pie-RZYD4A2V-hnbxk152.js");
23
+ const parser = createPieServices2().Pie.parser.LangiumParser;
24
+ parsers.pie = parser;
25
+ }, "pie"),
26
+ treeView: /* @__PURE__ */ __name(async () => {
27
+ const { createTreeViewServices: createTreeViewServices2 } = await import("./treeView-QDETBFTQ-hcx7n0vt.js");
28
+ const parser = createTreeViewServices2().TreeView.parser.LangiumParser;
29
+ parsers.treeView = parser;
30
+ }, "treeView"),
31
+ architecture: /* @__PURE__ */ __name(async () => {
32
+ const { createArchitectureServices: createArchitectureServices2 } = await import("./architecture-TIHT7OUA-cvdjn7dt.js");
33
+ const parser = createArchitectureServices2().Architecture.parser.LangiumParser;
34
+ parsers.architecture = parser;
35
+ }, "architecture"),
36
+ gitGraph: /* @__PURE__ */ __name(async () => {
37
+ const { createGitGraphServices: createGitGraphServices2 } = await import("./gitGraph-TEB2WS4Q-j6kw0naa.js");
38
+ const parser = createGitGraphServices2().GitGraph.parser.LangiumParser;
39
+ parsers.gitGraph = parser;
40
+ }, "gitGraph"),
41
+ eventmodeling: /* @__PURE__ */ __name(async () => {
42
+ const { createEventModelingServices: createEventModelingServices2 } = await import("./eventmodeling-45OFAUF4-sg07qr0c.js");
43
+ const parser = createEventModelingServices2().EventModel.parser.LangiumParser;
44
+ parsers.eventmodeling = parser;
45
+ }, "eventmodeling"),
46
+ radar: /* @__PURE__ */ __name(async () => {
47
+ const { createRadarServices: createRadarServices2 } = await import("./radar-I7S5WNFK-ewqd27se.js");
48
+ const parser = createRadarServices2().Radar.parser.LangiumParser;
49
+ parsers.radar = parser;
50
+ }, "radar"),
51
+ railroad: /* @__PURE__ */ __name(async () => {
52
+ const { createRailroadServices: createRailroadServices2 } = await import("./railroad-3IZDKUUU-5hy4bdx3.js");
53
+ const parser = createRailroadServices2().Railroad.parser.LangiumParser;
54
+ parsers.railroad = parser;
55
+ }, "railroad"),
56
+ railroadEbnf: /* @__PURE__ */ __name(async () => {
57
+ const { createRailroadEbnfServices: createRailroadEbnfServices2 } = await import("./railroad-ebnf-EBAXGLYW-6b9c3zeh.js");
58
+ const parser = createRailroadEbnfServices2().RailroadEbnf.parser.LangiumParser;
59
+ parsers.railroadEbnf = parser;
60
+ }, "railroadEbnf"),
61
+ railroadAbnf: /* @__PURE__ */ __name(async () => {
62
+ const { createRailroadAbnfServices: createRailroadAbnfServices2 } = await import("./railroad-abnf-AHOZXSZD-bh5sxz0d.js");
63
+ const parser = createRailroadAbnfServices2().RailroadAbnf.parser.LangiumParser;
64
+ parsers.railroadAbnf = parser;
65
+ }, "railroadAbnf"),
66
+ railroadPeg: /* @__PURE__ */ __name(async () => {
67
+ const { createRailroadPegServices: createRailroadPegServices2 } = await import("./railroad-peg-LSFZ7HO6-avc8v39s.js");
68
+ const parser = createRailroadPegServices2().RailroadPeg.parser.LangiumParser;
69
+ parsers.railroadPeg = parser;
70
+ }, "railroadPeg"),
71
+ treemap: /* @__PURE__ */ __name(async () => {
72
+ const { createTreemapServices: createTreemapServices2 } = await import("./treemap-6X3UGDF4-av02skdw.js");
73
+ const parser = createTreemapServices2().Treemap.parser.LangiumParser;
74
+ parsers.treemap = parser;
75
+ }, "treemap"),
76
+ wardley: /* @__PURE__ */ __name(async () => {
77
+ const { createWardleyServices: createWardleyServices2 } = await import("./wardley-OPB4EBWU-njsp6e40.js");
78
+ const parser = createWardleyServices2().Wardley.parser.LangiumParser;
79
+ parsers.wardley = parser;
80
+ }, "wardley"),
81
+ cynefin: /* @__PURE__ */ __name(async () => {
82
+ const { createCynefinServices: createCynefinServices2 } = await import("./cynefin-VYW2F7L2-tqjv913d.js");
83
+ const parser = createCynefinServices2().Cynefin.parser.LangiumParser;
84
+ parsers.cynefin = parser;
85
+ }, "cynefin")
86
+ };
87
+ async function parse(diagramType, text) {
88
+ const initializer = initializers[diagramType];
89
+ if (!initializer) {
90
+ throw new Error(`Unknown diagram type: ${diagramType}`);
91
+ }
92
+ if (!parsers[diagramType]) {
93
+ await initializer();
94
+ }
95
+ const parser = parsers[diagramType];
96
+ const result = parser.parse(text);
97
+ if (result.lexerErrors.length > 0 || result.parserErrors.length > 0) {
98
+ throw new MermaidParseError(result);
99
+ }
100
+ return result.value;
101
+ }
102
+ __name(parse, "parse");
103
+ var MermaidParseError = class extends Error {
104
+ constructor(result) {
105
+ const lexerErrors = result.lexerErrors.map((err) => {
106
+ const line = err.line !== undefined && !isNaN(err.line) ? err.line : "?";
107
+ const column = err.column !== undefined && !isNaN(err.column) ? err.column : "?";
108
+ return `Lexer error on line ${line}, column ${column}: ${err.message}`;
109
+ }).join(`
110
+ `);
111
+ const parserErrors = result.parserErrors.map((err) => {
112
+ const line = err.token.startLine !== undefined && !isNaN(err.token.startLine) ? err.token.startLine : "?";
113
+ const column = err.token.startColumn !== undefined && !isNaN(err.token.startColumn) ? err.token.startColumn : "?";
114
+ return `Parse error on line ${line}, column ${column}: ${err.message}`;
115
+ }).join(`
116
+ `);
117
+ super(`Parsing failed: ${lexerErrors} ${parserErrors}`);
118
+ this.result = result;
119
+ }
120
+ static {
121
+ __name(this, "MermaidParseError");
122
+ }
123
+ };
124
+
125
+ export { parse, MermaidParseError };
@@ -0,0 +1,243 @@
1
+ // src/shared/contracts/renderers.ts
2
+ var RENDERERS = ["svg", "canvas"];
3
+ function isRenderer(value) {
4
+ return typeof value === "string" && RENDERERS.includes(value);
5
+ }
6
+
7
+ // src/shared/html/policy.ts
8
+ var HTML_DENIED_ELEMENTS = [
9
+ "script",
10
+ "iframe",
11
+ "object",
12
+ "embed",
13
+ "form",
14
+ "link",
15
+ "meta",
16
+ "base",
17
+ "style"
18
+ ];
19
+ var HTML_STRUCTURAL_GROUPS = {
20
+ headings: ["h1", "h2", "h3", "h4", "h5", "h6"],
21
+ tables: ["table"],
22
+ lists: ["ul", "ol"],
23
+ images: ["img"],
24
+ canvases: ["canvas"]
25
+ };
26
+ var HTML_URL_BEARING_ATTRIBUTES = {
27
+ img: ["src", "srcset"],
28
+ source: ["srcset"],
29
+ a: ["href"]
30
+ };
31
+ var HTML_ALLOWED_ANCHOR_SCHEMES = ["https:", "mailto:"];
32
+ var HTML_ALLOWED_IMAGE_SCHEMES = ["data:", "https:"];
33
+ function htmlUrlBearingElement(name) {
34
+ const normalized = name.toLowerCase();
35
+ return normalized in HTML_URL_BEARING_ATTRIBUTES ? normalized : null;
36
+ }
37
+ function isHtmlDeniedElement(name) {
38
+ return HTML_DENIED_ELEMENTS.includes(name.toLowerCase());
39
+ }
40
+ function isHtmlUrlBearingAttribute(elementName, attributeName) {
41
+ const element = htmlUrlBearingElement(elementName);
42
+ return element !== null && HTML_URL_BEARING_ATTRIBUTES[element].includes(attributeName.toLowerCase());
43
+ }
44
+ function isHtmlUrlAttributeName(attributeName) {
45
+ const normalized = attributeName.toLowerCase();
46
+ return Object.values(HTML_URL_BEARING_ATTRIBUTES).some((attributes) => attributes.includes(normalized));
47
+ }
48
+ function isHtmlEventHandlerAttribute(name) {
49
+ return name.toLowerCase().startsWith("on");
50
+ }
51
+ function isHtmlInlineStyleAttribute(name) {
52
+ return name.toLowerCase() === "style";
53
+ }
54
+ function isAllowedHtmlUrl(elementName, attributeName, value) {
55
+ const element = htmlUrlBearingElement(elementName);
56
+ if (element === null || !isHtmlUrlBearingAttribute(element, attributeName))
57
+ return false;
58
+ const trimmed = value.trim();
59
+ if (trimmed.startsWith("//"))
60
+ return false;
61
+ let url;
62
+ try {
63
+ url = new URL(trimmed, "https://facet.invalid/");
64
+ } catch {
65
+ return false;
66
+ }
67
+ const scheme = url.protocol.toLowerCase();
68
+ switch (element) {
69
+ case "img":
70
+ case "source":
71
+ if (scheme === "data:")
72
+ return isImageDataUrl(url);
73
+ return HTML_ALLOWED_IMAGE_SCHEMES.includes(scheme);
74
+ case "a":
75
+ return HTML_ALLOWED_ANCHOR_SCHEMES.includes(scheme);
76
+ default: {
77
+ const _ = element;
78
+ return _;
79
+ }
80
+ }
81
+ }
82
+ function isImageDataUrl(url) {
83
+ const comma = url.pathname.indexOf(",");
84
+ if (comma < 0)
85
+ return false;
86
+ const metadata = url.pathname.slice(0, comma);
87
+ const separator = metadata.indexOf(";");
88
+ const encodedMediaType = (separator < 0 ? metadata : metadata.slice(0, separator)).trim();
89
+ let mediaType;
90
+ try {
91
+ mediaType = decodeURIComponent(encodedMediaType).toLowerCase();
92
+ } catch {
93
+ return false;
94
+ }
95
+ const parts = mediaType.split("/");
96
+ return parts.length === 2 && parts[0] === "image" && parts[1].length > 0;
97
+ }
98
+
99
+ // src/shared/tsx/execution.ts
100
+ var TSX_EXECUTION_MODES = ["static", "interactive"];
101
+ function isTsxExecutionMode(value) {
102
+ return typeof value === "string" && TSX_EXECUTION_MODES.includes(value);
103
+ }
104
+
105
+ // src/gallery-web/frame/renderers/registry.ts
106
+ class FacetRenderError extends Error {
107
+ code;
108
+ constructor(message, code) {
109
+ super(message);
110
+ this.code = code;
111
+ this.name = "FacetRenderError";
112
+ }
113
+ }
114
+ function decodeArtifactBytes(bytes) {
115
+ return new TextDecoder("utf-8", { fatal: false }).decode(bytes);
116
+ }
117
+ var RENDER_ERROR_ATTRIBUTE = "data-facet-error";
118
+ var RENDER_ERROR_ELEMENT = "facet-error";
119
+ function renderErrorMessage(value) {
120
+ if (value instanceof Error)
121
+ return value.message;
122
+ if (typeof value === "string")
123
+ return value;
124
+ if (typeof value === "object" && value !== null) {
125
+ const event = value;
126
+ for (const candidate of [event.reason, event.error, event.message]) {
127
+ if (candidate instanceof Error)
128
+ return candidate.message;
129
+ if (typeof candidate === "string")
130
+ return candidate;
131
+ if (typeof candidate === "object" && candidate !== null && "message" in candidate && typeof candidate.message === "string") {
132
+ return candidate.message;
133
+ }
134
+ }
135
+ }
136
+ return "interactive TSX runtime error";
137
+ }
138
+ function appendRenderError(container, value) {
139
+ const el = container.ownerDocument.createElement(RENDER_ERROR_ELEMENT);
140
+ el.setAttribute(RENDER_ERROR_ATTRIBUTE, "true");
141
+ el.textContent = renderErrorMessage(value);
142
+ container.appendChild(el);
143
+ }
144
+ var RENDERER_ROOT_SELECTOR = 'svg[data-facet-renderer-root="true"]';
145
+ var MARKED_ROOT_SELECTOR = '[data-facet-renderer-root="true"]';
146
+ var RENDERER_GRAPH_ATTRIBUTE = "data-facet-renderer-graph";
147
+ function safeSelectorElementsWithin(scope, selector) {
148
+ try {
149
+ return Array.from(scope.querySelectorAll(selector));
150
+ } catch {
151
+ return [];
152
+ }
153
+ }
154
+ function safeSelectorElements(selector) {
155
+ return safeSelectorElementsWithin(document, selector);
156
+ }
157
+ function hasMarkedRootAncestor(root, roots) {
158
+ let parent = root.parentElement;
159
+ while (parent !== null) {
160
+ if (roots.has(parent))
161
+ return true;
162
+ parent = parent.parentElement;
163
+ }
164
+ return false;
165
+ }
166
+ function nonDegenerateViewBox(svg) {
167
+ const parts = (svg.getAttribute("viewBox") ?? "").trim().split(/[\s,]+/).map((part) => Number.parseFloat(part));
168
+ if (parts.length !== 4)
169
+ return false;
170
+ const [, , width, height] = parts;
171
+ return Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0;
172
+ }
173
+ function countPageShim() {
174
+ const markedCandidates = safeSelectorElements(RENDERER_ROOT_SELECTOR);
175
+ const candidateSet = new Set(markedCandidates);
176
+ const roots = markedCandidates.filter((root) => !hasMarkedRootAncestor(root, candidateSet));
177
+ const graphRoots = roots.filter((root) => root.getAttribute(RENDERER_GRAPH_ATTRIBUTE) === "true");
178
+ const allMarkedCandidates = safeSelectorElements(MARKED_ROOT_SELECTOR);
179
+ const markedSet = new Set(allMarkedCandidates);
180
+ const htmlRoots = allMarkedCandidates.filter((root) => root.nodeName.toLowerCase() !== "svg" && !hasMarkedRootAncestor(root, markedSet));
181
+ const html = htmlRoots.length === 0 ? undefined : {
182
+ rendererRootCount: htmlRoots.length,
183
+ headingCount: 0,
184
+ tableCount: 0,
185
+ listCount: 0,
186
+ imageCount: 0,
187
+ canvasCount: 0,
188
+ externalImageCount: 0
189
+ };
190
+ for (const root of htmlRoots) {
191
+ html.headingCount += safeSelectorElementsWithin(root, HTML_STRUCTURAL_GROUPS.headings.join(",")).length;
192
+ html.tableCount += safeSelectorElementsWithin(root, HTML_STRUCTURAL_GROUPS.tables.join(",")).length;
193
+ html.listCount += safeSelectorElementsWithin(root, HTML_STRUCTURAL_GROUPS.lists.join(",")).length;
194
+ const images = safeSelectorElementsWithin(root, HTML_STRUCTURAL_GROUPS.images.join(","));
195
+ html.imageCount += images.length;
196
+ html.externalImageCount += images.filter((image) => {
197
+ try {
198
+ return new URL(image.getAttribute("src") ?? "").protocol === "https:";
199
+ } catch {
200
+ return false;
201
+ }
202
+ }).length;
203
+ html.canvasCount += safeSelectorElementsWithin(root, HTML_STRUCTURAL_GROUPS.canvases.join(",")).length;
204
+ }
205
+ const mermaidNodeCount = graphRoots.reduce((count, root) => count + safeSelectorElementsWithin(root, "g.node").length, 0);
206
+ const opaqueRegionCount = safeSelectorElements("*").filter((element) => element.nodeName.toLowerCase() === "canvas").length;
207
+ return {
208
+ rendererRootSvgCount: roots.length,
209
+ graphCount: graphRoots.length,
210
+ mermaidNodeCount,
211
+ visibleSvgCount: roots.filter(nonDegenerateViewBox).length,
212
+ opaqueRegionCount,
213
+ externalImageCount: html?.externalImageCount ?? 0,
214
+ errorCount: safeSelectorElements("[data-facet-error]").length,
215
+ ...html === undefined ? {} : { html }
216
+ };
217
+ }
218
+ function createRendererRegistry(entries) {
219
+ const registry = new Map(entries);
220
+ return {
221
+ get(type) {
222
+ return registry.get(type);
223
+ }
224
+ };
225
+ }
226
+ async function dispatchRender(registry, ctx, payload) {
227
+ if (!isRenderer(payload.renderer)) {
228
+ throw new FacetRenderError(`Artifact renderer '${payload.renderer}' is not supported in this frame`, "invalid_request");
229
+ }
230
+ const renderer = registry.get(payload.artifactType);
231
+ if (renderer === undefined) {
232
+ throw new FacetRenderError(`Artifact type '${payload.artifactType}' has no renderer in this frame`, "unsupported_reserved_type");
233
+ }
234
+ if (payload.artifactType === "tsx" && !isTsxExecutionMode(payload.execution)) {
235
+ throw new FacetRenderError("TSX artifact payload is missing execution", "invalid_request");
236
+ }
237
+ if (payload.artifactType !== "tsx" && payload.execution === "interactive") {
238
+ throw new FacetRenderError("Interactive execution is only supported for TSX artifacts", "invalid_request");
239
+ }
240
+ await renderer(ctx, payload.bytes, payload.renderer, payload.execution);
241
+ }
242
+
243
+ export { isTsxExecutionMode, isRenderer, isHtmlDeniedElement, isHtmlUrlBearingAttribute, isHtmlUrlAttributeName, isHtmlEventHandlerAttribute, isHtmlInlineStyleAttribute, isAllowedHtmlUrl, FacetRenderError, decodeArtifactBytes, RENDER_ERROR_ATTRIBUTE, appendRenderError, countPageShim, createRendererRegistry, dispatchRender };