@semacode/cli 1.3.2 → 1.3.5

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 (155) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +33 -27
  3. package/package.json +21 -33
  4. package/semacode-cli-1.3.1.tgz +0 -0
  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 +4476 -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 -272
  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/agendamento.sema +0 -106
  59. package/exemplos/assinatura.sema +0 -136
  60. package/exemplos/auditoria.sema +0 -88
  61. package/exemplos/autenticacao.sema +0 -125
  62. package/exemplos/automacao.sema +0 -107
  63. package/exemplos/cadastro_usuario.sema +0 -54
  64. package/exemplos/calculadora.sema +0 -78
  65. package/exemplos/crud_simples.sema +0 -89
  66. package/exemplos/estoque.sema +0 -126
  67. package/exemplos/exportacao.sema +0 -94
  68. package/exemplos/fila.sema +0 -131
  69. package/exemplos/integracao_externa.sema +0 -94
  70. package/exemplos/multi_tenant.sema +0 -140
  71. package/exemplos/notificacao.sema +0 -98
  72. package/exemplos/operacao_estrategia.sema +0 -402
  73. package/exemplos/pagamento.sema +0 -222
  74. package/exemplos/pagamento_dominio.sema +0 -35
  75. package/exemplos/pedido.sema +0 -119
  76. package/exemplos/permissao.sema +0 -121
  77. package/exemplos/relatorio.sema +0 -93
  78. package/exemplos/testes_embutidos.sema +0 -45
  79. package/exemplos/tratamento_erro.sema +0 -157
  80. package/exemplos/upload_arquivo.sema +0 -93
  81. package/exemplos/webhook.sema +0 -96
  82. package/llms-full.txt +0 -34
  83. package/llms.txt +0 -17
  84. package/node_modules/@sema/gerador-css/dist/index.d.ts +0 -3
  85. package/node_modules/@sema/gerador-css/dist/index.js +0 -592
  86. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  87. package/node_modules/@sema/gerador-css/package.json +0 -7
  88. package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
  89. package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
  90. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  91. package/node_modules/@sema/gerador-dart/package.json +0 -7
  92. package/node_modules/@sema/gerador-html/dist/index.d.ts +0 -3
  93. package/node_modules/@sema/gerador-html/dist/index.js +0 -163
  94. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  95. package/node_modules/@sema/gerador-html/package.json +0 -7
  96. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +0 -3
  97. package/node_modules/@sema/gerador-javascript/dist/index.js +0 -421
  98. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  99. package/node_modules/@sema/gerador-javascript/package.json +0 -7
  100. package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
  101. package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
  102. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  103. package/node_modules/@sema/gerador-lua/package.json +0 -7
  104. package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
  105. package/node_modules/@sema/gerador-python/dist/index.js +0 -628
  106. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  107. package/node_modules/@sema/gerador-python/package.json +0 -7
  108. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
  109. package/node_modules/@sema/gerador-typescript/dist/index.js +0 -656
  110. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  111. package/node_modules/@sema/gerador-typescript/package.json +0 -7
  112. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -122
  113. package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
  114. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  115. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
  116. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
  117. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  118. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
  119. package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -445
  120. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  121. package/node_modules/@sema/nucleo/dist/index.d.ts +0 -34
  122. package/node_modules/@sema/nucleo/dist/index.js +0 -95
  123. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  124. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
  125. package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -781
  126. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  127. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -285
  128. package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
  129. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  130. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
  131. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
  132. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  133. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
  134. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -46
  135. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  136. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
  137. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -656
  138. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  139. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -57
  140. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1497
  141. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  142. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
  143. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
  144. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  145. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
  146. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
  147. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  148. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
  149. package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
  150. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  151. package/node_modules/@sema/nucleo/package.json +0 -7
  152. package/node_modules/@sema/padroes/dist/index.d.ts +0 -23
  153. package/node_modules/@sema/padroes/dist/index.js +0 -210
  154. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
  155. 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