@semacode/cli 1.5.11 → 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 +6 -1
  2. package/dist/index.js +446 -32
  3. package/package.json +23 -32
  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 -110
  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 -244
  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 -123
  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 -460
  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 -883
  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 -345
  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 -61
  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 -771
  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 -57
  162. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1617
  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,883 +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 coletarLinhasPersistencia(bloco, nome) {
154
- if (!bloco) {
155
- return [];
156
- }
157
- return encontrarSubBloco(bloco, nome)?.linhas.map((linha) => linha.conteudo) ?? [];
158
- }
159
- function resolverTipoRecursoPersistencia(bloco) {
160
- const explicito = valorCampoCompleto(localizarCampoPersistencia(bloco, "resource_kind"));
161
- if (explicito && TIPOS_RECURSO_PERSISTENCIA.has(explicito)) {
162
- return explicito;
163
- }
164
- return nomeTipoRecursoPersistencia(bloco);
165
- }
166
- function converterCompatibilidadePersistencia(compatibilidades) {
167
- return compatibilidades.map((item) => ({ ...item }));
168
- }
169
- function converterRecursoPersistencia(recurso) {
170
- const resourceKind = resolverTipoRecursoPersistencia(recurso);
171
- if (!resourceKind) {
172
- return undefined;
173
- }
174
- const mode = valorCampoCompleto(localizarCampoPersistencia(recurso, "mode"));
175
- const isolation = valorCampoCompleto(localizarCampoPersistencia(recurso, "isolation"));
176
- return {
177
- nome: recurso.nome ?? resourceKind,
178
- resourceKind,
179
- entity: valorCampoCompleto(localizarCampoPersistencia(recurso, "entity")),
180
- collection: valorCampoCompleto(localizarCampoPersistencia(recurso, "collection")),
181
- table: valorCampoCompleto(localizarCampoPersistencia(recurso, "table")),
182
- consistency: normalizarConsistenciaPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "consistency")))
183
- ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "consistency")),
184
- durability: normalizarDurabilidadePersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "durability")))
185
- ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "durability")),
186
- transactionModel: normalizarModeloTransacaoPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "transaction_model")))
187
- ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "transaction_model")),
188
- queryModel: normalizarModeloConsultaPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "query_model")))
189
- ?? valorCampoCompleto(localizarCampoPersistencia(recurso, "query_model")),
190
- mode,
191
- isolation,
192
- strategy: valorCampoCompleto(localizarCampoPersistencia(recurso, "strategy")),
193
- ttl: valorCampoCompleto(localizarCampoPersistencia(recurso, "ttl")),
194
- retention: valorCampoCompleto(localizarCampoPersistencia(recurso, "retention")),
195
- path: valorCampoCompleto(localizarCampoPersistencia(recurso, "path")),
196
- from: valorCampoCompleto(localizarCampoPersistencia(recurso, "from")),
197
- to: valorCampoCompleto(localizarCampoPersistencia(recurso, "to")),
198
- surface: valorCampoCompleto(localizarCampoPersistencia(recurso, "surface")),
199
- adapter: valorCampoCompleto(localizarCampoPersistencia(recurso, "adapter")),
200
- portavel: parsearBooleanoPersistencia(valorCampoCompleto(localizarCampoPersistencia(recurso, "portavel"))),
201
- capabilities: coletarLinhasPersistencia(recurso, "capabilities"),
202
- operations: coletarLinhasPersistencia(recurso, "operations"),
203
- indexing: coletarLinhasPersistencia(recurso, "indexing"),
204
- guarantees: coletarLinhasPersistencia(recurso, "guarantees"),
205
- diagnostics: coletarLinhasPersistencia(recurso, "diagnostics"),
206
- risks: coletarLinhasPersistencia(recurso, "risks"),
207
- fields: converterCampos(recurso),
208
- lines: recurso.linhas.map((linha) => linha.conteudo),
209
- block: converterBloco(recurso),
210
- compatibilidade: converterCompatibilidadePersistencia(matrizCompatibilidadePersistencia(resourceKind, { mode, isolation })),
211
- };
212
- }
213
- function converterDatabase(database) {
214
- return {
215
- nome: database.nome ?? "database",
216
- engine: normalizarEngineBanco(valorCampoCompleto(localizarCampoPersistencia(database, "engine"))),
217
- schema: valorCampoCompleto(localizarCampoPersistencia(database, "schema")),
218
- database: valorCampoCompleto(localizarCampoPersistencia(database, "database")),
219
- consistency: normalizarConsistenciaPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "consistency")))
220
- ?? valorCampoCompleto(localizarCampoPersistencia(database, "consistency")),
221
- durability: normalizarDurabilidadePersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "durability")))
222
- ?? valorCampoCompleto(localizarCampoPersistencia(database, "durability")),
223
- transactionModel: normalizarModeloTransacaoPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "transaction_model")))
224
- ?? valorCampoCompleto(localizarCampoPersistencia(database, "transaction_model")),
225
- queryModel: normalizarModeloConsultaPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "query_model")))
226
- ?? valorCampoCompleto(localizarCampoPersistencia(database, "query_model")),
227
- portavel: parsearBooleanoPersistencia(valorCampoCompleto(localizarCampoPersistencia(database, "portavel"))),
228
- adapter: valorCampoCompleto(localizarCampoPersistencia(database, "adapter")),
229
- capabilities: coletarLinhasPersistencia(database, "capabilities"),
230
- operations: coletarLinhasPersistencia(database, "operations"),
231
- indexing: coletarLinhasPersistencia(database, "indexing"),
232
- guarantees: coletarLinhasPersistencia(database, "guarantees"),
233
- diagnostics: coletarLinhasPersistencia(database, "diagnostics"),
234
- risks: coletarLinhasPersistencia(database, "risks"),
235
- fields: converterCampos(database),
236
- lines: database.linhas.map((linha) => linha.conteudo),
237
- block: converterBloco(database),
238
- resources: database.blocos
239
- .filter((bloco) => bloco.tipo === "bloco_generico")
240
- .map(converterRecursoPersistencia)
241
- .filter((item) => Boolean(item)),
242
- };
243
- }
244
- function converterImplementacoes(bloco) {
245
- const implementacoes = [];
246
- for (const campo of bloco?.campos ?? []) {
247
- const origem = campo.nome.toLowerCase();
248
- if (origem === "ts" || origem === "typescript") {
249
- implementacoes.push({ origem: "ts", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
250
- continue;
251
- }
252
- if (origem === "py" || origem === "python") {
253
- implementacoes.push({ origem: "py", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
254
- continue;
255
- }
256
- if (origem === "dart") {
257
- implementacoes.push({ origem: "dart", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
258
- continue;
259
- }
260
- if (origem === "lua") {
261
- implementacoes.push({ origem: "lua", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
262
- continue;
263
- }
264
- if (origem === "php") {
265
- implementacoes.push({ origem: "php", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
266
- continue;
267
- }
268
- if (origem === "cs" || origem === "csharp" || origem === "dotnet") {
269
- implementacoes.push({ origem: "cs", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
270
- continue;
271
- }
272
- if (origem === "java") {
273
- implementacoes.push({ origem: "java", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
274
- continue;
275
- }
276
- if (origem === "go" || origem === "golang") {
277
- implementacoes.push({ origem: "go", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
278
- continue;
279
- }
280
- if (origem === "rust" || origem === "rs") {
281
- implementacoes.push({ origem: "rust", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
282
- continue;
283
- }
284
- if (origem === "cpp" || origem === "cxx" || origem === "cc" || origem === "c++") {
285
- implementacoes.push({ origem: "cpp", caminho: campo.valor, resolucaoImpl: campo.valor, statusImpl: "nao_verificado" });
286
- }
287
- }
288
- return implementacoes;
289
- }
290
- function converterVinculos(bloco) {
291
- if (!bloco) {
292
- return [];
293
- }
294
- const campos = bloco.campos.map((campo) => {
295
- const valor = valorCampoCompleto(campo) ?? "";
296
- return {
297
- tipo: campo.nome,
298
- valor,
299
- arquivo: campo.nome === "arquivo" ? valor : undefined,
300
- simbolo: campo.nome === "simbolo" ? valor : undefined,
301
- recurso: ["recurso", "tabela", "fila", "cache", "storage"].includes(campo.nome) ? valor : undefined,
302
- superficie: ["superficie", "rota", "worker", "cron", "webhook", "evento", "policy", "fila", "cache", "storage"].includes(campo.nome) ? valor : undefined,
303
- statusResolucao: "nao_verificado",
304
- };
305
- });
306
- const linhas = bloco.linhas.map((linha) => {
307
- const [tipo, ...resto] = linha.conteudo.split(/\s+/);
308
- const valor = resto.join(" ").trim();
309
- return {
310
- tipo: tipo ?? "desconhecido",
311
- valor,
312
- statusResolucao: "nao_verificado",
313
- };
314
- }).filter((item) => item.valor);
315
- const subblocos = bloco.blocos
316
- .filter((item) => item.tipo === "bloco_generico")
317
- .map((item) => ({
318
- tipo: item.palavraChave === "desconhecido" ? (item.nome ?? "desconhecido") : item.palavraChave,
319
- valor: item.nome ?? item.palavraChave,
320
- arquivo: valorCampoCompleto(localizarCampo(item, "arquivo")),
321
- simbolo: valorCampoCompleto(localizarCampo(item, "simbolo")),
322
- recurso: valorCampoCompleto(localizarCampo(item, "recurso", "tabela", "fila", "cache", "storage")),
323
- superficie: valorCampoCompleto(localizarCampo(item, "superficie", "rota", "worker", "cron", "webhook", "evento")),
324
- statusResolucao: "nao_verificado",
325
- }));
326
- return [...campos, ...linhas, ...subblocos];
327
- }
328
- function converterExecucao(bloco) {
329
- const idempotencia = valorCampoCompleto(localizarCampo(bloco, "idempotencia"));
330
- const criticidadeOperacional = valorCampoCompleto(localizarCampo(bloco, "criticidade_operacional"));
331
- return {
332
- idempotencia: idempotencia === "verdadeiro" || idempotencia === "true",
333
- timeout: valorCampoCompleto(localizarCampo(bloco, "timeout")) ?? "padrao",
334
- retry: valorCampoCompleto(localizarCampo(bloco, "retry")) ?? "nenhum",
335
- compensacao: valorCampoCompleto(localizarCampo(bloco, "compensacao")) ?? "nenhuma",
336
- criticidadeOperacional: (criticidadeOperacional === "baixa"
337
- || criticidadeOperacional === "alta"
338
- || criticidadeOperacional === "critica") ? criticidadeOperacional : "media",
339
- explicita: Boolean(bloco),
340
- };
341
- }
342
- function converterAuth(bloco) {
343
- return extrairContratoAuth(bloco);
344
- }
345
- function converterAuthz(bloco) {
346
- return extrairContratoAuthz(bloco);
347
- }
348
- function converterDados(bloco) {
349
- return extrairContratoDados(bloco);
350
- }
351
- function converterAudit(bloco) {
352
- return extrairContratoAudit(bloco);
353
- }
354
- function converterSegredos(bloco) {
355
- return extrairContratoSegredos(bloco);
356
- }
357
- function converterForbidden(bloco) {
358
- return extrairContratoForbidden(bloco);
359
- }
360
- function converterErrosTask(bloco, fallback) {
361
- const erros = new Map();
362
- for (const campo of bloco?.campos ?? []) {
363
- erros.set(campo.nome, {
364
- codigo: campo.nome,
365
- mensagem: valorCampoCompleto(campo) ?? "",
366
- });
367
- }
368
- for (const subbloco of bloco?.blocos ?? []) {
369
- if (subbloco.tipo !== "bloco_generico") {
370
- continue;
371
- }
372
- const codigo = subbloco.nome ?? subbloco.palavraChave;
373
- if (!codigo || codigo === "desconhecido") {
374
- continue;
375
- }
376
- erros.set(codigo, {
377
- codigo,
378
- mensagem: valorCampoCompleto(localizarCampo(subbloco, "mensagem")) ?? `Erro estruturado "${codigo}".`,
379
- categoria: valorCampoCompleto(localizarCampo(subbloco, "categoria")),
380
- recuperabilidade: valorCampoCompleto(localizarCampo(subbloco, "recuperabilidade")),
381
- acaoChamador: valorCampoCompleto(localizarCampo(subbloco, "acao_chamador")),
382
- impactaEstado: valorCampoCompleto(localizarCampo(subbloco, "impacta_estado")) === "verdadeiro",
383
- requerCompensacao: valorCampoCompleto(localizarCampo(subbloco, "requer_compensacao")) === "verdadeiro",
384
- });
385
- }
386
- for (const erro of fallback ?? []) {
387
- if (!erros.has(erro.codigo)) {
388
- erros.set(erro.codigo, {
389
- codigo: erro.codigo,
390
- mensagem: erro.mensagem,
391
- categoria: erro.categoria,
392
- recuperabilidade: erro.recuperabilidade,
393
- acaoChamador: erro.acaoChamador,
394
- impactaEstado: erro.impactaEstado,
395
- requerCompensacao: erro.requerCompensacao,
396
- });
397
- }
398
- }
399
- return [...erros.values()];
400
- }
401
- function extrairPerfil(bloco, padrao = "interno") {
402
- const perfil = valorCampoCompleto(localizarCampo(bloco, "perfil", "compatibilidade"))?.toLowerCase();
403
- if (perfil === "publico"
404
- || perfil === "interno"
405
- || perfil === "experimental"
406
- || perfil === "legado"
407
- || perfil === "deprecado") {
408
- return perfil;
409
- }
410
- return padrao;
411
- }
412
- function tipoNaoPrimitivo(campo) {
413
- if (!TIPOS_PRIMITIVOS.has(campo.tipoBase)) {
414
- return campo.tipoBase;
415
- }
416
- if (campo.tipoItem && !TIPOS_PRIMITIVOS.has(campo.tipoItem)) {
417
- return campo.tipoItem;
418
- }
419
- if (campo.valorMapa && !TIPOS_PRIMITIVOS.has(campo.valorMapa)) {
420
- return campo.valorMapa;
421
- }
422
- return undefined;
423
- }
424
- function deduplicarTexto(valores) {
425
- return [...new Set(valores.filter(Boolean))].sort((a, b) => a.localeCompare(b, "pt-BR"));
426
- }
427
- function resumirAgente(params) {
428
- const entidadesAfetadas = deduplicarTexto([
429
- ...(params.input ?? []).map(tipoNaoPrimitivo).filter((item) => Boolean(item)),
430
- ...(params.output ?? []).map(tipoNaoPrimitivo).filter((item) => Boolean(item)),
431
- ...(params.efeitos ?? []).map((efeito) => efeito.alvo),
432
- ]);
433
- const mutacoesPrevistas = deduplicarTexto((params.efeitos ?? []).map((efeito) => `${efeito.categoria}:${efeito.alvo}`));
434
- const riscos = new Set();
435
- if ((params.efeitos ?? []).some((efeito) => efeito.categoria === "persistencia")) {
436
- riscos.add("altera_persistencia");
437
- }
438
- if ((params.efeitos ?? []).some((efeito) => efeitoEhPrivilegiado(efeito))) {
439
- riscos.add("efeito_privilegiado");
440
- }
441
- if ((params.efeitos ?? []).some((efeito) => efeito.criticidade === "alta" || efeito.criticidade === "critica")) {
442
- riscos.add("efeito_critico");
443
- }
444
- if (params.execucao?.criticidadeOperacional === "alta" || params.execucao?.criticidadeOperacional === "critica") {
445
- riscos.add("execucao_critica");
446
- }
447
- if (contratoDadosTemSensivel(params.dados)) {
448
- riscos.add("dados_sensiveis");
449
- }
450
- if (params.segredos?.itens.length) {
451
- riscos.add("segredo_operacional");
452
- }
453
- if ((params.vinculos ?? []).length === 0) {
454
- riscos.add("vinculo_fraco");
455
- }
456
- const checks = new Set();
457
- checks.add("rodar sema validar --json");
458
- if ((params.output ?? []).length > 0) {
459
- checks.add("verificar guarantees");
460
- }
461
- if ((params.vinculos ?? []).length > 0) {
462
- checks.add("rodar sema drift --json");
463
- }
464
- if (params.auth?.explicita || params.authz?.explicita) {
465
- checks.add("revisar auth e authz");
466
- }
467
- if (params.dados?.explicita) {
468
- checks.add("validar classificacao de dados");
469
- }
470
- if (params.audit?.explicita) {
471
- checks.add("validar trilha de auditoria");
472
- }
473
- if (params.forbidden?.explicita) {
474
- checks.add("confirmar proibicoes operacionais");
475
- }
476
- if (params.superficiePublica) {
477
- checks.add("validar superficie publica impactada");
478
- }
479
- return {
480
- riscos: [...riscos],
481
- checks: [...checks],
482
- entidadesAfetadas,
483
- superficiesPublicas: params.superficiePublica ? [params.superficiePublica] : [],
484
- mutacoesPrevistas,
485
- };
486
- }
487
- function recomporCaminho(campo) {
488
- const valor = valorCampoCompleto(campo);
489
- return valor?.replace(/\s*\/\s*/g, "/").trim();
490
- }
491
- function ehUseInterop(use) {
492
- return use.origem !== "sema";
493
- }
494
- function converterErroPublico(erro, origemTask) {
495
- return {
496
- nome: erro.codigo,
497
- codigo: erro.codigo,
498
- mensagem: erro.mensagem,
499
- categoria: erro.categoria,
500
- recuperabilidade: erro.recuperabilidade,
501
- acaoChamador: erro.acaoChamador,
502
- impactaEstado: erro.impactaEstado,
503
- requerCompensacao: erro.requerCompensacao,
504
- origemTask,
505
- };
506
- }
507
- function calcularConfiancaPublica(route) {
508
- if (route.task && route.vinculos.length > 0) {
509
- return "alta";
510
- }
511
- if (route.task || route.vinculos.length > 0) {
512
- return "media";
513
- }
514
- return "baixa";
515
- }
516
- function calcularRiscoPublico(route) {
517
- if (!route.auth.explicita
518
- || contratoDadosTemSensivel(route.dados)
519
- || route.efeitosPublicos.some((efeito) => efeitoEhPrivilegiado(efeito) || efeito.categoria === "persistencia" || efeito.criticidade === "critica")) {
520
- return "alto";
521
- }
522
- if (route.efeitosPublicos.length > 0 || route.errosPublicos.length > 0) {
523
- return "medio";
524
- }
525
- return "baixo";
526
- }
527
- function converterSuperficie(tipo, superficie) {
528
- const input = converterCampos(encontrarSubBloco(superficie, "input"));
529
- const output = converterCampos(encontrarSubBloco(superficie, "output"));
530
- const effects = (encontrarSubBloco(superficie, "effects")?.linhas ?? [])
531
- .map((linha) => parsearEfeitoSemantico(linha.conteudo))
532
- .filter((linha) => Boolean(linha));
533
- const vinculos = converterVinculos(encontrarSubBloco(superficie, "vinculos"));
534
- const execucao = converterExecucao(encontrarSubBloco(superficie, "execucao"));
535
- const auth = converterAuth(encontrarSubBloco(superficie, "auth"));
536
- const authz = converterAuthz(encontrarSubBloco(superficie, "authz"));
537
- const dados = converterDados(encontrarSubBloco(superficie, "dados"));
538
- const audit = converterAudit(encontrarSubBloco(superficie, "audit"));
539
- const segredos = converterSegredos(encontrarSubBloco(superficie, "segredos"));
540
- const forbidden = converterForbidden(encontrarSubBloco(superficie, "forbidden"));
541
- const task = valorCampoCompleto(localizarCampo(superficie, "task", "tarefa"));
542
- const perfilCompatibilidade = extrairPerfil(superficie, tipo === "webhook" ? "publico" : "interno");
543
- const resumoAgente = resumirAgente({
544
- input,
545
- output,
546
- efeitos: effects,
547
- vinculos,
548
- execucao,
549
- auth,
550
- authz,
551
- dados,
552
- audit,
553
- segredos,
554
- forbidden,
555
- superficiePublica: perfilCompatibilidade === "publico" ? `${tipo}:${superficie.nome ?? tipo}` : undefined,
556
- });
557
- return {
558
- tipo,
559
- nome: superficie.nome ?? tipo,
560
- campos: converterCampos(superficie),
561
- linhas: superficie.linhas.map((linha) => linha.conteudo),
562
- task: task || undefined,
563
- input,
564
- output,
565
- effects,
566
- implementacoesExternas: converterImplementacoes(encontrarSubBloco(superficie, "impl")),
567
- vinculos,
568
- execucao,
569
- auth,
570
- authz,
571
- dados,
572
- audit,
573
- segredos,
574
- forbidden,
575
- perfilCompatibilidade,
576
- resumoAgente,
577
- };
578
- }
579
- export function converterParaIr(modulo, diagnosticos, contexto) {
580
- const perfilModulo = extrairPerfil(modulo.vinculos, modulo.routes.length > 0 || modulo.webhooks.length > 0 ? "publico" : "interno");
581
- const types = modulo.types.map((type) => ({
582
- nome: type.nome,
583
- definicao: converterBloco(encontrarSubBloco(type.corpo, "fields") ?? type.corpo),
584
- invariantes: (encontrarSubBloco(type.corpo, "invariants")?.linhas ?? [])
585
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
586
- .filter((linha) => Boolean(linha)),
587
- }));
588
- const entities = modulo.entities.map((entity) => ({
589
- nome: entity.nome,
590
- campos: converterCampos(encontrarSubBloco(entity.corpo, "fields")),
591
- invariantes: (encontrarSubBloco(entity.corpo, "invariants")?.linhas ?? [])
592
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
593
- .filter((linha) => Boolean(linha)),
594
- }));
595
- const tarefasSemanticas = contexto?.tarefasDetalhadas ?? new Map();
596
- const tasks = modulo.tasks.map((task) => {
597
- const input = converterCampos(task.input);
598
- const output = converterCampos(task.output);
599
- const effects = (task.effects?.linhas ?? [])
600
- .map((linha) => parsearEfeitoSemantico(linha.conteudo))
601
- .filter((linha) => Boolean(linha));
602
- const vinculos = converterVinculos(task.vinculos);
603
- const execucao = converterExecucao(task.execucao);
604
- const auth = converterAuth(encontrarSubBloco(task.corpo, "auth"));
605
- const authz = converterAuthz(encontrarSubBloco(task.corpo, "authz"));
606
- const dados = converterDados(encontrarSubBloco(task.corpo, "dados"));
607
- const audit = converterAudit(encontrarSubBloco(task.corpo, "audit"));
608
- const segredos = converterSegredos(encontrarSubBloco(task.corpo, "segredos"));
609
- const forbidden = converterForbidden(encontrarSubBloco(task.corpo, "forbidden"));
610
- const errosDetalhados = converterErrosTask(task.error, tarefasSemanticas.get(task.nome)?.errors);
611
- const perfilCompatibilidade = extrairPerfil(task.corpo, "interno");
612
- const resumoAgente = resumirAgente({
613
- input,
614
- output,
615
- efeitos: effects,
616
- vinculos,
617
- execucao,
618
- auth,
619
- authz,
620
- dados,
621
- audit,
622
- segredos,
623
- forbidden,
624
- });
625
- return {
626
- nome: task.nome,
627
- input,
628
- output,
629
- rules: task.rules?.linhas.map((linha) => linha.conteudo) ?? [],
630
- regrasEstruturadas: (task.rules?.linhas ?? [])
631
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
632
- .filter((linha) => Boolean(linha)),
633
- effects: task.effects?.linhas.map((linha) => linha.conteudo) ?? [],
634
- efeitosEstruturados: effects,
635
- implementacoesExternas: converterImplementacoes(task.impl),
636
- vinculos,
637
- execucao,
638
- auth,
639
- authz,
640
- dados,
641
- audit,
642
- segredos,
643
- forbidden,
644
- guarantees: task.guarantees?.linhas.map((linha) => linha.conteudo) ?? [],
645
- garantiasEstruturadas: (task.guarantees?.linhas ?? [])
646
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
647
- .filter((linha) => Boolean(linha)),
648
- errors: Object.fromEntries(errosDetalhados.map((erro) => [erro.codigo, erro.mensagem])),
649
- errosDetalhados,
650
- perfilCompatibilidade,
651
- stateContract: task.state ? {
652
- nomeEstado: task.state.nome ?? task.state.campos.find((campo) => campo.nome === "state" || campo.nome === "estado")?.valor,
653
- campos: converterCampos(task.state),
654
- linhas: task.state.linhas.map((linha) => linha.conteudo),
655
- transicoes: (encontrarSubBloco(task.state, "transitions")?.linhas ?? task.state.linhas)
656
- .map((linha) => parsearTransicaoEstado(linha.conteudo))
657
- .filter((linha) => Boolean(linha)),
658
- } : undefined,
659
- resumoAgente,
660
- tests: (task.tests?.blocos.filter((bloco) => bloco.tipo === "caso_teste") ?? []).map(converterCaso),
661
- };
662
- });
663
- const tarefasPorNome = new Map(tasks.map((task) => [task.nome, task]));
664
- const flows = modulo.flows.map((flow) => {
665
- const campos = converterCampos(flow.corpo);
666
- const effects = (encontrarSubBloco(flow.corpo, "effects")?.linhas ?? [])
667
- .map((linha) => parsearEfeitoSemantico(linha.conteudo))
668
- .filter((linha) => Boolean(linha));
669
- const vinculos = converterVinculos(flow.vinculos);
670
- const perfilCompatibilidade = extrairPerfil(flow.corpo, "interno");
671
- return {
672
- nome: flow.nome,
673
- campos,
674
- linhas: flow.corpo.linhas.map((linha) => linha.conteudo),
675
- tasksReferenciadas: flow.corpo.campos
676
- .filter((campo) => campo.nome === "task" || campo.nome === "tarefa")
677
- .map((campo) => campo.valor),
678
- etapasEstruturadas: flow.corpo.linhas
679
- .map((linha) => parsearEtapaFlow(linha.conteudo))
680
- .filter((linha) => Boolean(linha)),
681
- effects: (encontrarSubBloco(flow.corpo, "effects")?.linhas ?? []).map((linha) => linha.conteudo),
682
- efeitosEstruturados: effects,
683
- vinculos,
684
- perfilCompatibilidade,
685
- resumoAgente: resumirAgente({
686
- input: campos,
687
- efeitos: effects,
688
- vinculos,
689
- }),
690
- };
691
- });
692
- const routes = modulo.routes.map((route) => ({
693
- nome: route.nome,
694
- campos: converterCampos(route.corpo),
695
- linhas: route.corpo.linhas.map((linha) => linha.conteudo),
696
- metodo: route.corpo.campos.find((campo) => campo.nome === "metodo")?.valor,
697
- caminho: recomporCaminho(route.corpo.campos.find((campo) => campo.nome === "caminho")),
698
- task: route.corpo.campos.find((campo) => campo.nome === "task" || campo.nome === "tarefa")?.valor,
699
- inputPublico: [],
700
- outputPublico: [],
701
- errosPublicos: [],
702
- efeitosPublicos: [],
703
- vinculos: converterVinculos(route.vinculos),
704
- auth: converterAuth(encontrarSubBloco(route.corpo, "auth")),
705
- authz: converterAuthz(encontrarSubBloco(route.corpo, "authz")),
706
- dados: converterDados(encontrarSubBloco(route.corpo, "dados")),
707
- audit: converterAudit(encontrarSubBloco(route.corpo, "audit")),
708
- segredos: converterSegredos(encontrarSubBloco(route.corpo, "segredos")),
709
- forbidden: converterForbidden(encontrarSubBloco(route.corpo, "forbidden")),
710
- perfilCompatibilidade: extrairPerfil(route.corpo, "publico"),
711
- garantiasPublicasMinimas: [],
712
- resumoAgente: {
713
- riscos: [],
714
- checks: [],
715
- entidadesAfetadas: [],
716
- superficiesPublicas: [],
717
- mutacoesPrevistas: [],
718
- },
719
- publico: {
720
- metodo: undefined,
721
- caminho: undefined,
722
- task: undefined,
723
- input: [],
724
- output: [],
725
- errors: [],
726
- effects: [],
727
- garantiasMinimas: [],
728
- },
729
- })).map((route) => {
730
- const routeAst = modulo.routes.find((item) => item.nome === route.nome);
731
- const tarefaAssociada = route.task ? tarefasPorNome.get(route.task) : undefined;
732
- const tarefaSemantica = route.task ? tarefasSemanticas.get(route.task) : undefined;
733
- const inputPublicoDeclarado = converterCampos(encontrarSubBloco(routeAst.corpo, "input"));
734
- const outputPublicoDeclarado = converterCampos(encontrarSubBloco(routeAst.corpo, "output"));
735
- const errosDeclarados = converterErrosTask(encontrarSubBloco(routeAst.corpo, "error"), tarefaSemantica?.errors);
736
- const efeitosPublicosDeclarados = (encontrarSubBloco(routeAst.corpo, "effects")?.linhas ?? [])
737
- .map((linha) => parsearEfeitoSemantico(linha.conteudo))
738
- .filter((linha) => Boolean(linha));
739
- const inputPublicoResolvido = inputPublicoDeclarado.length > 0
740
- ? inputPublicoDeclarado
741
- : (tarefaAssociada?.input ?? tarefaSemantica?.input?.map((campo) => ({
742
- nome: campo.nome,
743
- tipo: campo.tipo,
744
- modificadores: campo.modificadores,
745
- tipoOriginal: campo.tipo,
746
- tipoBase: campo.tipo,
747
- cardinalidade: "unitario",
748
- opcional: false,
749
- tiposAlternativos: [],
750
- refinamentos: [],
751
- })) ?? []);
752
- const outputPublicoResolvido = outputPublicoDeclarado.length > 0
753
- ? outputPublicoDeclarado
754
- : (tarefaAssociada?.output ?? tarefaSemantica?.output?.map((campo) => ({
755
- nome: campo.nome,
756
- tipo: campo.tipo,
757
- modificadores: campo.modificadores,
758
- tipoOriginal: campo.tipo,
759
- tipoBase: campo.tipo,
760
- cardinalidade: "unitario",
761
- opcional: false,
762
- tiposAlternativos: [],
763
- refinamentos: [],
764
- })) ?? []);
765
- const errosPublicosResolvidos = errosDeclarados.length > 0
766
- ? errosDeclarados.map((erro) => converterErroPublico(erro, route.task))
767
- : (tarefaAssociada?.errosDetalhados ?? (tarefaSemantica?.errors ?? []).map((erro) => ({ codigo: erro.codigo, mensagem: erro.mensagem }))).map((erro) => converterErroPublico(erro, route.task));
768
- const garantiasPublicasMinimas = (tarefaAssociada?.guarantees ?? tarefaSemantica?.guarantees ?? []).filter((garantia) => {
769
- const referencia = garantia.trim().split(/\s+/)[0] ?? "";
770
- return outputPublicoResolvido.some((campo) => campo.nome === referencia || garantia.includes(`${campo.nome}.`));
771
- });
772
- const routeResolvida = {
773
- ...route,
774
- inputPublico: inputPublicoResolvido,
775
- outputPublico: outputPublicoResolvido,
776
- errosPublicos: errosPublicosResolvidos,
777
- efeitosPublicos: efeitosPublicosDeclarados,
778
- garantiasPublicasMinimas,
779
- resumoAgente: resumirAgente({
780
- input: inputPublicoResolvido,
781
- output: outputPublicoResolvido,
782
- efeitos: efeitosPublicosDeclarados,
783
- vinculos: route.vinculos,
784
- auth: route.auth,
785
- authz: route.authz,
786
- dados: route.dados,
787
- audit: route.audit,
788
- segredos: route.segredos,
789
- forbidden: route.forbidden,
790
- superficiePublica: `${route.metodo ?? "?"} ${route.caminho ?? "?"}`,
791
- }),
792
- publico: {
793
- metodo: route.metodo,
794
- caminho: route.caminho,
795
- task: route.task,
796
- input: inputPublicoResolvido,
797
- output: outputPublicoResolvido,
798
- errors: errosPublicosResolvidos,
799
- effects: efeitosPublicosDeclarados,
800
- garantiasMinimas: garantiasPublicasMinimas,
801
- confiancaContrato: "media",
802
- riscoRegressao: "medio",
803
- divergenciasPublicas: [],
804
- },
805
- };
806
- routeResolvida.publico.confiancaContrato = calcularConfiancaPublica(routeResolvida);
807
- routeResolvida.publico.riscoRegressao = calcularRiscoPublico(routeResolvida);
808
- return routeResolvida;
809
- });
810
- const superficies = [
811
- ...modulo.workers.map((item) => converterSuperficie("worker", item)),
812
- ...modulo.eventos.map((item) => converterSuperficie("evento", item)),
813
- ...modulo.filas.map((item) => converterSuperficie("fila", item)),
814
- ...modulo.crons.map((item) => converterSuperficie("cron", item)),
815
- ...modulo.webhooks.map((item) => converterSuperficie("webhook", item)),
816
- ...modulo.caches.map((item) => converterSuperficie("cache", item)),
817
- ...modulo.storages.map((item) => converterSuperficie("storage", item)),
818
- ...modulo.policies.map((item) => converterSuperficie("policy", item)),
819
- ];
820
- const states = modulo.states.map((state) => ({
821
- nome: state.nome,
822
- campos: converterCampos(encontrarSubBloco(state.corpo, "fields") ?? state.corpo),
823
- linhas: state.corpo.linhas.map((linha) => linha.conteudo),
824
- invariantes: (encontrarSubBloco(state.corpo, "invariants")?.linhas ?? [])
825
- .map((linha) => parsearExpressaoSemantica(linha.conteudo))
826
- .filter((linha) => Boolean(linha)),
827
- transicoes: (encontrarSubBloco(state.corpo, "transitions")?.linhas ?? [])
828
- .map((linha) => parsearTransicaoEstado(linha.conteudo))
829
- .filter((linha) => Boolean(linha)),
830
- }));
831
- const databases = modulo.databases.map(converterDatabase);
832
- const resumoAgenteModulo = resumirAgente({
833
- input: [],
834
- output: [],
835
- efeitos: [
836
- ...tasks.flatMap((task) => task.efeitosEstruturados),
837
- ...routes.flatMap((route) => route.efeitosPublicos),
838
- ...superficies.flatMap((superficie) => superficie.effects),
839
- ],
840
- vinculos: [
841
- ...converterVinculos(modulo.vinculos),
842
- ...tasks.flatMap((task) => task.vinculos),
843
- ...routes.flatMap((route) => route.vinculos),
844
- ...superficies.flatMap((superficie) => superficie.vinculos),
845
- ],
846
- });
847
- return {
848
- nome: modulo.nome,
849
- uses: contexto?.modulosImportados.length
850
- ? [...contexto.modulosImportados]
851
- : modulo.uses.filter((use) => use.origem === "sema").map((use) => use.caminho),
852
- imports: modulo.uses.map((use) => ({
853
- origem: use.origem,
854
- caminho: use.caminho,
855
- externo: use.origem !== "sema",
856
- })),
857
- interoperabilidades: contexto?.interoperabilidades.map((interop) => ({ ...interop })) ?? modulo.uses
858
- .filter(ehUseInterop)
859
- .map((use) => ({ origem: use.origem, caminho: use.caminho })),
860
- vinculos: converterVinculos(modulo.vinculos),
861
- perfilCompatibilidade: perfilModulo,
862
- types,
863
- entities,
864
- enums: modulo.enums.map((enumeracao) => ({ nome: enumeracao.nome, valores: enumeracao.valores })),
865
- tasks,
866
- flows,
867
- routes,
868
- superficies,
869
- states,
870
- databases,
871
- resumoAgente: {
872
- ...resumoAgenteModulo,
873
- superficiesPublicas: deduplicarTexto([
874
- ...routes.map((route) => `${route.metodo ?? "?"} ${route.caminho ?? route.nome}`),
875
- ...superficies
876
- .filter((superficie) => superficie.perfilCompatibilidade === "publico")
877
- .map((superficie) => `${superficie.tipo}:${superficie.nome}`),
878
- ]),
879
- },
880
- diagnosticos,
881
- };
882
- }
883
- //# sourceMappingURL=conversor.js.map