@semacode/cli 2.2.0 → 2.3.1

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 (252) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +251 -141
  3. package/dist/agentContext.d.ts +1 -1
  4. package/dist/agentContextPack.js +6 -1
  5. package/dist/agentContextTipos.d.ts +4 -2
  6. package/dist/agentContextTipos.js +7 -0
  7. package/dist/agentEntryPoints.js +551 -499
  8. package/dist/angular-consumer-standalone.d.ts +3 -1
  9. package/dist/angular-consumer-standalone.js +12 -8
  10. package/dist/comandos.js +4 -0
  11. package/dist/discovery/catalog.d.ts +11 -0
  12. package/dist/discovery/catalog.js +521 -0
  13. package/dist/discovery/command.d.ts +11 -0
  14. package/dist/discovery/command.js +226 -0
  15. package/dist/discovery/index.d.ts +5 -0
  16. package/dist/discovery/index.js +8 -0
  17. package/dist/discovery/ranker.d.ts +3 -0
  18. package/dist/discovery/ranker.js +310 -0
  19. package/dist/discovery/redaction.d.ts +2 -0
  20. package/dist/discovery/redaction.js +21 -0
  21. package/dist/discovery/render.d.ts +2 -0
  22. package/dist/discovery/render.js +100 -0
  23. package/dist/discovery/types.d.ts +119 -0
  24. package/dist/discovery/types.js +13 -0
  25. package/dist/drift.part01.d.ts +32 -2
  26. package/dist/drift.part01.js +2 -0
  27. package/dist/drift.part04.d.ts +3 -2
  28. package/dist/drift.part04.js +6 -3
  29. package/dist/drift.part05.d.ts +2 -1
  30. package/dist/drift.part05.js +4 -3
  31. package/dist/drift.part06.d.ts +2 -1
  32. package/dist/drift.part06.js +9 -5
  33. package/dist/drift.part07.d.ts +11 -10
  34. package/dist/drift.part07.js +40 -30
  35. package/dist/drift.part08.d.ts +2 -1
  36. package/dist/drift.part08.js +4 -3
  37. package/dist/drift.part11.js +71 -6
  38. package/dist/drift.part12.js +14 -1
  39. package/dist/drift.part13.d.ts +42 -7
  40. package/dist/drift.part13.js +660 -36
  41. package/dist/driftCache.d.ts +49 -0
  42. package/dist/driftCache.js +311 -0
  43. package/dist/driftCacheIncremental.d.ts +98 -0
  44. package/dist/driftCacheIncremental.js +596 -0
  45. package/dist/driftCatalogo.d.ts +91 -0
  46. package/dist/driftCatalogo.js +657 -0
  47. package/dist/driftCatalogoPersistente.d.ts +8 -0
  48. package/dist/driftCatalogoPersistente.js +77 -0
  49. package/dist/driftEscopo.d.ts +23 -0
  50. package/dist/driftEscopo.js +563 -0
  51. package/dist/driftEscopoReferencias.d.ts +4 -0
  52. package/dist/driftEscopoReferencias.js +265 -0
  53. package/dist/driftOrcamento.d.ts +12 -0
  54. package/dist/driftOrcamento.js +19 -3
  55. package/dist/execucoesExternas.js +5 -19
  56. package/dist/exemplosOficiais.js +29 -8
  57. package/dist/iaPrompts.d.ts +1 -1
  58. package/dist/iaPrompts.js +310 -307
  59. package/dist/index.d.ts +2 -0
  60. package/dist/index.js +23 -5
  61. package/dist/index.part01.d.ts +17 -2
  62. package/dist/index.part01.js +119 -8
  63. package/dist/index.part02.js +21 -21
  64. package/dist/index.part03.d.ts +2 -2
  65. package/dist/index.part03.js +14 -3
  66. package/dist/index.part04.d.ts +2 -2
  67. package/dist/index.part04.js +113 -101
  68. package/dist/index.part05.d.ts +1 -1
  69. package/dist/index.part05.js +99 -22
  70. package/dist/index.part06.js +6 -2
  71. package/dist/index.part07.js +24 -24
  72. package/dist/index.part08.js +1 -1
  73. package/dist/init/templates.part01.js +393 -393
  74. package/dist/init/templates.part02.js +189 -189
  75. package/dist/initTemplatesBackend.js +73 -73
  76. package/dist/initTemplatesBase.js +81 -80
  77. package/dist/initTemplatesFlutter.js +137 -137
  78. package/dist/initTemplatesRuntime.js +350 -350
  79. package/dist/initTemplatesWeb.js +309 -309
  80. package/dist/pipelineConteudo/command.js +1 -36
  81. package/dist/profileArtefatoValidadores.d.ts +3 -2
  82. package/dist/profileArtefatoValidadores.js +81 -0
  83. package/dist/profileAuthorTipos.d.ts +4 -3
  84. package/dist/profileCatalogo.d.ts +5 -5
  85. package/dist/profileCatalogo.js +30 -0
  86. package/dist/profileCommand.d.ts +8 -2
  87. package/dist/profileCommand.js +15 -5
  88. package/dist/profileRegras.d.ts +5 -5
  89. package/dist/profileRegras.js +13 -1
  90. package/dist/profileRulePacks.js +68 -0
  91. package/dist/projeto.d.ts +1 -1
  92. package/dist/projetoCarregar.d.ts +2 -2
  93. package/dist/projetoCarregar.js +47 -24
  94. package/dist/projetoCatalogo.d.ts +7 -0
  95. package/dist/projetoCatalogo.js +125 -0
  96. package/dist/projetoTipos.d.ts +14 -5
  97. package/dist/sistemasInterativos/adapterProtocol.d.ts +3 -0
  98. package/dist/sistemasInterativos/adapterProtocol.js +240 -0
  99. package/dist/sistemasInterativos/advancedCatalog.d.ts +5 -0
  100. package/dist/sistemasInterativos/advancedCatalog.js +442 -0
  101. package/dist/sistemasInterativos/autonomy.d.ts +230 -0
  102. package/dist/sistemasInterativos/autonomy.js +753 -0
  103. package/dist/sistemasInterativos/canonical.d.ts +3 -0
  104. package/dist/sistemasInterativos/canonical.js +43 -0
  105. package/dist/sistemasInterativos/catalog.d.ts +116 -0
  106. package/dist/sistemasInterativos/catalog.js +543 -0
  107. package/dist/sistemasInterativos/command.d.ts +7 -0
  108. package/dist/sistemasInterativos/command.js +311 -0
  109. package/dist/sistemasInterativos/controlRun.d.ts +56 -0
  110. package/dist/sistemasInterativos/controlRun.js +391 -0
  111. package/dist/sistemasInterativos/evidence.d.ts +5 -0
  112. package/dist/sistemasInterativos/evidence.js +306 -0
  113. package/dist/sistemasInterativos/experienceIr.d.ts +12 -0
  114. package/dist/sistemasInterativos/experienceIr.js +895 -0
  115. package/dist/sistemasInterativos/experienceIrSemantics.d.ts +30 -0
  116. package/dist/sistemasInterativos/experienceIrSemantics.js +368 -0
  117. package/dist/sistemasInterativos/experienceIrTypes.d.ts +370 -0
  118. package/dist/sistemasInterativos/experienceIrTypes.js +5 -0
  119. package/dist/sistemasInterativos/extensionCommand.d.ts +391 -0
  120. package/dist/sistemasInterativos/extensionCommand.js +383 -0
  121. package/dist/sistemasInterativos/index.d.ts +19 -0
  122. package/dist/sistemasInterativos/index.js +22 -0
  123. package/dist/sistemasInterativos/operations.d.ts +40 -0
  124. package/dist/sistemasInterativos/operations.js +1167 -0
  125. package/dist/sistemasInterativos/operationsTypes.d.ts +297 -0
  126. package/dist/sistemasInterativos/operationsTypes.js +11 -0
  127. package/dist/sistemasInterativos/planner.d.ts +2 -0
  128. package/dist/sistemasInterativos/planner.js +159 -0
  129. package/dist/sistemasInterativos/portability.d.ts +164 -0
  130. package/dist/sistemasInterativos/portability.js +539 -0
  131. package/dist/sistemasInterativos/render.d.ts +3 -0
  132. package/dist/sistemasInterativos/render.js +179 -0
  133. package/dist/sistemasInterativos/temporal.d.ts +183 -0
  134. package/dist/sistemasInterativos/temporal.js +543 -0
  135. package/dist/sistemasInterativos/types.d.ts +215 -0
  136. package/dist/sistemasInterativos/types.js +4 -0
  137. package/dist/sistemasInterativos/validator.d.ts +2 -0
  138. package/dist/sistemasInterativos/validator.js +305 -0
  139. package/dist/sync/index.js +35 -35
  140. package/docs/README.md +34 -28
  141. package/docs/ai-onboarding.md +62 -62
  142. package/docs/ai-workflow.md +9 -4
  143. package/docs/auth.md +26 -26
  144. package/docs/cli.md +79 -79
  145. package/docs/commands.md +47 -2
  146. package/docs/database.md +15 -15
  147. package/docs/deploy.md +41 -41
  148. package/docs/descoberta-capacidades.md +106 -0
  149. package/docs/documentation.md +39 -39
  150. package/docs/env.md +16 -16
  151. package/docs/frontend.md +41 -41
  152. package/docs/getting-started.md +57 -57
  153. package/docs/i18n.md +15 -15
  154. package/docs/pipeline-conteudo.md +246 -246
  155. package/docs/profiles.md +54 -45
  156. package/docs/repositories.md +43 -43
  157. package/docs/rollback.md +31 -31
  158. package/docs/security.md +32 -32
  159. package/docs/sistemas-interativos.md +376 -0
  160. package/docs/support.md +8 -8
  161. package/docs/testing.md +51 -35
  162. package/docs/vocabulary.md +29 -29
  163. package/exemplos/agendamento.sema +1 -1
  164. package/exemplos/assinatura.sema +1 -1
  165. package/exemplos/auditoria.sema +1 -1
  166. package/exemplos/autenticacao.sema +1 -1
  167. package/exemplos/author_obra_comum.sema +1 -1
  168. package/exemplos/author_tema_sensivel.sema +1 -1
  169. package/exemplos/automacao.sema +1 -1
  170. package/exemplos/cadastro_usuario.sema +1 -1
  171. package/exemplos/calculadora.sema +1 -1
  172. package/exemplos/crud_simples.sema +1 -1
  173. package/exemplos/estoque.sema +1 -1
  174. package/exemplos/exportacao.sema +1 -1
  175. package/exemplos/fila.sema +1 -1
  176. package/exemplos/integracao_externa.sema +1 -1
  177. package/exemplos/multi_tenant.sema +1 -1
  178. package/exemplos/notificacao.sema +1 -1
  179. package/exemplos/operacao_estrategia.sema +132 -132
  180. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  181. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  182. package/exemplos/operacao_estrategia_gates.sema +106 -106
  183. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  184. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  185. package/exemplos/pagamento.sema +1 -1
  186. package/exemplos/pagamento_dominio.sema +1 -1
  187. package/exemplos/pedido.sema +1 -1
  188. package/exemplos/permissao.sema +1 -1
  189. package/exemplos/persistencia_vendor_first.sema +1 -1
  190. package/exemplos/pipeline-conteudo/README.md +44 -44
  191. package/exemplos/pipeline-conteudo/alvos.json +23 -23
  192. package/exemplos/pipeline-conteudo/definicao.json +136 -136
  193. package/exemplos/profile_conversas.sema +165 -165
  194. package/exemplos/profile_game.sema +1 -1
  195. package/exemplos/profile_legal.sema +1 -1
  196. package/exemplos/profile_ops.sema +1 -1
  197. package/exemplos/profile_research.sema +1 -1
  198. package/exemplos/profile_simulation.sema +211 -0
  199. package/exemplos/profile_software.sema +1 -1
  200. package/exemplos/profile_workflow_n8n.sema +1 -1
  201. package/exemplos/relatorio.sema +1 -1
  202. package/exemplos/replica_analitica_erp.sema +1 -1
  203. package/exemplos/sistemas-interativos/README.md +100 -0
  204. package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -0
  205. package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -0
  206. package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -0
  207. package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -0
  208. package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -0
  209. package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -0
  210. package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -0
  211. package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -0
  212. package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -0
  213. package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -0
  214. package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -0
  215. package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -0
  216. package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -0
  217. package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -0
  218. package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -0
  219. package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -0
  220. package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -0
  221. package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -0
  222. package/exemplos/sistemas-interativos/game-2d.json +83 -0
  223. package/exemplos/sistemas-interativos/game-3d-human.json +81 -0
  224. package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -0
  225. package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -0
  226. package/exemplos/sistemas-interativos/game-xr-human.json +80 -0
  227. package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -0
  228. package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -0
  229. package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -0
  230. package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -0
  231. package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -0
  232. package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -0
  233. package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -0
  234. package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -0
  235. package/exemplos/testes_embutidos.sema +1 -1
  236. package/exemplos/tratamento_erro.sema +1 -1
  237. package/exemplos/upload_arquivo.sema +1 -1
  238. package/exemplos/webhook.sema +1 -1
  239. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  240. package/node_modules/@sema/gerador-cpp/package.json +1 -1
  241. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  242. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  243. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  244. package/node_modules/@sema/gerador-dotnet/package.json +1 -1
  245. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  246. package/node_modules/@sema/gerador-lua/dist/index.js +76 -47
  247. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
  248. package/node_modules/@sema/gerador-php/dist/index.js +113 -113
  249. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  250. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  251. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  252. package/package.json +3 -3
@@ -0,0 +1,7 @@
1
+ import { type FonteProjeto } from "@sema/nucleo";
2
+ export interface FechamentoContratosSema {
3
+ fontes: FonteProjeto[];
4
+ dependenciasNaoResolvidas: string[];
5
+ }
6
+ export declare function carregarFontesContratos(arquivos: string[]): Promise<FonteProjeto[]>;
7
+ export declare function carregarFechamentoContratosSema(arquivosAlvo: string[], arquivosDescobertos: string[]): Promise<FechamentoContratosSema>;
@@ -0,0 +1,125 @@
1
+ // SEMA-GOVERNED: sema.produto.governanca_ia.contexto
2
+ // Descricao: descobre contratos por caminho e carrega apenas o fechamento transitivo de uses do alvo.
3
+ import path from "node:path";
4
+ import { lerArquivoTexto, parsear, tokenizar, } from "@sema/nucleo";
5
+ function normalizarChaveArquivo(valor) {
6
+ return valor
7
+ .normalize("NFD")
8
+ .replace(/[\u0300-\u036f]/g, "")
9
+ .toLowerCase()
10
+ .replace(/[^a-z0-9]+/g, "_")
11
+ .replace(/^_+|_+$/g, "");
12
+ }
13
+ function chavesSufixoModulo(nomeModulo) {
14
+ const partes = nomeModulo.split(".").map(normalizarChaveArquivo).filter(Boolean);
15
+ return partes.map((_, indice) => partes.slice(indice).join("_"));
16
+ }
17
+ function criarIndiceSufixos(arquivos) {
18
+ const indice = new Map();
19
+ for (const arquivo of arquivos) {
20
+ const chave = normalizarChaveArquivo(path.basename(arquivo, path.extname(arquivo)));
21
+ const atuais = indice.get(chave) ?? [];
22
+ atuais.push(path.resolve(arquivo));
23
+ indice.set(chave, atuais);
24
+ }
25
+ for (const caminhos of indice.values()) {
26
+ caminhos.sort((a, b) => a.localeCompare(b, "pt-BR"));
27
+ }
28
+ return indice;
29
+ }
30
+ export async function carregarFontesContratos(arquivos) {
31
+ const fontes = [];
32
+ for (const arquivo of arquivos) {
33
+ const caminho = path.resolve(arquivo);
34
+ fontes.push({ caminho, codigo: await lerArquivoTexto(caminho) });
35
+ }
36
+ return fontes;
37
+ }
38
+ export async function carregarFechamentoContratosSema(arquivosAlvo, arquivosDescobertos) {
39
+ const descobertos = [...new Set(arquivosDescobertos.map((arquivo) => path.resolve(arquivo)))]
40
+ .sort((a, b) => a.localeCompare(b, "pt-BR"));
41
+ const indiceSufixos = criarIndiceSufixos(descobertos);
42
+ const leituras = new Map();
43
+ const caminhoPorModulo = new Map();
44
+ const lerContrato = (arquivo) => {
45
+ const caminho = path.resolve(arquivo);
46
+ const existente = leituras.get(caminho);
47
+ if (existente) {
48
+ return existente;
49
+ }
50
+ const leitura = (async () => {
51
+ const codigo = await lerArquivoTexto(caminho);
52
+ const resultadoLexer = tokenizar(codigo, caminho);
53
+ const resultadoParser = parsear(resultadoLexer.tokens);
54
+ if (resultadoParser.modulo) {
55
+ caminhoPorModulo.set(resultadoParser.modulo.nome, caminho);
56
+ }
57
+ return {
58
+ fonte: { caminho, codigo },
59
+ modulo: resultadoParser.modulo,
60
+ };
61
+ })();
62
+ leituras.set(caminho, leitura);
63
+ return leitura;
64
+ };
65
+ const resolverArquivoModulo = async (nomeModulo) => {
66
+ const jaConhecido = caminhoPorModulo.get(nomeModulo);
67
+ if (jaConhecido) {
68
+ return jaConhecido;
69
+ }
70
+ const tentados = new Set();
71
+ for (const chave of chavesSufixoModulo(nomeModulo)) {
72
+ for (const candidato of indiceSufixos.get(chave) ?? []) {
73
+ tentados.add(candidato);
74
+ const contrato = await lerContrato(candidato);
75
+ if (contrato.modulo?.nome === nomeModulo) {
76
+ return candidato;
77
+ }
78
+ }
79
+ }
80
+ // Fallback raro para workspaces que nao seguem a convencao modulo -> nome do arquivo.
81
+ // Ele so acontece depois que todos os sufixos deterministas falharam.
82
+ for (const candidato of descobertos) {
83
+ if (tentados.has(candidato)) {
84
+ continue;
85
+ }
86
+ const contrato = await lerContrato(candidato);
87
+ if (contrato.modulo?.nome === nomeModulo) {
88
+ return candidato;
89
+ }
90
+ }
91
+ return undefined;
92
+ };
93
+ const fila = arquivosAlvo.map((arquivo) => path.resolve(arquivo));
94
+ const carregados = new Set();
95
+ const fontes = [];
96
+ const dependenciasNaoResolvidas = new Set();
97
+ while (fila.length > 0) {
98
+ const arquivo = fila.shift();
99
+ if (carregados.has(arquivo)) {
100
+ continue;
101
+ }
102
+ carregados.add(arquivo);
103
+ const contrato = await lerContrato(arquivo);
104
+ fontes.push(contrato.fonte);
105
+ const usesSema = contrato.modulo?.uses
106
+ .filter((use) => use.origem === "sema")
107
+ .map((use) => use.caminho) ?? [];
108
+ for (const use of usesSema) {
109
+ const dependencia = await resolverArquivoModulo(use);
110
+ if (!dependencia) {
111
+ dependenciasNaoResolvidas.add(use);
112
+ continue;
113
+ }
114
+ if (!carregados.has(dependencia)) {
115
+ fila.push(dependencia);
116
+ }
117
+ }
118
+ }
119
+ return {
120
+ fontes,
121
+ dependenciasNaoResolvidas: [...dependenciasNaoResolvidas]
122
+ .sort((a, b) => a.localeCompare(b, "pt-BR")),
123
+ };
124
+ }
125
+ //# sourceMappingURL=projetoCatalogo.js.map
@@ -1,6 +1,10 @@
1
1
  import type { EngineBanco, ResultadoCompilacaoProjetoModulo } from '@sema/nucleo';
2
2
  import type { AlvoGeracao, FrameworkGeracao } from '@sema/padroes';
3
3
  import type { EstruturaSaida, FonteLegado, ModoAdocao } from './tipos.js';
4
+ export type EscopoCarregamentoProjeto = "arquivo" | "modulo" | "projeto";
5
+ export interface OpcoesCarregarProjeto {
6
+ escopo?: EscopoCarregamentoProjeto;
7
+ }
4
8
  export interface ConfiguracaoPersistenciaProjeto {
5
9
  enginesHabilitados?: EngineBanco[];
6
10
  adaptersPorEngine?: Partial<Record<EngineBanco, string>>;
@@ -30,18 +34,23 @@ export interface ConfiguracaoProjetoCarregada {
30
34
  baseDiretorio: string;
31
35
  config: SemaConfigProjeto;
32
36
  }
37
+ export interface ModuloProjetoCarregado {
38
+ caminho: string;
39
+ codigo: string;
40
+ resultado: ResultadoCompilacaoProjetoModulo;
41
+ }
33
42
  export interface ContextoProjetoCarregado {
34
43
  entradaResolvida: string;
35
44
  baseProjeto: string;
36
45
  configCarregada?: ConfiguracaoProjetoCarregada;
46
+ /** Contratos efetivamente lidos e compilados nesta execucao. */
37
47
  arquivosProjeto: string[];
48
+ /** Contratos encontrados nas origens, inclusive os que ficaram fora do escopo carregado. */
49
+ arquivosDescobertos: string[];
38
50
  origensProjeto: string[];
39
51
  diretoriosCodigo: string[];
40
52
  fontesLegado: FonteLegado[];
41
53
  modoAdocao: ModoAdocao;
42
- modulosSelecionados: Array<{
43
- caminho: string;
44
- codigo: string;
45
- resultado: ResultadoCompilacaoProjetoModulo;
46
- }>;
54
+ modulosCarregados: ModuloProjetoCarregado[];
55
+ modulosSelecionados: ModuloProjetoCarregado[];
47
56
  }
@@ -0,0 +1,3 @@
1
+ import type { AdaptadorSistemaInterativo, RegistroProtocoloAdapter, ResultadoValidacaoAdaptadorSistemaInterativo, ResultadoValidacaoProtocoloAdapter } from "./types.js";
2
+ export declare function validarAdaptadorSistemaInterativo(adapter: AdaptadorSistemaInterativo): ResultadoValidacaoAdaptadorSistemaInterativo;
3
+ export declare function validarProtocoloAdapterSistemaInterativo(registro: RegistroProtocoloAdapter): ResultadoValidacaoProtocoloAdapter;
@@ -0,0 +1,240 @@
1
+ // SEMA-GOVERNED: sema.produto.sistemas_interativos.adaptadores
2
+ // Descricao: valida descriptors e registros detect-probe-snapshot-plan sem executar qualquer fase.
3
+ import { digestSha256Valido } from "./canonical.js";
4
+ import { MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS, obterAdaptadorSistemaInterativo } from "./catalog.js";
5
+ const ORDEM_FASES = [
6
+ "DETECT", "PROBE", "SNAPSHOT", "PLAN", "APPLY", "VALIDATE", "EVIDENCE", "ROLLBACK",
7
+ ];
8
+ const BASE_FASES = [
9
+ "DETECT", "PROBE", "SNAPSHOT", "PLAN", "VALIDATE", "EVIDENCE",
10
+ ];
11
+ const VERSOES_FLUTUANTES = new Set(["latest", "next", "dev", "main", "master", "*"]);
12
+ const MARCADOR_CHAVE_SENSIVEL = /password|passwd|senha|secret|token|privatekey|apikey|credential|credencial|chaveprivada|chavesecreta/;
13
+ const VALOR_SENSIVEL = /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----|\bBearer\s+[A-Za-z0-9._~+/=-]+|\b(?:sk|ghp|github_pat)_[A-Za-z0-9_-]{12,}/i;
14
+ function adicionar(bloqueios, valor) {
15
+ if (!bloqueios.includes(valor))
16
+ bloqueios.push(valor);
17
+ }
18
+ function textoOpaco(valor) {
19
+ return typeof valor === "string" && valor.trim().length > 0 && !/[\u0000-\u001f\u007f]/.test(valor);
20
+ }
21
+ function registroObjeto(valor) {
22
+ return typeof valor === "object" && valor !== null && !Array.isArray(valor);
23
+ }
24
+ function listaUnicaNaoVazia(valor) {
25
+ return Array.isArray(valor)
26
+ && valor.length > 0
27
+ && valor.every(textoOpaco)
28
+ && new Set(valor).size === valor.length;
29
+ }
30
+ function chaveSensivel(chave) {
31
+ const normalizada = chave
32
+ .normalize("NFKD")
33
+ .replace(/[\u0300-\u036f]/gu, "")
34
+ .replace(/[^a-z0-9]/giu, "")
35
+ .toLowerCase();
36
+ return MARCADOR_CHAVE_SENSIVEL.test(normalizada);
37
+ }
38
+ function contemDadoSensivel(valor, visitados = new Set()) {
39
+ if (typeof valor === "string")
40
+ return VALOR_SENSIVEL.test(valor);
41
+ if (valor === null || typeof valor !== "object")
42
+ return false;
43
+ if (visitados.has(valor))
44
+ return true;
45
+ visitados.add(valor);
46
+ try {
47
+ if (Array.isArray(valor))
48
+ return valor.some((item) => contemDadoSensivel(item, visitados));
49
+ return Object.entries(valor).some(([chave, item]) => chaveSensivel(chave) || contemDadoSensivel(item, visitados));
50
+ }
51
+ finally {
52
+ visitados.delete(valor);
53
+ }
54
+ }
55
+ function fasesEmOrdem(protocol) {
56
+ let ultima = -1;
57
+ for (const fase of protocol) {
58
+ const indice = ORDEM_FASES.indexOf(fase);
59
+ if (indice < 0 || indice <= ultima)
60
+ return false;
61
+ ultima = indice;
62
+ }
63
+ return true;
64
+ }
65
+ export function validarAdaptadorSistemaInterativo(adapter) {
66
+ const bloqueios = [];
67
+ const entrada = registroObjeto(adapter) ? adapter : {};
68
+ if (entrada !== adapter)
69
+ adicionar(bloqueios, "adapter_invalido");
70
+ if (!textoOpaco(entrada.adapterId))
71
+ adicionar(bloqueios, "adapter_id_invalido");
72
+ if (!textoOpaco(entrada.version) || VERSOES_FLUTUANTES.has(entrada.version.toLowerCase()))
73
+ adicionar(bloqueios, "adapter_version_nao_fixada");
74
+ if (!textoOpaco(entrada.engine))
75
+ adicionar(bloqueios, "adapter_engine_invalida");
76
+ if (!MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS.adapterRoles.includes(entrada.role))
77
+ adicionar(bloqueios, "adapter_role_invalido");
78
+ if (entrada.readOnlyProbe !== true)
79
+ adicionar(bloqueios, "adapter_probe_deve_ser_read_only");
80
+ if (typeof entrada.mutatesWorkspace !== "boolean")
81
+ adicionar(bloqueios, "adapter_mutates_workspace_deve_ser_booleano");
82
+ if (typeof entrada.supportsRollback !== "boolean")
83
+ adicionar(bloqueios, "adapter_supports_rollback_deve_ser_booleano");
84
+ if (entrada.executionBoundary !== "EXTERNAL")
85
+ adicionar(bloqueios, "adapter_execution_boundary_deve_ser_external");
86
+ for (const [campo, lista] of [
87
+ ["kinds", entrada.kinds],
88
+ ["spatial_models", entrada.spatialModels],
89
+ ["render_modes", entrada.renderModes],
90
+ ["visual_profiles", entrada.visualProfiles],
91
+ ["control_modes", entrada.controlModes],
92
+ ["time_models", entrada.timeModels],
93
+ ["fidelities", entrada.fidelities],
94
+ ["capabilities", entrada.capabilities],
95
+ ["protocol", entrada.protocol],
96
+ ]) {
97
+ if (!listaUnicaNaoVazia(lista))
98
+ adicionar(bloqueios, `adapter_${campo}_invalidos`);
99
+ }
100
+ const vocabularios = [
101
+ [entrada.kinds, MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS.kinds, "adapter_kind_fora_do_vocabulario"],
102
+ [entrada.spatialModels, MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS.spatialModels, "adapter_spatial_model_fora_do_vocabulario"],
103
+ [entrada.renderModes, MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS.renderModes, "adapter_render_mode_fora_do_vocabulario"],
104
+ [entrada.visualProfiles, MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS.visualProfiles, "adapter_visual_profile_fora_do_vocabulario"],
105
+ [entrada.controlModes, MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS.controlModes, "adapter_control_mode_fora_do_vocabulario"],
106
+ [entrada.timeModels, MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS.timeModels, "adapter_time_model_fora_do_vocabulario"],
107
+ [entrada.fidelities, MATRIZ_DOMINIO_SISTEMAS_INTERATIVOS.fidelities, "adapter_fidelity_fora_do_vocabulario"],
108
+ ];
109
+ for (const [valores, permitidos, codigo] of vocabularios) {
110
+ if (Array.isArray(valores) && !valores.every((valor) => typeof valor === "string" && permitidos.includes(valor))) {
111
+ adicionar(bloqueios, codigo);
112
+ }
113
+ }
114
+ if (Array.isArray(entrada.protocol)) {
115
+ if (!fasesEmOrdem(entrada.protocol))
116
+ adicionar(bloqueios, "adapter_protocol_ordem_invalida");
117
+ for (const fase of BASE_FASES) {
118
+ if (!entrada.protocol.includes(fase))
119
+ adicionar(bloqueios, `adapter_protocol_fase_ausente:${fase}`);
120
+ }
121
+ if (entrada.mutatesWorkspace === true) {
122
+ if (!entrada.protocol.includes("APPLY"))
123
+ adicionar(bloqueios, "adapter_mutante_sem_apply");
124
+ if (!entrada.protocol.includes("ROLLBACK"))
125
+ adicionar(bloqueios, "adapter_mutante_sem_rollback");
126
+ if (!entrada.supportsRollback)
127
+ adicionar(bloqueios, "adapter_mutante_sem_suporte_rollback");
128
+ }
129
+ else {
130
+ if (entrada.protocol.includes("APPLY"))
131
+ adicionar(bloqueios, "adapter_read_only_nao_pode_declarar_apply");
132
+ if (entrada.protocol.includes("ROLLBACK"))
133
+ adicionar(bloqueios, "adapter_read_only_nao_pode_declarar_rollback");
134
+ if (entrada.supportsRollback)
135
+ adicionar(bloqueios, "adapter_read_only_nao_deve_declarar_rollback");
136
+ }
137
+ }
138
+ if (contemDadoSensivel(entrada))
139
+ adicionar(bloqueios, "adapter_contem_dado_sensivel");
140
+ return { valido: bloqueios.length === 0, bloqueios: bloqueios.sort() };
141
+ }
142
+ export function validarProtocoloAdapterSistemaInterativo(registro) {
143
+ const bloqueios = [];
144
+ const entrada = registroObjeto(registro) ? registro : {};
145
+ if (entrada !== registro)
146
+ adicionar(bloqueios, "registro_protocolo_invalido");
147
+ if (!textoOpaco(entrada.runId))
148
+ adicionar(bloqueios, "run_id_invalido");
149
+ if (!textoOpaco(entrada.adapterId))
150
+ adicionar(bloqueios, "adapter_id_invalido");
151
+ if (!textoOpaco(entrada.adapterVersion) || VERSOES_FLUTUANTES.has(entrada.adapterVersion.toLowerCase()))
152
+ adicionar(bloqueios, "adapter_version_invalida");
153
+ if (!textoOpaco(entrada.semanticTargetId))
154
+ adicionar(bloqueios, "semantic_target_id_invalido");
155
+ if (typeof entrada.mutated !== "boolean")
156
+ adicionar(bloqueios, "mutated_deve_ser_booleano");
157
+ if (typeof entrada.success !== "boolean")
158
+ adicionar(bloqueios, "success_deve_ser_booleano");
159
+ const phases = Array.isArray(entrada.phases) ? entrada.phases : [];
160
+ if (phases.length === 0)
161
+ adicionar(bloqueios, "phases_ausentes_ou_malformadas");
162
+ const descriptor = textoOpaco(entrada.adapterId) ? obterAdaptadorSistemaInterativo(entrada.adapterId) : undefined;
163
+ if (!descriptor)
164
+ adicionar(bloqueios, "registro_adapter_desconhecido");
165
+ else if (entrada.adapterVersion !== descriptor.version)
166
+ adicionar(bloqueios, "registro_adapter_version_divergente");
167
+ const ids = new Set();
168
+ const fases = [];
169
+ for (const [indice, itemBruto] of phases.entries()) {
170
+ if (!registroObjeto(itemBruto)) {
171
+ adicionar(bloqueios, `phase_malformada_indice:${indice}`);
172
+ continue;
173
+ }
174
+ const item = itemBruto;
175
+ if (!textoOpaco(item.phaseId))
176
+ adicionar(bloqueios, "phase_id_invalido");
177
+ else if (ids.has(item.phaseId))
178
+ adicionar(bloqueios, `phase_id_duplicado_indice:${indice}`);
179
+ else
180
+ ids.add(item.phaseId);
181
+ if (!ORDEM_FASES.includes(item.phase))
182
+ adicionar(bloqueios, `phase_invalida_indice:${indice}`);
183
+ else {
184
+ fases.push(item.phase);
185
+ if (descriptor && !descriptor.protocol.includes(item.phase)) {
186
+ adicionar(bloqueios, `phase_nao_permitida_pelo_adapter_indice:${indice}`);
187
+ }
188
+ }
189
+ if (item.semanticTargetId !== entrada.semanticTargetId)
190
+ adicionar(bloqueios, `semantic_target_divergente_indice:${indice}`);
191
+ if (!digestSha256Valido(item.inputDigest))
192
+ adicionar(bloqueios, `phase_input_digest_invalido_indice:${indice}`);
193
+ if (!digestSha256Valido(item.outputDigest))
194
+ adicionar(bloqueios, `phase_output_digest_invalido_indice:${indice}`);
195
+ if (typeof item.success !== "boolean")
196
+ adicionar(bloqueios, `phase_success_deve_ser_booleano_indice:${indice}`);
197
+ }
198
+ if (fases[0] !== "DETECT")
199
+ adicionar(bloqueios, "protocolo_deve_iniciar_em_detect");
200
+ if (new Set(fases).size !== fases.length)
201
+ adicionar(bloqueios, "phase_tipo_duplicado");
202
+ if (!fasesEmOrdem(fases))
203
+ adicionar(bloqueios, "phases_fora_da_ordem_canonica");
204
+ for (const fase of BASE_FASES) {
205
+ if (!fases.includes(fase))
206
+ adicionar(bloqueios, `protocolo_fase_base_ausente:${fase}`);
207
+ }
208
+ if (descriptor && !descriptor.mutatesWorkspace && entrada.mutated === true) {
209
+ adicionar(bloqueios, "adapter_read_only_nao_pode_mutar");
210
+ }
211
+ if (entrada.mutated === false && (fases.includes("APPLY") || fases.includes("ROLLBACK"))) {
212
+ adicionar(bloqueios, "registro_nao_mutante_com_fase_mutante");
213
+ }
214
+ const faseSucesso = (fase) => phases.some((item) => (registroObjeto(item) && item.phase === fase && item.success === true));
215
+ const exigeRollback = entrada.mutated === true && entrada.success === false && !faseSucesso("ROLLBACK");
216
+ if (entrada.mutated === true && !faseSucesso("APPLY"))
217
+ adicionar(bloqueios, "mutated_sem_apply_bem_sucedido");
218
+ if (entrada.success === true) {
219
+ if (!faseSucesso("VALIDATE"))
220
+ adicionar(bloqueios, "sucesso_sem_validate");
221
+ if (!faseSucesso("EVIDENCE"))
222
+ adicionar(bloqueios, "sucesso_sem_evidence");
223
+ if (phases.some((item) => !registroObjeto(item) || item.success !== true))
224
+ adicionar(bloqueios, "sucesso_global_com_fase_falha");
225
+ }
226
+ if (exigeRollback)
227
+ adicionar(bloqueios, "falha_mutante_exige_rollback");
228
+ if (entrada.mutated === true && entrada.success === false && faseSucesso("ROLLBACK") && !textoOpaco(entrada.rollbackEvidenceId)) {
229
+ adicionar(bloqueios, "rollback_sem_evidence_id");
230
+ }
231
+ if (contemDadoSensivel(entrada))
232
+ adicionar(bloqueios, "registro_contem_dado_sensivel");
233
+ return {
234
+ valido: bloqueios.length === 0,
235
+ faseAtual: fases.at(-1) ?? "NOT_STARTED",
236
+ bloqueios: bloqueios.sort(),
237
+ exigeRollback,
238
+ };
239
+ }
240
+ //# sourceMappingURL=adapterProtocol.js.map
@@ -0,0 +1,5 @@
1
+ import type { AdaptadorSistemaInterativo, PipelineSistemaInterativo } from "./types.js";
2
+ export declare const CATALOGO_PIPELINES_INTERATIVOS_AVANCADOS: readonly PipelineSistemaInterativo[];
3
+ export declare const CATALOGO_ADAPTADORES_INTERATIVOS_AVANCADOS: readonly AdaptadorSistemaInterativo[];
4
+ export declare function listarPipelinesInterativosAvancados(): readonly PipelineSistemaInterativo[];
5
+ export declare function listarAdaptadoresInterativosAvancados(): readonly AdaptadorSistemaInterativo[];