@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,503 @@
1
+ import { cleanLines, extractProgramIds, groupText, isDeclarativesMarker, matchHeader, } from './source-lines.js';
2
+ const PROCEDURE_DIVISION_RE = /^\s*PROCEDURE\s+DIVISION/i;
3
+ const END_PROGRAM_RE = /^\s*END\s+PROGRAM\b/i;
4
+ const TERMINATES_G = /(?<![\w-])(?:STOP\s+RUN|GOBACK|EXIT\s+PROGRAM)(?![\w-])/gi;
5
+ // Un nombre de párrafo puede empezar por dígito (convención 0000-/1000-),
6
+ // así que los destinos aceptan letra o dígito inicial. Un destino que sea
7
+ // SOLO dígitos (`PERFORM 3 TIMES`) es un contador, no un nombre, y se
8
+ // descarta con isProcedureName.
9
+ const NAME = '[A-Za-z0-9][\\w-]*';
10
+ // PERFORM <destino> [THRU <destino>] [<n> TIMES] [UNTIL <cond>]
11
+ // Un PERFORM inline (PERFORM UNTIL/VARYING ... END-PERFORM) no tiene
12
+ // destino: el "target" capturado sería una palabra reservada y se
13
+ // descarta con INLINE_KEYWORDS. La condición UNTIL captura hasta el punto
14
+ // o el fin de línea (greedy) — una condición partida en varias líneas
15
+ // queda truncada a la primera, limitación aceptada del subconjunto.
16
+ const PERFORM_RE = new RegExp(`(?<![\\w-])PERFORM\\s+(${NAME})(?:\\s+(?:THRU|THROUGH)\\s+(${NAME}))?(?:\\s+(\\d+)\\s+TIMES)?(?:\\s+(UNTIL\\s+[^.]+))?`, 'dgi');
17
+ const INLINE_KEYWORDS = new Set(['UNTIL', 'VARYING', 'WITH', 'TEST', 'TIMES']);
18
+ const CALL_RE = /(?<![\w-])CALL\s+('[^']*'|"[^"]*"|[A-Za-z][\w-]*)/dgi;
19
+ const GO_TO_DEPENDING_RE = new RegExp(`(?<![\\w-])GO\\s+TO\\s+((?:${NAME}\\s+)+)DEPENDING\\s+ON\\s+([\\w-]+)`, 'gi');
20
+ const GO_TO_RE = new RegExp(`(?<![\\w-])GO\\s+TO\\s+(${NAME})`, 'gi');
21
+ // SORT/MERGE ... INPUT PROCEDURE IS <párrafo> [THRU <párrafo>]. Es una
22
+ // transferencia de control real: el compilador ejecuta ese rango por cada
23
+ // registro. Sin ella el párrafo aparece como isla en el diagrama.
24
+ const SORT_PROCEDURE_RE = new RegExp(`(?<![\\w-])(INPUT|OUTPUT)\\s+PROCEDURE\\s+(?:IS\\s+)?(${NAME})(?:\\s+(?:THRU|THROUGH)\\s+(${NAME}))?`, 'dgi');
25
+ /** Un destino de PERFORM/GO TO válido: un nombre, no un contador. Un token
26
+ * de solo dígitos es el `3` de `PERFORM 3 TIMES`, no un párrafo. */
27
+ function isProcedureName(token) {
28
+ return !/^\d+$/.test(token);
29
+ }
30
+ // ── Condicionales ───────────────────────────────────────────────────────
31
+ // El grafo sigue siendo de párrafos: un IF no crea nodo propio, sino que
32
+ // *guarda* las aristas que caen dentro de su rama. Eso es lo verificable
33
+ // ("este PERFORM solo ocurre si WS-TIPO = 'A'"); un nodo de decisión con
34
+ // sus dos salidas sería una estructura que el fuente no declara y que
35
+ // habría que inventar párrafo a párrafo (ADR-0003).
36
+ // Las frases de manejo (AT END, INVALID KEY, ON SIZE ERROR…) son ramas
37
+ // igual que un ELSE: lo que cuelga de ellas solo ocurre si la condición se
38
+ // da. Sin tratarlas, un `PERFORM FIN-PARA` bajo un AT END se leería como
39
+ // incondicional. Las alternativas van de más larga a más corta.
40
+ const HANDLER_ALTERNATIVES = [
41
+ 'NOT\\s+AT\\s+END-OF-PAGE',
42
+ 'NOT\\s+AT\\s+EOP',
43
+ 'AT\\s+END-OF-PAGE',
44
+ 'AT\\s+EOP',
45
+ 'NOT\\s+AT\\s+END',
46
+ 'AT\\s+END',
47
+ 'NOT\\s+INVALID\\s+KEY',
48
+ 'INVALID\\s+KEY',
49
+ 'NOT\\s+ON\\s+SIZE\\s+ERROR',
50
+ 'ON\\s+SIZE\\s+ERROR',
51
+ 'NOT\\s+ON\\s+OVERFLOW',
52
+ 'ON\\s+OVERFLOW',
53
+ 'NOT\\s+ON\\s+EXCEPTION',
54
+ 'ON\\s+EXCEPTION',
55
+ ].join('|');
56
+ // Terminadores de ámbito de las sentencias que admiten manejadores.
57
+ const SCOPE_END_ALTERNATIVES = 'END-READ|END-WRITE|END-REWRITE|END-DELETE|END-START|END-ADD|END-SUBTRACT|END-MULTIPLY|END-DIVIDE|END-COMPUTE|END-STRING|END-UNSTRING|END-CALL|END-RETURN';
58
+ const CONTROL_RE = new RegExp(`(?<![\\w-])(END-EVALUATE|END-PERFORM|END-IF|${SCOPE_END_ALTERNATIVES}|${HANDLER_ALTERNATIVES}|EVALUATE|PERFORM|ELSE|WHEN|IF)(?![\\w-])`, 'gi');
59
+ const HANDLER_TOKEN_RE = new RegExp(`^(?:${HANDLER_ALTERNATIVES})$`, 'i');
60
+ const SCOPE_END_TOKEN_RE = new RegExp(`^(?:${SCOPE_END_ALTERNATIVES})$`, 'i');
61
+ // Lo que puede seguir a PERFORM en un bucle en línea (sin destino).
62
+ const INLINE_PERFORM_HEAD_RE = /^\s*(UNTIL|VARYING|WITH\s+TEST|FOREVER|\d+\s+TIMES)(?![\w-])/i;
63
+ // El texto de una condición termina donde empieza el primer verbo: en
64
+ // COBOL no hay separador entre "IF <cond>" y la sentencia que gobierna.
65
+ const VERB_RE = /(?<![\w-])(PERFORM|CALL|GO|MOVE|ADD|SUBTRACT|MULTIPLY|DIVIDE|COMPUTE|DISPLAY|ACCEPT|READ|WRITE|REWRITE|DELETE|OPEN|CLOSE|START|SET|STRING|UNSTRING|INSPECT|INITIALIZE|EXEC|CONTINUE|EXIT|STOP|GOBACK|SEARCH|SORT|RETURN|RELEASE|CANCEL|MERGE|NEXT|UNLOCK)(?![\w-])/gi;
66
+ // Un punto cierra la sentencia y con ella TODOS los IF/EVALUATE abiertos
67
+ // sin terminador explícito. El lookahead evita confundirlo con el punto
68
+ // decimal de un literal numérico (MOVE 1.5 TO ...).
69
+ const PERIOD_RE = /\.(?![0-9])/g;
70
+ function tidyCondition(text) {
71
+ return text.replace(/\s+/g, ' ').replace(/\.\s*$/, '').trim();
72
+ }
73
+ function whenGuard(subject, value) {
74
+ if (value.toUpperCase() === 'OTHER')
75
+ return 'WHEN OTHER';
76
+ if (subject === '' || subject.toUpperCase() === 'TRUE')
77
+ return value;
78
+ return `${subject} = ${value}`;
79
+ }
80
+ /**
81
+ * Extrae los hechos de flujo de la PROCEDURE DIVISION: párrafos/secciones
82
+ * en orden de fuente y aristas PERFORM/CALL/GO TO, cada una anclada a la
83
+ * línea donde aparece. Todo lo no verificable se marca, no se rellena:
84
+ * un CALL con variable es `dynamic` (el destino real solo se conoce en
85
+ * ejecución), un destino que no existe en el fuente va a `missingTargets`,
86
+ * y un fuente sin cabecera PROCEDURE DIVISION queda como `fragment`.
87
+ */
88
+ export function parseFlow(source) {
89
+ const cleaned = cleanLines(source);
90
+ // Todos los PROGRAM-ID del fuente: el primero es este programa, los
91
+ // demás son programas anidados dentro de él.
92
+ const programIds = extractProgramIds(cleaned);
93
+ const programId = programIds[0]?.name;
94
+ const nestedPrograms = programIds.slice(1).map(p => p.name);
95
+ const nestedFrom = programIds[1]?.line;
96
+ let lines;
97
+ let fragment = false;
98
+ const headerIndex = cleaned.findIndex(l => PROCEDURE_DIVISION_RE.test(l.body));
99
+ if (headerIndex === -1) {
100
+ lines = cleaned;
101
+ fragment = true;
102
+ }
103
+ else {
104
+ let start = headerIndex + 1;
105
+ // PROCEDURE DIVISION USING ... puede continuar en más líneas hasta el
106
+ // punto final; nada de eso son sentencias.
107
+ if (!/\.\s*$/.test(cleaned[headerIndex].body)) {
108
+ while (start < cleaned.length && !/\.\s*$/.test(cleaned[start].body))
109
+ start++;
110
+ start++;
111
+ }
112
+ lines = cleaned.slice(start);
113
+ }
114
+ const paragraphs = [];
115
+ const edges = [];
116
+ let currentSection;
117
+ let current;
118
+ let inDeclaratives = false;
119
+ // Párrafos que contienen una transferencia de control incondicional:
120
+ // quien llegue a ellos NO sigue en el párrafo siguiente.
121
+ const cutsFlow = new Set();
122
+ // Línea de la cabecera de cada párrafo, para anclar la caída natural.
123
+ const headerLine = new Map();
124
+ const ensureCurrent = () => {
125
+ if (current)
126
+ return current;
127
+ // Sentencias antes del primer párrafo declarado: nodo de entrada
128
+ // sintético, marcado como implicit para no hacerlo pasar por un
129
+ // párrafo real del fuente.
130
+ const entry = { name: programId ?? 'MAIN', kind: 'paragraph', implicit: true };
131
+ paragraphs.push(entry);
132
+ current = entry;
133
+ return entry;
134
+ };
135
+ // Pila de IF/EVALUATE abiertos y, si una condición se parte en varias
136
+ // líneas, qué fragmento se está acumulando.
137
+ const frames = [];
138
+ let collecting;
139
+ const activeGuards = () => frames.map(f => f.guard).filter((g) => g !== undefined && g !== '');
140
+ const refreshGuard = (f) => {
141
+ if (f.kind === 'if') {
142
+ f.guard = f.head === '' ? undefined : f.head;
143
+ }
144
+ else if (f.kind === 'loop') {
145
+ // Prefijo explícito: la guarda de un bucle no es una condición de
146
+ // "solo si", sino de "en cada vuelta". Distinguirlo evita leer
147
+ // `[VARYING ...]` como si fuera un IF.
148
+ f.guard = f.head === '' ? 'en bucle' : `en bucle (${f.head})`;
149
+ }
150
+ else if (f.kind === 'evaluate' && f.whenParts && f.whenParts.length > 0) {
151
+ f.guard = f.whenParts.map(v => whenGuard(f.head, tidyCondition(v))).join(' OR ');
152
+ }
153
+ };
154
+ /** Desapila hasta el frame abierto más cercano del tipo pedido, incluido */
155
+ const closeFrame = (kind) => {
156
+ for (let i = frames.length - 1; i >= 0; i--) {
157
+ if (frames[i].kind === kind) {
158
+ frames.length = i;
159
+ return;
160
+ }
161
+ }
162
+ };
163
+ /** El frame abierto más cercano del tipo pedido, cerrando los de dentro */
164
+ const innermost = (kind) => {
165
+ for (let i = frames.length - 1; i >= 0; i--) {
166
+ if (frames[i].kind === kind) {
167
+ frames.length = i + 1;
168
+ return frames[i];
169
+ }
170
+ }
171
+ return undefined;
172
+ };
173
+ for (const { body, masked, line } of lines) {
174
+ if (END_PROGRAM_RE.test(masked))
175
+ break;
176
+ // Un segundo PROGRAM-ID abre un programa anidado: sus párrafos no son
177
+ // de este programa y mezclarlos daría un flujo que no existe. Se corta
178
+ // aquí y el anidado se declara como límite, no se parsea a medias.
179
+ if (nestedFrom !== undefined && line >= nestedFrom)
180
+ break;
181
+ if (isDeclarativesMarker(masked)) {
182
+ inDeclaratives = !/END-DECLARATIVES/i.test(masked);
183
+ continue;
184
+ }
185
+ const header = matchHeader(masked);
186
+ if (header) {
187
+ const para = {
188
+ name: header.name,
189
+ kind: header.kind,
190
+ ...(header.kind === 'paragraph' && currentSection ? { section: currentSection } : {}),
191
+ ...(inDeclaratives ? { inDeclaratives: true } : {}),
192
+ line,
193
+ };
194
+ paragraphs.push(para);
195
+ headerLine.set(para, line);
196
+ if (header.kind === 'section')
197
+ currentSection = header.name;
198
+ current = para;
199
+ // Un párrafo nuevo siempre viene tras un punto: nada queda abierto.
200
+ frames.length = 0;
201
+ collecting = undefined;
202
+ continue;
203
+ }
204
+ const owner = ensureCurrent();
205
+ // Posiciones donde termina el texto de una condición: el primer
206
+ // token de control o el primer verbo que aparezca a partir de ahí.
207
+ const stops = [];
208
+ for (const m of masked.matchAll(CONTROL_RE))
209
+ stops.push(m.index);
210
+ for (const m of masked.matchAll(VERB_RE))
211
+ stops.push(m.index);
212
+ stops.sort((a, b) => a - b);
213
+ const boundaryFrom = (from) => {
214
+ for (const s of stops)
215
+ if (s >= from)
216
+ return s;
217
+ return masked.length;
218
+ };
219
+ // Continuación de una condición partida en varias líneas: el texto
220
+ // anterior al primer verbo/control de esta línea todavía es condición.
221
+ if (collecting) {
222
+ const stop = boundaryFrom(0);
223
+ const chunk = tidyCondition(body.slice(0, stop));
224
+ if (chunk !== '') {
225
+ const f = collecting.frame;
226
+ if (collecting.role === 'when' && f.whenParts && f.whenParts.length > 0) {
227
+ f.whenParts[f.whenParts.length - 1] += ' ' + chunk;
228
+ }
229
+ else {
230
+ f.head = tidyCondition(`${f.head} ${chunk}`);
231
+ }
232
+ refreshGuard(f);
233
+ }
234
+ if (stop < masked.length)
235
+ collecting = undefined;
236
+ }
237
+ const events = [];
238
+ for (const m of masked.matchAll(CONTROL_RE)) {
239
+ events.push({
240
+ at: m.index,
241
+ rank: 0,
242
+ kind: 'control',
243
+ token: m[1].toUpperCase().replace(/\s+/g, ' '),
244
+ end: m.index + m[0].length,
245
+ });
246
+ }
247
+ for (const m of masked.matchAll(VERB_RE)) {
248
+ events.push({ at: m.index, rank: 2, kind: 'verb' });
249
+ }
250
+ for (const m of masked.matchAll(TERMINATES_G)) {
251
+ events.push({ at: m.index, rank: 1, kind: 'terminate' });
252
+ }
253
+ for (const m of masked.matchAll(PERIOD_RE)) {
254
+ events.push({ at: m.index, rank: 3, kind: 'period' });
255
+ }
256
+ // SORT/MERGE ... INPUT/OUTPUT PROCEDURE: transferencia de control a un
257
+ // párrafo (o rango THRU), igual de real que un PERFORM.
258
+ for (const m of masked.matchAll(SORT_PROCEDURE_RE)) {
259
+ if (!isProcedureName(m[2]))
260
+ continue;
261
+ const kind = m[1].toUpperCase() === 'INPUT' ? 'sort-input' : 'sort-output';
262
+ events.push({
263
+ at: m.index,
264
+ rank: 1,
265
+ kind: 'edge',
266
+ edge: {
267
+ from: owner.name,
268
+ to: m[2],
269
+ kind,
270
+ ...(m[3] ? { thru: m[3] } : {}),
271
+ line,
272
+ },
273
+ });
274
+ }
275
+ for (const m of masked.matchAll(PERFORM_RE)) {
276
+ const target = m[1];
277
+ if (INLINE_KEYWORDS.has(target.toUpperCase()))
278
+ continue;
279
+ // `PERFORM 3 TIMES`: el "3" es el contador, no un párrafo destino.
280
+ if (!isProcedureName(target))
281
+ continue;
282
+ const condition = groupText(m, 4, body);
283
+ events.push({
284
+ at: m.index,
285
+ rank: 1,
286
+ kind: 'edge',
287
+ edge: {
288
+ from: owner.name,
289
+ to: target,
290
+ kind: 'perform',
291
+ ...(m[2] ? { thru: m[2] } : {}),
292
+ ...(m[3] ? { times: Number(m[3]) } : {}),
293
+ ...(condition ? { condition: condition.trim() } : {}),
294
+ line,
295
+ },
296
+ });
297
+ }
298
+ for (const m of masked.matchAll(CALL_RE)) {
299
+ // El target se recupera del body original: en masked el interior
300
+ // del literal está en blanco.
301
+ const rawTarget = groupText(m, 1, body);
302
+ const isLiteral = rawTarget.startsWith("'") || rawTarget.startsWith('"');
303
+ events.push({
304
+ at: m.index,
305
+ rank: 1,
306
+ kind: 'edge',
307
+ edge: {
308
+ from: owner.name,
309
+ to: isLiteral ? rawTarget.slice(1, -1) : rawTarget,
310
+ kind: 'call',
311
+ ...(isLiteral ? {} : { dynamic: true }),
312
+ line,
313
+ },
314
+ });
315
+ }
316
+ const depMatches = [...masked.matchAll(GO_TO_DEPENDING_RE)];
317
+ for (const m of depMatches) {
318
+ const targets = m[1].trim().split(/\s+/);
319
+ for (const target of targets) {
320
+ if (!isProcedureName(target))
321
+ continue;
322
+ events.push({
323
+ at: m.index,
324
+ rank: 1,
325
+ kind: 'edge',
326
+ edge: { from: owner.name, to: target, kind: 'goto', condition: `DEPENDING ON ${m[2]}`, line },
327
+ });
328
+ }
329
+ }
330
+ if (depMatches.length === 0) {
331
+ for (const m of masked.matchAll(GO_TO_RE)) {
332
+ if (!isProcedureName(m[1]))
333
+ continue;
334
+ events.push({
335
+ at: m.index,
336
+ rank: 1,
337
+ kind: 'edge',
338
+ edge: { from: owner.name, to: m[1], kind: 'goto', line },
339
+ });
340
+ }
341
+ }
342
+ events.sort((a, b) => a.at - b.at || a.rank - b.rank);
343
+ for (const ev of events) {
344
+ if (ev.kind === 'period') {
345
+ // El punto cierra la sentencia: todos los IF/EVALUATE sin
346
+ // terminador explícito quedan cerrados con ella.
347
+ frames.length = 0;
348
+ collecting = undefined;
349
+ continue;
350
+ }
351
+ if (ev.kind === 'verb') {
352
+ const top = frames[frames.length - 1];
353
+ if (top?.kind === 'evaluate')
354
+ top.whenOpen = false;
355
+ continue;
356
+ }
357
+ if (ev.kind === 'terminate') {
358
+ owner.terminates = true;
359
+ // Un STOP RUN/GOBACK/EXIT PROGRAM fuera de toda rama corta el
360
+ // flujo: quien llega aquí no sigue en el párrafo siguiente.
361
+ if (activeGuards().length === 0)
362
+ cutsFlow.add(owner);
363
+ continue;
364
+ }
365
+ if (ev.kind === 'edge') {
366
+ const guards = activeGuards();
367
+ edges.push(guards.length > 0 ? { ...ev.edge, guards } : ev.edge);
368
+ // Un GO TO incondicional (no DEPENDING, sin guarda) es una
369
+ // transferencia de control: el párrafo no cae en el siguiente.
370
+ if (ev.edge.kind === 'goto' && guards.length === 0 && !ev.edge.condition) {
371
+ cutsFlow.add(owner);
372
+ }
373
+ continue;
374
+ }
375
+ const text = tidyCondition(body.slice(ev.end, boundaryFrom(ev.end)));
376
+ const openEnded = boundaryFrom(ev.end) >= masked.length;
377
+ switch (ev.token) {
378
+ case 'IF': {
379
+ const frame = { kind: 'if', head: text };
380
+ refreshGuard(frame);
381
+ frames.push(frame);
382
+ if (openEnded)
383
+ collecting = { frame, role: 'if' };
384
+ break;
385
+ }
386
+ case 'ELSE': {
387
+ const frame = innermost('if');
388
+ // Sin condición legible (partida de forma que el subconjunto no
389
+ // cubre) se etiqueta la rama por lo que es, no se inventa texto.
390
+ if (frame)
391
+ frame.guard = frame.head === '' ? 'ELSE' : `NOT (${frame.head})`;
392
+ collecting = undefined;
393
+ break;
394
+ }
395
+ case 'END-IF': {
396
+ closeFrame('if');
397
+ collecting = undefined;
398
+ break;
399
+ }
400
+ case 'EVALUATE': {
401
+ const frame = { kind: 'evaluate', head: text, whenParts: [] };
402
+ frames.push(frame);
403
+ if (openEnded)
404
+ collecting = { frame, role: 'evaluate' };
405
+ break;
406
+ }
407
+ case 'WHEN': {
408
+ // Un WHEN fuera de un EVALUATE (SEARCH ... WHEN) no se guarda:
409
+ // el subconjunto no cubre SEARCH y no se inventa una rama.
410
+ const frame = innermost('evaluate');
411
+ if (!frame)
412
+ break;
413
+ if (frame.whenOpen && frame.whenParts && frame.whenParts.length > 0) {
414
+ frame.whenParts.push(text);
415
+ }
416
+ else {
417
+ frame.whenParts = [text];
418
+ frame.whenOpen = true;
419
+ }
420
+ refreshGuard(frame);
421
+ if (openEnded)
422
+ collecting = { frame, role: 'when' };
423
+ break;
424
+ }
425
+ case 'END-EVALUATE': {
426
+ closeFrame('evaluate');
427
+ collecting = undefined;
428
+ break;
429
+ }
430
+ case 'PERFORM': {
431
+ // Un PERFORM en línea (PERFORM UNTIL/VARYING/n TIMES/FOREVER sin
432
+ // destino) abre un bucle: lo que cuelga de él se repite. Un
433
+ // PERFORM con destino no abre nada — su arista la crea PERFORM_RE.
434
+ if (INLINE_PERFORM_HEAD_RE.test(body.slice(ev.end))) {
435
+ const frame = { kind: 'loop', head: text };
436
+ refreshGuard(frame);
437
+ frames.push(frame);
438
+ if (openEnded)
439
+ collecting = { frame, role: 'if' };
440
+ }
441
+ break;
442
+ }
443
+ case 'END-PERFORM': {
444
+ closeFrame('loop');
445
+ collecting = undefined;
446
+ break;
447
+ }
448
+ default: {
449
+ if (HANDLER_TOKEN_RE.test(ev.token)) {
450
+ // AT END / INVALID KEY / ON SIZE ERROR y sus NOT: ramas de la
451
+ // sentencia de E/S o aritmética. Un segundo manejador (NOT AT
452
+ // END tras AT END) sustituye al anterior, como un ELSE.
453
+ if (frames[frames.length - 1]?.kind === 'handler')
454
+ frames.pop();
455
+ const frame = { kind: 'handler', head: ev.token, guard: ev.token };
456
+ frames.push(frame);
457
+ }
458
+ else if (SCOPE_END_TOKEN_RE.test(ev.token)) {
459
+ closeFrame('handler');
460
+ collecting = undefined;
461
+ }
462
+ break;
463
+ }
464
+ }
465
+ }
466
+ }
467
+ // Caída natural: un párrafo que no corta el flujo continúa en el
468
+ // siguiente por orden de fuente. Es EL malentendido clásico del que
469
+ // hereda COBOL, así que se dibuja explícito. No cruza la frontera de
470
+ // DECLARATIVES (los manejadores no se ejecutan en línea con el cuerpo).
471
+ const fallEdges = [];
472
+ for (let i = 0; i < paragraphs.length - 1; i++) {
473
+ const from = paragraphs[i];
474
+ const to = paragraphs[i + 1];
475
+ if (cutsFlow.has(from))
476
+ continue;
477
+ if ((from.inDeclaratives ?? false) !== (to.inDeclaratives ?? false))
478
+ continue;
479
+ from.fallsThrough = true;
480
+ fallEdges.push({ from: from.name, to: to.name, kind: 'fall-through', line: headerLine.get(to) ?? 0 });
481
+ }
482
+ edges.push(...fallEdges);
483
+ const defined = new Set(paragraphs.map(p => p.name.toUpperCase()));
484
+ const missingTargets = [];
485
+ for (const edge of edges) {
486
+ if (edge.kind === 'call')
487
+ continue; // el destino de CALL es otro programa, no un párrafo
488
+ for (const target of [edge.to, edge.thru]) {
489
+ if (target && !defined.has(target.toUpperCase()) && !missingTargets.includes(target)) {
490
+ missingTargets.push(target);
491
+ }
492
+ }
493
+ }
494
+ return {
495
+ ...(programId ? { programId } : {}),
496
+ paragraphs,
497
+ edges,
498
+ missingTargets,
499
+ nestedPrograms,
500
+ fragment,
501
+ };
502
+ }
503
+ //# sourceMappingURL=flow-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-parser.js","sourceRoot":"","sources":["../src/flow-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Glosario COBOL — capa determinista, no generada por IA.
3
+ *
4
+ * Es el diferenciador: mientras la explicación de UN programa cambia con
5
+ * cada fuente y la produce el LLM, "qué significa COMP-3" es siempre lo
6
+ * mismo y lo escribimos una vez. Ventajas: coste y latencia cero, nunca
7
+ * alucina, y la calidad la garantizas tú, no un modelo.
8
+ *
9
+ * Cada entrada tiene:
10
+ * - `short`: una línea para el tooltip (el 80% de las dudas se resuelven aquí).
11
+ * - `what` / `why` / `gotcha`: la ficha completa que aparece en el cajón.
12
+ * - `example`: código real, corto, que ilustra la idea.
13
+ * - `pattern`: cómo detectar el término en un texto ya escrito.
14
+ *
15
+ * El orden en el que aparecen aquí determina la precedencia de detección:
16
+ * las alternativas más largas van antes para que "PIC X" no gane a "PIC".
17
+ */
18
+ export interface GlossaryEntry {
19
+ id: string;
20
+ term: string;
21
+ /** Subtítulo bajo el nombre en el cajón */
22
+ sub: string;
23
+ /** Una línea para el hover */
24
+ short: string;
25
+ /** Párrafo "Qué es" */
26
+ what: string;
27
+ /** Párrafo "Por qué existe" */
28
+ why: string;
29
+ /** Aviso al mantenedor (opcional) */
30
+ gotcha?: string;
31
+ /** Ejemplo COBOL corto */
32
+ example: string;
33
+ /** Detección en texto libre; word-boundary de COBOL (respeta guiones) */
34
+ pattern: RegExp;
35
+ }
36
+ export declare const GLOSSARY: readonly GlossaryEntry[];
37
+ /** Un segmento de texto: o es texto plano, o casa con un término del glosario. */
38
+ export type Segment = {
39
+ text: string;
40
+ term?: GlossaryEntry | undefined;
41
+ };
42
+ /** Índice por id para el cajón (busca la ficha completa por su clave). */
43
+ export declare const GLOSSARY_BY_ID: Readonly<Record<string, GlossaryEntry>>;
44
+ /**
45
+ * Trocea un texto en segmentos, marcando los que casan con un término del
46
+ * glosario. Los patrones más específicos ganan a los más generales (`COMP-3`
47
+ * antes que `COMP`) porque están antes en el array.
48
+ *
49
+ * Un mismo trozo del texto NO puede casar con dos términos: en cuanto un
50
+ * carácter queda cubierto por un match, los demás no lo tocan. Sin eso,
51
+ * "COMP-3" abriría el tooltip de "COMP-3" pero también el de "COMP" al
52
+ * pasar por sus cuatro primeras letras.
53
+ */
54
+ export declare function segmentText(text: string): Segment[];