@semacode/cli 1.5.14 → 1.5.16

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 (177) hide show
  1. package/README.md +2 -1
  2. package/dist/index.js +76 -43
  3. package/package.json +26 -35
  4. package/semacode-cli-1.3.1.tgz +0 -0
  5. package/src/angular-consumer-standalone.ts +312 -0
  6. package/src/cpp-symbols.ts +82 -0
  7. package/src/docs.ts +535 -0
  8. package/src/dotnet-http.ts +355 -0
  9. package/src/drift.ts +4933 -0
  10. package/src/go-http.ts +118 -0
  11. package/src/importador.ts +3891 -0
  12. package/src/index.ts +5641 -0
  13. package/src/java-http.ts +247 -0
  14. package/src/lua-symbols.ts +114 -0
  15. package/src/php-symbols.ts +462 -0
  16. package/src/projeto.ts +862 -0
  17. package/src/python-http.ts +258 -0
  18. package/src/rust-http.ts +125 -0
  19. package/src/tipos.ts +24 -0
  20. package/src/typescript-http.ts +1076 -0
  21. package/tsconfig.json +20 -0
  22. package/AGENTS.md +0 -272
  23. package/LICENSE +0 -22
  24. package/SEMA_BRIEF.curto.txt +0 -9
  25. package/SEMA_BRIEF.md +0 -63
  26. package/SEMA_BRIEF.micro.txt +0 -7
  27. package/SEMA_INDEX.json +0 -799
  28. package/dist/angular-consumer-standalone.d.ts +0 -6
  29. package/dist/angular-consumer-standalone.js.map +0 -1
  30. package/dist/cpp-symbols.d.ts +0 -10
  31. package/dist/cpp-symbols.js.map +0 -1
  32. package/dist/docs.d.ts +0 -56
  33. package/dist/docs.js.map +0 -1
  34. package/dist/dotnet-http.d.ts +0 -23
  35. package/dist/dotnet-http.js.map +0 -1
  36. package/dist/drift.d.ts +0 -225
  37. package/dist/drift.js.map +0 -1
  38. package/dist/go-http.d.ts +0 -23
  39. package/dist/go-http.js.map +0 -1
  40. package/dist/importador.d.ts +0 -31
  41. package/dist/importador.js.map +0 -1
  42. package/dist/index.d.ts +0 -2
  43. package/dist/index.js.map +0 -1
  44. package/dist/java-http.d.ts +0 -23
  45. package/dist/java-http.js.map +0 -1
  46. package/dist/lua-symbols.d.ts +0 -10
  47. package/dist/lua-symbols.js.map +0 -1
  48. package/dist/php-symbols.d.ts +0 -24
  49. package/dist/php-symbols.js.map +0 -1
  50. package/dist/projeto.d.ts +0 -53
  51. package/dist/projeto.js.map +0 -1
  52. package/dist/python-http.d.ts +0 -23
  53. package/dist/python-http.js.map +0 -1
  54. package/dist/rust-http.d.ts +0 -23
  55. package/dist/rust-http.js.map +0 -1
  56. package/dist/tipos.d.ts +0 -3
  57. package/dist/tipos.js.map +0 -1
  58. package/dist/typescript-http.d.ts +0 -35
  59. package/dist/typescript-http.js.map +0 -1
  60. package/docs/AGENT_STARTER.md +0 -102
  61. package/docs/cli.md +0 -117
  62. package/docs/como-ensinar-a-sema-para-ia.md +0 -149
  63. package/docs/deploy.md +0 -70
  64. package/docs/documentacao.md +0 -63
  65. package/docs/env.md +0 -56
  66. package/docs/extensao-vscode.md +0 -45
  67. package/docs/fluxo-pratico-ia-sema.md +0 -177
  68. package/docs/instalacao-e-primeiro-uso.md +0 -112
  69. package/docs/integracao-com-ia.md +0 -101
  70. package/docs/mcp.md +0 -53
  71. package/docs/pagamento-ponta-a-ponta.md +0 -155
  72. package/docs/persistencia-vendor-first.md +0 -145
  73. package/docs/prompt-base-ia-sema.md +0 -104
  74. package/docs/rollback.md +0 -47
  75. package/docs/sintaxe.md +0 -410
  76. package/exemplos/agendamento.sema +0 -106
  77. package/exemplos/assinatura.sema +0 -136
  78. package/exemplos/auditoria.sema +0 -88
  79. package/exemplos/autenticacao.sema +0 -125
  80. package/exemplos/automacao.sema +0 -107
  81. package/exemplos/cadastro_usuario.sema +0 -54
  82. package/exemplos/calculadora.sema +0 -78
  83. package/exemplos/crud_simples.sema +0 -89
  84. package/exemplos/estoque.sema +0 -126
  85. package/exemplos/exportacao.sema +0 -94
  86. package/exemplos/fila.sema +0 -131
  87. package/exemplos/integracao_externa.sema +0 -94
  88. package/exemplos/multi_tenant.sema +0 -140
  89. package/exemplos/notificacao.sema +0 -98
  90. package/exemplos/operacao_estrategia.sema +0 -402
  91. package/exemplos/pagamento.sema +0 -222
  92. package/exemplos/pagamento_dominio.sema +0 -35
  93. package/exemplos/pedido.sema +0 -119
  94. package/exemplos/permissao.sema +0 -121
  95. package/exemplos/persistencia_vendor_first.sema +0 -86
  96. package/exemplos/relatorio.sema +0 -93
  97. package/exemplos/testes_embutidos.sema +0 -45
  98. package/exemplos/tratamento_erro.sema +0 -157
  99. package/exemplos/upload_arquivo.sema +0 -93
  100. package/exemplos/webhook.sema +0 -96
  101. package/llms-full.txt +0 -34
  102. package/llms.txt +0 -17
  103. package/node_modules/@sema/gerador-css/dist/index.d.ts +0 -3
  104. package/node_modules/@sema/gerador-css/dist/index.js +0 -592
  105. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  106. package/node_modules/@sema/gerador-css/package.json +0 -7
  107. package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
  108. package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
  109. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  110. package/node_modules/@sema/gerador-dart/package.json +0 -7
  111. package/node_modules/@sema/gerador-html/dist/index.d.ts +0 -3
  112. package/node_modules/@sema/gerador-html/dist/index.js +0 -163
  113. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  114. package/node_modules/@sema/gerador-html/package.json +0 -7
  115. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +0 -3
  116. package/node_modules/@sema/gerador-javascript/dist/index.js +0 -421
  117. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  118. package/node_modules/@sema/gerador-javascript/package.json +0 -7
  119. package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
  120. package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
  121. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  122. package/node_modules/@sema/gerador-lua/package.json +0 -7
  123. package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
  124. package/node_modules/@sema/gerador-python/dist/index.js +0 -729
  125. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  126. package/node_modules/@sema/gerador-python/package.json +0 -7
  127. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
  128. package/node_modules/@sema/gerador-typescript/dist/index.js +0 -793
  129. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  130. package/node_modules/@sema/gerador-typescript/package.json +0 -7
  131. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -125
  132. package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
  133. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  134. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
  135. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
  136. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  137. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
  138. package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -487
  139. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  140. package/node_modules/@sema/nucleo/dist/index.d.ts +0 -35
  141. package/node_modules/@sema/nucleo/dist/index.js +0 -96
  142. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  143. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
  144. package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -1058
  145. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  146. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -377
  147. package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
  148. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  149. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
  150. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
  151. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  152. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
  153. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -82
  154. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  155. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
  156. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -807
  157. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  158. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +0 -39
  159. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +0 -294
  160. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  161. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -58
  162. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1912
  163. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  164. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
  165. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
  166. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  167. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
  168. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
  169. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  170. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
  171. package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
  172. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  173. package/node_modules/@sema/nucleo/package.json +0 -7
  174. package/node_modules/@sema/padroes/dist/index.d.ts +0 -25
  175. package/node_modules/@sema/padroes/dist/index.js +0 -316
  176. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
  177. package/node_modules/@sema/padroes/package.json +0 -7
@@ -1,1058 +0,0 @@
1
- import { localizarCampoPersistencia, matrizCompatibilidadePersistencia, nomeTipoRecursoPersistencia, normalizarConsistenciaPersistencia, normalizarDurabilidadePersistencia, normalizarEngineBanco, normalizarModeloConsultaPersistencia, normalizarModeloTransacaoPersistencia, parsearBooleanoPersistencia, TIPOS_RECURSO_PERSISTENCIA, } from "../persistencia/contratos.js";
2
- import { contratoDadosTemSensivel, extrairContratoAudit, extrairContratoAuth, extrairContratoAuthz, extrairContratoDados, extrairContratoForbidden, extrairContratoSegredos, efeitoEhPrivilegiado, } from "../semantico/seguranca.js";
3
- import { parsearEfeitoSemantico, parsearEtapaFlow, parsearExpressaoSemantica, parsearTransicaoEstado } from "../semantico/estruturas.js";
4
- const TIPOS_PRIMITIVOS = new Set([
5
- "Texto",
6
- "Numero",
7
- "Inteiro",
8
- "Decimal",
9
- "Booleano",
10
- "Data",
11
- "DataHora",
12
- "Id",
13
- "Email",
14
- "Url",
15
- "Json",
16
- "Vazio",
17
- ]);
18
- function encontrarSubBloco(bloco, palavraChave) {
19
- return bloco.blocos.find((subbloco) => subbloco.tipo === "bloco_generico" && subbloco.palavraChave === palavraChave);
20
- }
21
- function localizarCampo(bloco, ...nomes) {
22
- return bloco?.campos.find((campo) => nomes.includes(campo.nome));
23
- }
24
- function valorCampoCompleto(campo) {
25
- if (!campo) {
26
- return undefined;
27
- }
28
- return [campo.valor, ...campo.modificadores].join(" ").trim() || undefined;
29
- }
30
- function normalizarTipoDeclarado(tipo) {
31
- return tipo
32
- .replace(/\s*([<>\[\](),|?])\s*/g, "$1")
33
- .replace(/\s+/g, "")
34
- .trim();
35
- }
36
- function dividirNoNivelRaiz(texto, separador) {
37
- const partes = [];
38
- let profundidadeAngular = 0;
39
- let profundidadeColchete = 0;
40
- let inicio = 0;
41
- for (let indice = 0; indice < texto.length; indice += 1) {
42
- const caractere = texto[indice];
43
- if (caractere === "<") {
44
- profundidadeAngular += 1;
45
- continue;
46
- }
47
- if (caractere === ">") {
48
- profundidadeAngular = Math.max(0, profundidadeAngular - 1);
49
- continue;
50
- }
51
- if (caractere === "[") {
52
- profundidadeColchete += 1;
53
- continue;
54
- }
55
- if (caractere === "]") {
56
- profundidadeColchete = Math.max(0, profundidadeColchete - 1);
57
- continue;
58
- }
59
- if (profundidadeAngular === 0 && profundidadeColchete === 0 && texto.startsWith(separador, indice)) {
60
- partes.push(texto.slice(inicio, indice));
61
- inicio = indice + separador.length;
62
- indice += separador.length - 1;
63
- }
64
- }
65
- partes.push(texto.slice(inicio));
66
- return partes.map((parte) => parte.trim()).filter(Boolean);
67
- }
68
- function analisarCampoTipo(tipo, modificadores) {
69
- const tipoOriginal = normalizarTipoDeclarado(tipo);
70
- const modificadoresNormalizados = modificadores.map((item) => item.trim()).filter(Boolean);
71
- const refinamentos = modificadoresNormalizados.filter((item) => !["required", "optional", "opcional"].includes(item));
72
- const opcionalPorModificador = modificadoresNormalizados.includes("optional") || modificadoresNormalizados.includes("opcional");
73
- let tipoBase = tipoOriginal;
74
- let cardinalidade = "unitario";
75
- let tiposAlternativos = [];
76
- let tipoItem;
77
- let chaveMapa;
78
- let valorMapa;
79
- let opcional = opcionalPorModificador;
80
- if (tipoBase.endsWith("?")) {
81
- opcional = true;
82
- tipoBase = tipoBase.slice(0, -1);
83
- }
84
- if (/^Opcional<.+>$/.test(tipoBase)) {
85
- opcional = true;
86
- tipoBase = tipoBase.slice("Opcional<".length, -1);
87
- }
88
- const uniao = dividirNoNivelRaiz(tipoBase, "|");
89
- if (uniao.length > 1) {
90
- cardinalidade = "uniao";
91
- tiposAlternativos = uniao.map(normalizarTipoDeclarado);
92
- tipoBase = tiposAlternativos[0] ?? tipoBase;
93
- }
94
- else if (/^Lista<.+>$/.test(tipoBase)) {
95
- cardinalidade = "lista";
96
- tipoItem = tipoBase.slice("Lista<".length, -1).trim();
97
- tipoBase = tipoItem;
98
- }
99
- else if (/^Mapa<.+>$/.test(tipoBase)) {
100
- cardinalidade = "mapa";
101
- const partesMapa = dividirNoNivelRaiz(tipoBase.slice("Mapa<".length, -1), ",");
102
- chaveMapa = partesMapa[0];
103
- valorMapa = partesMapa[1];
104
- tipoBase = valorMapa ?? tipoBase;
105
- }
106
- return {
107
- tipo: tipoOriginal,
108
- modificadores: modificadoresNormalizados,
109
- tipoOriginal,
110
- tipoBase,
111
- cardinalidade,
112
- opcional,
113
- tiposAlternativos,
114
- tipoItem,
115
- chaveMapa,
116
- valorMapa,
117
- refinamentos,
118
- };
119
- }
120
- function converterCampo(campo) {
121
- return {
122
- nome: campo.nome,
123
- ...analisarCampoTipo(campo.valor, campo.modificadores),
124
- };
125
- }
126
- function converterCampos(bloco) {
127
- if (!bloco) {
128
- return [];
129
- }
130
- return bloco.campos.map(converterCampo);
131
- }
132
- function converterBloco(bloco) {
133
- return {
134
- campos: converterCampos(bloco),
135
- linhas: bloco?.linhas.map((linha) => linha.conteudo) ?? [],
136
- blocos: (bloco?.blocos ?? [])
137
- .filter((subbloco) => subbloco.tipo === "bloco_generico")
138
- .map((subbloco) => ({
139
- nome: subbloco.nome ?? subbloco.palavraChave,
140
- conteudo: converterBloco(subbloco),
141
- })),
142
- };
143
- }
144
- function converterCaso(caso) {
145
- return {
146
- nome: caso.nome,
147
- given: converterBloco(caso.given),
148
- when: caso.when ? converterBloco(caso.when) : undefined,
149
- expect: converterBloco(caso.expect),
150
- error: caso.error ? converterBloco(caso.error) : undefined,
151
- };
152
- }
153
- function nomeBlocoDeclarativo(bloco) {
154
- return bloco.palavraChave === "desconhecido"
155
- ? (bloco.nome ?? "desconhecido")
156
- : bloco.palavraChave;
157
- }
158
- function blocoTemNome(bloco, nomes) {
159
- const nomeNormalizado = nomeBlocoDeclarativo(bloco).toLowerCase();
160
- return nomes.includes(nomeNormalizado);
161
- }
162
- function coletarValoresBloco(bloco) {
163
- if (!bloco) {
164
- return [];
165
- }
166
- return deduplicarTexto([
167
- ...bloco.linhas.map((linha) => linha.conteudo),
168
- ...bloco.campos.map((campo) => valorCampoCompleto(campo) ?? campo.nome),
169
- ]);
170
- }
171
- function coletarValoresSubblocos(bloco, nomes) {
172
- return deduplicarTexto(bloco.blocos
173
- .filter((item) => item.tipo === "bloco_generico" && blocoTemNome(item, nomes))
174
- .flatMap(coletarValoresBloco));
175
- }
176
- function extrairToleranciasAuthor(bloco) {
177
- const tolerancias = {};
178
- for (const subbloco of bloco.blocos) {
179
- if (subbloco.tipo !== "bloco_generico" || !blocoTemNome(subbloco, ["tolerancia", "tolerance"])) {
180
- continue;
181
- }
182
- for (const campo of subbloco.campos) {
183
- const valor = valorCampoCompleto(campo);
184
- if (valor) {
185
- tolerancias[campo.nome] = valor;
186
- }
187
- }
188
- }
189
- return tolerancias;
190
- }
191
- function extrairProibicoesAuthor(bloco) {
192
- const proibicoes = [];
193
- for (const subbloco of bloco.blocos) {
194
- if (subbloco.tipo !== "bloco_generico"
195
- || !blocoTemNome(subbloco, ["forbidden", "proibido", "avoid", "evitar", "echo", "ecos"])) {
196
- continue;
197
- }
198
- const origem = nomeBlocoDeclarativo(subbloco);
199
- for (const campo of subbloco.campos) {
200
- const valor = valorCampoCompleto(campo);
201
- if (valor) {
202
- proibicoes.push({ tipo: campo.nome, valor, origem });
203
- }
204
- }
205
- for (const linha of subbloco.linhas) {
206
- proibicoes.push({ tipo: origem, valor: linha.conteudo, origem });
207
- }
208
- }
209
- return proibicoes;
210
- }
211
- function converterAuthorBlock(bloco) {
212
- const tipo = bloco.palavraChave;
213
- return {
214
- tipo,
215
- nome: bloco.nome ?? tipo,
216
- campos: converterCampos(bloco),
217
- linhas: bloco.linhas.map((linha) => linha.conteudo),
218
- proibicoes: extrairProibicoesAuthor(bloco),
219
- preferencias: coletarValoresSubblocos(bloco, ["preferir", "prefer", "preferencias", "preferences"]),
220
- requisitos: coletarValoresSubblocos(bloco, ["require", "requer", "requisitos", "requirements"]),
221
- tolerancias: extrairToleranciasAuthor(bloco),
222
- bloco: converterBloco(bloco),
223
- };
224
- }
225
- const REQUISITOS_AUTHOR_AUTOMATICOS = [
226
- "mostrar_por_evidencia",
227
- "causa_e_consequencia",
228
- "cena_com_dupla_funcao",
229
- "exposicao_com_atrito",
230
- "antagonista_com_logica_interna",
231
- "conflito_sem_solucao_limpa",
232
- "continuidade_de_personagens",
233
- "misterio_em_escada",
234
- "dialogo_com_subtexto",
235
- "acao_com_geografia_e_dano",
236
- "final_de_capitulo_sem_slogan",
237
- "morte_com_peso_estrutural",
238
- "especificidade_sensorial",
239
- "voz_distinta_por_personagem",
240
- "anti_cliche_adaptativa",
241
- ];
242
- const PROIBICOES_AUTHOR_AUTOMATICAS = [
243
- { tipo: "moral_explicada", valor: "emocao ou mudanca social resumida sem evidencia concreta em cena", origem: "automatico" },
244
- { tipo: "cena_morta", valor: "cena que nao cumpre ao menos duas funcoes narrativas", origem: "automatico" },
245
- { tipo: "exposicao_sem_atrito", valor: "lore em formato de palestra sem tensao, custo ou conflito", origem: "automatico" },
246
- { tipo: "solucao_limpa", valor: "problema importante resolvido sem custo, perda ou novo problema", origem: "automatico" },
247
- { tipo: "dialogo_expositivo", valor: "dialogo usado so para explicar trama ou emocao declarada", origem: "automatico" },
248
- { tipo: "acao_generica", valor: "acao sem geografia, objetivo, obstaculo crescente ou dano posterior", origem: "automatico" },
249
- { tipo: "final_slogan", valor: "capitulo encerrado com frase moralizante ou efeito de trailer", origem: "automatico" },
250
- { tipo: "cliche", valor: "nao era sobre X, era sobre Y", origem: "automatico" },
251
- { tipo: "cliche", valor: "a esperanca renasceu", origem: "automatico" },
252
- { tipo: "cliche", valor: "o destino cobraria seu preco", origem: "automatico" },
253
- ];
254
- const PREFERENCIAS_AUTHOR_AUTOMATICAS = [
255
- "trocar abstracao por gesto, objeto, rotina quebrada ou decisao visivel",
256
- "mostrar consequencia emocional, fisica, politica, logistica, moral ou relacional",
257
- "plantar pista, contradicao e verdade parcial antes de revelacao grande",
258
- "usar subtexto, silencio, resposta indireta ou pergunta como ataque em dialogos",
259
- "terminar capitulos com decisao, imagem forte, perda concreta, ameaca especifica ou descoberta parcial",
260
- "diferenciar personagens por vocabulario, ritmo de fala, tipo de silencio e forma de decidir",
261
- ];
262
- function criarRegrasAuthorAutomaticas() {
263
- return {
264
- tipo: "style_rule",
265
- nome: "regras_gerais_author",
266
- campos: [],
267
- linhas: [
268
- "Aplicado automaticamente a todo modulo com blocos Author.",
269
- "As regras sao gerais e nao pertencem a um universo especifico.",
270
- ],
271
- proibicoes: [...PROIBICOES_AUTHOR_AUTOMATICAS],
272
- preferencias: [...PREFERENCIAS_AUTHOR_AUTOMATICAS],
273
- requisitos: [...REQUISITOS_AUTHOR_AUTOMATICOS],
274
- tolerancias: {
275
- max_repeticao_palavra_por_trecho: "2",
276
- cena_funcoes_minimas: "2",
277
- morte_dimensoes_minimas: "3",
278
- },
279
- bloco: {
280
- campos: [],
281
- linhas: [
282
- "automatico: verdadeiro",
283
- "escopo: author_geral",
284
- ],
285
- blocos: [],
286
- },
287
- };
288
- }
289
- function converterAgent(agent) {
290
- return {
291
- nome: agent.nome ?? "agent",
292
- role: valorCampoCompleto(localizarCampo(agent, "role", "papel")),
293
- goal: valorCampoCompleto(localizarCampo(agent, "goal", "objetivo")),
294
- tools: coletarValoresSubblocos(agent, ["tools", "ferramentas"]),
295
- memory: coletarValoresSubblocos(agent, ["memory", "memoria"]),
296
- policy: coletarValoresSubblocos(agent, ["policy", "politica"]),
297
- permissions: coletarValoresSubblocos(agent, ["permissions", "permissoes"]),
298
- campos: converterCampos(agent),
299
- linhas: agent.linhas.map((linha) => linha.conteudo),
300
- bloco: converterBloco(agent),
301
- };
302
- }
303
- function coletarLinhasPersistencia(bloco, nome) {
304
- if (!bloco) {
305
- return [];
306
- }
307
- return encontrarSubBloco(bloco, nome)?.linhas.map((linha) => linha.conteudo) ?? [];
308
- }
309
- function resolverTipoRecursoPersistencia(bloco) {
310
- const explicito = valorCampoCompleto(localizarCampoPersistencia(bloco, "resource_kind"));
311
- if (explicito && TIPOS_RECURSO_PERSISTENCIA.has(explicito)) {
312
- return explicito;
313
- }
314
- return nomeTipoRecursoPersistencia(bloco);
315
- }
316
- function converterCompatibilidadePersistencia(compatibilidades) {
317
- return compatibilidades.map((item) => ({ ...item }));
318
- }
319
- function converterRecursoPersistencia(recurso) {
320
- const resourceKind = resolverTipoRecursoPersistencia(recurso);
321
- if (!resourceKind) {
322
- return undefined;
323
- }
324
- const mode = valorCampoCompleto(localizarCampoPersistencia(recurso, "mode"));
325
- const isolation = valorCampoCompleto(localizarCampoPersistencia(recurso, "isolation"));
326
- return {
327
- nome: recurso.nome ?? resourceKind,
328
- resourceKind,
329
- entity: valorCampoCompleto(localizarCampoPersistencia(recurso, "entity")),
330
- collection: valorCampoCompleto(localizarCampoPersistencia(recurso, "collection")),
331
- table: valorCampoCompleto(localizarCampoPersistencia(recurso, "table")),
332
- consistency: normalizarConsistenciaPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "consistency")))
333
- ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "consistency")),
334
- durability: normalizarDurabilidadePersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "durability")))
335
- ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "durability")),
336
- transactionModel: normalizarModeloTransacaoPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "transaction_model")))
337
- ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "transaction_model")),
338
- queryModel: normalizarModeloConsultaPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "query_model")))
339
- ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "query_model")),
340
- mode,
341
- isolation,
342
- strategy: valorCampoCompleto(localizarCampoPersistencia(recurso, "strategy")),
343
- ttl: valorCampoCompleto(localizarCampoPersistencia(recurso, "ttl")),
344
- retention: valorCampoCompleto(localizarCampoPersistencia(recurso, "retention")),
345
- path: valorCampoCompleto(localizarCampoPersistencia(recurso, "path")),
346
- from: valorCampoCompleto(localizarCampoPersistencia(recurso, "from")),
347
- to: valorCampoCompleto(localizarCampoPersistencia(recurso, "to")),
348
- surface: valorCampoCompleto(localizarCampoPersistencia(recurso, "surface")),
349
- adapter: valorCampoCompleto(localizarCampoPersistencia(recurso, "adapter")),
350
- portavel: parsearBooleanoPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "portavel"))),
351
- capabilities: coletarLinhasPersistencia(recurso, "capabilities"),
352
- operations: coletarLinhasPersistencia(recurso, "operations"),
353
- indexing: coletarLinhasPersistencia(recurso, "indexing"),
354
- guarantees: coletarLinhasPersistencia(recurso, "guarantees"),
355
- diagnostics: coletarLinhasPersistencia(recurso, "diagnostics"),
356
- risks: coletarLinhasPersistencia(recurso, "risks"),
357
- fields: converterCampos(recurso),
358
- lines: recurso.linhas.map((linha) => linha.conteudo),
359
- block: converterBloco(recurso),
360
- compatibilidade: converterCompatibilidadePersistencia(matrizCompatibilidadePersistencia(resourceKind, { mode, isolation })),
361
- };
362
- }
363
- function converterDatabase(database) {
364
- return {
365
- nome: database.nome ?? "database",
366
- engine: normalizarEngineBanco(valorCampoCompleto(localizarCampoPersistencia(database, "engine"))),
367
- schema: valorCampoCompleto(localizarCampoPersistencia(database, "schema")),
368
- database: valorCampoCompleto(localizarCampoPersistencia(database, "database")),
369
- consistency: normalizarConsistenciaPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "consistency")))
370
- ?? valorCampoCompleto(localizarCampoPersistencia(database, "consistency")),
371
- durability: normalizarDurabilidadePersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "durability")))
372
- ?? valorCampoCompleto(localizarCampoPersistencia(database, "durability")),
373
- transactionModel: normalizarModeloTransacaoPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "transaction_model")))
374
- ?? valorCampoCompleto(localizarCampoPersistencia(database, "transaction_model")),
375
- queryModel: normalizarModeloConsultaPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "query_model")))
376
- ?? valorCampoCompleto(localizarCampoPersistencia(database, "query_model")),
377
- portavel: parsearBooleanoPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "portavel"))),
378
- adapter: valorCampoCompleto(localizarCampoPersistencia(database, "adapter")),
379
- capabilities: coletarLinhasPersistencia(database, "capabilities"),
380
- operations: coletarLinhasPersistencia(database, "operations"),
381
- indexing: coletarLinhasPersistencia(database, "indexing"),
382
- guarantees: coletarLinhasPersistencia(database, "guarantees"),
383
- diagnostics: coletarLinhasPersistencia(database, "diagnostics"),
384
- risks: coletarLinhasPersistencia(database, "risks"),
385
- fields: converterCampos(database),
386
- lines: database.linhas.map((linha) => linha.conteudo),
387
- block: converterBloco(database),
388
- resources: database.blocos
389
- .filter((bloco) => bloco.tipo === "bloco_generico")
390
- .map(converterRecursoPersistencia)
391
- .filter((item) => Boolean(item)),
392
- };
393
- }
394
- function converterImplementacoes(bloco) {
395
- const implementacoes = [];
396
- for (const campo of bloco?.campos ?? []) {
397
- const origem = campo.nome.toLowerCase();
398
- if (origem === "ts" || origem === "typescript") {
399
- implementacoes.push({ origem: "ts", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
400
- continue;
401
- }
402
- if (origem === "py" || origem === "python") {
403
- implementacoes.push({ origem: "py", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
404
- continue;
405
- }
406
- if (origem === "dart") {
407
- implementacoes.push({ origem: "dart", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
408
- continue;
409
- }
410
- if (origem === "lua") {
411
- implementacoes.push({ origem: "lua", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
412
- continue;
413
- }
414
- if (origem === "php") {
415
- implementacoes.push({ origem: "php", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
416
- continue;
417
- }
418
- if (origem === "cs" || origem === "csharp" || origem === "dotnet") {
419
- implementacoes.push({ origem: "cs", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
420
- continue;
421
- }
422
- if (origem === "java") {
423
- implementacoes.push({ origem: "java", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
424
- continue;
425
- }
426
- if (origem === "go" || origem === "golang") {
427
- implementacoes.push({ origem: "go", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
428
- continue;
429
- }
430
- if (origem === "rust" || origem === "rs") {
431
- implementacoes.push({ origem: "rust", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
432
- continue;
433
- }
434
- if (origem === "cpp" || origem === "cxx" || origem === "cc" || origem === "c++") {
435
- implementacoes.push({ origem: "cpp", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
436
- }
437
- }
438
- return implementacoes;
439
- }
440
- function converterVinculos(bloco) {
441
- if (!bloco) {
442
- return [];
443
- }
444
- const campos = bloco.campos.map((campo) => {
445
- const valor = valorCampoCompleto(campo) ?? "";
446
- return {
447
- tipo: campo.nome,
448
- valor,
449
- arquivo: campo.nome === "arquivo" ? valor : undefined,
450
- simbolo: campo.nome === "simbolo" ? valor : undefined,
451
- recurso: ["recurso", "tabela", "fila", "cache", "storage"].includes(campo.nome) ? valor : undefined,
452
- superficie: ["superficie", "rota", "worker", "cron", "webhook", "evento", "policy", "fila", "cache", "storage"].includes(campo.nome) ? valor : undefined,
453
- statusResolucao: "nao_verificado",
454
- };
455
- });
456
- const linhas = bloco.linhas.map((linha) => {
457
- const [tipo, ...resto] = linha.conteudo.split(/\s+/);
458
- const valor = resto.join(" ").trim();
459
- return {
460
- tipo: tipo ?? "desconhecido",
461
- valor,
462
- statusResolucao: "nao_verificado",
463
- };
464
- }).filter((item) => item.valor);
465
- const subblocos = bloco.blocos
466
- .filter((item) => item.tipo === "bloco_generico")
467
- .map((item) => ({
468
- tipo: item.palavraChave === "desconhecido" ? (item.nome ?? "desconhecido") : item.palavraChave,
469
- valor: item.nome ?? item.palavraChave,
470
- arquivo: valorCampoCompleto(localizarCampo(item, "arquivo")),
471
- simbolo: valorCampoCompleto(localizarCampo(item, "simbolo")),
472
- recurso: valorCampoCompleto(localizarCampo(item, "recurso", "tabela", "fila", "cache", "storage")),
473
- superficie: valorCampoCompleto(localizarCampo(item, "superficie", "rota", "worker", "cron", "webhook", "evento")),
474
- statusResolucao: "nao_verificado",
475
- }));
476
- return [...campos, ...linhas, ...subblocos];
477
- }
478
- function converterExecucao(bloco) {
479
- const idempotencia = valorCampoCompleto(localizarCampo(bloco, "idempotencia"));
480
- const criticidadeOperacional = valorCampoCompleto(localizarCampo(bloco, "criticidade_operacional"));
481
- return {
482
- idempotencia: idempotencia === "verdadeiro" || idempotencia === "true",
483
- timeout: valorCampoCompleto(localizarCampo(bloco, "timeout")) ?? "padrao",
484
- retry: valorCampoCompleto(localizarCampo(bloco, "retry")) ?? "nenhum",
485
- compensacao: valorCampoCompleto(localizarCampo(bloco, "compensacao")) ?? "nenhuma",
486
- criticidadeOperacional: (criticidadeOperacional === "baixa"
487
- || criticidadeOperacional === "alta"
488
- || criticidadeOperacional === "critica") ? criticidadeOperacional : "media",
489
- explicita: Boolean(bloco),
490
- };
491
- }
492
- function converterAuth(bloco) {
493
- return extrairContratoAuth(bloco);
494
- }
495
- function converterAuthz(bloco) {
496
- return extrairContratoAuthz(bloco);
497
- }
498
- function converterDados(bloco) {
499
- return extrairContratoDados(bloco);
500
- }
501
- function converterAudit(bloco) {
502
- return extrairContratoAudit(bloco);
503
- }
504
- function converterSegredos(bloco) {
505
- return extrairContratoSegredos(bloco);
506
- }
507
- function converterForbidden(bloco) {
508
- return extrairContratoForbidden(bloco);
509
- }
510
- function converterErrosTask(bloco, fallback) {
511
- const erros = new Map();
512
- for (const campo of bloco?.campos ?? []) {
513
- erros.set(campo.nome, {
514
- codigo: campo.nome,
515
- mensagem: valorCampoCompleto(campo) ?? "",
516
- });
517
- }
518
- for (const subbloco of bloco?.blocos ?? []) {
519
- if (subbloco.tipo !== "bloco_generico") {
520
- continue;
521
- }
522
- const codigo = subbloco.nome ?? subbloco.palavraChave;
523
- if (!codigo || codigo === "desconhecido") {
524
- continue;
525
- }
526
- erros.set(codigo, {
527
- codigo,
528
- mensagem: valorCampoCompleto(localizarCampo(subbloco, "mensagem")) ?? `Erro estruturado "${codigo}".`,
529
- categoria: valorCampoCompleto(localizarCampo(subbloco, "categoria")),
530
- recuperabilidade: valorCampoCompleto(localizarCampo(subbloco, "recuperabilidade")),
531
- acaoChamador: valorCampoCompleto(localizarCampo(subbloco, "acao_chamador")),
532
- impactaEstado: valorCampoCompleto(localizarCampo(subbloco, "impacta_estado")) === "verdadeiro",
533
- requerCompensacao: valorCampoCompleto(localizarCampo(subbloco, "requer_compensacao")) === "verdadeiro",
534
- });
535
- }
536
- for (const erro of fallback ?? []) {
537
- if (!erros.has(erro.codigo)) {
538
- erros.set(erro.codigo, {
539
- codigo: erro.codigo,
540
- mensagem: erro.mensagem,
541
- categoria: erro.categoria,
542
- recuperabilidade: erro.recuperabilidade,
543
- acaoChamador: erro.acaoChamador,
544
- impactaEstado: erro.impactaEstado,
545
- requerCompensacao: erro.requerCompensacao,
546
- });
547
- }
548
- }
549
- return [...erros.values()];
550
- }
551
- function extrairPerfil(bloco, padrao = "interno") {
552
- const perfil = valorCampoCompleto(localizarCampo(bloco, "perfil", "compatibilidade"))?.toLowerCase();
553
- if (perfil === "publico"
554
- || perfil === "interno"
555
- || perfil === "experimental"
556
- || perfil === "legado"
557
- || perfil === "deprecado") {
558
- return perfil;
559
- }
560
- return padrao;
561
- }
562
- function tipoNaoPrimitivo(campo) {
563
- if (!TIPOS_PRIMITIVOS.has(campo.tipoBase)) {
564
- return campo.tipoBase;
565
- }
566
- if (campo.tipoItem && !TIPOS_PRIMITIVOS.has(campo.tipoItem)) {
567
- return campo.tipoItem;
568
- }
569
- if (campo.valorMapa && !TIPOS_PRIMITIVOS.has(campo.valorMapa)) {
570
- return campo.valorMapa;
571
- }
572
- return undefined;
573
- }
574
- function deduplicarTexto(valores) {
575
- return [...new Set(valores.filter(Boolean))].sort((a, b) => a.localeCompare(b, "pt-BR"));
576
- }
577
- function resumirAgente(params) {
578
- const entidadesAfetadas = deduplicarTexto([
579
- ...(params.input ?? []).map(tipoNaoPrimitivo).filter((item) => Boolean(item)),
580
- ...(params.output ?? []).map(tipoNaoPrimitivo).filter((item) => Boolean(item)),
581
- ...(params.efeitos ?? []).map((efeito) => efeito.alvo),
582
- ]);
583
- const mutacoesPrevistas = deduplicarTexto((params.efeitos ?? []).map((efeito) => `${efeito.categoria}:${efeito.alvo}`));
584
- const riscos = new Set();
585
- if ((params.efeitos ?? []).some((efeito) => efeito.categoria === "persistencia")) {
586
- riscos.add("altera_persistencia");
587
- }
588
- if ((params.efeitos ?? []).some((efeito) => efeitoEhPrivilegiado(efeito))) {
589
- riscos.add("efeito_privilegiado");
590
- }
591
- if ((params.efeitos ?? []).some((efeito) => efeito.criticidade === "alta" || efeito.criticidade === "critica")) {
592
- riscos.add("efeito_critico");
593
- }
594
- if (params.execucao?.criticidadeOperacional === "alta" || params.execucao?.criticidadeOperacional === "critica") {
595
- riscos.add("execucao_critica");
596
- }
597
- if (contratoDadosTemSensivel(params.dados)) {
598
- riscos.add("dados_sensiveis");
599
- }
600
- if (params.segredos?.itens.length) {
601
- riscos.add("segredo_operacional");
602
- }
603
- if ((params.vinculos ?? []).length === 0) {
604
- riscos.add("vinculo_fraco");
605
- }
606
- const checks = new Set();
607
- checks.add("rodar sema validar --json");
608
- if ((params.output ?? []).length > 0) {
609
- checks.add("verificar guarantees");
610
- }
611
- if ((params.vinculos ?? []).length > 0) {
612
- checks.add("rodar sema drift --json");
613
- }
614
- if (params.auth?.explicita || params.authz?.explicita) {
615
- checks.add("revisar auth e authz");
616
- }
617
- if (params.dados?.explicita) {
618
- checks.add("validar classificacao de dados");
619
- }
620
- if (params.audit?.explicita) {
621
- checks.add("validar trilha de auditoria");
622
- }
623
- if (params.forbidden?.explicita) {
624
- checks.add("confirmar proibicoes operacionais");
625
- }
626
- if (params.superficiePublica) {
627
- checks.add("validar superficie publica impactada");
628
- }
629
- return {
630
- riscos: [...riscos],
631
- checks: [...checks],
632
- entidadesAfetadas,
633
- superficiesPublicas: params.superficiePublica ? [params.superficiePublica] : [],
634
- mutacoesPrevistas,
635
- };
636
- }
637
- function recomporCaminho(campo) {
638
- const valor = valorCampoCompleto(campo);
639
- return valor?.replace(/\s*\/\s*/g, "/").trim();
640
- }
641
- function ehUseInterop(use) {
642
- return use.origem !== "sema";
643
- }
644
- function resolverReferenciaAgent(referencia, agentesConhecidos) {
645
- if (!referencia) {
646
- return undefined;
647
- }
648
- if (agentesConhecidos.has(referencia)) {
649
- return referencia;
650
- }
651
- if (referencia.startsWith("agent.")) {
652
- const nome = referencia.slice("agent.".length);
653
- return agentesConhecidos.has(nome) ? nome : undefined;
654
- }
655
- return undefined;
656
- }
657
- function converterErroPublico(erro, origemTask) {
658
- return {
659
- nome: erro.codigo,
660
- codigo: erro.codigo,
661
- mensagem: erro.mensagem,
662
- categoria: erro.categoria,
663
- recuperabilidade: erro.recuperabilidade,
664
- acaoChamador: erro.acaoChamador,
665
- impactaEstado: erro.impactaEstado,
666
- requerCompensacao: erro.requerCompensacao,
667
- origemTask,
668
- };
669
- }
670
- function calcularConfiancaPublica(route) {
671
- if (route.task && route.vinculos.length > 0) {
672
- return "alta";
673
- }
674
- if (route.task || route.vinculos.length > 0) {
675
- return "media";
676
- }
677
- return "baixa";
678
- }
679
- function calcularRiscoPublico(route) {
680
- if (!route.auth.explicita
681
- || contratoDadosTemSensivel(route.dados)
682
- || route.efeitosPublicos.some((efeito) => efeitoEhPrivilegiado(efeito) || efeito.categoria === "persistencia" || efeito.criticidade === "critica")) {
683
- return "alto";
684
- }
685
- if (route.efeitosPublicos.length > 0 || route.errosPublicos.length > 0) {
686
- return "medio";
687
- }
688
- return "baixo";
689
- }
690
- function converterSuperficie(tipo, superficie) {
691
- const input = converterCampos(encontrarSubBloco(superficie, "input"));
692
- const output = converterCampos(encontrarSubBloco(superficie, "output"));
693
- const effects = (encontrarSubBloco(superficie, "effects")?.linhas ?? [])
694
- .map((linha) => parsearEfeitoSemantico(linha.conteudo))
695
- .filter((linha) => Boolean(linha));
696
- const vinculos = converterVinculos(encontrarSubBloco(superficie, "vinculos"));
697
- const execucao = converterExecucao(encontrarSubBloco(superficie, "execucao"));
698
- const auth = converterAuth(encontrarSubBloco(superficie, "auth"));
699
- const authz = converterAuthz(encontrarSubBloco(superficie, "authz"));
700
- const dados = converterDados(encontrarSubBloco(superficie, "dados"));
701
- const audit = converterAudit(encontrarSubBloco(superficie, "audit"));
702
- const segredos = converterSegredos(encontrarSubBloco(superficie, "segredos"));
703
- const forbidden = converterForbidden(encontrarSubBloco(superficie, "forbidden"));
704
- const task = valorCampoCompleto(localizarCampo(superficie, "task", "tarefa"));
705
- const perfilCompatibilidade = extrairPerfil(superficie, tipo === "webhook" ? "publico" : "interno");
706
- const resumoAgente = resumirAgente({
707
- input,
708
- output,
709
- efeitos: effects,
710
- vinculos,
711
- execucao,
712
- auth,
713
- authz,
714
- dados,
715
- audit,
716
- segredos,
717
- forbidden,
718
- superficiePublica: perfilCompatibilidade === "publico" ? `${tipo}:${superficie.nome ?? tipo}` : undefined,
719
- });
720
- return {
721
- tipo,
722
- nome: superficie.nome ?? tipo,
723
- campos: converterCampos(superficie),
724
- linhas: superficie.linhas.map((linha) => linha.conteudo),
725
- task: task || undefined,
726
- input,
727
- output,
728
- effects,
729
- implementacoesExternas: converterImplementacoes(encontrarSubBloco(superficie, "impl")),
730
- vinculos,
731
- execucao,
732
- auth,
733
- authz,
734
- dados,
735
- audit,
736
- segredos,
737
- forbidden,
738
- perfilCompatibilidade,
739
- resumoAgente,
740
- };
741
- }
742
- export function converterParaIr(modulo, diagnosticos, contexto) {
743
- const perfilModulo = extrairPerfil(modulo.vinculos, modulo.routes.length > 0 || modulo.webhooks.length > 0 ? "publico" : "interno");
744
- const types = modulo.types.map((type) => ({
745
- nome: type.nome,
746
- definicao: converterBloco(encontrarSubBloco(type.corpo, "fields") ?? type.corpo),
747
- invariantes: (encontrarSubBloco(type.corpo, "invariants")?.linhas ?? [])
748
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
749
- .filter((linha) => Boolean(linha)),
750
- }));
751
- const entities = modulo.entities.map((entity) => ({
752
- nome: entity.nome,
753
- campos: converterCampos(encontrarSubBloco(entity.corpo, "fields")),
754
- invariantes: (encontrarSubBloco(entity.corpo, "invariants")?.linhas ?? [])
755
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
756
- .filter((linha) => Boolean(linha)),
757
- }));
758
- const authorDeclarado = modulo.authorBlocks.map(converterAuthorBlock);
759
- const author = modulo.authorBlocks.length > 0
760
- ? [criarRegrasAuthorAutomaticas(), ...authorDeclarado]
761
- : authorDeclarado;
762
- const agents = modulo.agents.map(converterAgent);
763
- const agentsConhecidos = new Set(agents.map((agent) => agent.nome));
764
- const tarefasSemanticas = contexto?.tarefasDetalhadas ?? new Map();
765
- const tasks = modulo.tasks.map((task) => {
766
- const input = converterCampos(task.input);
767
- const output = converterCampos(task.output);
768
- const effects = (task.effects?.linhas ?? [])
769
- .map((linha) => parsearEfeitoSemantico(linha.conteudo))
770
- .filter((linha) => Boolean(linha));
771
- const vinculos = converterVinculos(task.vinculos);
772
- const execucao = converterExecucao(task.execucao);
773
- const auth = converterAuth(encontrarSubBloco(task.corpo, "auth"));
774
- const authz = converterAuthz(encontrarSubBloco(task.corpo, "authz"));
775
- const dados = converterDados(encontrarSubBloco(task.corpo, "dados"));
776
- const audit = converterAudit(encontrarSubBloco(task.corpo, "audit"));
777
- const segredos = converterSegredos(encontrarSubBloco(task.corpo, "segredos"));
778
- const forbidden = converterForbidden(encontrarSubBloco(task.corpo, "forbidden"));
779
- const errosDetalhados = converterErrosTask(task.error, tarefasSemanticas.get(task.nome)?.errors);
780
- const perfilCompatibilidade = extrairPerfil(task.corpo, "interno");
781
- const resumoAgente = resumirAgente({
782
- input,
783
- output,
784
- efeitos: effects,
785
- vinculos,
786
- execucao,
787
- auth,
788
- authz,
789
- dados,
790
- audit,
791
- segredos,
792
- forbidden,
793
- });
794
- return {
795
- nome: task.nome,
796
- input,
797
- output,
798
- rules: task.rules?.linhas.map((linha) => linha.conteudo) ?? [],
799
- regrasEstruturadas: (task.rules?.linhas ?? [])
800
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
801
- .filter((linha) => Boolean(linha)),
802
- effects: task.effects?.linhas.map((linha) => linha.conteudo) ?? [],
803
- efeitosEstruturados: effects,
804
- implementacoesExternas: converterImplementacoes(task.impl),
805
- vinculos,
806
- execucao,
807
- auth,
808
- authz,
809
- dados,
810
- audit,
811
- segredos,
812
- forbidden,
813
- guarantees: task.guarantees?.linhas.map((linha) => linha.conteudo) ?? [],
814
- garantiasEstruturadas: (task.guarantees?.linhas ?? [])
815
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
816
- .filter((linha) => Boolean(linha)),
817
- errors: Object.fromEntries(errosDetalhados.map((erro) => [erro.codigo, erro.mensagem])),
818
- errosDetalhados,
819
- perfilCompatibilidade,
820
- stateContract: task.state ? {
821
- nomeEstado: task.state.nome ?? task.state.campos.find((campo) => campo.nome === "state" || campo.nome === "estado")?.valor,
822
- campos: converterCampos(task.state),
823
- linhas: task.state.linhas.map((linha) => linha.conteudo),
824
- transicoes: (encontrarSubBloco(task.state, "transitions")?.linhas ?? task.state.linhas)
825
- .map((linha) => parsearTransicaoEstado(linha.conteudo))
826
- .filter((linha) => Boolean(linha)),
827
- } : undefined,
828
- resumoAgente,
829
- tests: (task.tests?.blocos.filter((bloco) => bloco.tipo === "caso_teste") ?? []).map(converterCaso),
830
- };
831
- });
832
- const tarefasPorNome = new Map(tasks.map((task) => [task.nome, task]));
833
- const flows = modulo.flows.map((flow) => {
834
- const campos = converterCampos(flow.corpo);
835
- const effects = (encontrarSubBloco(flow.corpo, "effects")?.linhas ?? [])
836
- .map((linha) => parsearEfeitoSemantico(linha.conteudo))
837
- .filter((linha) => Boolean(linha));
838
- const vinculos = converterVinculos(flow.vinculos);
839
- const perfilCompatibilidade = extrairPerfil(flow.corpo, "interno");
840
- const etapasEstruturadas = flow.corpo.linhas
841
- .map((linha) => parsearEtapaFlow(linha.conteudo))
842
- .filter((linha) => Boolean(linha));
843
- return {
844
- nome: flow.nome,
845
- campos,
846
- linhas: flow.corpo.linhas.map((linha) => linha.conteudo),
847
- tasksReferenciadas: flow.corpo.campos
848
- .filter((campo) => campo.nome === "task" || campo.nome === "tarefa")
849
- .map((campo) => campo.valor),
850
- agentsReferenciados: deduplicarTexto(etapasEstruturadas
851
- .map((etapa) => resolverReferenciaAgent(etapa.task, agentsConhecidos))
852
- .filter((agent) => Boolean(agent))),
853
- etapasEstruturadas,
854
- effects: (encontrarSubBloco(flow.corpo, "effects")?.linhas ?? []).map((linha) => linha.conteudo),
855
- efeitosEstruturados: effects,
856
- vinculos,
857
- perfilCompatibilidade,
858
- resumoAgente: resumirAgente({
859
- input: campos,
860
- efeitos: effects,
861
- vinculos,
862
- }),
863
- };
864
- });
865
- const routes = modulo.routes.map((route) => ({
866
- nome: route.nome,
867
- campos: converterCampos(route.corpo),
868
- linhas: route.corpo.linhas.map((linha) => linha.conteudo),
869
- metodo: route.corpo.campos.find((campo) => campo.nome === "metodo")?.valor,
870
- caminho: recomporCaminho(route.corpo.campos.find((campo) => campo.nome === "caminho")),
871
- task: route.corpo.campos.find((campo) => campo.nome === "task" || campo.nome === "tarefa")?.valor,
872
- inputPublico: [],
873
- outputPublico: [],
874
- errosPublicos: [],
875
- efeitosPublicos: [],
876
- vinculos: converterVinculos(route.vinculos),
877
- auth: converterAuth(encontrarSubBloco(route.corpo, "auth")),
878
- authz: converterAuthz(encontrarSubBloco(route.corpo, "authz")),
879
- dados: converterDados(encontrarSubBloco(route.corpo, "dados")),
880
- audit: converterAudit(encontrarSubBloco(route.corpo, "audit")),
881
- segredos: converterSegredos(encontrarSubBloco(route.corpo, "segredos")),
882
- forbidden: converterForbidden(encontrarSubBloco(route.corpo, "forbidden")),
883
- perfilCompatibilidade: extrairPerfil(route.corpo, "publico"),
884
- garantiasPublicasMinimas: [],
885
- resumoAgente: {
886
- riscos: [],
887
- checks: [],
888
- entidadesAfetadas: [],
889
- superficiesPublicas: [],
890
- mutacoesPrevistas: [],
891
- },
892
- publico: {
893
- metodo: undefined,
894
- caminho: undefined,
895
- task: undefined,
896
- input: [],
897
- output: [],
898
- errors: [],
899
- effects: [],
900
- garantiasMinimas: [],
901
- },
902
- })).map((route) => {
903
- const routeAst = modulo.routes.find((item) => item.nome === route.nome);
904
- const tarefaAssociada = route.task ? tarefasPorNome.get(route.task) : undefined;
905
- const tarefaSemantica = route.task ? tarefasSemanticas.get(route.task) : undefined;
906
- const inputPublicoDeclarado = converterCampos(encontrarSubBloco(routeAst.corpo, "input"));
907
- const outputPublicoDeclarado = converterCampos(encontrarSubBloco(routeAst.corpo, "output"));
908
- const errosDeclarados = converterErrosTask(encontrarSubBloco(routeAst.corpo, "error"), tarefaSemantica?.errors);
909
- const efeitosPublicosDeclarados = (encontrarSubBloco(routeAst.corpo, "effects")?.linhas ?? [])
910
- .map((linha) => parsearEfeitoSemantico(linha.conteudo))
911
- .filter((linha) => Boolean(linha));
912
- const inputPublicoResolvido = inputPublicoDeclarado.length > 0
913
- ? inputPublicoDeclarado
914
- : (tarefaAssociada?.input ?? tarefaSemantica?.input?.map((campo) => ({
915
- nome: campo.nome,
916
- tipo: campo.tipo,
917
- modificadores: campo.modificadores,
918
- tipoOriginal: campo.tipo,
919
- tipoBase: campo.tipo,
920
- cardinalidade: "unitario",
921
- opcional: false,
922
- tiposAlternativos: [],
923
- refinamentos: [],
924
- })) ?? []);
925
- const outputPublicoResolvido = outputPublicoDeclarado.length > 0
926
- ? outputPublicoDeclarado
927
- : (tarefaAssociada?.output ?? tarefaSemantica?.output?.map((campo) => ({
928
- nome: campo.nome,
929
- tipo: campo.tipo,
930
- modificadores: campo.modificadores,
931
- tipoOriginal: campo.tipo,
932
- tipoBase: campo.tipo,
933
- cardinalidade: "unitario",
934
- opcional: false,
935
- tiposAlternativos: [],
936
- refinamentos: [],
937
- })) ?? []);
938
- const errosPublicosResolvidos = errosDeclarados.length > 0
939
- ? errosDeclarados.map((erro) => converterErroPublico(erro, route.task))
940
- : (tarefaAssociada?.errosDetalhados ?? (tarefaSemantica?.errors ?? []).map((erro) => ({ codigo: erro.codigo, mensagem: erro.mensagem }))).map((erro) => converterErroPublico(erro, route.task));
941
- const garantiasPublicasMinimas = (tarefaAssociada?.guarantees ?? tarefaSemantica?.guarantees ?? []).filter((garantia) => {
942
- const referencia = garantia.trim().split(/\s+/)[0] ?? "";
943
- return outputPublicoResolvido.some((campo) => campo.nome === referencia || garantia.includes(`${campo.nome}.`));
944
- });
945
- const routeResolvida = {
946
- ...route,
947
- inputPublico: inputPublicoResolvido,
948
- outputPublico: outputPublicoResolvido,
949
- errosPublicos: errosPublicosResolvidos,
950
- efeitosPublicos: efeitosPublicosDeclarados,
951
- garantiasPublicasMinimas,
952
- resumoAgente: resumirAgente({
953
- input: inputPublicoResolvido,
954
- output: outputPublicoResolvido,
955
- efeitos: efeitosPublicosDeclarados,
956
- vinculos: route.vinculos,
957
- auth: route.auth,
958
- authz: route.authz,
959
- dados: route.dados,
960
- audit: route.audit,
961
- segredos: route.segredos,
962
- forbidden: route.forbidden,
963
- superficiePublica: `${route.metodo ?? "?"} ${route.caminho ?? "?"}`,
964
- }),
965
- publico: {
966
- metodo: route.metodo,
967
- caminho: route.caminho,
968
- task: route.task,
969
- input: inputPublicoResolvido,
970
- output: outputPublicoResolvido,
971
- errors: errosPublicosResolvidos,
972
- effects: efeitosPublicosDeclarados,
973
- garantiasMinimas: garantiasPublicasMinimas,
974
- confiancaContrato: "media",
975
- riscoRegressao: "medio",
976
- divergenciasPublicas: [],
977
- },
978
- };
979
- routeResolvida.publico.confiancaContrato = calcularConfiancaPublica(routeResolvida);
980
- routeResolvida.publico.riscoRegressao = calcularRiscoPublico(routeResolvida);
981
- return routeResolvida;
982
- });
983
- const superficies = [
984
- ...modulo.workers.map((item) => converterSuperficie("worker", item)),
985
- ...modulo.eventos.map((item) => converterSuperficie("evento", item)),
986
- ...modulo.filas.map((item) => converterSuperficie("fila", item)),
987
- ...modulo.crons.map((item) => converterSuperficie("cron", item)),
988
- ...modulo.webhooks.map((item) => converterSuperficie("webhook", item)),
989
- ...modulo.caches.map((item) => converterSuperficie("cache", item)),
990
- ...modulo.storages.map((item) => converterSuperficie("storage", item)),
991
- ...modulo.policies.map((item) => converterSuperficie("policy", item)),
992
- ];
993
- const states = modulo.states.map((state) => ({
994
- nome: state.nome,
995
- campos: converterCampos(encontrarSubBloco(state.corpo, "fields") ?? state.corpo),
996
- linhas: state.corpo.linhas.map((linha) => linha.conteudo),
997
- invariantes: (encontrarSubBloco(state.corpo, "invariants")?.linhas ?? [])
998
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
999
- .filter((linha) => Boolean(linha)),
1000
- transicoes: (encontrarSubBloco(state.corpo, "transitions")?.linhas ?? [])
1001
- .map((linha) => parsearTransicaoEstado(linha.conteudo))
1002
- .filter((linha) => Boolean(linha)),
1003
- }));
1004
- const databases = modulo.databases.map(converterDatabase);
1005
- const resumoAgenteModulo = resumirAgente({
1006
- input: [],
1007
- output: [],
1008
- efeitos: [
1009
- ...tasks.flatMap((task) => task.efeitosEstruturados),
1010
- ...routes.flatMap((route) => route.efeitosPublicos),
1011
- ...superficies.flatMap((superficie) => superficie.effects),
1012
- ],
1013
- vinculos: [
1014
- ...converterVinculos(modulo.vinculos),
1015
- ...tasks.flatMap((task) => task.vinculos),
1016
- ...routes.flatMap((route) => route.vinculos),
1017
- ...superficies.flatMap((superficie) => superficie.vinculos),
1018
- ],
1019
- });
1020
- return {
1021
- nome: modulo.nome,
1022
- uses: contexto?.modulosImportados.length
1023
- ? [...contexto.modulosImportados]
1024
- : modulo.uses.filter((use) => use.origem === "sema").map((use) => use.caminho),
1025
- imports: modulo.uses.map((use) => ({
1026
- origem: use.origem,
1027
- caminho: use.caminho,
1028
- externo: use.origem !== "sema",
1029
- })),
1030
- interoperabilidades: contexto?.interoperabilidades.map((interop) => ({ ...interop })) ?? modulo.uses
1031
- .filter(ehUseInterop)
1032
- .map((use) => ({ origem: use.origem, caminho: use.caminho })),
1033
- vinculos: converterVinculos(modulo.vinculos),
1034
- perfilCompatibilidade: perfilModulo,
1035
- types,
1036
- entities,
1037
- enums: modulo.enums.map((enumeracao) => ({ nome: enumeracao.nome, valores: enumeracao.valores })),
1038
- author,
1039
- agents,
1040
- tasks,
1041
- flows,
1042
- routes,
1043
- superficies,
1044
- states,
1045
- databases,
1046
- resumoAgente: {
1047
- ...resumoAgenteModulo,
1048
- superficiesPublicas: deduplicarTexto([
1049
- ...routes.map((route) => `${route.metodo ?? "?"} ${route.caminho ?? route.nome}`),
1050
- ...superficies
1051
- .filter((superficie) => superficie.perfilCompatibilidade === "publico")
1052
- .map((superficie) => `${superficie.tipo}:${superficie.nome}`),
1053
- ]),
1054
- },
1055
- diagnosticos,
1056
- };
1057
- }
1058
- //# sourceMappingURL=conversor.js.map