docviz-builder 0.1.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 (233) hide show
  1. package/AGENTS.md +371 -0
  2. package/LICENSE +21 -0
  3. package/README.md +837 -0
  4. package/bin/docviz-mcp.mjs +10 -0
  5. package/bin/docviz.mjs +11 -0
  6. package/dist/build/builder.d.ts +62 -0
  7. package/dist/build/builder.d.ts.map +1 -0
  8. package/dist/build/builder.js +337 -0
  9. package/dist/build/builder.js.map +1 -0
  10. package/dist/build/diff.d.ts +64 -0
  11. package/dist/build/diff.d.ts.map +1 -0
  12. package/dist/build/diff.js +156 -0
  13. package/dist/build/diff.js.map +1 -0
  14. package/dist/build/doctor.d.ts +39 -0
  15. package/dist/build/doctor.d.ts.map +1 -0
  16. package/dist/build/doctor.js +190 -0
  17. package/dist/build/doctor.js.map +1 -0
  18. package/dist/build/init.d.ts +28 -0
  19. package/dist/build/init.d.ts.map +1 -0
  20. package/dist/build/init.js +274 -0
  21. package/dist/build/init.js.map +1 -0
  22. package/dist/build/preview.d.ts +13 -0
  23. package/dist/build/preview.d.ts.map +1 -0
  24. package/dist/build/preview.js +277 -0
  25. package/dist/build/preview.js.map +1 -0
  26. package/dist/build/skill.d.ts +41 -0
  27. package/dist/build/skill.d.ts.map +1 -0
  28. package/dist/build/skill.js +63 -0
  29. package/dist/build/skill.js.map +1 -0
  30. package/dist/build/verify.d.ts +26 -0
  31. package/dist/build/verify.d.ts.map +1 -0
  32. package/dist/build/verify.js +99 -0
  33. package/dist/build/verify.js.map +1 -0
  34. package/dist/cli.d.ts +20 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +427 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/config/load.d.ts +32 -0
  39. package/dist/config/load.d.ts.map +1 -0
  40. package/dist/config/load.js +279 -0
  41. package/dist/config/load.js.map +1 -0
  42. package/dist/config/types.d.ts +89 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +5 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/core/cache.d.ts +32 -0
  47. package/dist/core/cache.d.ts.map +1 -0
  48. package/dist/core/cache.js +69 -0
  49. package/dist/core/cache.js.map +1 -0
  50. package/dist/core/errors.d.ts +115 -0
  51. package/dist/core/errors.d.ts.map +1 -0
  52. package/dist/core/errors.js +164 -0
  53. package/dist/core/errors.js.map +1 -0
  54. package/dist/core/hash.d.ts +57 -0
  55. package/dist/core/hash.d.ts.map +1 -0
  56. package/dist/core/hash.js +0 -0
  57. package/dist/core/hash.js.map +1 -0
  58. package/dist/core/package-version.d.ts +9 -0
  59. package/dist/core/package-version.d.ts.map +1 -0
  60. package/dist/core/package-version.js +44 -0
  61. package/dist/core/package-version.js.map +1 -0
  62. package/dist/core/paths.d.ts +46 -0
  63. package/dist/core/paths.d.ts.map +1 -0
  64. package/dist/core/paths.js +105 -0
  65. package/dist/core/paths.js.map +1 -0
  66. package/dist/core/registry.d.ts +24 -0
  67. package/dist/core/registry.d.ts.map +1 -0
  68. package/dist/core/registry.js +72 -0
  69. package/dist/core/registry.js.map +1 -0
  70. package/dist/core/types.d.ts +78 -0
  71. package/dist/core/types.d.ts.map +1 -0
  72. package/dist/core/types.js +11 -0
  73. package/dist/core/types.js.map +1 -0
  74. package/dist/dsl/architecture.d.ts +15 -0
  75. package/dist/dsl/architecture.d.ts.map +1 -0
  76. package/dist/dsl/architecture.js +242 -0
  77. package/dist/dsl/architecture.js.map +1 -0
  78. package/dist/dsl/catalog.d.ts +62 -0
  79. package/dist/dsl/catalog.d.ts.map +1 -0
  80. package/dist/dsl/catalog.en.d.ts +18 -0
  81. package/dist/dsl/catalog.en.d.ts.map +1 -0
  82. package/dist/dsl/catalog.en.js +299 -0
  83. package/dist/dsl/catalog.en.js.map +1 -0
  84. package/dist/dsl/catalog.js +1082 -0
  85. package/dist/dsl/catalog.js.map +1 -0
  86. package/dist/dsl/chart.d.ts +14 -0
  87. package/dist/dsl/chart.d.ts.map +1 -0
  88. package/dist/dsl/chart.js +435 -0
  89. package/dist/dsl/chart.js.map +1 -0
  90. package/dist/dsl/compile.d.ts +31 -0
  91. package/dist/dsl/compile.d.ts.map +1 -0
  92. package/dist/dsl/compile.js +120 -0
  93. package/dist/dsl/compile.js.map +1 -0
  94. package/dist/dsl/diagram-bpmn.d.ts +13 -0
  95. package/dist/dsl/diagram-bpmn.d.ts.map +1 -0
  96. package/dist/dsl/diagram-bpmn.js +215 -0
  97. package/dist/dsl/diagram-bpmn.js.map +1 -0
  98. package/dist/dsl/diagram-product.d.ts +15 -0
  99. package/dist/dsl/diagram-product.d.ts.map +1 -0
  100. package/dist/dsl/diagram-product.js +291 -0
  101. package/dist/dsl/diagram-product.js.map +1 -0
  102. package/dist/dsl/diagram-technical.d.ts +28 -0
  103. package/dist/dsl/diagram-technical.d.ts.map +1 -0
  104. package/dist/dsl/diagram-technical.js +365 -0
  105. package/dist/dsl/diagram-technical.js.map +1 -0
  106. package/dist/dsl/diagram.d.ts +22 -0
  107. package/dist/dsl/diagram.d.ts.map +1 -0
  108. package/dist/dsl/diagram.js +542 -0
  109. package/dist/dsl/diagram.js.map +1 -0
  110. package/dist/dsl/fallbacks-d2.d.ts +27 -0
  111. package/dist/dsl/fallbacks-d2.d.ts.map +1 -0
  112. package/dist/dsl/fallbacks-d2.js +265 -0
  113. package/dist/dsl/fallbacks-d2.js.map +1 -0
  114. package/dist/dsl/fallbacks.d.ts +25 -0
  115. package/dist/dsl/fallbacks.d.ts.map +1 -0
  116. package/dist/dsl/fallbacks.js +264 -0
  117. package/dist/dsl/fallbacks.js.map +1 -0
  118. package/dist/dsl/fields.d.ts +93 -0
  119. package/dist/dsl/fields.d.ts.map +1 -0
  120. package/dist/dsl/fields.js +233 -0
  121. package/dist/dsl/fields.js.map +1 -0
  122. package/dist/dsl/index.d.ts +50 -0
  123. package/dist/dsl/index.d.ts.map +1 -0
  124. package/dist/dsl/index.js +114 -0
  125. package/dist/dsl/index.js.map +1 -0
  126. package/dist/dsl/util.d.ts +105 -0
  127. package/dist/dsl/util.d.ts.map +1 -0
  128. package/dist/dsl/util.js +261 -0
  129. package/dist/dsl/util.js.map +1 -0
  130. package/dist/index.d.ts +27 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +21 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/markdown/scan.d.ts +73 -0
  135. package/dist/markdown/scan.d.ts.map +1 -0
  136. package/dist/markdown/scan.js +150 -0
  137. package/dist/markdown/scan.js.map +1 -0
  138. package/dist/markdown/transform.d.ts +28 -0
  139. package/dist/markdown/transform.d.ts.map +1 -0
  140. package/dist/markdown/transform.js +38 -0
  141. package/dist/markdown/transform.js.map +1 -0
  142. package/dist/mcp/server.d.ts +18 -0
  143. package/dist/mcp/server.d.ts.map +1 -0
  144. package/dist/mcp/server.js +118 -0
  145. package/dist/mcp/server.js.map +1 -0
  146. package/dist/mcp/tools.d.ts +118 -0
  147. package/dist/mcp/tools.d.ts.map +1 -0
  148. package/dist/mcp/tools.js +573 -0
  149. package/dist/mcp/tools.js.map +1 -0
  150. package/dist/renderers/base.d.ts +18 -0
  151. package/dist/renderers/base.d.ts.map +1 -0
  152. package/dist/renderers/base.js +59 -0
  153. package/dist/renderers/base.js.map +1 -0
  154. package/dist/renderers/bpmn.d.ts +68 -0
  155. package/dist/renderers/bpmn.d.ts.map +1 -0
  156. package/dist/renderers/bpmn.js +158 -0
  157. package/dist/renderers/bpmn.js.map +1 -0
  158. package/dist/renderers/browser.d.ts +30 -0
  159. package/dist/renderers/browser.d.ts.map +1 -0
  160. package/dist/renderers/browser.js +143 -0
  161. package/dist/renderers/browser.js.map +1 -0
  162. package/dist/renderers/color-scheme.d.ts +40 -0
  163. package/dist/renderers/color-scheme.d.ts.map +1 -0
  164. package/dist/renderers/color-scheme.js +122 -0
  165. package/dist/renderers/color-scheme.js.map +1 -0
  166. package/dist/renderers/d2.d.ts +37 -0
  167. package/dist/renderers/d2.d.ts.map +1 -0
  168. package/dist/renderers/d2.js +108 -0
  169. package/dist/renderers/d2.js.map +1 -0
  170. package/dist/renderers/graphviz.d.ts +33 -0
  171. package/dist/renderers/graphviz.d.ts.map +1 -0
  172. package/dist/renderers/graphviz.js +88 -0
  173. package/dist/renderers/graphviz.js.map +1 -0
  174. package/dist/renderers/in-page.d.ts +33 -0
  175. package/dist/renderers/in-page.d.ts.map +1 -0
  176. package/dist/renderers/in-page.js +76 -0
  177. package/dist/renderers/in-page.js.map +1 -0
  178. package/dist/renderers/index.d.ts +20 -0
  179. package/dist/renderers/index.d.ts.map +1 -0
  180. package/dist/renderers/index.js +94 -0
  181. package/dist/renderers/index.js.map +1 -0
  182. package/dist/renderers/kroki.d.ts +38 -0
  183. package/dist/renderers/kroki.d.ts.map +1 -0
  184. package/dist/renderers/kroki.js +151 -0
  185. package/dist/renderers/kroki.js.map +1 -0
  186. package/dist/renderers/likec4-svg.d.ts +82 -0
  187. package/dist/renderers/likec4-svg.d.ts.map +1 -0
  188. package/dist/renderers/likec4-svg.js +435 -0
  189. package/dist/renderers/likec4-svg.js.map +1 -0
  190. package/dist/renderers/likec4.d.ts +22 -0
  191. package/dist/renderers/likec4.d.ts.map +1 -0
  192. package/dist/renderers/likec4.js +77 -0
  193. package/dist/renderers/likec4.js.map +1 -0
  194. package/dist/renderers/mermaid.d.ts +64 -0
  195. package/dist/renderers/mermaid.d.ts.map +1 -0
  196. package/dist/renderers/mermaid.js +196 -0
  197. package/dist/renderers/mermaid.js.map +1 -0
  198. package/dist/renderers/plantuml.d.ts +56 -0
  199. package/dist/renderers/plantuml.d.ts.map +1 -0
  200. package/dist/renderers/plantuml.js +195 -0
  201. package/dist/renderers/plantuml.js.map +1 -0
  202. package/dist/renderers/svg-utils.d.ts +46 -0
  203. package/dist/renderers/svg-utils.d.ts.map +1 -0
  204. package/dist/renderers/svg-utils.js +439 -0
  205. package/dist/renderers/svg-utils.js.map +1 -0
  206. package/dist/renderers/svgbob.d.ts +26 -0
  207. package/dist/renderers/svgbob.d.ts.map +1 -0
  208. package/dist/renderers/svgbob.js +70 -0
  209. package/dist/renderers/svgbob.js.map +1 -0
  210. package/dist/renderers/vega-lite.d.ts +18 -0
  211. package/dist/renderers/vega-lite.d.ts.map +1 -0
  212. package/dist/renderers/vega-lite.js +94 -0
  213. package/dist/renderers/vega-lite.js.map +1 -0
  214. package/dist/themes/index.d.ts +17 -0
  215. package/dist/themes/index.d.ts.map +1 -0
  216. package/dist/themes/index.js +419 -0
  217. package/dist/themes/index.js.map +1 -0
  218. package/dist/themes/types.d.ts +99 -0
  219. package/dist/themes/types.d.ts.map +1 -0
  220. package/dist/themes/types.js +9 -0
  221. package/dist/themes/types.js.map +1 -0
  222. package/eval/casos.json +513 -0
  223. package/package.json +114 -0
  224. package/scripts/capture-preview.mjs +101 -0
  225. package/scripts/check-github.mjs +128 -0
  226. package/scripts/eval.d.mts +8 -0
  227. package/scripts/eval.mjs +284 -0
  228. package/scripts/fetch-plantuml.mjs +122 -0
  229. package/scripts/generate-catalog-doc.mjs +106 -0
  230. package/scripts/rasterize.mjs +68 -0
  231. package/scripts/sync-docs.mjs +158 -0
  232. package/skills/docviz/SKILL.md +111 -0
  233. package/vendor/.gitkeep +0 -0
@@ -0,0 +1,573 @@
1
+ /**
2
+ * Logica de las herramientas MCP, independiente del transporte.
3
+ *
4
+ * Se separa del servidor para poder probarla sin levantar stdio, y para que la
5
+ * misma implementacion sirva a cualquier otro adaptador.
6
+ */
7
+ import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
8
+ import { tmpdir } from 'node:os';
9
+ import path from 'node:path';
10
+ import { build, check } from '../build/builder.js';
11
+ import { diff as diffTrees } from '../build/diff.js';
12
+ import { verify } from '../build/verify.js';
13
+ import { loadConfig, resolveFromRoot } from '../config/load.js';
14
+ import { DocVizError, BuildFailedError, ERROR_CODES } from '../core/errors.js';
15
+ import { parse as parseYaml } from 'yaml';
16
+ import { compileDsl, dslCatalog, dslCatalogDetailed, findType, isDslLanguage, unknownFields, } from '../dsl/index.js';
17
+ import { TYPE_CATALOG } from '../dsl/catalog.js';
18
+ import { buildRegistry } from '../renderers/index.js';
19
+ import { getTheme, themeNames } from '../themes/index.js';
20
+ import { toPosix } from '../core/paths.js';
21
+ /** Tipos que el agente puede pedir a `docviz_render_diagram`. */
22
+ export function renderableTypes() {
23
+ const catalog = dslCatalog();
24
+ return [...catalog.diagram, ...catalog.chart, ...catalog.architecture].sort();
25
+ }
26
+ function describeError(err) {
27
+ if (err instanceof BuildFailedError)
28
+ return { ok: false, error: err.message, detail: err.format() };
29
+ if (err instanceof DocVizError) {
30
+ // El codigo va aparte del texto: permite al agente decidir la correccion
31
+ // sin analizar un mensaje escrito para personas.
32
+ const out = {
33
+ ok: false,
34
+ error: err.message,
35
+ code: err.code,
36
+ };
37
+ const detail = err.format();
38
+ if (detail !== '')
39
+ out.detail = detail;
40
+ return out;
41
+ }
42
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
43
+ }
44
+ /** Error estructurado: lo que un agente necesita para corregir sin leer texto. */
45
+ function structuredError(err) {
46
+ return {
47
+ code: err.code,
48
+ message: err.message,
49
+ ...(err.location.file !== undefined ? { file: err.location.file } : {}),
50
+ ...(err.location.line !== undefined ? { line: err.location.line } : {}),
51
+ ...(err.location.renderer !== undefined ? { engine: err.location.renderer } : {}),
52
+ ...(err.detail !== undefined ? { detail: err.detail } : {}),
53
+ };
54
+ }
55
+ /**
56
+ * `docviz_validate_document`
57
+ *
58
+ * Valida los bloques de un documento (o de todo el directorio fuente) sin
59
+ * renderizar. Es la herramienta que un agente debe llamar antes de dar por
60
+ * escrita la documentacion.
61
+ */
62
+ export async function validateDocument(args) {
63
+ try {
64
+ // Con `content` se valida un texto en memoria a traves de un directorio
65
+ // temporal: el agente puede comprobar lo que acaba de escribir sin tocar
66
+ // el repositorio.
67
+ if (args.content !== undefined) {
68
+ const dir = await mkdtemp(path.join(tmpdir(), 'docviz-mcp-'));
69
+ try {
70
+ const src = path.join(dir, 'docs-src');
71
+ await writeFile(path.join(await ensureDir(src), 'documento.md'), args.content, 'utf8');
72
+ const config = await loadConfig({ cwd: dir });
73
+ config.rootDir = dir;
74
+ const result = await check(config);
75
+ return {
76
+ ok: result.errors.length === 0,
77
+ blocks: result.blocks,
78
+ invalidBlocks: result.invalidBlocks,
79
+ findings: result.findings.map((f) => ({ line: f.line, lang: f.lang, engine: f.rendererType, title: f.title })),
80
+ warnings: result.warnings,
81
+ errors: result.errors.map(structuredError),
82
+ };
83
+ }
84
+ finally {
85
+ await rm(dir, { recursive: true, force: true });
86
+ }
87
+ }
88
+ const config = await loadConfig({
89
+ cwd: args.cwd,
90
+ overrides: args.source !== undefined ? { source: args.source } : {},
91
+ });
92
+ const result = await check(config);
93
+ return {
94
+ ok: result.errors.length === 0,
95
+ documents: result.documents,
96
+ blocks: result.blocks,
97
+ invalidBlocks: result.invalidBlocks,
98
+ findings: result.findings,
99
+ warnings: result.warnings,
100
+ errors: result.errors.map(structuredError),
101
+ };
102
+ }
103
+ catch (err) {
104
+ return describeError(err);
105
+ }
106
+ }
107
+ /**
108
+ * `docviz_build_document`
109
+ *
110
+ * Compila el directorio fuente y devuelve el resumen: documentos escritos,
111
+ * diagramas generados y aciertos de cache.
112
+ */
113
+ export async function buildDocuments(args) {
114
+ try {
115
+ const config = await loadConfig({
116
+ cwd: args.cwd,
117
+ overrides: {
118
+ ...(args.source !== undefined ? { source: args.source } : {}),
119
+ ...(args.output !== undefined ? { output: args.output } : {}),
120
+ ...(args.theme !== undefined ? { theme: args.theme } : {}),
121
+ },
122
+ });
123
+ const result = await build(config, { clean: args.clean === true });
124
+ const report = await verify(resolveFromRoot(config, config.output));
125
+ return {
126
+ ok: true,
127
+ stats: result.stats,
128
+ documents: result.documents,
129
+ assets: result.assets.map((a) => ({ path: a.relativePath, format: a.format, fromCache: a.fromCache })),
130
+ warnings: result.warnings,
131
+ verification: { images: report.images, issues: report.issues },
132
+ };
133
+ }
134
+ catch (err) {
135
+ return describeError(err);
136
+ }
137
+ }
138
+ /**
139
+ * `docviz_diff`
140
+ *
141
+ * Compara los diagramas de dos versiones de la documentacion. El agente que
142
+ * acaba de reescribir un documento puede comprobar asi que no toco de mas.
143
+ */
144
+ export async function diffDocuments(args) {
145
+ try {
146
+ const config = await loadConfig(args.cwd !== undefined ? { cwd: args.cwd } : {});
147
+ const result = await diffTrees(config, path.resolve(config.rootDir, args.base), path.resolve(config.rootDir, args.head));
148
+ return {
149
+ ok: true,
150
+ summary: result.summary,
151
+ // Los iguales no se devuelven: son la mayoria y no aportan nada a quien
152
+ // pregunta que cambio.
153
+ entries: result.entries.filter((e) => e.status !== 'unchanged'),
154
+ issues: result.issues,
155
+ };
156
+ }
157
+ catch (err) {
158
+ return describeError(err);
159
+ }
160
+ }
161
+ /**
162
+ * `docviz_fix`
163
+ *
164
+ * Recibe un bloque que no compila y devuelve el bloque corregido.
165
+ *
166
+ * No adivina: solo aplica las correcciones que se deducen del propio catalogo
167
+ * —renombrar un campo cuya errata es inequivoca— y vuelve a compilar para decir
168
+ * si con eso basta. Cuando no basta, devuelve el diagnostico y el esqueleto
169
+ * canonico del tipo, que es lo que el agente necesita para reescribirlo.
170
+ *
171
+ * Existe porque el ciclo "falla, lee el error, reintenta" cuesta una llamada al
172
+ * modelo cada vuelta, y la mitad de las vueltas son una letra cambiada de sitio.
173
+ */
174
+ export function fixBlock(args) {
175
+ const lang = args.lang ?? 'diagram';
176
+ if (!isDslLanguage(lang)) {
177
+ return { ok: false, error: `"${lang}" no es una valla de DocViz`, code: ERROR_CODES.DSL_TYPE };
178
+ }
179
+ const original = args.source;
180
+ const primero = intentar(lang, original);
181
+ if (primero.ok && primero.warnings.length === 0) {
182
+ return { ok: true, cambiado: false, source: original, aplicado: [], nota: 'el bloque ya compilaba' };
183
+ }
184
+ // Las erratas se corrigen sobre el texto, no sobre el YAML ya interpretado:
185
+ // asi se conservan comentarios, orden y sangrado tal como los escribio quien
186
+ // lo redacto. Devolver un bloque reformateado seria devolver otro bloque.
187
+ const aplicado = [];
188
+ let corregido = original;
189
+ for (const aviso of primero.warnings) {
190
+ if (aviso.suggestion === undefined)
191
+ continue;
192
+ const renombrado = renombrarClave(corregido, aviso.field, aviso.suggestion);
193
+ if (renombrado === undefined)
194
+ continue;
195
+ corregido = renombrado;
196
+ aplicado.push({ de: aviso.field, a: aviso.suggestion });
197
+ }
198
+ const segundo = intentar(lang, corregido);
199
+ const spec = primero.spec ?? segundo.spec;
200
+ if (segundo.ok && segundo.warnings.length === 0) {
201
+ return { ok: true, cambiado: aplicado.length > 0, source: corregido, aplicado };
202
+ }
203
+ return {
204
+ ok: false,
205
+ cambiado: aplicado.length > 0,
206
+ source: corregido,
207
+ aplicado,
208
+ ...(segundo.error !== undefined ? { error: segundo.error.message, code: segundo.error.code, detail: segundo.error.format() } : {}),
209
+ pendientes: segundo.warnings.map((w) => w.message),
210
+ ...(spec !== undefined ? { ejemplo: `\`\`\`${spec.lang}\n${spec.example}\n\`\`\`` } : {}),
211
+ };
212
+ }
213
+ function intentar(lang, source) {
214
+ try {
215
+ const compiled = compileDsl(lang, source);
216
+ const salida = { ok: true, warnings: [...(compiled.warnings ?? [])] };
217
+ if (compiled.spec !== undefined)
218
+ salida.spec = compiled.spec;
219
+ return salida;
220
+ }
221
+ catch (err) {
222
+ const salida = { ok: false, warnings: [] };
223
+ if (err instanceof DocVizError)
224
+ salida.error = err;
225
+ // Aunque no compile, se puede saber de que tipo hablaba para devolver su
226
+ // ejemplo y para detectar las erratas: es justo el caso en el que hacen
227
+ // falta, porque la errata suele ser la causa del fallo.
228
+ const declarado = /^\s*type:\s*(\S+)/m.exec(source)?.[1];
229
+ const spec = declarado === undefined ? undefined : findType(declarado);
230
+ if (spec !== undefined) {
231
+ salida.spec = spec;
232
+ try {
233
+ const doc = parseYaml(source);
234
+ if (doc !== null && typeof doc === 'object' && !Array.isArray(doc)) {
235
+ salida.warnings = unknownFields(doc, spec);
236
+ }
237
+ }
238
+ catch {
239
+ // YAML invalido: no hay campos que analizar, solo el error de sintaxis.
240
+ }
241
+ }
242
+ return salida;
243
+ }
244
+ }
245
+ /**
246
+ * Renombra una clave de YAML conservando el resto del texto.
247
+ *
248
+ * Se niega si el destino ya existe: fusionar dos claves no es una correccion,
249
+ * es perder una de las dos.
250
+ */
251
+ function renombrarClave(texto, de, a) {
252
+ const escapado = de.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
253
+ const origen = new RegExp(`^(\\s*)(?:- )?${escapado}(\\s*:)`, 'm');
254
+ if (!origen.test(texto))
255
+ return undefined;
256
+ if (new RegExp(`^\\s*(?:- )?${a.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*:`, 'm').test(texto))
257
+ return undefined;
258
+ return texto.replace(origen, (_m, sangria, dosPuntos) => `${sangria}${a}${dosPuntos}`);
259
+ }
260
+ /**
261
+ * `docviz_render_diagram`
262
+ *
263
+ * Renderiza un unico diagrama declarativo y devuelve el recurso. El agente
264
+ * describe la intencion (`uml-sequence`, `strategy-tree`, `bar`...) y DocViz
265
+ * elige el motor.
266
+ */
267
+ export async function renderDiagram(args) {
268
+ try {
269
+ const config = await loadConfig({
270
+ cwd: args.cwd,
271
+ overrides: args.theme !== undefined ? { theme: args.theme } : {},
272
+ });
273
+ const theme = getTheme(config.theme.name);
274
+ // El `type` puede ser un tipo del DSL o directamente un motor.
275
+ const registry = buildRegistry(config);
276
+ let rendererType;
277
+ let source;
278
+ let title = args.title;
279
+ let warnings = [];
280
+ const directEngine = registry.resolve(args.type);
281
+ if (directEngine !== undefined) {
282
+ rendererType = directEngine;
283
+ source = args.source;
284
+ }
285
+ else {
286
+ const lang = languageForType(args.type);
287
+ if (lang === undefined) {
288
+ return {
289
+ ok: false,
290
+ error: `el tipo "${args.type}" no existe`,
291
+ detail: `tipos validos: ${renderableTypes().join(', ')}`,
292
+ };
293
+ }
294
+ const compiled = compileDsl(lang, prependType(args.type, args.source, lang));
295
+ rendererType = compiled.rendererType;
296
+ source = compiled.source;
297
+ title ??= compiled.title;
298
+ warnings = compiled.warnings ?? [];
299
+ }
300
+ const renderer = registry.get(rendererType);
301
+ const format = config.formats[rendererType] ?? renderer.defaultFormat;
302
+ const rendered = await renderer.render(source, {
303
+ format,
304
+ theme,
305
+ ...(title !== undefined ? { title } : {}),
306
+ timeoutMs: config.renderers.timeoutMs,
307
+ maxOutputBytes: config.renderers.maxOutputBytes,
308
+ });
309
+ await registry.disposeAll().catch(() => undefined);
310
+ if (args.outputDir !== undefined) {
311
+ const dir = path.resolve(config.rootDir, args.outputDir);
312
+ await ensureDir(dir);
313
+ const name = `${(title ?? rendererType).toLowerCase().replace(/[^a-z0-9]+/g, '-')}.${format}`;
314
+ const target = path.join(dir, name);
315
+ await writeFile(target, rendered.content);
316
+ return {
317
+ ok: true,
318
+ engine: rendererType,
319
+ format,
320
+ path: toPosix(path.relative(config.rootDir, target)),
321
+ bytes: rendered.content.byteLength,
322
+ ...(warnings.length > 0 ? { warnings } : {}),
323
+ };
324
+ }
325
+ return {
326
+ ok: true,
327
+ engine: rendererType,
328
+ format,
329
+ bytes: rendered.content.byteLength,
330
+ content: format === 'svg' ? rendered.content.toString('utf8') : rendered.content.toString('base64'),
331
+ encoding: format === 'svg' ? 'utf8' : 'base64',
332
+ ...(warnings.length > 0 ? { warnings } : {}),
333
+ };
334
+ }
335
+ catch (err) {
336
+ return describeError(err);
337
+ }
338
+ }
339
+ /**
340
+ * `docviz_preview`
341
+ *
342
+ * Devuelve el Markdown compilado y la lista de recursos referenciados, para que
343
+ * el agente pueda comprobar el resultado sin abrir un navegador.
344
+ */
345
+ export async function previewDocument(args) {
346
+ try {
347
+ const config = await loadConfig({
348
+ cwd: args.cwd,
349
+ overrides: args.output !== undefined ? { output: args.output } : {},
350
+ });
351
+ const outputDir = resolveFromRoot(config, config.output);
352
+ const report = await verify(outputDir);
353
+ if (args.document === undefined) {
354
+ return {
355
+ ok: report.issues.length === 0 && report.residualBlocks.length === 0,
356
+ documents: report.documents,
357
+ images: report.images,
358
+ issues: report.issues,
359
+ residualBlocks: report.residualBlocks,
360
+ };
361
+ }
362
+ const target = path.resolve(outputDir, args.document);
363
+ if (path.relative(outputDir, target).startsWith('..')) {
364
+ return { ok: false, error: 'el documento pedido esta fuera del directorio de salida' };
365
+ }
366
+ const markdown = await readFile(target, 'utf8');
367
+ return {
368
+ ok: report.issues.length === 0,
369
+ document: toPosix(path.relative(outputDir, target)),
370
+ markdown,
371
+ issues: report.issues.filter((i) => i.file === toPosix(path.relative(outputDir, target))),
372
+ };
373
+ }
374
+ catch (err) {
375
+ return describeError(err);
376
+ }
377
+ }
378
+ /**
379
+ * `docviz_types`: catalogo de tipos y temas.
380
+ *
381
+ * Devuelve el proposito y el cuando usar de cada tipo, no solo su nombre: un
382
+ * listado de nombres obliga a adivinar, y adivinar es justo lo que se quiere
383
+ * evitar.
384
+ */
385
+ export function listTypes(args = {}) {
386
+ if (args.detailed === false) {
387
+ return { ok: true, ...dslCatalog(), themes: themeNames() };
388
+ }
389
+ return {
390
+ ok: true,
391
+ themes: themeNames(),
392
+ types: dslCatalogDetailed().map((spec) => ({
393
+ type: spec.type,
394
+ lang: spec.lang,
395
+ engine: spec.engine,
396
+ fallbacks: spec.fallbacks ?? [],
397
+ aliases: spec.aliases ?? [],
398
+ purpose: spec.purpose,
399
+ whenToUse: spec.whenToUse,
400
+ whenNotToUse: spec.whenNotToUse,
401
+ example: spec.example,
402
+ })),
403
+ };
404
+ }
405
+ /** Determina a que valla de DSL pertenece un tipo. */
406
+ function languageForType(type) {
407
+ const catalog = dslCatalog();
408
+ const normalized = type.trim().toLowerCase();
409
+ if (catalog.diagram.includes(normalized))
410
+ return 'diagram';
411
+ if (catalog.chart.includes(normalized))
412
+ return 'chart';
413
+ if (catalog.architecture.includes(normalized))
414
+ return 'architecture';
415
+ if (isDslLanguage(normalized))
416
+ return normalized;
417
+ return undefined;
418
+ }
419
+ /**
420
+ * El agente envia el cuerpo sin la linea `type:`; se le antepone para que el
421
+ * compilador del DSL reciba un documento completo.
422
+ */
423
+ function prependType(type, source, lang) {
424
+ if (/^\s*type\s*:/m.test(source))
425
+ return source;
426
+ if (isDslLanguage(type) && type === lang)
427
+ return source;
428
+ return `type: ${type}\n${source}`;
429
+ }
430
+ async function ensureDir(dir) {
431
+ const { mkdir } = await import('node:fs/promises');
432
+ await mkdir(dir, { recursive: true });
433
+ return dir;
434
+ }
435
+ // --------------------------------------------------------------------------
436
+ // Recomendacion de tipo
437
+ // --------------------------------------------------------------------------
438
+ /**
439
+ * `docviz_suggest`
440
+ *
441
+ * Recibe una frase con lo que se quiere explicar y devuelve los tipos mas
442
+ * adecuados, con su esqueleto listo para rellenar.
443
+ *
444
+ * Existe porque recordar cuarenta y tantos tipos no es razonable, ni para una
445
+ * persona ni para un modelo. Consultar es mas fiable que recordar, y el
446
+ * esqueleto evita el segundo error habitual: acertar el tipo y equivocarse en
447
+ * la forma.
448
+ */
449
+ export function suggestType(args) {
450
+ const need = (args.need ?? '').trim();
451
+ if (need === '') {
452
+ return { ok: false, error: 'describe en una frase que quieres explicar' };
453
+ }
454
+ const terms = tokenize(need);
455
+ const scored = TYPE_CATALOG.map((spec) => ({ spec, score: score(spec, terms) }))
456
+ .filter((entry) => entry.score > 0)
457
+ .sort((a, b) => b.score - a.score || a.spec.type.localeCompare(b.spec.type));
458
+ const limit = Math.min(Math.max(args.limit ?? 3, 1), 8);
459
+ const matches = scored.slice(0, limit);
460
+ if (matches.length === 0) {
461
+ return {
462
+ ok: true,
463
+ need,
464
+ matches: [],
465
+ // Sin coincidencia, la respuesta util no es una lista larga sino un aviso:
466
+ // muchas veces la respuesta correcta es no dibujar nada.
467
+ advice: 'Ninguna intencion del catalogo encaja claramente. Comprueba si una tabla o un parrafo ' +
468
+ 'comunican mejor; si aun asi quieres un diagrama, consulta docviz_types.',
469
+ };
470
+ }
471
+ return {
472
+ ok: true,
473
+ need,
474
+ matches: matches.map(({ spec }) => ({
475
+ type: spec.type,
476
+ lang: spec.lang,
477
+ engine: spec.engine,
478
+ purpose: spec.purpose,
479
+ whenToUse: spec.whenToUse,
480
+ whenNotToUse: spec.whenNotToUse,
481
+ block: `\`\`\`${spec.lang}\n${spec.example}\n\`\`\``,
482
+ })),
483
+ };
484
+ }
485
+ const STOP_WORDS = new Set([
486
+ 'el', 'la', 'los', 'las', 'un', 'una', 'unos', 'unas', 'de', 'del', 'al', 'y', 'o', 'que',
487
+ 'como', 'para', 'por', 'con', 'sin', 'en', 'se', 'su', 'sus', 'lo', 'es', 'son', 'quiero',
488
+ 'necesito', 'mostrar', 'explicar', 'dibujar', 'diagrama', 'grafico', 'the', 'a', 'of', 'to',
489
+ ]);
490
+ function tokenize(text) {
491
+ return text
492
+ .toLowerCase()
493
+ .normalize('NFD')
494
+ .replace(/[̀-ͯ]/g, '')
495
+ .split(/[^a-z0-9]+/)
496
+ .filter((w) => w.length > 2 && !STOP_WORDS.has(w));
497
+ }
498
+ let frecuencias;
499
+ /**
500
+ * Prosa del tipo en los dos idiomas.
501
+ *
502
+ * Se concatenan a proposito en lugar de elegir uno: la peticion puede venir en
503
+ * cualquiera de los dos —y a menudo mezclada, con el termino tecnico en ingles
504
+ * dentro de una frase en español— y detectar el idioma para luego acertar solo
505
+ * a veces seria peor que mirar en ambos.
506
+ */
507
+ function prosaDe(spec) {
508
+ const ingles = spec.en === undefined ? '' : ` ${spec.en.purpose} ${spec.en.whenToUse}`;
509
+ return `${spec.purpose} ${spec.whenToUse}${ingles}`;
510
+ }
511
+ function calcularFrecuencias() {
512
+ if (frecuencias !== undefined)
513
+ return frecuencias;
514
+ const prosa = new Map();
515
+ for (const spec of TYPE_CATALOG) {
516
+ for (const t of new Set(tokenize(prosaDe(spec))))
517
+ prosa.set(t, (prosa.get(t) ?? 0) + 1);
518
+ }
519
+ frecuencias = { prosa, total: TYPE_CATALOG.length };
520
+ return frecuencias;
521
+ }
522
+ /**
523
+ * Peso de una palabra: 1 si es casi exclusiva de un tipo, cerca de 0 si la usan
524
+ * todos. Se acota por abajo para que una palabra muy comun siga sumando algo.
525
+ */
526
+ function peso(termino, frecuencia, total) {
527
+ const df = frecuencia.get(termino) ?? 0;
528
+ if (df === 0)
529
+ return 1;
530
+ const valor = Math.log(total / (1 + df)) / Math.log(total);
531
+ return Math.max(0.05, Math.min(1, valor));
532
+ }
533
+ /**
534
+ * Puntua un tipo frente a los terminos de la peticion.
535
+ *
536
+ * Las palabras clave pesan mas que el texto libre: son las que el catalogo
537
+ * declara a proposito para este uso, mientras que una coincidencia en la
538
+ * descripcion puede ser casual. Y dentro de cada categoria, cada palabra pesa
539
+ * segun lo especifica que sea (ver `calcularFrecuencias`).
540
+ */
541
+ function score(spec, terms) {
542
+ if (terms.length === 0)
543
+ return 0;
544
+ const { prosa: dfProsa, total } = calcularFrecuencias();
545
+ const keywords = spec.keywords.map((k) => k.toLowerCase());
546
+ const tokensProsa = new Set(tokenize(prosaDe(spec)));
547
+ const name = spec.type.toLowerCase();
548
+ let total_ = 0;
549
+ for (const term of terms) {
550
+ if (name.includes(term))
551
+ total_ += 6;
552
+ if (keywords.some((k) => k === term))
553
+ total_ += 5;
554
+ else if (keywords.some((k) => k.includes(term) || term.includes(k)))
555
+ total_ += 3;
556
+ // Coincidencia por raiz: quien escribe "interactuan" se refiere a
557
+ // "interaccion", y exigir la forma exacta desaprovecha el catalogo.
558
+ else if (keywords.some((k) => sharePrefix(k, term)))
559
+ total_ += 2;
560
+ // Solo la prosa se pondera. Una palabra clave la puso alguien a proposito
561
+ // para este tipo; una coincidencia en la descripcion puede ser casual, y
562
+ // cuanto mas comun sea la palabra, mas probable es que lo sea.
563
+ if (tokensProsa.has(term))
564
+ total_ += peso(term, dfProsa, total);
565
+ }
566
+ return total_;
567
+ }
568
+ /** Dos palabras comparten raiz si coinciden en sus primeros seis caracteres. */
569
+ function sharePrefix(a, b) {
570
+ const n = 6;
571
+ return a.length >= n && b.length >= n && a.slice(0, n) === b.slice(0, n);
572
+ }
573
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EACL,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,aAAa,GAEd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAiB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAO3C,iEAAiE;AACjE,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,GAAG,YAAY,gBAAgB;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IACpG,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;QAC/B,yEAAyE;QACzE,iDAAiD;QACjD,MAAM,GAAG,GAAiE;YACxE,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,GAAG,CAAC,OAAO;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,MAAM,KAAK,EAAE;YAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACvC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,kFAAkF;AAClF,SAAS,eAAe,CAAC,GAAgB;IACvC,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAItC;IACC,IAAI,CAAC;QACH,wEAAwE;QACxE,yEAAyE;QACzE,kBAAkB;QAClB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACvC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACvF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC9C,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;gBACrB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnC,OAAO;oBACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;oBAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC9G,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;iBAC3C,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;SACpE,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAC9B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;SAC3C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAMpC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE;gBACT,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D;SACF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACtG,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;SAC/D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAInC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,MAAM,EACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CACxC,CAAC;QACF,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,wEAAwE;YACxE,uBAAuB;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC;YAC/D,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAuC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,IAAI,6BAA6B,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC;IACjG,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC;IACvG,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,QAAQ,GAAqC,EAAE,CAAC;IACtD,IAAI,SAAS,GAAG,QAAQ,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;YAAE,SAAS;QAC7C,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5E,IAAI,UAAU,KAAK,SAAS;YAAE,SAAS;QACvC,SAAS,GAAG,UAAU,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1C,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAClF,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC7B,MAAM,EAAE,SAAS;QACjB,QAAQ;QACR,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClI,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1F,CAAC;AACJ,CAAC;AASD,SAAS,QAAQ,CAAC,IAAY,EAAE,MAAc;IAC5C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAY,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC/E,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAY,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACpD,IAAI,GAAG,YAAY,WAAW;YAAE,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;QAEnD,yEAAyE;QACzE,wEAAwE;QACxE,wDAAwD;QACxD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAmC,CAAC;gBAChE,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnE,MAAM,CAAC,QAAQ,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wEAAwE;YAC1E,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,KAAa,EAAE,EAAU,EAAE,CAAS;IAC1D,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,QAAQ,SAAS,EAAE,GAAG,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClH,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,OAAe,EAAE,SAAiB,EAAE,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;AACzG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAQnC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;SACjE,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,YAAoB,CAAC;QACzB,IAAI,MAAc,CAAC;QACnB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEvB,IAAI,QAAQ,GAAoE,EAAE,CAAC;QAEnF,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,YAAY,GAAG,YAAY,CAAC;YAC5B,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,YAAY,IAAI,CAAC,IAAI,aAAa;oBACzC,MAAM,EAAE,kBAAkB,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACzD,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAC7E,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;YACrC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YACzB,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC;YACzB,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;YAC7C,MAAM;YACN,KAAK;YACL,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS;YACrC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,cAAc;SAChD,CAAC,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACzD,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;YAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACpC,MAAM,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,YAAY;gBACpB,MAAM;gBACN,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpD,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU;gBAClC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,YAAY;YACpB,MAAM;YACN,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU;YAClC,OAAO,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACnG,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YAC9C,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAIrC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;SACpE,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;gBACpE,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,cAAc,EAAE,MAAM,CAAC,cAAc;aACtC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yDAAyD,EAAE,CAAC;QACzF,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAC9B,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACnD,QAAQ;YACR,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;SAC1F,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,OAA+B,EAAE;IACzD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,UAAU,EAAE;QACpB,KAAK,EAAE,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,OAAO,CAAC;IACvD,IAAI,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,cAAc,CAAC;IACrE,IAAI,aAAa,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACjD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,MAAc,EAAE,IAAY;IAC7D,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAChD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACxD,OAAO,SAAS,IAAI,KAAK,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6EAA6E;AAC7E,wBAAwB;AACxB,6EAA6E;AAE7E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,IAAsC;IAChE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC;IAC5E,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;SAC7E,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE/E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI;YACJ,OAAO,EAAE,EAAE;YACX,2EAA2E;YAC3E,yDAAyD;YACzD,MAAM,EACJ,wFAAwF;gBACxF,yEAAyE;SAC5E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,KAAK,EAAE,SAAS,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,UAAU;SACrD,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK;IACzF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ;IACzF,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI;CAC5F,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAgBD,IAAI,WAAoC,CAAC;AAEzC;;;;;;;GAOG;AACH,SAAS,OAAO,CAAC,IAIhB;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;IACvF,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,WAAW,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;IACpD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,SAAS,IAAI,CAAC,OAAe,EAAE,UAA+B,EAAE,KAAa;IAC3E,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,KAAK,CACZ,IAMC,EACD,KAAwB;IAExB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,mBAAmB,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAErC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC;aAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC;QACjF,kEAAkE;QAClE,oEAAoE;aAC/D,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,CAAC,CAAC;QACjE,0EAA0E;QAC1E,yEAAyE;QACzE,+DAA+D;QAC/D,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAChF,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Piezas compartidas por todos los renderers: limite de tiempo, limite de
3
+ * tamano y construccion del `RenderResult` (seccion 12, puntos 3 y 4).
4
+ */
5
+ import { RenderError } from '../core/errors.js';
6
+ import { type OutputFormat, type RenderOptions, type RenderResult } from '../core/types.js';
7
+ /** Ejecuta una promesa con limite de tiempo; superarlo es un `RenderError`. */
8
+ export declare function withTimeout<T>(renderer: string, timeoutMs: number, work: (signal: AbortSignal) => Promise<T>): Promise<T>;
9
+ /** Rechaza recursos que superen el tamano maximo configurado. */
10
+ export declare function enforceSize(renderer: string, content: Buffer, maxBytes: number): void;
11
+ /** Comprueba que el formato pedido este soportado por el renderer. */
12
+ export declare function assertFormat(renderer: string, format: OutputFormat, supported: readonly OutputFormat[]): void;
13
+ /** Normaliza, sanea y empaqueta un SVG como `RenderResult`. */
14
+ export declare function svgResult(renderer: string, svg: string, options: RenderOptions): RenderResult;
15
+ export declare function pngResult(renderer: string, png: Buffer, options: RenderOptions): RenderResult;
16
+ /** Convierte un error desconocido en `RenderError` sin perder el detalle. */
17
+ export declare function asRenderError(renderer: string, err: unknown, fallback: string): RenderError;
18
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/renderers/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAc,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIxG,+EAA+E;AAC/E,wBAAsB,WAAW,CAAC,CAAC,EACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQrF;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,YAAY,EAAE,GACjC,IAAI,CAQN;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,aAAa,GACrB,YAAY,CAMd;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,aAAa,GACrB,YAAY,CAGd;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAI3F"}