@semacode/cli 1.5.16 → 1.5.17

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