@miguelduran14/knowflow 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +182 -0
  3. package/dist/advisories.d.ts +16 -0
  4. package/dist/advisories.js +364 -0
  5. package/dist/advisories.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +104 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/copy-resolver.d.ts +22 -0
  10. package/dist/copy-resolver.js +74 -0
  11. package/dist/copy-resolver.js.map +1 -0
  12. package/dist/dataflow.d.ts +2 -0
  13. package/dist/dataflow.js +88 -0
  14. package/dist/dataflow.js.map +1 -0
  15. package/dist/dossier.d.ts +20 -0
  16. package/dist/dossier.js +331 -0
  17. package/dist/dossier.js.map +1 -0
  18. package/dist/explain/claude.d.ts +14 -0
  19. package/dist/explain/claude.js +91 -0
  20. package/dist/explain/claude.js.map +1 -0
  21. package/dist/explain/explain.d.ts +72 -0
  22. package/dist/explain/explain.js +126 -0
  23. package/dist/explain/explain.js.map +1 -0
  24. package/dist/explain/facts.d.ts +23 -0
  25. package/dist/explain/facts.js +266 -0
  26. package/dist/explain/facts.js.map +1 -0
  27. package/dist/explain/fake.d.ts +14 -0
  28. package/dist/explain/fake.js +27 -0
  29. package/dist/explain/fake.js.map +1 -0
  30. package/dist/explain/openai.d.ts +42 -0
  31. package/dist/explain/openai.js +102 -0
  32. package/dist/explain/openai.js.map +1 -0
  33. package/dist/explain/provider.d.ts +19 -0
  34. package/dist/explain/provider.js +2 -0
  35. package/dist/explain/provider.js.map +1 -0
  36. package/dist/explain/sse.d.ts +10 -0
  37. package/dist/explain/sse.js +44 -0
  38. package/dist/explain/sse.js.map +1 -0
  39. package/dist/flow-parser.d.ts +10 -0
  40. package/dist/flow-parser.js +503 -0
  41. package/dist/flow-parser.js.map +1 -0
  42. package/dist/glossary.d.ts +54 -0
  43. package/dist/glossary.js +340 -0
  44. package/dist/glossary.js.map +1 -0
  45. package/dist/index.d.ts +17 -0
  46. package/dist/index.js +16 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/inventory.d.ts +7 -0
  49. package/dist/inventory.js +453 -0
  50. package/dist/inventory.js.map +1 -0
  51. package/dist/lines.d.ts +15 -0
  52. package/dist/lines.js +53 -0
  53. package/dist/lines.js.map +1 -0
  54. package/dist/linker.d.ts +17 -0
  55. package/dist/linker.js +56 -0
  56. package/dist/linker.js.map +1 -0
  57. package/dist/mermaid.d.ts +27 -0
  58. package/dist/mermaid.js +133 -0
  59. package/dist/mermaid.js.map +1 -0
  60. package/dist/parser.d.ts +19 -0
  61. package/dist/parser.js +442 -0
  62. package/dist/parser.js.map +1 -0
  63. package/dist/pic.d.ts +29 -0
  64. package/dist/pic.js +197 -0
  65. package/dist/pic.js.map +1 -0
  66. package/dist/references.d.ts +24 -0
  67. package/dist/references.js +906 -0
  68. package/dist/references.js.map +1 -0
  69. package/dist/source-lines.d.ts +56 -0
  70. package/dist/source-lines.js +114 -0
  71. package/dist/source-lines.js.map +1 -0
  72. package/dist/types.d.ts +499 -0
  73. package/dist/types.js +2 -0
  74. package/dist/types.js.map +1 -0
  75. package/gui/dist/assets/ChainCanvas-C37KyhnE.js +1 -0
  76. package/gui/dist/assets/FlowCanvas-BRklWBCp.js +3 -0
  77. package/gui/dist/assets/RobotProfessor-BtTDTBDq.js +4220 -0
  78. package/gui/dist/assets/fira-code-cyrillic-400-normal-UC0NFL4U.woff2 +0 -0
  79. package/gui/dist/assets/fira-code-cyrillic-400-normal-dc1q3VD7.woff +0 -0
  80. package/gui/dist/assets/fira-code-cyrillic-500-normal-Bu7VCL72.woff +0 -0
  81. package/gui/dist/assets/fira-code-cyrillic-500-normal-CX35h3Mg.woff2 +0 -0
  82. package/gui/dist/assets/fira-code-cyrillic-600-normal-BD56RyRT.woff +0 -0
  83. package/gui/dist/assets/fira-code-cyrillic-600-normal-CPRdbepc.woff2 +0 -0
  84. package/gui/dist/assets/fira-code-cyrillic-ext-400-normal-Buh61xzB.woff +0 -0
  85. package/gui/dist/assets/fira-code-cyrillic-ext-400-normal-txZ9Fk_1.woff2 +0 -0
  86. package/gui/dist/assets/fira-code-cyrillic-ext-500-normal-CYRspHgm.woff2 +0 -0
  87. package/gui/dist/assets/fira-code-cyrillic-ext-500-normal-CwtLmSFD.woff +0 -0
  88. package/gui/dist/assets/fira-code-cyrillic-ext-600-normal-B9wE0zmr.woff2 +0 -0
  89. package/gui/dist/assets/fira-code-cyrillic-ext-600-normal-DldcyWhZ.woff +0 -0
  90. package/gui/dist/assets/fira-code-greek-400-normal-B2Gh_Y8s.woff2 +0 -0
  91. package/gui/dist/assets/fira-code-greek-400-normal-DobhaxvF.woff +0 -0
  92. package/gui/dist/assets/fira-code-greek-500-normal-CVO0IRNt.woff2 +0 -0
  93. package/gui/dist/assets/fira-code-greek-500-normal-DEXIWiey.woff +0 -0
  94. package/gui/dist/assets/fira-code-greek-600-normal-D_h3X2X5.woff +0 -0
  95. package/gui/dist/assets/fira-code-greek-600-normal-Dxp52_By.woff2 +0 -0
  96. package/gui/dist/assets/fira-code-greek-ext-400-normal-DR7mBgIM.woff2 +0 -0
  97. package/gui/dist/assets/fira-code-greek-ext-400-normal-DSPUheWg.woff +0 -0
  98. package/gui/dist/assets/fira-code-greek-ext-500-normal-BO3iq16n.woff2 +0 -0
  99. package/gui/dist/assets/fira-code-greek-ext-500-normal-CMiNLXER.woff +0 -0
  100. package/gui/dist/assets/fira-code-greek-ext-600-normal-C-cQDoOk.woff +0 -0
  101. package/gui/dist/assets/fira-code-greek-ext-600-normal-DtBpFRLc.woff2 +0 -0
  102. package/gui/dist/assets/fira-code-latin-400-normal-C-QZfXAs.woff +0 -0
  103. package/gui/dist/assets/fira-code-latin-400-normal-DGosTW8U.woff2 +0 -0
  104. package/gui/dist/assets/fira-code-latin-500-normal-B6gioGu8.woff2 +0 -0
  105. package/gui/dist/assets/fira-code-latin-500-normal-aMLC2AMm.woff +0 -0
  106. package/gui/dist/assets/fira-code-latin-600-normal-BmSSHshu.woff +0 -0
  107. package/gui/dist/assets/fira-code-latin-600-normal-CvYZpPHg.woff2 +0 -0
  108. package/gui/dist/assets/fira-code-latin-ext-400-normal-DG73JjOf.woff +0 -0
  109. package/gui/dist/assets/fira-code-latin-ext-400-normal-KSMg0QLl.woff2 +0 -0
  110. package/gui/dist/assets/fira-code-latin-ext-500-normal-CaANqXjI.woff +0 -0
  111. package/gui/dist/assets/fira-code-latin-ext-500-normal-Crd9e_oI.woff2 +0 -0
  112. package/gui/dist/assets/fira-code-latin-ext-600-normal-0PFQL1eg.woff +0 -0
  113. package/gui/dist/assets/fira-code-latin-ext-600-normal-Cb7jxoAi.woff2 +0 -0
  114. package/gui/dist/assets/fira-code-symbols2-400-normal-_QEZCEwe.woff +0 -0
  115. package/gui/dist/assets/fira-code-symbols2-500-normal-DwsgbIjQ.woff +0 -0
  116. package/gui/dist/assets/fira-code-symbols2-600-normal-Dvq6IQE5.woff +0 -0
  117. package/gui/dist/assets/fira-sans-cyrillic-300-normal-BO7tmGom.woff2 +0 -0
  118. package/gui/dist/assets/fira-sans-cyrillic-300-normal-BtNmWoqn.woff +0 -0
  119. package/gui/dist/assets/fira-sans-cyrillic-400-normal-CKu2TFQr.woff2 +0 -0
  120. package/gui/dist/assets/fira-sans-cyrillic-400-normal-D9eUeF-O.woff +0 -0
  121. package/gui/dist/assets/fira-sans-cyrillic-500-normal-CXfldnQ8.woff2 +0 -0
  122. package/gui/dist/assets/fira-sans-cyrillic-500-normal-Daski1k2.woff +0 -0
  123. package/gui/dist/assets/fira-sans-cyrillic-600-normal-CJ5P9t7t.woff +0 -0
  124. package/gui/dist/assets/fira-sans-cyrillic-600-normal-JSBvCpTs.woff2 +0 -0
  125. package/gui/dist/assets/fira-sans-cyrillic-700-normal-Bl-HczEO.woff2 +0 -0
  126. package/gui/dist/assets/fira-sans-cyrillic-700-normal-KyW5QH4H.woff +0 -0
  127. package/gui/dist/assets/fira-sans-cyrillic-ext-300-normal-BRn8Tsce.woff2 +0 -0
  128. package/gui/dist/assets/fira-sans-cyrillic-ext-300-normal-DOtRq9zH.woff +0 -0
  129. package/gui/dist/assets/fira-sans-cyrillic-ext-400-normal-Cycyekte.woff2 +0 -0
  130. package/gui/dist/assets/fira-sans-cyrillic-ext-400-normal-Dd5dApAy.woff +0 -0
  131. package/gui/dist/assets/fira-sans-cyrillic-ext-500-normal-Cixivk4R.woff +0 -0
  132. package/gui/dist/assets/fira-sans-cyrillic-ext-500-normal-Dkk5LlrU.woff2 +0 -0
  133. package/gui/dist/assets/fira-sans-cyrillic-ext-600-normal-BKgjRriM.woff +0 -0
  134. package/gui/dist/assets/fira-sans-cyrillic-ext-600-normal-CE6oUZE1.woff2 +0 -0
  135. package/gui/dist/assets/fira-sans-cyrillic-ext-700-normal-BfO9TR-w.woff2 +0 -0
  136. package/gui/dist/assets/fira-sans-cyrillic-ext-700-normal-Gcpdxicj.woff +0 -0
  137. package/gui/dist/assets/fira-sans-greek-300-normal-D3JfF3y9.woff2 +0 -0
  138. package/gui/dist/assets/fira-sans-greek-300-normal-DSgcXl_1.woff +0 -0
  139. package/gui/dist/assets/fira-sans-greek-400-normal-BFCFncbp.woff2 +0 -0
  140. package/gui/dist/assets/fira-sans-greek-400-normal-DQ8sF22y.woff +0 -0
  141. package/gui/dist/assets/fira-sans-greek-500-normal-C9KT8sAy.woff +0 -0
  142. package/gui/dist/assets/fira-sans-greek-500-normal-Cy-TUuxE.woff2 +0 -0
  143. package/gui/dist/assets/fira-sans-greek-600-normal-BlqpLOpF.woff2 +0 -0
  144. package/gui/dist/assets/fira-sans-greek-600-normal-DfHu91YF.woff +0 -0
  145. package/gui/dist/assets/fira-sans-greek-700-normal-BVfcrbV7.woff2 +0 -0
  146. package/gui/dist/assets/fira-sans-greek-700-normal-CJu31rC4.woff +0 -0
  147. package/gui/dist/assets/fira-sans-greek-ext-300-normal-CodlqOxk.woff +0 -0
  148. package/gui/dist/assets/fira-sans-greek-ext-300-normal-DVDwbKuK.woff2 +0 -0
  149. package/gui/dist/assets/fira-sans-greek-ext-400-normal-ByG7UNQ2.woff2 +0 -0
  150. package/gui/dist/assets/fira-sans-greek-ext-400-normal-ClCfNE6D.woff +0 -0
  151. package/gui/dist/assets/fira-sans-greek-ext-500-normal-Bem4H9fH.woff +0 -0
  152. package/gui/dist/assets/fira-sans-greek-ext-500-normal-nq-cjB3m.woff2 +0 -0
  153. package/gui/dist/assets/fira-sans-greek-ext-600-normal-DPxZoeHL.woff +0 -0
  154. package/gui/dist/assets/fira-sans-greek-ext-600-normal-fS0evUH3.woff2 +0 -0
  155. package/gui/dist/assets/fira-sans-greek-ext-700-normal-C1m6bE4Q.woff2 +0 -0
  156. package/gui/dist/assets/fira-sans-greek-ext-700-normal-C8J5qYMq.woff +0 -0
  157. package/gui/dist/assets/fira-sans-latin-300-normal-B2LrTgQS.woff2 +0 -0
  158. package/gui/dist/assets/fira-sans-latin-300-normal-Dwkm-oZ7.woff +0 -0
  159. package/gui/dist/assets/fira-sans-latin-400-normal-66xCkunx.woff +0 -0
  160. package/gui/dist/assets/fira-sans-latin-400-normal-a0AnQzuD.woff2 +0 -0
  161. package/gui/dist/assets/fira-sans-latin-500-normal-Bkfzcwmr.woff +0 -0
  162. package/gui/dist/assets/fira-sans-latin-500-normal-Bvbxc8ch.woff2 +0 -0
  163. package/gui/dist/assets/fira-sans-latin-600-normal-CXKlxLG9.woff2 +0 -0
  164. package/gui/dist/assets/fira-sans-latin-600-normal-DtSgd811.woff +0 -0
  165. package/gui/dist/assets/fira-sans-latin-700-normal-CRhwpWTq.woff2 +0 -0
  166. package/gui/dist/assets/fira-sans-latin-700-normal-DgqLm3Fi.woff +0 -0
  167. package/gui/dist/assets/fira-sans-latin-ext-300-normal-CAROBYR0.woff +0 -0
  168. package/gui/dist/assets/fira-sans-latin-ext-300-normal-GNF4Ac3G.woff2 +0 -0
  169. package/gui/dist/assets/fira-sans-latin-ext-400-normal-BCUwhuGB.woff +0 -0
  170. package/gui/dist/assets/fira-sans-latin-ext-400-normal-BLG_mAEf.woff2 +0 -0
  171. package/gui/dist/assets/fira-sans-latin-ext-500-normal-CFRf4jcC.woff +0 -0
  172. package/gui/dist/assets/fira-sans-latin-ext-500-normal-OO1QnNpY.woff2 +0 -0
  173. package/gui/dist/assets/fira-sans-latin-ext-600-normal-DLMQsaV4.woff +0 -0
  174. package/gui/dist/assets/fira-sans-latin-ext-600-normal-DTQBTt1m.woff2 +0 -0
  175. package/gui/dist/assets/fira-sans-latin-ext-700-normal-cfTxGFzJ.woff +0 -0
  176. package/gui/dist/assets/fira-sans-latin-ext-700-normal-g2Yrd4J5.woff2 +0 -0
  177. package/gui/dist/assets/fira-sans-vietnamese-300-normal-BO7He0nF.woff2 +0 -0
  178. package/gui/dist/assets/fira-sans-vietnamese-300-normal-CeyOCBN-.woff +0 -0
  179. package/gui/dist/assets/fira-sans-vietnamese-400-normal-DUVG35gE.woff +0 -0
  180. package/gui/dist/assets/fira-sans-vietnamese-400-normal-ljDTQFsx.woff2 +0 -0
  181. package/gui/dist/assets/fira-sans-vietnamese-500-normal-ChEXCnJy.woff2 +0 -0
  182. package/gui/dist/assets/fira-sans-vietnamese-500-normal-UV7M6ot_.woff +0 -0
  183. package/gui/dist/assets/fira-sans-vietnamese-600-normal-Bxjaclsw.woff +0 -0
  184. package/gui/dist/assets/fira-sans-vietnamese-600-normal-Dh2KAvU8.woff2 +0 -0
  185. package/gui/dist/assets/fira-sans-vietnamese-700-normal-DFi88MGY.woff +0 -0
  186. package/gui/dist/assets/fira-sans-vietnamese-700-normal-j5oLGLJY.woff2 +0 -0
  187. package/gui/dist/assets/index-CwQzep9r.js +413 -0
  188. package/gui/dist/assets/index-DUFjnEFT.css +1 -0
  189. package/gui/dist/assets/theme-BnuhLJ6X.css +1 -0
  190. package/gui/dist/assets/theme-G7EkTZY2.js +30 -0
  191. package/gui/dist/index.html +13 -0
  192. package/package.json +62 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Traza transitiva de datos (P7): a partir de las aristas de propagación
3
+ * de `collectReferences`, sigue de dónde VIENE el valor de un campo
4
+ * (`upstream`) o a dónde VA (`downstream`), encadenando MOVE/COMPUTE/…
5
+ * y los solapes REDEFINES.
6
+ *
7
+ * Insensible al orden de ejecución (decisión ratificada): cada arista es
8
+ * un flujo POSIBLE en el fuente, no el que gana al final. La GUI lo rotula
9
+ * "puede venir de / puede ir a". No modela el grafo de PERFORM/GO TO.
10
+ *
11
+ * Función pura: solo consume `ReferenceResult`. Con topes de profundidad
12
+ * y de número de caminos, y detección de ciclos (COBOL tiene `ADD A TO A`
13
+ * y realimentaciones A→B→A a cascoporro).
14
+ */
15
+ const MAX_DEPTH = 8;
16
+ const MAX_PATHS = 60;
17
+ export function traceField(references, name, direction) {
18
+ const target = name.toUpperCase();
19
+ // Adyacencia por el extremo que toca al campo pedido: aguas arriba se
20
+ // indexa por `to` y se salta a `from`; aguas abajo, al revés.
21
+ const adj = new Map();
22
+ const seen = new Set();
23
+ for (const edge of references.assignments) {
24
+ const key = `${edge.from}|${edge.to}|${edge.verb}|${edge.line}|${edge.kind ?? ''}`;
25
+ if (seen.has(key))
26
+ continue;
27
+ seen.add(key);
28
+ const pivot = direction === 'upstream' ? edge.to : edge.from;
29
+ const list = adj.get(pivot);
30
+ if (list)
31
+ list.push(edge);
32
+ else
33
+ adj.set(pivot, [edge]);
34
+ }
35
+ const other = (edge) => (direction === 'upstream' ? edge.from : edge.to);
36
+ const stepOf = (edge) => ({
37
+ from: edge.from,
38
+ to: edge.to,
39
+ verb: edge.verb,
40
+ line: edge.line,
41
+ ...(edge.paragraph ? { paragraph: edge.paragraph } : {}),
42
+ ...(edge.uncertain ? { uncertain: true } : {}),
43
+ ...(edge.kind === 'redefines' ? { redefines: true } : {}),
44
+ });
45
+ const direct = (adj.get(target) ?? []).map(stepOf);
46
+ const paths = [];
47
+ let truncated = false;
48
+ const finish = (nodes, steps, extra = {}) => {
49
+ paths.push({
50
+ nodes,
51
+ steps,
52
+ ...(steps.some(s => s.uncertain || s.redefines) ? { uncertain: true } : {}),
53
+ ...extra,
54
+ });
55
+ };
56
+ const walk = (node, nodes, steps) => {
57
+ if (paths.length >= MAX_PATHS) {
58
+ truncated = true;
59
+ return;
60
+ }
61
+ const outs = adj.get(node) ?? [];
62
+ if (outs.length === 0) {
63
+ if (steps.length > 0)
64
+ finish(nodes, steps);
65
+ return;
66
+ }
67
+ if (steps.length >= MAX_DEPTH) {
68
+ finish(nodes, steps, { truncated: true });
69
+ return;
70
+ }
71
+ for (const edge of outs) {
72
+ if (paths.length >= MAX_PATHS) {
73
+ truncated = true;
74
+ return;
75
+ }
76
+ const nxt = other(edge);
77
+ const step = stepOf(edge);
78
+ if (nodes.includes(nxt)) {
79
+ finish([...nodes, nxt], [...steps, step], { cyclic: true });
80
+ continue;
81
+ }
82
+ walk(nxt, [...nodes, nxt], [...steps, step]);
83
+ }
84
+ };
85
+ walk(target, [target], []);
86
+ return { direct, paths, truncated };
87
+ }
88
+ //# sourceMappingURL=dataflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataflow.js","sourceRoot":"","sources":["../src/dataflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Advisory, FlowResult, Inventory, ParseResult, ReferenceResult } from './types.js';
2
+ import type { Explanation } from './explain/explain.js';
3
+ /**
4
+ * Todo lo necesario para armar el paquete de onboarding de UN programa.
5
+ * La explicación es opcional: sin clave de IA el dossier sigue siendo útil
6
+ * (flujo, datos, inventario y avisos son todos hechos del parser). Cuando
7
+ * está, su prosa encabeza el documento.
8
+ */
9
+ export interface DossierInput {
10
+ data?: ParseResult | undefined;
11
+ flow?: FlowResult | undefined;
12
+ inventory?: Inventory | undefined;
13
+ advisories?: Advisory[] | undefined;
14
+ /** Where-used por campo — dónde se lee/escribe cada dato en la PROCEDURE */
15
+ references?: ReferenceResult | undefined;
16
+ explanation?: Explanation | undefined;
17
+ /** Encabezado cuando el fuente no trae PROGRAM-ID (p. ej. el nombre del fichero) */
18
+ sourceName?: string | undefined;
19
+ }
20
+ export declare function renderDossier(input: DossierInput): string;
@@ -0,0 +1,331 @@
1
+ import { factsFidelity } from './explain/facts.js';
2
+ import { flowToMermaid } from './mermaid.js';
3
+ /** Un nivel de indentación en la tabla, con espacios no rompibles que los
4
+ * renderizadores de Markdown (GitHub, wikis) sí respetan dentro de celdas. */
5
+ function indent(depth) {
6
+ return '  '.repeat(depth);
7
+ }
8
+ /** Escapa el `|` para que no rompa una celda de tabla Markdown. */
9
+ function cell(text) {
10
+ return text.replace(/\|/g, '\\|');
11
+ }
12
+ /**
13
+ * Vuelca un campo del esquema (y sus hijos/88/66) como filas de una tabla
14
+ * Markdown. Mismas columnas y semántica que la vista Datos de la GUI, para
15
+ * que el export sea la misma verdad en otro formato — revive la "tabla
16
+ * Markdown exportable" (T4) sobre el esquema ya verificado.
17
+ */
18
+ function schemaRows(field, depth, out) {
19
+ if (field.type === 'unresolved-copy') {
20
+ out.push(`| ${indent(depth)}COPY ${cell(field.unresolvedCopyMember ?? '')} | — | no disponible | | ? | ? | copybook ausente |`);
21
+ return;
22
+ }
23
+ const notes = [];
24
+ if (field.dataSection)
25
+ notes.push(field.dataSection);
26
+ if (field.value !== undefined)
27
+ notes.push(`VALUE ${field.value}`);
28
+ if (field.redefines)
29
+ notes.push(`REDEFINES ${field.redefines}`);
30
+ if (field.occurs !== undefined)
31
+ notes.push(`OCCURS ${field.occurs}`);
32
+ if (field.occursDepending) {
33
+ notes.push(`OCCURS ${field.occursDepending.min}..${field.occursDepending.max ?? '?'} DEPENDING ON ${field.occursDepending.dependingOn}`);
34
+ }
35
+ if (field.synchronized)
36
+ notes.push('alineado (SYNC)');
37
+ const typeCol = field.type === 'group' ? 'grupo' : (field.picture ?? field.type) + (field.type === 'numeric-edited' ? ' (editado)' : '');
38
+ const offset = field.offsetUnknown ? '?' : String(field.offset);
39
+ out.push(`| ${indent(depth)}${cell(field.name)} | ${String(field.level).padStart(2, '0')} | ${cell(typeCol)} | ${field.usage ?? ''} | ${field.lengthInBytes} | ${offset} | ${cell(notes.join('; '))} |`);
40
+ for (const cond of field.conditionValues ?? []) {
41
+ out.push(`| ${indent(depth + 1)}88 ${cell(cond.name)} | 88 | | | | | = ${cell(cond.values.join(', '))} |`);
42
+ }
43
+ for (const child of field.children) {
44
+ schemaRows(child, depth + 1, out);
45
+ }
46
+ for (const group of field.renamesGroups ?? []) {
47
+ const range = group.thru ? `${group.from} THRU ${group.thru}` : group.from;
48
+ const span = group.offset !== undefined && group.lengthInBytes !== undefined ? String(group.lengthInBytes) : '?';
49
+ const off = group.offset !== undefined ? String(group.offset) : '?';
50
+ out.push(`| ${indent(depth + 1)}66 ${cell(group.name)} | 66 | misma memoria | | ${span} | ${off} | RENAMES ${cell(range)} |`);
51
+ }
52
+ }
53
+ /** Sección de recorrido a partir de la explicación estructurada. */
54
+ function walkthroughSection(explanation, out) {
55
+ if (explanation.summary) {
56
+ out.push('## Resumen');
57
+ out.push('');
58
+ out.push(explanation.summary);
59
+ out.push('');
60
+ }
61
+ if (explanation.walkthrough.length > 0) {
62
+ out.push('## Recorrido');
63
+ out.push('');
64
+ out.push('_Narración generada por IA sobre los hechos del parser; cada etapa enlaza al párrafo que la demuestra._');
65
+ out.push('');
66
+ explanation.walkthrough.forEach((step, i) => {
67
+ const anchor = step.paragraph
68
+ ? ` — \`${step.paragraph}\`${step.line !== undefined ? ` (L${step.line})` : ''}${step.branches ? ' · rama condicional' : ''}`
69
+ : '';
70
+ out.push(`${i + 1}. ${step.text}${anchor}`);
71
+ });
72
+ out.push('');
73
+ }
74
+ }
75
+ /**
76
+ * Arma el paquete de onboarding de un programa como un solo documento
77
+ * Markdown, pegable en una wiki o un PR: prosa (si hay IA) + diagrama de
78
+ * flujo (Mermaid, que se renderiza solo) + esquema de datos en tabla +
79
+ * inventario + avisos + límites de lo verificado. Todo son hechos del
80
+ * parser salvo la prosa, que va etiquetada como tal.
81
+ */
82
+ /** Rol de una referencia como sigla corta para el dossier. */
83
+ const REF_ROLE = {
84
+ read: 'R',
85
+ write: 'W',
86
+ 'read-write': 'RW',
87
+ unclassified: '?',
88
+ };
89
+ /**
90
+ * Sección "dónde se usa cada campo": para cada dato del esquema tocado en
91
+ * la PROCEDURE, sus lecturas y escrituras ancladas a párrafo y línea. Es
92
+ * la misma verdad que el panel de usos de la GUI, en Markdown. Todo son
93
+ * hechos del parser; las ocurrencias en verbos cuyo reparto de roles no se
94
+ * modela van marcadas `?` (ADR-0003).
95
+ */
96
+ function fieldUsageSection(references, out) {
97
+ if (references.fields.length === 0)
98
+ return;
99
+ out.push('## Dónde se usa cada campo');
100
+ out.push('');
101
+ out.push('_Lecturas (`R`) y escrituras (`W`) de cada dato en la PROCEDURE DIVISION, verificadas contra el fuente. ' +
102
+ '`RW` = un mismo operando leído y escrito en la sentencia (`ADD 1 TO X`). ' +
103
+ '`?` = el verbo no permite afirmar el rol. `~` marca lo incierto (argumento por referencia de una CALL, MOVE CORRESPONDING, homónimo…)._');
104
+ out.push('');
105
+ const MAX_PER_FIELD = 14;
106
+ for (const field of references.fields) {
107
+ // Una sola lista por campo, en orden de línea; una `read-write` aparece
108
+ // en `reads` y `writes` a la vez, así que se deduplica por línea+verbo.
109
+ const seen = new Set();
110
+ const rows = [];
111
+ for (const ref of [...field.writes, ...field.reads, ...field.unclassified].sort((a, b) => a.line - b.line)) {
112
+ const key = `${ref.line}|${ref.verb}|${ref.kind}`;
113
+ if (seen.has(key))
114
+ continue;
115
+ seen.add(key);
116
+ rows.push(ref);
117
+ }
118
+ out.push(`- **${cell(field.name)}**`);
119
+ for (const ref of rows.slice(0, MAX_PER_FIELD)) {
120
+ const where = ref.paragraphImplicit ? `${ref.paragraph} (entrada implícita)` : ref.paragraph;
121
+ const marks = [ref.via88 ? `vía ${ref.via88}` : '', ref.uncertain ? '~' : ''].filter(Boolean);
122
+ out.push(` - \`${REF_ROLE[ref.kind]}\` ${cell(where)} L${ref.line} — ${cell(ref.verb)}${marks.length > 0 ? ` (${marks.join(', ')})` : ''}`);
123
+ }
124
+ if (rows.length > MAX_PER_FIELD)
125
+ out.push(` - … y ${rows.length - MAX_PER_FIELD} usos más`);
126
+ }
127
+ out.push('');
128
+ }
129
+ /**
130
+ * Sección "trazabilidad de datos": la adyacencia de propagación de valor
131
+ * campo→campo (P7) — de qué campos viene el valor de cada uno y a cuáles
132
+ * va, con verbo y línea. Insensible al orden de ejecución: cada arista es
133
+ * un flujo POSIBLE. Las cadenas transitivas son cosa de la GUI; aquí va la
134
+ * tabla de adyacencia, acotada.
135
+ */
136
+ function dataTraceSection(references, out) {
137
+ const edges = references.assignments;
138
+ if (edges.length === 0)
139
+ return;
140
+ const incoming = new Map();
141
+ const outgoing = new Map();
142
+ const push = (m, k, e) => {
143
+ const list = m.get(k);
144
+ if (list)
145
+ list.push(e);
146
+ else
147
+ m.set(k, [e]);
148
+ };
149
+ for (const e of edges) {
150
+ push(incoming, e.to, e);
151
+ push(outgoing, e.from, e);
152
+ }
153
+ const names = [...new Set([...incoming.keys(), ...outgoing.keys()])].sort();
154
+ out.push('## Trazabilidad de datos');
155
+ out.push('');
156
+ out.push('_Aristas de propagación de valor campo→campo (MOVE/COMPUTE/…) y solapes REDEFINES, verificadas contra el fuente. ' +
157
+ 'Insensible al orden de ejecución: cada arista es un flujo POSIBLE, no el que gana al final. ' +
158
+ '`~` incierto, `solape` = REDEFINES._');
159
+ out.push('');
160
+ const MAX_PER_DIR = 10;
161
+ const fmt = (peer, e) => {
162
+ if (e.kind === 'redefines')
163
+ return `${cell(peer)} (solape)`;
164
+ const mark = e.uncertain ? ' ~' : '';
165
+ return `${cell(peer)} (${cell(e.verb)} L${e.line}${mark})`;
166
+ };
167
+ for (const name of names) {
168
+ const from = (incoming.get(name) ?? []).slice(0, MAX_PER_DIR).map(e => fmt(e.from, e));
169
+ const to = (outgoing.get(name) ?? []).slice(0, MAX_PER_DIR).map(e => fmt(e.to, e));
170
+ const parts = [];
171
+ if (from.length > 0)
172
+ parts.push(`viene de ${from.join(', ')}`);
173
+ if (to.length > 0)
174
+ parts.push(`va a ${to.join(', ')}`);
175
+ out.push(`- **${cell(name)}** — ${parts.join('; ')}`);
176
+ }
177
+ out.push('');
178
+ }
179
+ export function renderDossier(input) {
180
+ const { data, flow, inventory, advisories, references, explanation, sourceName } = input;
181
+ const out = [];
182
+ const title = flow?.programId ?? sourceName ?? 'programa COBOL';
183
+ out.push(`# Dossier de onboarding — ${title}`);
184
+ out.push('');
185
+ const fidelity = factsFidelity(data, flow, inventory);
186
+ out.push(fidelity.level === 'verified'
187
+ ? '> **Fidelidad: verificado por parser.** Los hechos (flujo, datos, inventario) salen del fuente, no de una estimación. La prosa, si la hay, es de una IA sobre esos hechos.'
188
+ : `> **Fidelidad: parcialmente verificado.** ${fidelity.reasons.join('; ')}.`);
189
+ out.push('');
190
+ out.push('_Generado por KnowFlow. Los diagramas Mermaid se renderizan solos en GitHub y la mayoría de wikis._');
191
+ out.push('');
192
+ if (explanation) {
193
+ if (explanation.structured) {
194
+ walkthroughSection(explanation, out);
195
+ }
196
+ else if (explanation.raw.trim() !== '') {
197
+ out.push('## Resumen');
198
+ out.push('');
199
+ out.push(explanation.raw.trim());
200
+ out.push('');
201
+ }
202
+ }
203
+ const flowHasFacts = flow !== undefined && (flow.edges.length > 0 || flow.paragraphs.some(p => !p.implicit));
204
+ if (flow && flowHasFacts) {
205
+ out.push('## Flujo');
206
+ out.push('');
207
+ out.push('```mermaid');
208
+ out.push(flowToMermaid(flow).trimEnd());
209
+ out.push('```');
210
+ out.push('');
211
+ }
212
+ if (data && data.records.length > 0) {
213
+ out.push('## Datos');
214
+ out.push('');
215
+ out.push('| Campo | Nivel | PIC / tipo | USAGE | Bytes | Offset | Notas |');
216
+ out.push('| --- | ---: | --- | --- | ---: | ---: | --- |');
217
+ const rows = [];
218
+ for (const record of data.records)
219
+ schemaRows(record, 0, rows);
220
+ out.push(...rows);
221
+ out.push('');
222
+ }
223
+ if (references) {
224
+ fieldUsageSection(references, out);
225
+ dataTraceSection(references, out);
226
+ }
227
+ const inventoryHasFacts = inventory !== undefined &&
228
+ (inventory.files.length > 0 || inventory.execs.length > 0 || inventory.unresolvedFileOps.length > 0);
229
+ if (inventory && inventoryHasFacts) {
230
+ out.push('## Qué toca el programa');
231
+ out.push('');
232
+ if (inventory.files.length > 0) {
233
+ out.push('### Ficheros');
234
+ out.push('');
235
+ for (const file of inventory.files) {
236
+ const decl = [
237
+ file.assignTo ? `ASSIGN TO ${file.assignTo}` : '',
238
+ file.organization ?? '',
239
+ file.access ?? '',
240
+ ].filter(Boolean);
241
+ out.push(`- **${file.name}**${decl.length > 0 ? ` — ${decl.join(', ')}` : ''}`);
242
+ for (const op of file.operations) {
243
+ const where = op.paragraphImplicit ? `${op.paragraph} (entrada implícita)` : op.paragraph;
244
+ out.push(` - ${op.verb}${op.mode ? ` ${op.mode}` : ''} en ${where} (L${op.line})`);
245
+ }
246
+ if (file.operations.length === 0)
247
+ out.push(' - declarado, sin operaciones en el fuente aportado');
248
+ }
249
+ out.push('');
250
+ }
251
+ if (inventory.tables.length > 0) {
252
+ out.push(`**Tablas DB2:** ${inventory.tables.join(', ')}`);
253
+ out.push('');
254
+ }
255
+ if (inventory.cursors.length > 0) {
256
+ out.push('### Cursores');
257
+ out.push('');
258
+ for (const cursor of inventory.cursors) {
259
+ const ops = [
260
+ cursor.declared ? 'DECLARE' : '',
261
+ cursor.opened ? 'OPEN' : '',
262
+ cursor.fetched ? 'FETCH' : '',
263
+ cursor.closed ? 'CLOSE' : '',
264
+ ].filter(Boolean);
265
+ out.push(`- **${cursor.name}**: ${ops.join(' → ') || 'nombrado sin operaciones reconocidas'}` +
266
+ (cursor.tables.length > 0 ? ` — sobre ${cursor.tables.join(', ')}` : ''));
267
+ }
268
+ out.push('');
269
+ }
270
+ if (inventory.cicsCommands.length > 0) {
271
+ out.push(`**Comandos CICS:** ${inventory.cicsCommands.map(c => `${c.command}${c.count > 1 ? ` ×${c.count}` : ''}`).join(', ')}`);
272
+ out.push('');
273
+ }
274
+ if (inventory.unresolvedFileOps.length > 0) {
275
+ const targets = [...new Set(inventory.unresolvedFileOps.map(o => `${o.verb} ${o.target}`))];
276
+ out.push(`**E/S sin fichero resuelto** (falta el SELECT o el FD): ${targets.join(', ')}`);
277
+ out.push('');
278
+ }
279
+ }
280
+ if (advisories && advisories.length > 0) {
281
+ out.push('## Avisos — cuidado con esto');
282
+ out.push('');
283
+ out.push('_Trampas de mantenimiento verificadas contra el fuente, no huecos de fidelidad._');
284
+ out.push('');
285
+ for (const advisory of advisories) {
286
+ const at = advisory.line > 0 ? ` (${advisory.paragraph ? `${advisory.paragraph}, ` : ''}L${advisory.line})` : '';
287
+ out.push(`- **${advisory.title}**${at} — ${advisory.message}`);
288
+ }
289
+ out.push('');
290
+ }
291
+ const gaps = collectGaps(data, flow, inventory, references);
292
+ if (gaps.length > 0) {
293
+ out.push('## Límites de lo verificado');
294
+ out.push('');
295
+ for (const gap of gaps)
296
+ out.push(`- ${gap}`);
297
+ out.push('');
298
+ }
299
+ return out.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
300
+ }
301
+ /** Huecos honestos: lo que el parser NO pudo verificar contra el fuente. */
302
+ function collectGaps(data, flow, inventory, references) {
303
+ const gaps = [];
304
+ if (flow?.fragment)
305
+ gaps.push('El fuente es un fragmento sin PROCEDURE DIVISION: fidelidad parcial.');
306
+ if (references && references.unknownNames.length > 0) {
307
+ gaps.push(`Nombres usados en la PROCEDURE que no casan con el esquema aportado (¿copybook ausente?): ${references.unknownNames.join(', ')}.`);
308
+ }
309
+ for (const member of data?.missingCopybooks ?? []) {
310
+ gaps.push(`Copybook \`${member}\` no disponible: su estructura es desconocida.`);
311
+ }
312
+ for (const target of flow?.missingTargets ?? []) {
313
+ gaps.push(`El destino \`${target}\` no existe en el fuente aportado.`);
314
+ }
315
+ for (const nested of flow?.nestedPrograms ?? []) {
316
+ gaps.push(`El programa anidado \`${nested}\` no se ha analizado.`);
317
+ }
318
+ for (const edge of flow?.edges ?? []) {
319
+ if (edge.dynamic)
320
+ gaps.push(`CALL dinámica en L${edge.line}: el destino (\`${edge.to}\`) es una variable.`);
321
+ }
322
+ for (const op of inventory?.unresolvedFileOps ?? []) {
323
+ gaps.push(`\`${op.verb} ${op.target}\` en L${op.line}: sin SELECT ni FD que lo respalde.`);
324
+ }
325
+ for (const exec of inventory?.execs ?? []) {
326
+ if (exec.dynamic)
327
+ gaps.push(`EXEC ${exec.kind.toUpperCase()} ${exec.verb} en L${exec.line}: el recurso es una variable.`);
328
+ }
329
+ return gaps;
330
+ }
331
+ //# sourceMappingURL=dossier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dossier.js","sourceRoot":"","sources":["../src/dossier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ExplanationProvider } from './provider.js';
2
+ export declare const DEFAULT_CLAUDE_MODEL = "claude-sonnet-5";
3
+ export interface ClaudeProviderOptions {
4
+ /** Clave del usuario (BYOK) — nunca sale de su máquina salvo hacia Anthropic */
5
+ apiKey: string;
6
+ model?: string | undefined;
7
+ maxTokens?: number | undefined;
8
+ }
9
+ /**
10
+ * Adaptador Claude (Anthropic Messages API). Usa fetch, así que funciona
11
+ * igual en Node 18+ y en navegador; la llamada va directa del navegador del
12
+ * usuario a Anthropic, sin servidor intermedio.
13
+ */
14
+ export declare function createClaudeProvider(options: ClaudeProviderOptions): ExplanationProvider;
@@ -0,0 +1,91 @@
1
+ import { readSseStream } from './sse.js';
2
+ const API_URL = 'https://api.anthropic.com/v1/messages';
3
+ export const DEFAULT_CLAUDE_MODEL = 'claude-sonnet-5';
4
+ /** Convierte un fallo de la API en un mensaje accionable para el usuario. */
5
+ async function readError(response) {
6
+ const raw = await response.text().catch(() => '');
7
+ let detail = raw;
8
+ try {
9
+ const parsed = JSON.parse(raw);
10
+ if (parsed.error?.message)
11
+ detail = parsed.error.message;
12
+ }
13
+ catch {
14
+ // La respuesta no era JSON (p. ej. una página HTML de error): se usa cruda.
15
+ }
16
+ const hint = response.status === 401
17
+ ? ' — revisa la clave API.'
18
+ : response.status === 404
19
+ ? ' — revisa el nombre del modelo.'
20
+ : response.status === 429
21
+ ? ' — límite de tasa o saldo agotado.'
22
+ : '';
23
+ return `Claude API ${response.status}${hint} ${detail.slice(0, 300)}`.trim();
24
+ }
25
+ function baseHeaders(apiKey) {
26
+ return {
27
+ 'content-type': 'application/json',
28
+ 'x-api-key': apiKey,
29
+ 'anthropic-version': '2023-06-01',
30
+ // Permite la llamada directa navegador → Anthropic (diseño local-first/BYOK).
31
+ 'anthropic-dangerous-direct-browser-access': 'true',
32
+ };
33
+ }
34
+ /**
35
+ * Adaptador Claude (Anthropic Messages API). Usa fetch, así que funciona
36
+ * igual en Node 18+ y en navegador; la llamada va directa del navegador del
37
+ * usuario a Anthropic, sin servidor intermedio.
38
+ */
39
+ export function createClaudeProvider(options) {
40
+ const model = options.model ?? DEFAULT_CLAUDE_MODEL;
41
+ const maxTokens = options.maxTokens ?? 2000;
42
+ return {
43
+ id: 'claude',
44
+ async complete(system, user) {
45
+ const response = await fetch(API_URL, {
46
+ method: 'POST',
47
+ headers: baseHeaders(options.apiKey),
48
+ body: JSON.stringify({ model, max_tokens: maxTokens, system, messages: [{ role: 'user', content: user }] }),
49
+ });
50
+ if (!response.ok)
51
+ throw new Error(await readError(response));
52
+ const data = (await response.json());
53
+ const text = (data.content ?? [])
54
+ .filter(block => block.type === 'text' && typeof block.text === 'string')
55
+ .map(block => block.text)
56
+ .join('');
57
+ if (text === '')
58
+ throw new Error('Claude devolvió una respuesta vacía');
59
+ return text;
60
+ },
61
+ async stream(system, user, onChunk) {
62
+ const response = await fetch(API_URL, {
63
+ method: 'POST',
64
+ headers: baseHeaders(options.apiKey),
65
+ body: JSON.stringify({
66
+ model,
67
+ max_tokens: maxTokens,
68
+ system,
69
+ messages: [{ role: 'user', content: user }],
70
+ stream: true,
71
+ }),
72
+ });
73
+ if (!response.ok)
74
+ throw new Error(await readError(response));
75
+ if (!response.body)
76
+ throw new Error('Claude no devolvió un cuerpo en streaming');
77
+ let text = '';
78
+ await readSseStream(response.body, event => {
79
+ const e = event;
80
+ if (e.type === 'content_block_delta' && e.delta?.type === 'text_delta' && e.delta.text) {
81
+ text += e.delta.text;
82
+ onChunk(e.delta.text);
83
+ }
84
+ });
85
+ if (text === '')
86
+ throw new Error('Claude devolvió una respuesta vacía');
87
+ return text;
88
+ },
89
+ };
90
+ }
91
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/explain/claude.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,OAAO,GAAG,uCAAuC,CAAA;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAA;AASrD,6EAA6E;AAC7E,KAAK,UAAU,SAAS,CAAC,QAAkB;IACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IACjD,IAAI,MAAM,GAAG,GAAG,CAAA;IAChB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqC,CAAA;QAClE,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO;YAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;IACD,MAAM,IAAI,GACR,QAAQ,CAAC,MAAM,KAAK,GAAG;QACrB,CAAC,CAAC,yBAAyB;QAC3B,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG;YACvB,CAAC,CAAC,iCAAiC;YACnC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,EAAE,CAAA;IACZ,OAAO,cAAc,QAAQ,CAAC,MAAM,GAAG,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO;QACL,cAAc,EAAE,kBAAkB;QAClC,WAAW,EAAE,MAAM;QACnB,mBAAmB,EAAE,YAAY;QACjC,8EAA8E;QAC9E,2CAA2C,EAAE,MAAM;KACpD,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,oBAAoB,CAAA;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAA;IAE3C,OAAO;QACL,EAAE,EAAE,QAAQ;QAEZ,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,IAAY;YACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;gBACpC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;gBACpC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;aAC5G,CAAC,CAAA;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;YAE5D,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoD,CAAA;YACvF,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;iBAC9B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;iBACxE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;iBACxB,IAAI,CAAC,EAAE,CAAC,CAAA;YACX,IAAI,IAAI,KAAK,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;YACvE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,IAAY,EAAE,OAAgC;YACzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;gBACpC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;gBACpC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,UAAU,EAAE,SAAS;oBACrB,MAAM;oBACN,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBAC3C,MAAM,EAAE,IAAI;iBACb,CAAC;aACH,CAAC,CAAA;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC5D,IAAI,CAAC,QAAQ,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;YAEhF,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;gBACzC,MAAM,CAAC,GAAG,KAAoE,CAAA;gBAC9E,IAAI,CAAC,CAAC,IAAI,KAAK,qBAAqB,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBACvF,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;oBACpB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC,CAAC,CAAA;YACF,IAAI,IAAI,KAAK,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;YACvE,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC"}