@semacode/cli 1.5.16 → 1.5.18

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 (181) hide show
  1. package/AGENTS.md +272 -0
  2. package/LICENSE +22 -0
  3. package/README.md +104 -112
  4. package/SEMA_BRIEF.curto.txt +9 -0
  5. package/SEMA_BRIEF.md +63 -0
  6. package/SEMA_BRIEF.micro.txt +7 -0
  7. package/SEMA_INDEX.json +783 -0
  8. package/dist/angular-consumer-standalone.d.ts +6 -0
  9. package/dist/angular-consumer-standalone.js.map +1 -0
  10. package/dist/cpp-symbols.d.ts +10 -0
  11. package/dist/cpp-symbols.js.map +1 -0
  12. package/dist/docs.d.ts +56 -0
  13. package/dist/docs.js.map +1 -0
  14. package/dist/dotnet-http.d.ts +23 -0
  15. package/dist/dotnet-http.js.map +1 -0
  16. package/dist/drift.d.ts +225 -0
  17. package/dist/drift.js +5 -111
  18. package/dist/drift.js.map +1 -0
  19. package/dist/go-http.d.ts +23 -0
  20. package/dist/go-http.js.map +1 -0
  21. package/dist/importador.d.ts +31 -0
  22. package/dist/importador.js +1 -200
  23. package/dist/importador.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.js +59 -479
  26. package/dist/index.js.map +1 -0
  27. package/dist/java-http.d.ts +23 -0
  28. package/dist/java-http.js.map +1 -0
  29. package/dist/lua-symbols.d.ts +10 -0
  30. package/dist/lua-symbols.js.map +1 -0
  31. package/dist/php-symbols.d.ts +24 -0
  32. package/dist/php-symbols.js.map +1 -0
  33. package/dist/projeto.d.ts +53 -0
  34. package/dist/projeto.js +0 -20
  35. package/dist/projeto.js.map +1 -0
  36. package/dist/python-http.d.ts +23 -0
  37. package/dist/python-http.js.map +1 -0
  38. package/dist/rust-http.d.ts +23 -0
  39. package/dist/rust-http.js.map +1 -0
  40. package/dist/tipos.d.ts +3 -0
  41. package/dist/tipos.js.map +1 -0
  42. package/dist/typescript-http.d.ts +35 -0
  43. package/dist/typescript-http.js.map +1 -0
  44. package/docs/AGENT_STARTER.md +103 -0
  45. package/docs/cli.md +106 -0
  46. package/docs/como-ensinar-a-sema-para-ia.md +149 -0
  47. package/docs/deploy.md +70 -0
  48. package/docs/documentacao.md +63 -0
  49. package/docs/env.md +56 -0
  50. package/docs/extensao-vscode.md +45 -0
  51. package/docs/fluxo-pratico-ia-sema.md +181 -0
  52. package/docs/instalacao-e-primeiro-uso.md +112 -0
  53. package/docs/integracao-com-ia.md +103 -0
  54. package/docs/mcp.md +51 -0
  55. package/docs/pagamento-ponta-a-ponta.md +165 -0
  56. package/docs/persistencia-vendor-first.md +145 -0
  57. package/docs/prompt-base-ia-sema.md +105 -0
  58. package/docs/rollback.md +47 -0
  59. package/docs/sintaxe.md +212 -0
  60. package/exemplos/agendamento.sema +105 -0
  61. package/exemplos/assinatura.sema +133 -0
  62. package/exemplos/auditoria.sema +89 -0
  63. package/exemplos/autenticacao.sema +125 -0
  64. package/exemplos/automacao.sema +107 -0
  65. package/exemplos/cadastro_usuario.sema +54 -0
  66. package/exemplos/calculadora.sema +78 -0
  67. package/exemplos/crud_simples.sema +89 -0
  68. package/exemplos/estoque.sema +127 -0
  69. package/exemplos/exportacao.sema +94 -0
  70. package/exemplos/fila.sema +130 -0
  71. package/exemplos/integracao_externa.sema +94 -0
  72. package/exemplos/multi_tenant.sema +140 -0
  73. package/exemplos/notificacao.sema +149 -0
  74. package/exemplos/operacao_estrategia.sema +633 -0
  75. package/exemplos/pagamento.sema +434 -0
  76. package/exemplos/pagamento_dominio.sema +35 -0
  77. package/exemplos/pedido.sema +255 -0
  78. package/exemplos/permissao.sema +121 -0
  79. package/exemplos/persistencia_vendor_first.sema +86 -0
  80. package/exemplos/relatorio.sema +93 -0
  81. package/exemplos/replica_analitica_erp.sema +160 -0
  82. package/exemplos/testes_embutidos.sema +45 -0
  83. package/exemplos/tratamento_erro.sema +157 -0
  84. package/exemplos/upload_arquivo.sema +93 -0
  85. package/exemplos/webhook.sema +94 -0
  86. package/llms-full.txt +34 -0
  87. package/llms.txt +17 -0
  88. package/node_modules/@sema/gerador-css/dist/index.d.ts +3 -0
  89. package/node_modules/@sema/gerador-css/dist/index.js +592 -0
  90. package/node_modules/@sema/gerador-css/dist/index.js.map +1 -0
  91. package/node_modules/@sema/gerador-css/package.json +7 -0
  92. package/node_modules/@sema/gerador-dart/dist/index.d.ts +3 -0
  93. package/node_modules/@sema/gerador-dart/dist/index.js +44 -0
  94. package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -0
  95. package/node_modules/@sema/gerador-dart/package.json +7 -0
  96. package/node_modules/@sema/gerador-html/dist/index.d.ts +3 -0
  97. package/node_modules/@sema/gerador-html/dist/index.js +163 -0
  98. package/node_modules/@sema/gerador-html/dist/index.js.map +1 -0
  99. package/node_modules/@sema/gerador-html/package.json +7 -0
  100. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +3 -0
  101. package/node_modules/@sema/gerador-javascript/dist/index.js +421 -0
  102. package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -0
  103. package/node_modules/@sema/gerador-javascript/package.json +7 -0
  104. package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
  105. package/node_modules/@sema/gerador-lua/dist/index.js +328 -0
  106. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
  107. package/node_modules/@sema/gerador-lua/package.json +7 -0
  108. package/node_modules/@sema/gerador-python/dist/index.d.ts +6 -0
  109. package/node_modules/@sema/gerador-python/dist/index.js +729 -0
  110. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -0
  111. package/node_modules/@sema/gerador-python/package.json +7 -0
  112. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +6 -0
  113. package/node_modules/@sema/gerador-typescript/dist/index.js +793 -0
  114. package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -0
  115. package/node_modules/@sema/gerador-typescript/package.json +7 -0
  116. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +123 -0
  117. package/node_modules/@sema/nucleo/dist/ast/tipos.js +2 -0
  118. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +1 -0
  119. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +21 -0
  120. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +12 -0
  121. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +1 -0
  122. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +9 -0
  123. package/node_modules/@sema/nucleo/dist/formatador/index.js +460 -0
  124. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -0
  125. package/node_modules/@sema/nucleo/dist/index.d.ts +35 -0
  126. package/node_modules/@sema/nucleo/dist/index.js +96 -0
  127. package/node_modules/@sema/nucleo/dist/index.js.map +1 -0
  128. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +5 -0
  129. package/node_modules/@sema/nucleo/dist/ir/conversor.js +877 -0
  130. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -0
  131. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +345 -0
  132. package/node_modules/@sema/nucleo/dist/ir/modelos.js +2 -0
  133. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +1 -0
  134. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +7 -0
  135. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +122 -0
  136. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -0
  137. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +8 -0
  138. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +61 -0
  139. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -0
  140. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +9 -0
  141. package/node_modules/@sema/nucleo/dist/parser/parser.js +767 -0
  142. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -0
  143. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +39 -0
  144. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +294 -0
  145. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +1 -0
  146. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +59 -0
  147. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1681 -0
  148. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -0
  149. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +106 -0
  150. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +475 -0
  151. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -0
  152. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +91 -0
  153. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +258 -0
  154. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +1 -0
  155. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +2 -0
  156. package/node_modules/@sema/nucleo/dist/util/arquivos.js +25 -0
  157. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +1 -0
  158. package/node_modules/@sema/nucleo/package.json +7 -0
  159. package/node_modules/@sema/padroes/dist/index.d.ts +25 -0
  160. package/node_modules/@sema/padroes/dist/index.js +316 -0
  161. package/node_modules/@sema/padroes/dist/index.js.map +1 -0
  162. package/node_modules/@sema/padroes/package.json +7 -0
  163. package/package.json +32 -23
  164. package/semacode-cli-1.3.1.tgz +0 -0
  165. package/src/angular-consumer-standalone.ts +0 -312
  166. package/src/cpp-symbols.ts +0 -82
  167. package/src/docs.ts +0 -535
  168. package/src/dotnet-http.ts +0 -355
  169. package/src/drift.ts +0 -4933
  170. package/src/go-http.ts +0 -118
  171. package/src/importador.ts +0 -3891
  172. package/src/index.ts +0 -5641
  173. package/src/java-http.ts +0 -247
  174. package/src/lua-symbols.ts +0 -114
  175. package/src/php-symbols.ts +0 -462
  176. package/src/projeto.ts +0 -862
  177. package/src/python-http.ts +0 -258
  178. package/src/rust-http.ts +0 -125
  179. package/src/tipos.ts +0 -24
  180. package/src/typescript-http.ts +0 -1076
  181. package/tsconfig.json +0 -20
@@ -0,0 +1,877 @@
1
+ import { localizarCampoPersistencia, matrizCompatibilidadePersistencia, nomeTipoRecursoPersistencia, normalizarConsistenciaPersistencia, normalizarDurabilidadePersistencia, normalizarEngineBanco, normalizarModeloConsultaPersistencia, normalizarModeloTransacaoPersistencia, parsearBooleanoPersistencia, TIPOS_RECURSO_PERSISTENCIA, } from "../persistencia/contratos.js";
2
+ import { contratoDadosTemSensivel, extrairContratoAudit, extrairContratoAuth, extrairContratoAuthz, extrairContratoDados, extrairContratoForbidden, extrairContratoSegredos, efeitoEhPrivilegiado, } from "../semantico/seguranca.js";
3
+ import { parsearEfeitoSemantico, parsearEtapaFlow, parsearExpressaoSemantica, parsearTransicaoEstado } from "../semantico/estruturas.js";
4
+ const TIPOS_PRIMITIVOS = new Set([
5
+ "Texto",
6
+ "Numero",
7
+ "Inteiro",
8
+ "Decimal",
9
+ "Booleano",
10
+ "Data",
11
+ "DataHora",
12
+ "Timestamp",
13
+ "Id",
14
+ "Email",
15
+ "Url",
16
+ "Json",
17
+ "Objeto",
18
+ "Vazio",
19
+ ]);
20
+ function encontrarSubBloco(bloco, palavraChave) {
21
+ return bloco.blocos.find((subbloco) => subbloco.tipo === "bloco_generico" && subbloco.palavraChave === palavraChave);
22
+ }
23
+ function localizarCampo(bloco, ...nomes) {
24
+ return bloco?.campos.find((campo) => nomes.includes(campo.nome));
25
+ }
26
+ function valorCampoCompleto(campo) {
27
+ if (!campo) {
28
+ return undefined;
29
+ }
30
+ return [campo.valor, ...campo.modificadores].join(" ").trim() || undefined;
31
+ }
32
+ function normalizarTipoDeclarado(tipo) {
33
+ return tipo
34
+ .replace(/\s*([<>\[\](),|?])\s*/g, "$1")
35
+ .replace(/\s+/g, "")
36
+ .trim();
37
+ }
38
+ function dividirNoNivelRaiz(texto, separador) {
39
+ const partes = [];
40
+ let profundidadeAngular = 0;
41
+ let profundidadeColchete = 0;
42
+ let inicio = 0;
43
+ for (let indice = 0; indice < texto.length; indice += 1) {
44
+ const caractere = texto[indice];
45
+ if (caractere === "<") {
46
+ profundidadeAngular += 1;
47
+ continue;
48
+ }
49
+ if (caractere === ">") {
50
+ profundidadeAngular = Math.max(0, profundidadeAngular - 1);
51
+ continue;
52
+ }
53
+ if (caractere === "[") {
54
+ profundidadeColchete += 1;
55
+ continue;
56
+ }
57
+ if (caractere === "]") {
58
+ profundidadeColchete = Math.max(0, profundidadeColchete - 1);
59
+ continue;
60
+ }
61
+ if (profundidadeAngular === 0 && profundidadeColchete === 0 && texto.startsWith(separador, indice)) {
62
+ partes.push(texto.slice(inicio, indice));
63
+ inicio = indice + separador.length;
64
+ indice += separador.length - 1;
65
+ }
66
+ }
67
+ partes.push(texto.slice(inicio));
68
+ return partes.map((parte) => parte.trim()).filter(Boolean);
69
+ }
70
+ function analisarCampoTipo(tipo, modificadores) {
71
+ const tipoOriginal = normalizarTipoDeclarado(tipo);
72
+ const modificadoresNormalizados = modificadores.map((item) => item.trim()).filter(Boolean);
73
+ const refinamentos = modificadoresNormalizados.filter((item) => !["required", "optional", "opcional"].includes(item));
74
+ const opcionalPorModificador = modificadoresNormalizados.includes("optional") || modificadoresNormalizados.includes("opcional");
75
+ let tipoBase = tipoOriginal;
76
+ let cardinalidade = "unitario";
77
+ let tiposAlternativos = [];
78
+ let tipoItem;
79
+ let chaveMapa;
80
+ let valorMapa;
81
+ let opcional = opcionalPorModificador;
82
+ if (tipoBase.endsWith("?")) {
83
+ opcional = true;
84
+ tipoBase = tipoBase.slice(0, -1);
85
+ }
86
+ if (/^Opcional<.+>$/.test(tipoBase)) {
87
+ opcional = true;
88
+ tipoBase = tipoBase.slice("Opcional<".length, -1);
89
+ }
90
+ const uniao = dividirNoNivelRaiz(tipoBase, "|");
91
+ if (uniao.length > 1) {
92
+ cardinalidade = "uniao";
93
+ tiposAlternativos = uniao.map(normalizarTipoDeclarado);
94
+ tipoBase = tiposAlternativos[0] ?? tipoBase;
95
+ }
96
+ else if (/^Lista<.+>$/.test(tipoBase)) {
97
+ cardinalidade = "lista";
98
+ tipoItem = tipoBase.slice("Lista<".length, -1).trim();
99
+ tipoBase = tipoItem;
100
+ }
101
+ else if (/^Mapa<.+>$/.test(tipoBase)) {
102
+ cardinalidade = "mapa";
103
+ const partesMapa = dividirNoNivelRaiz(tipoBase.slice("Mapa<".length, -1), ",");
104
+ chaveMapa = partesMapa[0];
105
+ valorMapa = partesMapa[1];
106
+ tipoBase = valorMapa ?? tipoBase;
107
+ }
108
+ return {
109
+ tipo: tipoOriginal,
110
+ modificadores: modificadoresNormalizados,
111
+ tipoOriginal,
112
+ tipoBase,
113
+ cardinalidade,
114
+ opcional,
115
+ tiposAlternativos,
116
+ tipoItem,
117
+ chaveMapa,
118
+ valorMapa,
119
+ refinamentos,
120
+ };
121
+ }
122
+ function converterCampo(campo) {
123
+ return {
124
+ nome: campo.nome,
125
+ ...analisarCampoTipo(campo.valor, campo.modificadores),
126
+ };
127
+ }
128
+ function converterCampos(bloco) {
129
+ if (!bloco) {
130
+ return [];
131
+ }
132
+ return bloco.campos.map(converterCampo);
133
+ }
134
+ function converterBloco(bloco) {
135
+ return {
136
+ campos: converterCampos(bloco),
137
+ linhas: bloco?.linhas.map((linha) => linha.conteudo) ?? [],
138
+ blocos: (bloco?.blocos ?? [])
139
+ .filter((subbloco) => subbloco.tipo === "bloco_generico")
140
+ .map((subbloco) => ({
141
+ nome: subbloco.nome ?? subbloco.palavraChave,
142
+ conteudo: converterBloco(subbloco),
143
+ })),
144
+ };
145
+ }
146
+ function converterCaso(caso) {
147
+ return {
148
+ nome: caso.nome,
149
+ given: converterBloco(caso.given),
150
+ when: caso.when ? converterBloco(caso.when) : undefined,
151
+ expect: converterBloco(caso.expect),
152
+ error: caso.error ? converterBloco(caso.error) : undefined,
153
+ };
154
+ }
155
+ function coletarLinhasPersistencia(bloco, nome) {
156
+ if (!bloco) {
157
+ return [];
158
+ }
159
+ return encontrarSubBloco(bloco, nome)?.linhas.map((linha) => linha.conteudo) ?? [];
160
+ }
161
+ function resolverTipoRecursoPersistencia(bloco) {
162
+ const explicito = valorCampoCompleto(localizarCampoPersistencia(bloco, "resource_kind"));
163
+ if (explicito && TIPOS_RECURSO_PERSISTENCIA.has(explicito)) {
164
+ return explicito;
165
+ }
166
+ return nomeTipoRecursoPersistencia(bloco);
167
+ }
168
+ function converterCompatibilidadePersistencia(compatibilidades) {
169
+ return compatibilidades.map((item) => ({ ...item }));
170
+ }
171
+ function converterRecursoPersistencia(recurso) {
172
+ const resourceKind = resolverTipoRecursoPersistencia(recurso);
173
+ if (!resourceKind) {
174
+ return undefined;
175
+ }
176
+ const mode = valorCampoCompleto(localizarCampoPersistencia(recurso, "mode"));
177
+ const isolation = valorCampoCompleto(localizarCampoPersistencia(recurso, "isolation"));
178
+ return {
179
+ nome: recurso.nome ?? resourceKind,
180
+ resourceKind,
181
+ entity: valorCampoCompleto(localizarCampoPersistencia(recurso, "entity")),
182
+ collection: valorCampoCompleto(localizarCampoPersistencia(recurso, "collection")),
183
+ table: valorCampoCompleto(localizarCampoPersistencia(recurso, "table")),
184
+ consistency: normalizarConsistenciaPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "consistency")))
185
+ ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "consistency")),
186
+ durability: normalizarDurabilidadePersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "durability")))
187
+ ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "durability")),
188
+ transactionModel: normalizarModeloTransacaoPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "transaction_model")))
189
+ ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "transaction_model")),
190
+ queryModel: normalizarModeloConsultaPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "query_model")))
191
+ ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "query_model")),
192
+ mode,
193
+ isolation,
194
+ strategy: valorCampoCompleto(localizarCampoPersistencia(recurso, "strategy")),
195
+ ttl: valorCampoCompleto(localizarCampoPersistencia(recurso, "ttl")),
196
+ retention: valorCampoCompleto(localizarCampoPersistencia(recurso, "retention")),
197
+ path: valorCampoCompleto(localizarCampoPersistencia(recurso, "path")),
198
+ from: valorCampoCompleto(localizarCampoPersistencia(recurso, "from")),
199
+ to: valorCampoCompleto(localizarCampoPersistencia(recurso, "to")),
200
+ surface: valorCampoCompleto(localizarCampoPersistencia(recurso, "surface")),
201
+ adapter: valorCampoCompleto(localizarCampoPersistencia(recurso, "adapter")),
202
+ portavel: parsearBooleanoPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "portavel"))),
203
+ capabilities: coletarLinhasPersistencia(recurso, "capabilities"),
204
+ operations: coletarLinhasPersistencia(recurso, "operations"),
205
+ indexing: coletarLinhasPersistencia(recurso, "indexing"),
206
+ guarantees: coletarLinhasPersistencia(recurso, "guarantees"),
207
+ diagnostics: coletarLinhasPersistencia(recurso, "diagnostics"),
208
+ risks: coletarLinhasPersistencia(recurso, "risks"),
209
+ fields: converterCampos(recurso),
210
+ lines: recurso.linhas.map((linha) => linha.conteudo),
211
+ block: converterBloco(recurso),
212
+ compatibilidade: converterCompatibilidadePersistencia(matrizCompatibilidadePersistencia(resourceKind, { mode, isolation })),
213
+ };
214
+ }
215
+ function converterDatabase(database) {
216
+ return {
217
+ nome: database.nome ?? "database",
218
+ engine: normalizarEngineBanco(valorCampoCompleto(localizarCampoPersistencia(database, "engine"))),
219
+ schema: valorCampoCompleto(localizarCampoPersistencia(database, "schema")),
220
+ database: valorCampoCompleto(localizarCampoPersistencia(database, "database")),
221
+ consistency: normalizarConsistenciaPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "consistency")))
222
+ ?? valorCampoCompleto(localizarCampoPersistencia(database, "consistency")),
223
+ durability: normalizarDurabilidadePersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "durability")))
224
+ ?? valorCampoCompleto(localizarCampoPersistencia(database, "durability")),
225
+ transactionModel: normalizarModeloTransacaoPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "transaction_model")))
226
+ ?? valorCampoCompleto(localizarCampoPersistencia(database, "transaction_model")),
227
+ queryModel: normalizarModeloConsultaPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "query_model")))
228
+ ?? valorCampoCompleto(localizarCampoPersistencia(database, "query_model")),
229
+ portavel: parsearBooleanoPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "portavel"))),
230
+ adapter: valorCampoCompleto(localizarCampoPersistencia(database, "adapter")),
231
+ capabilities: coletarLinhasPersistencia(database, "capabilities"),
232
+ operations: coletarLinhasPersistencia(database, "operations"),
233
+ indexing: coletarLinhasPersistencia(database, "indexing"),
234
+ guarantees: coletarLinhasPersistencia(database, "guarantees"),
235
+ diagnostics: coletarLinhasPersistencia(database, "diagnostics"),
236
+ risks: coletarLinhasPersistencia(database, "risks"),
237
+ fields: converterCampos(database),
238
+ lines: database.linhas.map((linha) => linha.conteudo),
239
+ block: converterBloco(database),
240
+ resources: database.blocos
241
+ .filter((bloco) => bloco.tipo === "bloco_generico")
242
+ .map(converterRecursoPersistencia)
243
+ .filter((item) => Boolean(item)),
244
+ };
245
+ }
246
+ function converterImplementacoes(bloco) {
247
+ const implementacoes = [];
248
+ for (const campo of bloco?.campos ?? []) {
249
+ const origem = campo.nome.toLowerCase();
250
+ if (origem === "ts" || origem === "typescript") {
251
+ implementacoes.push({ origem: "ts", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
252
+ continue;
253
+ }
254
+ if (origem === "py" || origem === "python") {
255
+ implementacoes.push({ origem: "py", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
256
+ continue;
257
+ }
258
+ if (origem === "dart") {
259
+ implementacoes.push({ origem: "dart", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
260
+ continue;
261
+ }
262
+ if (origem === "cs" || origem === "csharp" || origem === "dotnet") {
263
+ implementacoes.push({ origem: "cs", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
264
+ continue;
265
+ }
266
+ if (origem === "java") {
267
+ implementacoes.push({ origem: "java", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
268
+ continue;
269
+ }
270
+ if (origem === "go" || origem === "golang") {
271
+ implementacoes.push({ origem: "go", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
272
+ continue;
273
+ }
274
+ if (origem === "rust" || origem === "rs") {
275
+ implementacoes.push({ origem: "rust", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
276
+ continue;
277
+ }
278
+ if (origem === "cpp" || origem === "cxx" || origem === "cc" || origem === "c++") {
279
+ implementacoes.push({ origem: "cpp", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
280
+ }
281
+ }
282
+ return implementacoes;
283
+ }
284
+ function converterVinculos(bloco) {
285
+ if (!bloco) {
286
+ return [];
287
+ }
288
+ const campos = bloco.campos.map((campo) => {
289
+ const valor = valorCampoCompleto(campo) ?? "";
290
+ return {
291
+ tipo: campo.nome,
292
+ valor,
293
+ arquivo: campo.nome === "arquivo" ? valor : undefined,
294
+ simbolo: campo.nome === "simbolo" ? valor : undefined,
295
+ recurso: ["recurso", "tabela", "fila", "cache", "storage"].includes(campo.nome) ? valor : undefined,
296
+ superficie: ["superficie", "rota", "worker", "cron", "webhook", "evento", "policy", "fila", "cache", "storage"].includes(campo.nome) ? valor : undefined,
297
+ statusResolucao: "nao_verificado",
298
+ };
299
+ });
300
+ const linhas = bloco.linhas.map((linha) => {
301
+ const [tipo, ...resto] = linha.conteudo.split(/\s+/);
302
+ const valor = resto.join(" ").trim();
303
+ return {
304
+ tipo: tipo ?? "desconhecido",
305
+ valor,
306
+ statusResolucao: "nao_verificado",
307
+ };
308
+ }).filter((item) => item.valor);
309
+ const subblocos = bloco.blocos
310
+ .filter((item) => item.tipo === "bloco_generico")
311
+ .map((item) => ({
312
+ tipo: item.palavraChave === "desconhecido" ? (item.nome ?? "desconhecido") : item.palavraChave,
313
+ valor: item.nome ?? item.palavraChave,
314
+ arquivo: valorCampoCompleto(localizarCampo(item, "arquivo")),
315
+ simbolo: valorCampoCompleto(localizarCampo(item, "simbolo")),
316
+ recurso: valorCampoCompleto(localizarCampo(item, "recurso", "tabela", "fila", "cache", "storage")),
317
+ superficie: valorCampoCompleto(localizarCampo(item, "superficie", "rota", "worker", "cron", "webhook", "evento")),
318
+ statusResolucao: "nao_verificado",
319
+ }));
320
+ return [...campos, ...linhas, ...subblocos];
321
+ }
322
+ function converterExecucao(bloco) {
323
+ const idempotencia = valorCampoCompleto(localizarCampo(bloco, "idempotencia"));
324
+ const criticidadeOperacional = valorCampoCompleto(localizarCampo(bloco, "criticidade_operacional"));
325
+ return {
326
+ idempotencia: idempotencia === "verdadeiro" || idempotencia === "true",
327
+ timeout: valorCampoCompleto(localizarCampo(bloco, "timeout")) ?? "padrao",
328
+ retry: valorCampoCompleto(localizarCampo(bloco, "retry")) ?? "nenhum",
329
+ compensacao: valorCampoCompleto(localizarCampo(bloco, "compensacao")) ?? "nenhuma",
330
+ criticidadeOperacional: (criticidadeOperacional === "baixa"
331
+ || criticidadeOperacional === "alta"
332
+ || criticidadeOperacional === "critica") ? criticidadeOperacional : "media",
333
+ explicita: Boolean(bloco),
334
+ };
335
+ }
336
+ function converterAuth(bloco) {
337
+ return extrairContratoAuth(bloco);
338
+ }
339
+ function converterAuthz(bloco) {
340
+ return extrairContratoAuthz(bloco);
341
+ }
342
+ function converterDados(bloco) {
343
+ return extrairContratoDados(bloco);
344
+ }
345
+ function converterAudit(bloco) {
346
+ return extrairContratoAudit(bloco);
347
+ }
348
+ function converterSegredos(bloco) {
349
+ return extrairContratoSegredos(bloco);
350
+ }
351
+ function converterForbidden(bloco) {
352
+ return extrairContratoForbidden(bloco);
353
+ }
354
+ function converterErrosTask(bloco, fallback) {
355
+ const erros = new Map();
356
+ for (const campo of bloco?.campos ?? []) {
357
+ erros.set(campo.nome, {
358
+ codigo: campo.nome,
359
+ mensagem: valorCampoCompleto(campo) ?? "",
360
+ });
361
+ }
362
+ for (const subbloco of bloco?.blocos ?? []) {
363
+ if (subbloco.tipo !== "bloco_generico") {
364
+ continue;
365
+ }
366
+ const codigo = subbloco.nome ?? subbloco.palavraChave;
367
+ if (!codigo || codigo === "desconhecido") {
368
+ continue;
369
+ }
370
+ erros.set(codigo, {
371
+ codigo,
372
+ mensagem: valorCampoCompleto(localizarCampo(subbloco, "mensagem")) ?? `Erro estruturado "${codigo}".`,
373
+ categoria: valorCampoCompleto(localizarCampo(subbloco, "categoria")),
374
+ recuperabilidade: valorCampoCompleto(localizarCampo(subbloco, "recuperabilidade")),
375
+ acaoChamador: valorCampoCompleto(localizarCampo(subbloco, "acao_chamador")),
376
+ impactaEstado: valorCampoCompleto(localizarCampo(subbloco, "impacta_estado")) === "verdadeiro",
377
+ requerCompensacao: valorCampoCompleto(localizarCampo(subbloco, "requer_compensacao")) === "verdadeiro",
378
+ });
379
+ }
380
+ for (const erro of fallback ?? []) {
381
+ if (!erros.has(erro.codigo)) {
382
+ erros.set(erro.codigo, {
383
+ codigo: erro.codigo,
384
+ mensagem: erro.mensagem,
385
+ categoria: erro.categoria,
386
+ recuperabilidade: erro.recuperabilidade,
387
+ acaoChamador: erro.acaoChamador,
388
+ impactaEstado: erro.impactaEstado,
389
+ requerCompensacao: erro.requerCompensacao,
390
+ });
391
+ }
392
+ }
393
+ return [...erros.values()];
394
+ }
395
+ function extrairPerfil(bloco, padrao = "interno") {
396
+ const perfil = valorCampoCompleto(localizarCampo(bloco, "perfil", "compatibilidade"))?.toLowerCase();
397
+ if (perfil === "publico"
398
+ || perfil === "interno"
399
+ || perfil === "experimental"
400
+ || perfil === "legado"
401
+ || perfil === "deprecado") {
402
+ return perfil;
403
+ }
404
+ return padrao;
405
+ }
406
+ function tipoNaoPrimitivo(campo) {
407
+ if (!TIPOS_PRIMITIVOS.has(campo.tipoBase)) {
408
+ return campo.tipoBase;
409
+ }
410
+ if (campo.tipoItem && !TIPOS_PRIMITIVOS.has(campo.tipoItem)) {
411
+ return campo.tipoItem;
412
+ }
413
+ if (campo.valorMapa && !TIPOS_PRIMITIVOS.has(campo.valorMapa)) {
414
+ return campo.valorMapa;
415
+ }
416
+ return undefined;
417
+ }
418
+ function deduplicarTexto(valores) {
419
+ return [...new Set(valores.filter(Boolean))].sort((a, b) => a.localeCompare(b, "pt-BR"));
420
+ }
421
+ function resumirAgente(params) {
422
+ const entidadesAfetadas = deduplicarTexto([
423
+ ...(params.input ?? []).map(tipoNaoPrimitivo).filter((item) => Boolean(item)),
424
+ ...(params.output ?? []).map(tipoNaoPrimitivo).filter((item) => Boolean(item)),
425
+ ...(params.efeitos ?? []).map((efeito) => efeito.alvo),
426
+ ]);
427
+ const mutacoesPrevistas = deduplicarTexto((params.efeitos ?? []).map((efeito) => `${efeito.categoria}:${efeito.alvo}`));
428
+ const riscos = new Set();
429
+ if ((params.efeitos ?? []).some((efeito) => efeito.categoria === "persistencia")) {
430
+ riscos.add("altera_persistencia");
431
+ }
432
+ if ((params.efeitos ?? []).some((efeito) => efeitoEhPrivilegiado(efeito))) {
433
+ riscos.add("efeito_privilegiado");
434
+ }
435
+ if ((params.efeitos ?? []).some((efeito) => efeito.criticidade === "alta" || efeito.criticidade === "critica")) {
436
+ riscos.add("efeito_critico");
437
+ }
438
+ if (params.execucao?.criticidadeOperacional === "alta" || params.execucao?.criticidadeOperacional === "critica") {
439
+ riscos.add("execucao_critica");
440
+ }
441
+ if (contratoDadosTemSensivel(params.dados)) {
442
+ riscos.add("dados_sensiveis");
443
+ }
444
+ if (params.segredos?.itens.length) {
445
+ riscos.add("segredo_operacional");
446
+ }
447
+ if ((params.vinculos ?? []).length === 0) {
448
+ riscos.add("vinculo_fraco");
449
+ }
450
+ const checks = new Set();
451
+ checks.add("rodar sema validar --json");
452
+ if ((params.output ?? []).length > 0) {
453
+ checks.add("verificar guarantees");
454
+ }
455
+ if ((params.vinculos ?? []).length > 0) {
456
+ checks.add("rodar sema drift --json");
457
+ }
458
+ if (params.auth?.explicita || params.authz?.explicita) {
459
+ checks.add("revisar auth e authz");
460
+ }
461
+ if (params.dados?.explicita) {
462
+ checks.add("validar classificacao de dados");
463
+ }
464
+ if (params.audit?.explicita) {
465
+ checks.add("validar trilha de auditoria");
466
+ }
467
+ if (params.forbidden?.explicita) {
468
+ checks.add("confirmar proibicoes operacionais");
469
+ }
470
+ if (params.superficiePublica) {
471
+ checks.add("validar superficie publica impactada");
472
+ }
473
+ return {
474
+ riscos: [...riscos],
475
+ checks: [...checks],
476
+ entidadesAfetadas,
477
+ superficiesPublicas: params.superficiePublica ? [params.superficiePublica] : [],
478
+ mutacoesPrevistas,
479
+ };
480
+ }
481
+ function recomporCaminho(campo) {
482
+ const valor = valorCampoCompleto(campo);
483
+ return valor?.replace(/\s*\/\s*/g, "/").trim();
484
+ }
485
+ function ehUseInterop(use) {
486
+ return use.origem !== "sema";
487
+ }
488
+ function converterErroPublico(erro, origemTask) {
489
+ return {
490
+ nome: erro.codigo,
491
+ codigo: erro.codigo,
492
+ mensagem: erro.mensagem,
493
+ categoria: erro.categoria,
494
+ recuperabilidade: erro.recuperabilidade,
495
+ acaoChamador: erro.acaoChamador,
496
+ impactaEstado: erro.impactaEstado,
497
+ requerCompensacao: erro.requerCompensacao,
498
+ origemTask,
499
+ };
500
+ }
501
+ function calcularConfiancaPublica(route) {
502
+ if (route.task && route.vinculos.length > 0) {
503
+ return "alta";
504
+ }
505
+ if (route.task || route.vinculos.length > 0) {
506
+ return "media";
507
+ }
508
+ return "baixa";
509
+ }
510
+ function calcularRiscoPublico(route) {
511
+ if (!route.auth.explicita
512
+ || contratoDadosTemSensivel(route.dados)
513
+ || route.efeitosPublicos.some((efeito) => efeitoEhPrivilegiado(efeito) || efeito.categoria === "persistencia" || efeito.criticidade === "critica")) {
514
+ return "alto";
515
+ }
516
+ if (route.efeitosPublicos.length > 0 || route.errosPublicos.length > 0) {
517
+ return "medio";
518
+ }
519
+ return "baixo";
520
+ }
521
+ function converterSuperficie(tipo, superficie) {
522
+ const input = converterCampos(encontrarSubBloco(superficie, "input"));
523
+ const output = converterCampos(encontrarSubBloco(superficie, "output"));
524
+ const effects = (encontrarSubBloco(superficie, "effects")?.linhas ?? [])
525
+ .map((linha) => parsearEfeitoSemantico(linha.conteudo))
526
+ .filter((linha) => Boolean(linha));
527
+ const vinculos = converterVinculos(encontrarSubBloco(superficie, "vinculos"));
528
+ const execucao = converterExecucao(encontrarSubBloco(superficie, "execucao"));
529
+ const auth = converterAuth(encontrarSubBloco(superficie, "auth"));
530
+ const authz = converterAuthz(encontrarSubBloco(superficie, "authz"));
531
+ const dados = converterDados(encontrarSubBloco(superficie, "dados"));
532
+ const audit = converterAudit(encontrarSubBloco(superficie, "audit"));
533
+ const segredos = converterSegredos(encontrarSubBloco(superficie, "segredos"));
534
+ const forbidden = converterForbidden(encontrarSubBloco(superficie, "forbidden"));
535
+ const task = valorCampoCompleto(localizarCampo(superficie, "task", "tarefa"));
536
+ const perfilCompatibilidade = extrairPerfil(superficie, tipo === "webhook" ? "publico" : "interno");
537
+ const resumoAgente = resumirAgente({
538
+ input,
539
+ output,
540
+ efeitos: effects,
541
+ vinculos,
542
+ execucao,
543
+ auth,
544
+ authz,
545
+ dados,
546
+ audit,
547
+ segredos,
548
+ forbidden,
549
+ superficiePublica: perfilCompatibilidade === "publico" ? `${tipo}:${superficie.nome ?? tipo}` : undefined,
550
+ });
551
+ return {
552
+ tipo,
553
+ nome: superficie.nome ?? tipo,
554
+ campos: converterCampos(superficie),
555
+ linhas: superficie.linhas.map((linha) => linha.conteudo),
556
+ task: task || undefined,
557
+ input,
558
+ output,
559
+ effects,
560
+ implementacoesExternas: converterImplementacoes(encontrarSubBloco(superficie, "impl")),
561
+ vinculos,
562
+ execucao,
563
+ auth,
564
+ authz,
565
+ dados,
566
+ audit,
567
+ segredos,
568
+ forbidden,
569
+ perfilCompatibilidade,
570
+ resumoAgente,
571
+ };
572
+ }
573
+ export function converterParaIr(modulo, diagnosticos, contexto) {
574
+ const perfilModulo = extrairPerfil(modulo.vinculos, modulo.routes.length > 0 || modulo.webhooks.length > 0 ? "publico" : "interno");
575
+ const types = modulo.types.map((type) => ({
576
+ nome: type.nome,
577
+ definicao: converterBloco(encontrarSubBloco(type.corpo, "fields") ?? type.corpo),
578
+ invariantes: (encontrarSubBloco(type.corpo, "invariants")?.linhas ?? [])
579
+ .map((linha) => parsearExpressaoSemantica(linha.conteudo))
580
+ .filter((linha) => Boolean(linha)),
581
+ }));
582
+ const entities = modulo.entities.map((entity) => ({
583
+ nome: entity.nome,
584
+ campos: converterCampos(encontrarSubBloco(entity.corpo, "fields")),
585
+ invariantes: (encontrarSubBloco(entity.corpo, "invariants")?.linhas ?? [])
586
+ .map((linha) => parsearExpressaoSemantica(linha.conteudo))
587
+ .filter((linha) => Boolean(linha)),
588
+ }));
589
+ const tarefasSemanticas = contexto?.tarefasDetalhadas ?? new Map();
590
+ const tasks = modulo.tasks.map((task) => {
591
+ const input = converterCampos(task.input);
592
+ const output = converterCampos(task.output);
593
+ const effects = (task.effects?.linhas ?? [])
594
+ .map((linha) => parsearEfeitoSemantico(linha.conteudo))
595
+ .filter((linha) => Boolean(linha));
596
+ const vinculos = converterVinculos(task.vinculos);
597
+ const execucao = converterExecucao(task.execucao);
598
+ const auth = converterAuth(encontrarSubBloco(task.corpo, "auth"));
599
+ const authz = converterAuthz(encontrarSubBloco(task.corpo, "authz"));
600
+ const dados = converterDados(encontrarSubBloco(task.corpo, "dados"));
601
+ const audit = converterAudit(encontrarSubBloco(task.corpo, "audit"));
602
+ const segredos = converterSegredos(encontrarSubBloco(task.corpo, "segredos"));
603
+ const forbidden = converterForbidden(encontrarSubBloco(task.corpo, "forbidden"));
604
+ const errosDetalhados = converterErrosTask(task.error, tarefasSemanticas.get(task.nome)?.errors);
605
+ const perfilCompatibilidade = extrairPerfil(task.corpo, "interno");
606
+ const resumoAgente = resumirAgente({
607
+ input,
608
+ output,
609
+ efeitos: effects,
610
+ vinculos,
611
+ execucao,
612
+ auth,
613
+ authz,
614
+ dados,
615
+ audit,
616
+ segredos,
617
+ forbidden,
618
+ });
619
+ return {
620
+ nome: task.nome,
621
+ input,
622
+ output,
623
+ rules: task.rules?.linhas.map((linha) => linha.conteudo) ?? [],
624
+ regrasEstruturadas: (task.rules?.linhas ?? [])
625
+ .map((linha) => parsearExpressaoSemantica(linha.conteudo))
626
+ .filter((linha) => Boolean(linha)),
627
+ effects: task.effects?.linhas.map((linha) => linha.conteudo) ?? [],
628
+ efeitosEstruturados: effects,
629
+ implementacoesExternas: converterImplementacoes(task.impl),
630
+ vinculos,
631
+ execucao,
632
+ auth,
633
+ authz,
634
+ dados,
635
+ audit,
636
+ segredos,
637
+ forbidden,
638
+ guarantees: task.guarantees?.linhas.map((linha) => linha.conteudo) ?? [],
639
+ garantiasEstruturadas: (task.guarantees?.linhas ?? [])
640
+ .map((linha) => parsearExpressaoSemantica(linha.conteudo))
641
+ .filter((linha) => Boolean(linha)),
642
+ errors: Object.fromEntries(errosDetalhados.map((erro) => [erro.codigo, erro.mensagem])),
643
+ errosDetalhados,
644
+ perfilCompatibilidade,
645
+ stateContract: task.state ? {
646
+ nomeEstado: task.state.nome ?? task.state.campos.find((campo) => campo.nome === "state" || campo.nome === "estado")?.valor,
647
+ campos: converterCampos(task.state),
648
+ linhas: task.state.linhas.map((linha) => linha.conteudo),
649
+ transicoes: (encontrarSubBloco(task.state, "transitions")?.linhas ?? task.state.linhas)
650
+ .map((linha) => parsearTransicaoEstado(linha.conteudo))
651
+ .filter((linha) => Boolean(linha)),
652
+ } : undefined,
653
+ resumoAgente,
654
+ tests: (task.tests?.blocos.filter((bloco) => bloco.tipo === "caso_teste") ?? []).map(converterCaso),
655
+ };
656
+ });
657
+ const tarefasPorNome = new Map(tasks.map((task) => [task.nome, task]));
658
+ const flows = modulo.flows.map((flow) => {
659
+ const campos = converterCampos(flow.corpo);
660
+ const effects = (encontrarSubBloco(flow.corpo, "effects")?.linhas ?? [])
661
+ .map((linha) => parsearEfeitoSemantico(linha.conteudo))
662
+ .filter((linha) => Boolean(linha));
663
+ const vinculos = converterVinculos(flow.vinculos);
664
+ const perfilCompatibilidade = extrairPerfil(flow.corpo, "interno");
665
+ return {
666
+ nome: flow.nome,
667
+ campos,
668
+ linhas: flow.corpo.linhas.map((linha) => linha.conteudo),
669
+ tasksReferenciadas: flow.corpo.campos
670
+ .filter((campo) => campo.nome === "task" || campo.nome === "tarefa")
671
+ .map((campo) => campo.valor),
672
+ etapasEstruturadas: flow.corpo.linhas
673
+ .map((linha) => parsearEtapaFlow(linha.conteudo))
674
+ .filter((linha) => Boolean(linha)),
675
+ effects: (encontrarSubBloco(flow.corpo, "effects")?.linhas ?? []).map((linha) => linha.conteudo),
676
+ efeitosEstruturados: effects,
677
+ vinculos,
678
+ perfilCompatibilidade,
679
+ resumoAgente: resumirAgente({
680
+ input: campos,
681
+ efeitos: effects,
682
+ vinculos,
683
+ }),
684
+ };
685
+ });
686
+ const routes = modulo.routes.map((route) => ({
687
+ nome: route.nome,
688
+ campos: converterCampos(route.corpo),
689
+ linhas: route.corpo.linhas.map((linha) => linha.conteudo),
690
+ metodo: route.corpo.campos.find((campo) => campo.nome === "metodo")?.valor,
691
+ caminho: recomporCaminho(route.corpo.campos.find((campo) => campo.nome === "caminho")),
692
+ task: route.corpo.campos.find((campo) => campo.nome === "task" || campo.nome === "tarefa")?.valor,
693
+ inputPublico: [],
694
+ outputPublico: [],
695
+ errosPublicos: [],
696
+ efeitosPublicos: [],
697
+ vinculos: converterVinculos(route.vinculos),
698
+ auth: converterAuth(encontrarSubBloco(route.corpo, "auth")),
699
+ authz: converterAuthz(encontrarSubBloco(route.corpo, "authz")),
700
+ dados: converterDados(encontrarSubBloco(route.corpo, "dados")),
701
+ audit: converterAudit(encontrarSubBloco(route.corpo, "audit")),
702
+ segredos: converterSegredos(encontrarSubBloco(route.corpo, "segredos")),
703
+ forbidden: converterForbidden(encontrarSubBloco(route.corpo, "forbidden")),
704
+ perfilCompatibilidade: extrairPerfil(route.corpo, "publico"),
705
+ garantiasPublicasMinimas: [],
706
+ resumoAgente: {
707
+ riscos: [],
708
+ checks: [],
709
+ entidadesAfetadas: [],
710
+ superficiesPublicas: [],
711
+ mutacoesPrevistas: [],
712
+ },
713
+ publico: {
714
+ metodo: undefined,
715
+ caminho: undefined,
716
+ task: undefined,
717
+ input: [],
718
+ output: [],
719
+ errors: [],
720
+ effects: [],
721
+ garantiasMinimas: [],
722
+ },
723
+ })).map((route) => {
724
+ const routeAst = modulo.routes.find((item) => item.nome === route.nome);
725
+ const tarefaAssociada = route.task ? tarefasPorNome.get(route.task) : undefined;
726
+ const tarefaSemantica = route.task ? tarefasSemanticas.get(route.task) : undefined;
727
+ const inputPublicoDeclarado = converterCampos(encontrarSubBloco(routeAst.corpo, "input"));
728
+ const outputPublicoDeclarado = converterCampos(encontrarSubBloco(routeAst.corpo, "output"));
729
+ const errosDeclarados = converterErrosTask(encontrarSubBloco(routeAst.corpo, "error"), tarefaSemantica?.errors);
730
+ const efeitosPublicosDeclarados = (encontrarSubBloco(routeAst.corpo, "effects")?.linhas ?? [])
731
+ .map((linha) => parsearEfeitoSemantico(linha.conteudo))
732
+ .filter((linha) => Boolean(linha));
733
+ const inputPublicoResolvido = inputPublicoDeclarado.length > 0
734
+ ? inputPublicoDeclarado
735
+ : (tarefaAssociada?.input ?? tarefaSemantica?.input?.map((campo) => ({
736
+ nome: campo.nome,
737
+ tipo: campo.tipo,
738
+ modificadores: campo.modificadores,
739
+ tipoOriginal: campo.tipo,
740
+ tipoBase: campo.tipo,
741
+ cardinalidade: "unitario",
742
+ opcional: false,
743
+ tiposAlternativos: [],
744
+ refinamentos: [],
745
+ })) ?? []);
746
+ const outputPublicoResolvido = outputPublicoDeclarado.length > 0
747
+ ? outputPublicoDeclarado
748
+ : (tarefaAssociada?.output ?? tarefaSemantica?.output?.map((campo) => ({
749
+ nome: campo.nome,
750
+ tipo: campo.tipo,
751
+ modificadores: campo.modificadores,
752
+ tipoOriginal: campo.tipo,
753
+ tipoBase: campo.tipo,
754
+ cardinalidade: "unitario",
755
+ opcional: false,
756
+ tiposAlternativos: [],
757
+ refinamentos: [],
758
+ })) ?? []);
759
+ const errosPublicosResolvidos = errosDeclarados.length > 0
760
+ ? errosDeclarados.map((erro) => converterErroPublico(erro, route.task))
761
+ : (tarefaAssociada?.errosDetalhados ?? (tarefaSemantica?.errors ?? []).map((erro) => ({ codigo: erro.codigo, mensagem: erro.mensagem }))).map((erro) => converterErroPublico(erro, route.task));
762
+ const garantiasPublicasMinimas = (tarefaAssociada?.guarantees ?? tarefaSemantica?.guarantees ?? []).filter((garantia) => {
763
+ const referencia = garantia.trim().split(/\s+/)[0] ?? "";
764
+ return outputPublicoResolvido.some((campo) => campo.nome === referencia || garantia.includes(`${campo.nome}.`));
765
+ });
766
+ const routeResolvida = {
767
+ ...route,
768
+ inputPublico: inputPublicoResolvido,
769
+ outputPublico: outputPublicoResolvido,
770
+ errosPublicos: errosPublicosResolvidos,
771
+ efeitosPublicos: efeitosPublicosDeclarados,
772
+ garantiasPublicasMinimas,
773
+ resumoAgente: resumirAgente({
774
+ input: inputPublicoResolvido,
775
+ output: outputPublicoResolvido,
776
+ efeitos: efeitosPublicosDeclarados,
777
+ vinculos: route.vinculos,
778
+ auth: route.auth,
779
+ authz: route.authz,
780
+ dados: route.dados,
781
+ audit: route.audit,
782
+ segredos: route.segredos,
783
+ forbidden: route.forbidden,
784
+ superficiePublica: `${route.metodo ?? "?"} ${route.caminho ?? "?"}`,
785
+ }),
786
+ publico: {
787
+ metodo: route.metodo,
788
+ caminho: route.caminho,
789
+ task: route.task,
790
+ input: inputPublicoResolvido,
791
+ output: outputPublicoResolvido,
792
+ errors: errosPublicosResolvidos,
793
+ effects: efeitosPublicosDeclarados,
794
+ garantiasMinimas: garantiasPublicasMinimas,
795
+ confiancaContrato: "media",
796
+ riscoRegressao: "medio",
797
+ divergenciasPublicas: [],
798
+ },
799
+ };
800
+ routeResolvida.publico.confiancaContrato = calcularConfiancaPublica(routeResolvida);
801
+ routeResolvida.publico.riscoRegressao = calcularRiscoPublico(routeResolvida);
802
+ return routeResolvida;
803
+ });
804
+ const superficies = [
805
+ ...modulo.workers.map((item) => converterSuperficie("worker", item)),
806
+ ...modulo.eventos.map((item) => converterSuperficie("evento", item)),
807
+ ...modulo.filas.map((item) => converterSuperficie("fila", item)),
808
+ ...modulo.crons.map((item) => converterSuperficie("cron", item)),
809
+ ...modulo.webhooks.map((item) => converterSuperficie("webhook", item)),
810
+ ...modulo.caches.map((item) => converterSuperficie("cache", item)),
811
+ ...modulo.storages.map((item) => converterSuperficie("storage", item)),
812
+ ...modulo.policies.map((item) => converterSuperficie("policy", item)),
813
+ ];
814
+ const states = modulo.states.map((state) => ({
815
+ nome: state.nome,
816
+ campos: converterCampos(encontrarSubBloco(state.corpo, "fields") ?? state.corpo),
817
+ linhas: state.corpo.linhas.map((linha) => linha.conteudo),
818
+ invariantes: (encontrarSubBloco(state.corpo, "invariants")?.linhas ?? [])
819
+ .map((linha) => parsearExpressaoSemantica(linha.conteudo))
820
+ .filter((linha) => Boolean(linha)),
821
+ transicoes: (encontrarSubBloco(state.corpo, "transitions")?.linhas ?? [])
822
+ .map((linha) => parsearTransicaoEstado(linha.conteudo))
823
+ .filter((linha) => Boolean(linha)),
824
+ }));
825
+ const databases = modulo.databases.map(converterDatabase);
826
+ const resumoAgenteModulo = resumirAgente({
827
+ input: [],
828
+ output: [],
829
+ efeitos: [
830
+ ...tasks.flatMap((task) => task.efeitosEstruturados),
831
+ ...routes.flatMap((route) => route.efeitosPublicos),
832
+ ...superficies.flatMap((superficie) => superficie.effects),
833
+ ],
834
+ vinculos: [
835
+ ...converterVinculos(modulo.vinculos),
836
+ ...tasks.flatMap((task) => task.vinculos),
837
+ ...routes.flatMap((route) => route.vinculos),
838
+ ...superficies.flatMap((superficie) => superficie.vinculos),
839
+ ],
840
+ });
841
+ return {
842
+ nome: modulo.nome,
843
+ uses: contexto?.modulosImportados.length
844
+ ? [...contexto.modulosImportados]
845
+ : modulo.uses.filter((use) => use.origem === "sema").map((use) => use.caminho),
846
+ imports: modulo.uses.map((use) => ({
847
+ origem: use.origem,
848
+ caminho: use.caminho,
849
+ externo: use.origem !== "sema",
850
+ })),
851
+ interoperabilidades: contexto?.interoperabilidades.map((interop) => ({ ...interop })) ?? modulo.uses
852
+ .filter(ehUseInterop)
853
+ .map((use) => ({ origem: use.origem, caminho: use.caminho })),
854
+ vinculos: converterVinculos(modulo.vinculos),
855
+ perfilCompatibilidade: perfilModulo,
856
+ types,
857
+ entities,
858
+ enums: modulo.enums.map((enumeracao) => ({ nome: enumeracao.nome, valores: enumeracao.valores })),
859
+ tasks,
860
+ flows,
861
+ routes,
862
+ superficies,
863
+ states,
864
+ databases,
865
+ resumoAgente: {
866
+ ...resumoAgenteModulo,
867
+ superficiesPublicas: deduplicarTexto([
868
+ ...routes.map((route) => `${route.metodo ?? "?"} ${route.caminho ?? route.nome}`),
869
+ ...superficies
870
+ .filter((superficie) => superficie.perfilCompatibilidade === "publico")
871
+ .map((superficie) => `${superficie.tipo}:${superficie.nome}`),
872
+ ]),
873
+ },
874
+ diagnosticos,
875
+ };
876
+ }
877
+ //# sourceMappingURL=conversor.js.map