@semacode/cli 1.3.0 → 1.3.2

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