@semacode/cli 2.3.0 → 3.0.0

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 (267) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +112 -41
  3. package/dist/agentContextPack.js +14 -10
  4. package/dist/agentEntryPoints.d.ts +5 -0
  5. package/dist/agentEntryPoints.js +102 -91
  6. package/dist/angular-consumer-standalone.d.ts +3 -1
  7. package/dist/angular-consumer-standalone.js +12 -8
  8. package/dist/bin.d.ts +6 -0
  9. package/dist/bin.js +130 -0
  10. package/dist/cliArgs.js +4 -4
  11. package/dist/cliControlError.d.ts +12 -0
  12. package/dist/cliControlError.js +47 -0
  13. package/dist/cliGrammar.d.ts +11 -0
  14. package/dist/cliGrammar.js +551 -0
  15. package/dist/cliHelp.d.ts +13 -0
  16. package/dist/cliHelp.js +19 -0
  17. package/dist/cliHelpTexto.d.ts +3 -0
  18. package/dist/cliHelpTexto.js +168 -0
  19. package/dist/cliRuntime.d.ts +2 -0
  20. package/dist/cliRuntime.js +31 -0
  21. package/dist/comandos.js +9 -22
  22. package/dist/contexto.js +5 -5
  23. package/dist/dev/index.d.ts +1 -0
  24. package/dist/dev/index.js +51 -9
  25. package/dist/discovery/catalog.js +3 -3
  26. package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
  27. package/dist/distribuicao/filesystemGlobal.js +701 -0
  28. package/dist/distribuicao/index.d.ts +7 -0
  29. package/dist/distribuicao/index.js +227 -0
  30. package/dist/distribuicao/launcherGlobal.d.ts +53 -0
  31. package/dist/distribuicao/launcherGlobal.js +643 -0
  32. package/dist/distribuicao/launcherWindows.d.ts +28 -0
  33. package/dist/distribuicao/launcherWindows.js +326 -0
  34. package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
  35. package/dist/distribuicao/lockContextGlobal.js +17 -0
  36. package/dist/distribuicao/lockGlobal.d.ts +6 -0
  37. package/dist/distribuicao/lockGlobal.js +520 -0
  38. package/dist/distribuicao/skillGlobal.d.ts +48 -0
  39. package/dist/distribuicao/skillGlobal.js +652 -0
  40. package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
  41. package/dist/distribuicao/skillIntentPolicy.js +115 -0
  42. package/dist/distribuicao/tipos.d.ts +50 -0
  43. package/dist/distribuicao/tipos.js +10 -0
  44. package/dist/distribuicao/versaoSemantica.d.ts +3 -0
  45. package/dist/distribuicao/versaoSemantica.js +62 -0
  46. package/dist/drift.part01.d.ts +34 -2
  47. package/dist/drift.part01.js +3 -0
  48. package/dist/drift.part04.d.ts +12 -2
  49. package/dist/drift.part04.js +89 -15
  50. package/dist/drift.part05.d.ts +2 -1
  51. package/dist/drift.part05.js +9 -6
  52. package/dist/drift.part06.d.ts +2 -1
  53. package/dist/drift.part06.js +115 -24
  54. package/dist/drift.part07.d.ts +11 -10
  55. package/dist/drift.part07.js +261 -255
  56. package/dist/drift.part08.d.ts +2 -1
  57. package/dist/drift.part08.js +35 -25
  58. package/dist/drift.part11.js +279 -32
  59. package/dist/drift.part12.d.ts +1 -1
  60. package/dist/drift.part12.js +196 -11
  61. package/dist/drift.part13.d.ts +18 -2
  62. package/dist/drift.part13.js +654 -76
  63. package/dist/drift.part14.js +21 -7
  64. package/dist/driftCacheCas.d.ts +43 -0
  65. package/dist/driftCacheCas.js +351 -0
  66. package/dist/driftCacheFilesystem.d.ts +64 -0
  67. package/dist/driftCacheFilesystem.js +313 -0
  68. package/dist/driftCacheModes.d.ts +38 -0
  69. package/dist/driftCacheModes.js +147 -0
  70. package/dist/driftCacheStore.d.ts +80 -0
  71. package/dist/driftCacheStore.js +603 -0
  72. package/dist/driftCatalogo.d.ts +65 -0
  73. package/dist/driftCatalogo.js +516 -0
  74. package/dist/driftEscopo.d.ts +21 -0
  75. package/dist/driftEscopo.js +647 -0
  76. package/dist/driftEscopoReferencias.d.ts +8 -0
  77. package/dist/driftEscopoReferencias.js +612 -0
  78. package/dist/driftOrcamento.d.ts +6 -0
  79. package/dist/driftOrcamento.js +20 -3
  80. package/dist/geracaoCore.js +4 -6
  81. package/dist/iaPrompts.d.ts +3 -3
  82. package/dist/iaPrompts.js +13 -14
  83. package/dist/index.d.ts +4 -1
  84. package/dist/index.js +6 -25
  85. package/dist/index.part01.d.ts +21 -14
  86. package/dist/index.part01.js +20 -165
  87. package/dist/index.part02.js +57 -43
  88. package/dist/index.part03.d.ts +23 -1
  89. package/dist/index.part03.js +83 -8
  90. package/dist/index.part04.d.ts +10 -2
  91. package/dist/index.part04.js +48 -14
  92. package/dist/index.part05.d.ts +1 -1
  93. package/dist/index.part05.js +109 -30
  94. package/dist/index.part06.js +34 -16
  95. package/dist/index.part07.js +31 -27
  96. package/dist/index.part08.d.ts +1 -1
  97. package/dist/index.part08.js +23 -28
  98. package/dist/init/templates.part01.js +393 -393
  99. package/dist/init/templates.part02.js +189 -189
  100. package/dist/initCommand.js +5 -1
  101. package/dist/initTemplatesBackend.js +73 -73
  102. package/dist/initTemplatesBase.js +7 -5
  103. package/dist/initTemplatesFlutter.js +137 -137
  104. package/dist/initTemplatesRuntime.js +350 -350
  105. package/dist/initTemplatesWeb.js +309 -309
  106. package/dist/pipelineConteudo/command.d.ts +1 -0
  107. package/dist/pipelineConteudo/command.js +4 -32
  108. package/dist/pipelineConteudo/help.d.ts +2 -0
  109. package/dist/pipelineConteudo/help.js +33 -0
  110. package/dist/profileAuthorCommand.js +3 -7
  111. package/dist/profileCommand.js +3 -7
  112. package/dist/projeto.d.ts +1 -1
  113. package/dist/projetoCarregar.d.ts +2 -2
  114. package/dist/projetoCarregar.js +69 -28
  115. package/dist/projetoCatalogo.d.ts +8 -0
  116. package/dist/projetoCatalogo.js +164 -0
  117. package/dist/projetoOrigens.d.ts +2 -0
  118. package/dist/projetoOrigens.js +65 -9
  119. package/dist/projetoTipos.d.ts +15 -5
  120. package/dist/resultadoCli.d.ts +20 -0
  121. package/dist/resultadoCli.js +57 -0
  122. package/dist/saidaCli.d.ts +35 -0
  123. package/dist/saidaCli.js +118 -0
  124. package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
  125. package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
  126. package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
  127. package/dist/sistemasInterativos/engineObservation.js +438 -0
  128. package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
  129. package/dist/sistemasInterativos/jobOrchestration.js +204 -0
  130. package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
  131. package/dist/sistemasInterativos/operationPrimitives.js +194 -0
  132. package/dist/sistemasInterativos/operations.d.ts +4 -39
  133. package/dist/sistemasInterativos/operations.js +5 -1164
  134. package/dist/skillCommand.d.ts +5 -0
  135. package/dist/skillCommand.js +88 -0
  136. package/dist/sync/index.js +35 -35
  137. package/docs/README.md +11 -7
  138. package/docs/ai-integration.md +18 -11
  139. package/docs/ai-onboarding.md +81 -62
  140. package/docs/ai-workflow.md +10 -4
  141. package/docs/auth.md +26 -26
  142. package/docs/cli.md +197 -79
  143. package/docs/commands.md +30 -6
  144. package/docs/database.md +15 -15
  145. package/docs/deploy.md +54 -41
  146. package/docs/documentation.md +11 -10
  147. package/docs/drift-cache.md +108 -0
  148. package/docs/env.md +16 -16
  149. package/docs/frontend.md +41 -41
  150. package/docs/getting-started.md +82 -57
  151. package/docs/i18n.md +15 -15
  152. package/docs/repositories.md +60 -43
  153. package/docs/rollback.md +38 -31
  154. package/docs/security.md +54 -32
  155. package/docs/sistemas-interativos.md +27 -27
  156. package/docs/support.md +8 -8
  157. package/docs/testing.md +123 -17
  158. package/docs/vocabulary.md +29 -29
  159. package/exemplos/agendamento.sema +1 -1
  160. package/exemplos/assinatura.sema +1 -1
  161. package/exemplos/auditoria.sema +1 -1
  162. package/exemplos/autenticacao.sema +1 -1
  163. package/exemplos/author_obra_comum.sema +1 -1
  164. package/exemplos/author_tema_sensivel.sema +1 -1
  165. package/exemplos/automacao.sema +1 -1
  166. package/exemplos/cadastro_usuario.sema +1 -1
  167. package/exemplos/calculadora.sema +1 -1
  168. package/exemplos/crud_simples.sema +1 -1
  169. package/exemplos/estoque.sema +1 -1
  170. package/exemplos/exportacao.sema +1 -1
  171. package/exemplos/fila.sema +1 -1
  172. package/exemplos/integracao_externa.sema +1 -1
  173. package/exemplos/multi_tenant.sema +1 -1
  174. package/exemplos/notificacao.sema +1 -1
  175. package/exemplos/operacao_estrategia.sema +132 -132
  176. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  177. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  178. package/exemplos/operacao_estrategia_gates.sema +106 -106
  179. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  180. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  181. package/exemplos/pagamento.sema +1 -1
  182. package/exemplos/pagamento_dominio.sema +1 -1
  183. package/exemplos/pedido.sema +1 -1
  184. package/exemplos/permissao.sema +1 -1
  185. package/exemplos/persistencia_vendor_first.sema +1 -1
  186. package/exemplos/profile_conversas.sema +165 -165
  187. package/exemplos/profile_game.sema +1 -1
  188. package/exemplos/profile_legal.sema +1 -1
  189. package/exemplos/profile_ops.sema +1 -1
  190. package/exemplos/profile_research.sema +1 -1
  191. package/exemplos/profile_software.sema +1 -1
  192. package/exemplos/profile_workflow_n8n.sema +1 -1
  193. package/exemplos/relatorio.sema +1 -1
  194. package/exemplos/replica_analitica_erp.sema +1 -1
  195. package/exemplos/testes_embutidos.sema +1 -1
  196. package/exemplos/tratamento_erro.sema +1 -1
  197. package/exemplos/upload_arquivo.sema +1 -1
  198. package/exemplos/webhook.sema +1 -1
  199. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  200. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  201. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  202. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  203. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  204. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  205. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  206. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  207. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
  208. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
  209. package/package.json +7 -2
  210. package/scripts/postinstall.mjs +148 -0
  211. package/skills/sema/SKILL.md +199 -0
  212. package/skills/sema/agents/openai.yaml +4 -0
  213. package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
  214. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  215. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
  216. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
  217. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  218. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
  219. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  220. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  221. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  222. package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
  223. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  224. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
  225. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
  226. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  227. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
  228. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
  229. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
  230. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  231. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  232. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
  233. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
  234. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  235. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
  236. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
  237. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  238. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  239. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
  240. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
  241. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
  242. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  243. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  244. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  245. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
  246. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  247. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
  248. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
  249. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
  250. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
  251. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  252. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  253. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
  254. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
  255. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
  256. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
  257. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
  258. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
  259. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
  260. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
  261. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  262. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
  263. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
  264. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
  265. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  266. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  267. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
@@ -0,0 +1,57 @@
1
+ // SEMA-GOVERNED: sema.produto.cli_invocacao_publica.resultados
2
+ // Descrição: modela o envelope único de resultados JSON da CLI pública 3.0.
3
+ export const SCHEMA_RESULTADO_CLI_V1 = "sema.cli.result/v1";
4
+ export const CODIGO_SAIDA_FATAL_RUNTIME_CLI = 70;
5
+ const COMANDO_CANONICO_VALIDO = /^[a-z][a-z0-9-]{0,63}$/u;
6
+ const MENSAGEM_PUBLICA_ERRO_DOMINIO = "O comando Sema não foi concluído.";
7
+ const SCHEMAS_ENVELOPE_CLI = new Set([
8
+ SCHEMA_RESULTADO_CLI_V1,
9
+ "sema.cli.control/v1",
10
+ ]);
11
+ function validarComandoCanonico(comando) {
12
+ if (!COMANDO_CANONICO_VALIDO.test(comando)) {
13
+ throw new TypeError("Comando canônico inválido.");
14
+ }
15
+ return comando;
16
+ }
17
+ function validarCodigoSaida(codigoSaida) {
18
+ if (!Number.isSafeInteger(codigoSaida) || codigoSaida < 0 || codigoSaida > 255) {
19
+ throw new TypeError("Código de saída inválido.");
20
+ }
21
+ return codigoSaida;
22
+ }
23
+ export function interpretarPayloadRuntimeCli(stdout) {
24
+ if (stdout.trim().length === 0)
25
+ return null;
26
+ let payload;
27
+ try {
28
+ payload = JSON.parse(stdout);
29
+ }
30
+ catch {
31
+ return stdout;
32
+ }
33
+ if (payload !== null
34
+ && typeof payload === "object"
35
+ && !Array.isArray(payload)
36
+ && Object.prototype.hasOwnProperty.call(payload, "schemaVersion")
37
+ && SCHEMAS_ENVELOPE_CLI.has(payload.schemaVersion)) {
38
+ throw new TypeError("Payload não pode conter outro envelope público da CLI.");
39
+ }
40
+ return payload;
41
+ }
42
+ export function criarEnvelopeResultadoCliV1(entrada) {
43
+ const command = validarComandoCanonico(entrada.comando);
44
+ const exitCode = validarCodigoSaida(entrada.codigoSaida);
45
+ const sucesso = exitCode === 0;
46
+ return {
47
+ schemaVersion: SCHEMA_RESULTADO_CLI_V1,
48
+ ok: sucesso,
49
+ kind: sucesso ? "SUCCESS" : "DOMAIN_ERROR",
50
+ command,
51
+ code: sucesso ? "CLI_SUCCESS" : "CLI_DOMAIN_ERROR",
52
+ message: sucesso ? null : MENSAGEM_PUBLICA_ERRO_DOMINIO,
53
+ exitCode,
54
+ payload: interpretarPayloadRuntimeCli(entrada.stdout),
55
+ };
56
+ }
57
+ //# sourceMappingURL=resultadoCli.js.map
@@ -0,0 +1,35 @@
1
+ import { type EntradaEnvelopeResultadoCliV1, type EnvelopeResultadoCliV1 } from "./resultadoCli.js";
2
+ export { CODIGO_SAIDA_FATAL_RUNTIME_CLI, SCHEMA_RESULTADO_CLI_V1, criarEnvelopeResultadoCliV1, interpretarPayloadRuntimeCli, type EntradaEnvelopeResultadoCliV1, type EnvelopeResultadoCliV1, type TipoResultadoCliV1, } from "./resultadoCli.js";
3
+ export declare const SCHEMA_CONTROLE_CLI_V1: "sema.cli.control/v1";
4
+ export type TipoControleCli = "HELP" | "UNKNOWN_COMMAND" | "ARGUMENT_ERROR" | "FATAL_ERROR";
5
+ export interface EnvelopeControleJsonV1 {
6
+ readonly schemaVersion: typeof SCHEMA_CONTROLE_CLI_V1;
7
+ readonly ok: boolean;
8
+ readonly kind: TipoControleCli;
9
+ readonly code: string;
10
+ readonly message: string;
11
+ readonly exitCode: number;
12
+ }
13
+ export interface EntradaEnvelopeControleJsonV1 {
14
+ readonly categoria: TipoControleCli;
15
+ readonly codigoPublico: string;
16
+ readonly mensagemPublica: string;
17
+ readonly codigoSaida: number;
18
+ }
19
+ export interface OpcoesInvocacaoPublica {
20
+ readonly resultado: TipoControleCli;
21
+ readonly modoJson: boolean;
22
+ readonly envelopeControle?: EnvelopeControleJsonV1;
23
+ readonly mensagemTexto?: string;
24
+ }
25
+ export interface RelatorioInvocacaoPublica {
26
+ readonly codigoSaida: number;
27
+ readonly envelopeControleEmitido: boolean;
28
+ readonly stderrVazio: boolean;
29
+ readonly handlerExecutado: boolean;
30
+ readonly politicaControleJsonV1Respeitada: boolean;
31
+ readonly politicaHelpPuroRespeitada: boolean;
32
+ }
33
+ export declare function criarEnvelopeControleJsonV1(entrada: EntradaEnvelopeControleJsonV1): EnvelopeControleJsonV1;
34
+ export declare function emitirResultadoCliJsonV1(entrada: EntradaEnvelopeResultadoCliV1): EnvelopeResultadoCliV1;
35
+ export declare function executarInvocacaoPublica(opcoes: OpcoesInvocacaoPublica): RelatorioInvocacaoPublica;
@@ -0,0 +1,118 @@
1
+ // SEMA-GOVERNED: sema.produto.cli_invocacao_publica, sema.produto.cli_invocacao_publica.resultados
2
+ // Descrição: cria e emite os envelopes JSON públicos de controle v1 e resultado v1 da CLI.
3
+ import { criarEnvelopeResultadoCliV1, } from "./resultadoCli.js";
4
+ export { CODIGO_SAIDA_FATAL_RUNTIME_CLI, SCHEMA_RESULTADO_CLI_V1, criarEnvelopeResultadoCliV1, interpretarPayloadRuntimeCli, } from "./resultadoCli.js";
5
+ export const SCHEMA_CONTROLE_CLI_V1 = "sema.cli.control/v1";
6
+ const CODIGO_PADRAO = {
7
+ HELP: "CLI_HELP",
8
+ UNKNOWN_COMMAND: "CLI_UNKNOWN_COMMAND",
9
+ ARGUMENT_ERROR: "CLI_ARGUMENT_ERROR",
10
+ FATAL_ERROR: "CLI_FATAL_ERROR",
11
+ };
12
+ const MENSAGEM_PADRAO = {
13
+ HELP: "Ajuda da CLI Sema.",
14
+ UNKNOWN_COMMAND: "Comando Sema desconhecido.",
15
+ ARGUMENT_ERROR: "Argumentos inválidos. Consulte a ajuda do comando.",
16
+ FATAL_ERROR: "Falha ao executar a CLI da Sema.",
17
+ };
18
+ const CODIGO_PUBLICO_VALIDO = /^[A-Z][A-Z0-9_]{2,63}$/u;
19
+ const PREFIXO_ERRO_INTERNO = /\b(?:Aggregate|Eval|Internal|Range|Reference|Syntax|Type|URI)?Error\s*:/iu;
20
+ const TRECHO_STACK = /(?:^|[\s;|=(:,])at\s+(?:async\s+)?(?:new\s+)?[^\n]{0,240}?(?:\([^()\n]*:\d+:\d+\)|[^\s()\n]+:\d+:\d+)/iu;
21
+ function decodificarPercentAscii(valor) {
22
+ return valor.replace(/%([0-9a-f]{2})/giu, (_trecho, hexadecimal) => String.fromCharCode(Number.parseInt(hexadecimal, 16)));
23
+ }
24
+ function variantesTextoPublico(valor) {
25
+ const variantes = new Set([valor.normalize("NFC")]);
26
+ let atual = valor;
27
+ for (let tentativa = 0; tentativa < 3; tentativa += 1) {
28
+ const decodificado = decodificarPercentAscii(atual);
29
+ if (decodificado === atual) {
30
+ break;
31
+ }
32
+ variantes.add(decodificado.normalize("NFC"));
33
+ atual = decodificado;
34
+ }
35
+ return [...variantes];
36
+ }
37
+ function contemCaminhoAbsoluto(valor) {
38
+ return variantesTextoPublico(valor).some((variante) => {
39
+ const normalizada = variante.replaceAll("\\", "/");
40
+ const semUrlsPublicas = normalizada.replace(/\b(?:https?|wss?):\/\/[^\s"'<>]+/giu, "");
41
+ return /(?:^|[^A-Za-z0-9])file:\/{1,3}/iu.test(semUrlsPublicas)
42
+ || /(?:^|[^A-Za-z0-9])[A-Za-z]:\/(?:[^/\s"'<>]+(?:\/[^/\s"'<>]*)*)?/u.test(semUrlsPublicas)
43
+ || /(?:^|[^A-Za-z0-9_./])\/\/[^/\s"'<>]+\/[^/\s"'<>]+/u.test(semUrlsPublicas)
44
+ || /(?:^|[^A-Za-z0-9_./])\/(?!\/)[^/\s"'<>]+(?:\/[^/\s"'<>]*)*/u.test(semUrlsPublicas);
45
+ });
46
+ }
47
+ function normalizarCodigoPublico(categoria, codigo) {
48
+ const candidato = codigo.trim();
49
+ return CODIGO_PUBLICO_VALIDO.test(candidato) ? candidato : CODIGO_PADRAO[categoria];
50
+ }
51
+ function normalizarMensagemPublica(categoria, mensagem) {
52
+ if (categoria !== "HELP") {
53
+ return MENSAGEM_PADRAO[categoria];
54
+ }
55
+ const candidata = mensagem.trim();
56
+ if (!candidata
57
+ || contemCaminhoAbsoluto(candidata)
58
+ || TRECHO_STACK.test(candidata)
59
+ || PREFIXO_ERRO_INTERNO.test(candidata)) {
60
+ return MENSAGEM_PADRAO[categoria];
61
+ }
62
+ return candidata;
63
+ }
64
+ export function criarEnvelopeControleJsonV1(entrada) {
65
+ const help = entrada.categoria === "HELP";
66
+ const exitCode = help
67
+ ? 0
68
+ : entrada.codigoSaida === 0
69
+ ? 1
70
+ : entrada.codigoSaida;
71
+ return {
72
+ schemaVersion: SCHEMA_CONTROLE_CLI_V1,
73
+ ok: help,
74
+ kind: entrada.categoria,
75
+ code: normalizarCodigoPublico(entrada.categoria, entrada.codigoPublico),
76
+ message: normalizarMensagemPublica(entrada.categoria, entrada.mensagemPublica),
77
+ exitCode,
78
+ };
79
+ }
80
+ export function emitirResultadoCliJsonV1(entrada) {
81
+ const envelope = criarEnvelopeResultadoCliV1(entrada);
82
+ // Uma única escrita lógica impede documentos JSON parciais no processo público.
83
+ console.log(JSON.stringify(envelope, null, 2));
84
+ return envelope;
85
+ }
86
+ function envelopeSeguroParaInvocacao(resultado, envelope, mensagemTexto) {
87
+ const coerente = envelope?.kind === resultado ? envelope : undefined;
88
+ return criarEnvelopeControleJsonV1({
89
+ categoria: resultado,
90
+ codigoPublico: coerente?.code ?? CODIGO_PADRAO[resultado],
91
+ mensagemPublica: resultado === "HELP"
92
+ ? coerente?.message ?? mensagemTexto ?? MENSAGEM_PADRAO.HELP
93
+ : MENSAGEM_PADRAO[resultado],
94
+ codigoSaida: coerente?.exitCode ?? (resultado === "HELP" ? 0 : 1),
95
+ });
96
+ }
97
+ export function executarInvocacaoPublica(opcoes) {
98
+ const envelope = envelopeSeguroParaInvocacao(opcoes.resultado, opcoes.envelopeControle, opcoes.mensagemTexto);
99
+ if (opcoes.modoJson) {
100
+ // Uma única escrita lógica mantém JSON de controle em um único documento no stdout.
101
+ console.log(JSON.stringify(envelope, null, 2));
102
+ }
103
+ else if (opcoes.resultado === "HELP") {
104
+ console.log(envelope.message);
105
+ }
106
+ else {
107
+ console.error(envelope.message);
108
+ }
109
+ return {
110
+ codigoSaida: envelope.exitCode,
111
+ envelopeControleEmitido: opcoes.modoJson,
112
+ stderrVazio: opcoes.modoJson || opcoes.resultado === "HELP",
113
+ handlerExecutado: false,
114
+ politicaControleJsonV1Respeitada: true,
115
+ politicaHelpPuroRespeitada: true,
116
+ };
117
+ }
118
+ //# sourceMappingURL=saidaCli.js.map
@@ -0,0 +1,22 @@
1
+ import { type AcceptanceLockV1, type AcceptanceOperationValue, type AcceptanceTimeRange, type MultimodalChannelType, type MultimodalEvidenceDescriptorV1, type OperationResult, type Sha256 } from "./operationsTypes.js";
2
+ export declare function validarAcceptanceLock(input: unknown): OperationResult<{
3
+ readonly lock: AcceptanceLockV1;
4
+ readonly lockDigest: Sha256;
5
+ }>;
6
+ export declare function operarAcceptanceLock(operation: unknown, lockInput: unknown, contextInput: unknown): OperationResult<AcceptanceOperationValue>;
7
+ export declare function digestVinculoClaimMultimodal(input: {
8
+ readonly claimId: string;
9
+ readonly runId: string;
10
+ readonly definitionDigest: Sha256;
11
+ readonly planDigest: Sha256;
12
+ readonly contractDigest: Sha256;
13
+ readonly artifactDigest: Sha256;
14
+ readonly sceneId: string;
15
+ readonly timeRange: AcceptanceTimeRange;
16
+ readonly requiredModalities: readonly MultimodalChannelType[];
17
+ }): Sha256;
18
+ export declare function validarEvidenciaMultimodal(input: unknown): OperationResult<{
19
+ readonly descriptor: MultimodalEvidenceDescriptorV1;
20
+ readonly descriptorDigest: Sha256;
21
+ readonly localDescriptorOnly: true;
22
+ }>;
@@ -0,0 +1,345 @@
1
+ // SEMA-GOVERNED: sema.produto.sistemas_interativos.operacao.acceptance_evidencias
2
+ // Descricao: acceptance locks, invalidacao explicita e evidencia multimodal local nao autoritativa.
3
+ import { ACCEPTANCE_LOCK_SCHEMA_V1, MULTIMODAL_EVIDENCE_SCHEMA_V1, } from "./operationsTypes.js";
4
+ import { MEDIA_TYPE_PATTERN, canonicalJson, digestJsonOperacional, failure, hasOnlyKeys, inspectPlainJson, isIntegerIn, isIsoTimestamp, isRecord, isSafeName, isSemanticId, isSha256, isVersion, issue, success, } from "./operationPrimitives.js";
5
+ const ACCEPTANCE_REASONS = new Set([
6
+ "ARTIFACT_CHANGED", "SCENE_CHANGED", "TIME_RANGE_CHANGED", "APPROVER_REVOKED", "MANUAL_WITHDRAWAL",
7
+ ]);
8
+ function validateTimeRange(input, field, issues) {
9
+ if (!isRecord(input)
10
+ || !hasOnlyKeys(input, ["start", "end", "unit"])
11
+ || typeof input.start !== "number"
12
+ || !Number.isFinite(input.start)
13
+ || input.start < 0
14
+ || typeof input.end !== "number"
15
+ || !Number.isFinite(input.end)
16
+ || input.end <= input.start
17
+ || (input.unit !== "FRAME" && input.unit !== "TICK" && input.unit !== "SECOND")) {
18
+ issues.push(issue("time_range_invalid", field));
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ export function validarAcceptanceLock(input) {
24
+ const issues = inspectPlainJson(input, "acceptanceLock");
25
+ if (!isRecord(input))
26
+ return failure([...issues, issue("acceptance_lock_object_required", "acceptanceLock")]);
27
+ if (!hasOnlyKeys(input, [
28
+ "schemaVersion", "lockId", "artifactDigest", "sceneId", "timeRange", "approver",
29
+ "decision", "status", "createdAt", "invalidation", "authoritative",
30
+ ]))
31
+ issues.push(issue("acceptance_lock_unknown_field", "acceptanceLock"));
32
+ if (input.schemaVersion !== ACCEPTANCE_LOCK_SCHEMA_V1)
33
+ issues.push(issue("acceptance_lock_schema_invalid", "schemaVersion"));
34
+ if (!isSemanticId(input.lockId))
35
+ issues.push(issue("acceptance_lock_id_invalid", "lockId"));
36
+ if (!isSha256(input.artifactDigest))
37
+ issues.push(issue("acceptance_artifact_digest_invalid", "artifactDigest"));
38
+ if (!isSemanticId(input.sceneId))
39
+ issues.push(issue("acceptance_scene_id_invalid", "sceneId"));
40
+ validateTimeRange(input.timeRange, "timeRange", issues);
41
+ if (!isRecord(input.approver)
42
+ || !hasOnlyKeys(input.approver, ["approverIdDigest", "role", "method"])
43
+ || !isSha256(input.approver.approverIdDigest)
44
+ || !isSafeName(input.approver.role)
45
+ || (input.approver.method !== "HUMAN" && input.approver.method !== "POLICY")) {
46
+ issues.push(issue("acceptance_approver_invalid", "approver"));
47
+ }
48
+ if (input.decision !== "ACCEPTED")
49
+ issues.push(issue("acceptance_decision_invalid", "decision"));
50
+ if (input.status !== "ACTIVE" && input.status !== "INVALIDATED")
51
+ issues.push(issue("acceptance_status_invalid", "status"));
52
+ if (!isIsoTimestamp(input.createdAt))
53
+ issues.push(issue("acceptance_created_at_invalid", "createdAt"));
54
+ if (input.authoritative !== false)
55
+ issues.push(issue("acceptance_lock_must_be_non_authoritative", "authoritative"));
56
+ if (input.status === "ACTIVE" && input.invalidation !== undefined) {
57
+ issues.push(issue("active_lock_cannot_have_invalidation", "invalidation"));
58
+ }
59
+ if (input.status === "INVALIDATED") {
60
+ const invalidation = input.invalidation;
61
+ if (!isRecord(invalidation)
62
+ || !hasOnlyKeys(invalidation, ["previousLockDigest", "invalidatedByDigest", "reasonCode", "invalidatedAt"])
63
+ || !isSha256(invalidation.previousLockDigest)
64
+ || !isSha256(invalidation.invalidatedByDigest)
65
+ || typeof invalidation.reasonCode !== "string"
66
+ || !ACCEPTANCE_REASONS.has(invalidation.reasonCode)
67
+ || !isIsoTimestamp(invalidation.invalidatedAt)) {
68
+ issues.push(issue("acceptance_invalidation_invalid", "invalidation"));
69
+ }
70
+ }
71
+ if (issues.length > 0)
72
+ return failure(issues);
73
+ const lock = input;
74
+ const normalized = {
75
+ ...lock,
76
+ timeRange: { ...lock.timeRange },
77
+ approver: { ...lock.approver },
78
+ ...(lock.invalidation === undefined ? {} : { invalidation: { ...lock.invalidation } }),
79
+ };
80
+ const lockDigest = digestJsonOperacional(normalized);
81
+ return success({ lock: normalized, lockDigest }, lockDigest);
82
+ }
83
+ export function operarAcceptanceLock(operation, lockInput, contextInput) {
84
+ if (operation !== "VALIDATE" && operation !== "EVALUATE" && operation !== "INVALIDATE") {
85
+ return failure([issue("acceptance_operation_invalid", "operation")]);
86
+ }
87
+ const lockResult = validarAcceptanceLock(lockInput);
88
+ if (!lockResult.value)
89
+ return failure(lockResult.issues);
90
+ const contextIssues = inspectPlainJson(contextInput, "context");
91
+ if (!isRecord(contextInput))
92
+ return failure([...contextIssues, issue("acceptance_context_object_required", "context")]);
93
+ const lock = lockResult.value.lock;
94
+ const active = lock.status === "ACTIVE";
95
+ if (operation === "VALIDATE") {
96
+ if (!hasOnlyKeys(contextInput, []))
97
+ contextIssues.push(issue("acceptance_validate_context_must_be_empty", "context"));
98
+ if (contextIssues.length > 0)
99
+ return failure(contextIssues);
100
+ return success({
101
+ operation,
102
+ accepted: active,
103
+ bindingMatches: active,
104
+ invalidated: !active,
105
+ blockers: active ? [] : ["acceptance_lock_invalidated"],
106
+ lock,
107
+ lockDigest: lockResult.value.lockDigest,
108
+ }, lockResult.value.lockDigest);
109
+ }
110
+ if (operation === "EVALUATE") {
111
+ if (!hasOnlyKeys(contextInput, ["artifactDigest", "sceneId", "timeRange"])) {
112
+ contextIssues.push(issue("acceptance_evaluate_unknown_field", "context"));
113
+ }
114
+ if (!isSha256(contextInput.artifactDigest))
115
+ contextIssues.push(issue("acceptance_context_artifact_invalid", "context"));
116
+ if (!isSemanticId(contextInput.sceneId))
117
+ contextIssues.push(issue("acceptance_context_scene_invalid", "context"));
118
+ validateTimeRange(contextInput.timeRange, "context", contextIssues);
119
+ if (contextIssues.length > 0)
120
+ return failure(contextIssues);
121
+ const bindingMatches = lock.artifactDigest === contextInput.artifactDigest
122
+ && lock.sceneId === contextInput.sceneId
123
+ && canonicalJson(lock.timeRange) === canonicalJson(contextInput.timeRange);
124
+ const blockers = [
125
+ ...(active ? [] : ["acceptance_lock_invalidated"]),
126
+ ...(bindingMatches ? [] : ["acceptance_binding_mismatch"]),
127
+ ];
128
+ return success({
129
+ operation,
130
+ accepted: active && bindingMatches,
131
+ bindingMatches,
132
+ invalidated: !active,
133
+ blockers,
134
+ lock,
135
+ lockDigest: lockResult.value.lockDigest,
136
+ }, lockResult.value.lockDigest);
137
+ }
138
+ if (!hasOnlyKeys(contextInput, ["lockDigest", "invalidatedByDigest", "reasonCode", "invalidatedAt"])) {
139
+ contextIssues.push(issue("acceptance_invalidate_unknown_field", "context"));
140
+ }
141
+ if (!isSha256(contextInput.lockDigest) || contextInput.lockDigest !== lockResult.value.lockDigest) {
142
+ contextIssues.push(issue("acceptance_lock_digest_mismatch", "context"));
143
+ }
144
+ if (!isSha256(contextInput.invalidatedByDigest))
145
+ contextIssues.push(issue("acceptance_invalidator_invalid", "context"));
146
+ if (typeof contextInput.reasonCode !== "string"
147
+ || !ACCEPTANCE_REASONS.has(contextInput.reasonCode)) {
148
+ contextIssues.push(issue("acceptance_invalidation_reason_invalid", "context"));
149
+ }
150
+ if (!isIsoTimestamp(contextInput.invalidatedAt))
151
+ contextIssues.push(issue("acceptance_invalidated_at_invalid", "context"));
152
+ if (!active)
153
+ contextIssues.push(issue("acceptance_lock_already_invalidated", "acceptanceLock"));
154
+ if (contextIssues.length > 0)
155
+ return failure(contextIssues);
156
+ const invalidatedLock = {
157
+ ...lock,
158
+ status: "INVALIDATED",
159
+ invalidation: {
160
+ previousLockDigest: lockResult.value.lockDigest,
161
+ invalidatedByDigest: contextInput.invalidatedByDigest,
162
+ reasonCode: contextInput.reasonCode,
163
+ invalidatedAt: contextInput.invalidatedAt,
164
+ },
165
+ };
166
+ const lockDigest = digestJsonOperacional(invalidatedLock);
167
+ return success({
168
+ operation,
169
+ accepted: false,
170
+ bindingMatches: true,
171
+ invalidated: true,
172
+ blockers: ["acceptance_lock_invalidated"],
173
+ lock: invalidatedLock,
174
+ lockDigest,
175
+ }, lockDigest);
176
+ }
177
+ const MULTIMODAL_CHANNEL_TYPES = new Set([
178
+ "SCREENSHOT", "VIDEO", "DEPTH", "NORMALS", "OBJECT_ID",
179
+ "MOTION", "TRANSFORMS", "EVENTS", "AUDIO", "TELEMETRY",
180
+ ]);
181
+ export function digestVinculoClaimMultimodal(input) {
182
+ return digestJsonOperacional({ ...input, requiredModalities: [...input.requiredModalities].sort() });
183
+ }
184
+ export function validarEvidenciaMultimodal(input) {
185
+ const issues = inspectPlainJson(input, "evidence");
186
+ if (!isRecord(input))
187
+ return failure([...issues, issue("evidence_object_required", "evidence")]);
188
+ if (!hasOnlyKeys(input, [
189
+ "schemaVersion", "evidenceId", "runId", "claimId", "definitionDigest", "planDigest", "contractDigest",
190
+ "claimBindingDigest", "artifactDigest", "sceneId", "timeRange", "requiredModalities", "channels",
191
+ "producer", "verifier", "decision", "observedAt", "authoritative",
192
+ ]))
193
+ issues.push(issue("evidence_unknown_field", "evidence"));
194
+ if (input.schemaVersion !== MULTIMODAL_EVIDENCE_SCHEMA_V1)
195
+ issues.push(issue("evidence_schema_invalid", "schemaVersion"));
196
+ if (!isSemanticId(input.evidenceId))
197
+ issues.push(issue("evidence_id_invalid", "evidenceId"));
198
+ if (!isSemanticId(input.runId))
199
+ issues.push(issue("evidence_run_id_invalid", "runId"));
200
+ if (!isSemanticId(input.claimId))
201
+ issues.push(issue("evidence_claim_id_invalid", "claimId"));
202
+ if (!isSha256(input.definitionDigest))
203
+ issues.push(issue("evidence_definition_digest_invalid", "definitionDigest"));
204
+ if (!isSha256(input.planDigest))
205
+ issues.push(issue("evidence_plan_digest_invalid", "planDigest"));
206
+ if (!isSha256(input.contractDigest))
207
+ issues.push(issue("evidence_contract_digest_invalid", "contractDigest"));
208
+ if (!isSha256(input.artifactDigest))
209
+ issues.push(issue("evidence_artifact_digest_invalid", "artifactDigest"));
210
+ if (!isSemanticId(input.sceneId))
211
+ issues.push(issue("evidence_scene_id_invalid", "sceneId"));
212
+ const timeRange = input.timeRange;
213
+ const timeRangeValid = validateTimeRange(timeRange, "timeRange", issues);
214
+ const requiredModalitiesInput = input.requiredModalities;
215
+ const requiredModalitiesValid = Array.isArray(requiredModalitiesInput)
216
+ && requiredModalitiesInput.length > 0
217
+ && requiredModalitiesInput.every((type) => typeof type === "string"
218
+ && MULTIMODAL_CHANNEL_TYPES.has(type))
219
+ && new Set(requiredModalitiesInput).size === requiredModalitiesInput.length;
220
+ const requiredModalities = requiredModalitiesValid
221
+ ? requiredModalitiesInput
222
+ : [];
223
+ if (!requiredModalitiesValid)
224
+ issues.push(issue("evidence_required_modalities_invalid", "requiredModalities"));
225
+ if (!isSha256(input.claimBindingDigest)
226
+ || !isSemanticId(input.claimId)
227
+ || !isSemanticId(input.runId)
228
+ || !isSha256(input.definitionDigest)
229
+ || !isSha256(input.planDigest)
230
+ || !isSha256(input.contractDigest)
231
+ || !isSha256(input.artifactDigest)
232
+ || !isSemanticId(input.sceneId)
233
+ || !timeRangeValid
234
+ || input.claimBindingDigest !== digestVinculoClaimMultimodal({
235
+ claimId: input.claimId,
236
+ runId: input.runId,
237
+ definitionDigest: input.definitionDigest,
238
+ planDigest: input.planDigest,
239
+ contractDigest: input.contractDigest,
240
+ artifactDigest: input.artifactDigest,
241
+ sceneId: input.sceneId,
242
+ timeRange,
243
+ requiredModalities,
244
+ }))
245
+ issues.push(issue("evidence_claim_binding_invalid", "claimBindingDigest"));
246
+ if (!isIsoTimestamp(input.observedAt))
247
+ issues.push(issue("evidence_observed_at_invalid", "observedAt"));
248
+ if (input.authoritative !== false)
249
+ issues.push(issue("evidence_must_be_non_authoritative", "authoritative"));
250
+ const channelIds = new Set();
251
+ const channelTypes = new Set();
252
+ if (!Array.isArray(input.channels) || input.channels.length === 0) {
253
+ issues.push(issue("evidence_channels_required", "channels"));
254
+ }
255
+ else
256
+ for (const channel of input.channels) {
257
+ if (!isRecord(channel)
258
+ || !hasOnlyKeys(channel, [
259
+ "channelId", "type", "artifactDigest", "mediaType", "metadataDigest", "sampleCount",
260
+ ])
261
+ || !isSemanticId(channel.channelId)
262
+ || typeof channel.type !== "string"
263
+ || !MULTIMODAL_CHANNEL_TYPES.has(channel.type)
264
+ || !isSha256(channel.artifactDigest)
265
+ || typeof channel.mediaType !== "string"
266
+ || !MEDIA_TYPE_PATTERN.test(channel.mediaType)
267
+ || !isSha256(channel.metadataDigest)
268
+ || !isIntegerIn(channel.sampleCount, 1, 1_000_000_000)) {
269
+ issues.push(issue("evidence_channel_invalid", "channels"));
270
+ continue;
271
+ }
272
+ if (channelIds.has(channel.channelId))
273
+ issues.push(issue("evidence_channel_id_duplicate", "channels"));
274
+ if (channelTypes.has(channel.type))
275
+ issues.push(issue("evidence_channel_type_duplicate", "channels"));
276
+ channelIds.add(channel.channelId);
277
+ channelTypes.add(channel.type);
278
+ }
279
+ const producer = input.producer;
280
+ if (!isRecord(producer)
281
+ || !hasOnlyKeys(producer, ["producerIdDigest", "producerType", "version", "configurationDigest"])
282
+ || !isSha256(producer.producerIdDigest)
283
+ || (producer.producerType !== "ENGINE"
284
+ && producer.producerType !== "EDITOR"
285
+ && producer.producerType !== "RUNNER"
286
+ && producer.producerType !== "MODEL"
287
+ && producer.producerType !== "HUMAN"
288
+ && producer.producerType !== "SENSOR")
289
+ || !isVersion(producer.version)
290
+ || !isSha256(producer.configurationDigest))
291
+ issues.push(issue("evidence_producer_invalid", "producer"));
292
+ const verifier = input.verifier;
293
+ if (!isRecord(verifier)
294
+ || !hasOnlyKeys(verifier, [
295
+ "verifierIdDigest", "verifierType", "version", "independent", "configurationDigest",
296
+ ])
297
+ || !isSha256(verifier.verifierIdDigest)
298
+ || (verifier.verifierType !== "RULE"
299
+ && verifier.verifierType !== "MODEL"
300
+ && verifier.verifierType !== "HUMAN"
301
+ && verifier.verifierType !== "SENSOR")
302
+ || !isVersion(verifier.version)
303
+ || verifier.independent !== true
304
+ || !isSha256(verifier.configurationDigest))
305
+ issues.push(issue("evidence_verifier_invalid", "verifier"));
306
+ if (isRecord(producer) && isRecord(verifier)
307
+ && isSha256(producer.producerIdDigest) && isSha256(verifier.verifierIdDigest)
308
+ && producer.producerIdDigest === verifier.verifierIdDigest) {
309
+ issues.push(issue("evidence_verifier_not_independent", "verifier"));
310
+ }
311
+ const decision = input.decision;
312
+ if (!isRecord(decision)
313
+ || !hasOnlyKeys(decision, ["verdict", "reasonCodes", "confidenceBasisPoints"])
314
+ || (decision.verdict !== "PASS" && decision.verdict !== "FAIL" && decision.verdict !== "INCONCLUSIVE")
315
+ || !Array.isArray(decision.reasonCodes)
316
+ || decision.reasonCodes.length === 0
317
+ || decision.reasonCodes.some((code) => !isSafeName(code))
318
+ || new Set(decision.reasonCodes).size !== decision.reasonCodes.length
319
+ || !isIntegerIn(decision.confidenceBasisPoints, 0, 10_000))
320
+ issues.push(issue("evidence_decision_invalid", "decision"));
321
+ if (isRecord(decision) && decision.verdict === "PASS") {
322
+ if (!requiredModalitiesValid || requiredModalities.length < 2) {
323
+ issues.push(issue("evidence_pass_requires_multiple_modalities", "requiredModalities"));
324
+ }
325
+ else if (!requiredModalities.every((type) => channelTypes.has(type))) {
326
+ issues.push(issue("evidence_pass_missing_required_modality", "channels"));
327
+ }
328
+ }
329
+ if (issues.length > 0)
330
+ return failure(issues);
331
+ const descriptor = input;
332
+ const normalized = {
333
+ ...descriptor,
334
+ timeRange: { ...descriptor.timeRange },
335
+ requiredModalities: [...descriptor.requiredModalities].sort(),
336
+ channels: descriptor.channels.map((channel) => ({ ...channel }))
337
+ .sort((left, right) => left.type.localeCompare(right.type) || left.channelId.localeCompare(right.channelId)),
338
+ producer: { ...descriptor.producer },
339
+ verifier: { ...descriptor.verifier },
340
+ decision: { ...descriptor.decision, reasonCodes: [...descriptor.decision.reasonCodes].sort() },
341
+ };
342
+ const descriptorDigest = digestJsonOperacional(normalized);
343
+ return success({ descriptor: normalized, descriptorDigest, localDescriptorOnly: true }, descriptorDigest);
344
+ }
345
+ //# sourceMappingURL=acceptanceEvidence.js.map
@@ -0,0 +1,12 @@
1
+ import { type AssetProvenanceV1, type EditorStateV1, type EngineSnapshotDiffV1, type OperationResult, type Sha256, type ValidatedEngineSnapshot } from "./operationsTypes.js";
2
+ export declare function validarSnapshotEngine(input: unknown): OperationResult<ValidatedEngineSnapshot>;
3
+ export declare function derivarDiffSnapshotsEngine(beforeInput: unknown, afterInput: unknown): OperationResult<EngineSnapshotDiffV1>;
4
+ export declare function validarProvenienciaAsset(input: unknown): OperationResult<{
5
+ readonly provenance: AssetProvenanceV1;
6
+ readonly provenanceDigest: Sha256;
7
+ }>;
8
+ export declare function validarEstadoEditor(input: unknown): OperationResult<{
9
+ readonly state: EditorStateV1;
10
+ readonly editorStateDigest: Sha256;
11
+ readonly externallyObserved: false;
12
+ }>;