@semacode/cli 1.2.17 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +58 -10
  3. package/dist/projeto.js +4 -1
  4. package/package.json +17 -34
  5. package/src/cpp-symbols.ts +82 -0
  6. package/src/dotnet-http.ts +355 -0
  7. package/src/drift.ts +2455 -0
  8. package/src/go-http.ts +118 -0
  9. package/src/importador.ts +3448 -0
  10. package/src/index.ts +4470 -0
  11. package/src/java-http.ts +247 -0
  12. package/src/projeto.ts +810 -0
  13. package/src/python-http.ts +258 -0
  14. package/src/rust-http.ts +125 -0
  15. package/src/tipos.ts +22 -0
  16. package/src/typescript-http.ts +1076 -0
  17. package/tsconfig.json +20 -0
  18. package/AGENTS.md +0 -50
  19. package/LICENSE +0 -22
  20. package/SEMA_BRIEF.curto.txt +0 -9
  21. package/SEMA_BRIEF.md +0 -49
  22. package/SEMA_BRIEF.micro.txt +0 -7
  23. package/SEMA_INDEX.json +0 -546
  24. package/dist/cpp-symbols.d.ts +0 -10
  25. package/dist/cpp-symbols.js.map +0 -1
  26. package/dist/dotnet-http.d.ts +0 -23
  27. package/dist/dotnet-http.js.map +0 -1
  28. package/dist/drift.d.ts +0 -118
  29. package/dist/drift.js.map +0 -1
  30. package/dist/go-http.d.ts +0 -23
  31. package/dist/go-http.js.map +0 -1
  32. package/dist/importador.d.ts +0 -29
  33. package/dist/importador.js.map +0 -1
  34. package/dist/index.d.ts +0 -2
  35. package/dist/index.js.map +0 -1
  36. package/dist/java-http.d.ts +0 -23
  37. package/dist/java-http.js.map +0 -1
  38. package/dist/lua-symbols.d.ts +0 -8
  39. package/dist/lua-symbols.js.map +0 -1
  40. package/dist/projeto.d.ts +0 -48
  41. package/dist/projeto.js.map +0 -1
  42. package/dist/python-http.d.ts +0 -23
  43. package/dist/python-http.js.map +0 -1
  44. package/dist/rust-http.d.ts +0 -23
  45. package/dist/rust-http.js.map +0 -1
  46. package/dist/tipos.d.ts +0 -3
  47. package/dist/tipos.js.map +0 -1
  48. package/dist/typescript-http.d.ts +0 -35
  49. package/dist/typescript-http.js.map +0 -1
  50. package/docs/AGENT_STARTER.md +0 -102
  51. package/docs/como-ensinar-a-sema-para-ia.md +0 -149
  52. package/docs/fluxo-pratico-ia-sema.md +0 -177
  53. package/docs/instalacao-e-primeiro-uso.md +0 -196
  54. package/docs/integracao-com-ia.md +0 -228
  55. package/docs/pagamento-ponta-a-ponta.md +0 -155
  56. package/docs/prompt-base-ia-sema.md +0 -104
  57. package/docs/sintaxe.md +0 -361
  58. package/exemplos/automacao.sema +0 -107
  59. package/exemplos/cadastro_usuario.sema +0 -54
  60. package/exemplos/calculadora.sema +0 -78
  61. package/exemplos/crud_simples.sema +0 -89
  62. package/exemplos/operacao_estrategia.sema +0 -402
  63. package/exemplos/pagamento.sema +0 -222
  64. package/exemplos/pagamento_dominio.sema +0 -35
  65. package/exemplos/testes_embutidos.sema +0 -45
  66. package/exemplos/tratamento_erro.sema +0 -157
  67. package/llms-full.txt +0 -34
  68. package/llms.txt +0 -17
  69. package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
  70. package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
  71. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  72. package/node_modules/@sema/gerador-dart/package.json +0 -7
  73. package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
  74. package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
  75. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  76. package/node_modules/@sema/gerador-lua/package.json +0 -7
  77. package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
  78. package/node_modules/@sema/gerador-python/dist/index.js +0 -628
  79. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  80. package/node_modules/@sema/gerador-python/package.json +0 -7
  81. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
  82. package/node_modules/@sema/gerador-typescript/dist/index.js +0 -656
  83. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  84. package/node_modules/@sema/gerador-typescript/package.json +0 -7
  85. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -122
  86. package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
  87. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  88. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
  89. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
  90. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  91. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
  92. package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -445
  93. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  94. package/node_modules/@sema/nucleo/dist/index.d.ts +0 -34
  95. package/node_modules/@sema/nucleo/dist/index.js +0 -95
  96. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  97. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
  98. package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -781
  99. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  100. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -285
  101. package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
  102. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  103. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
  104. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
  105. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  106. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
  107. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -46
  108. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  109. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
  110. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -656
  111. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  112. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -57
  113. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1497
  114. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  115. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
  116. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
  117. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  118. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
  119. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
  120. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  121. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
  122. package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
  123. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  124. package/node_modules/@sema/nucleo/package.json +0 -7
  125. package/node_modules/@sema/padroes/dist/index.d.ts +0 -21
  126. package/node_modules/@sema/padroes/dist/index.js +0 -159
  127. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
  128. package/node_modules/@sema/padroes/package.json +0 -7
@@ -1,781 +0,0 @@
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