@semacode/cli 2.3.1 → 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 (250) hide show
  1. package/README.md +265 -217
  2. package/dist/agentContextPack.js +14 -10
  3. package/dist/agentEntryPoints.d.ts +5 -0
  4. package/dist/agentEntryPoints.js +567 -557
  5. package/dist/angular-consumer-standalone.js +1 -1
  6. package/dist/bin.d.ts +6 -0
  7. package/dist/bin.js +130 -0
  8. package/dist/cliArgs.js +4 -4
  9. package/dist/cliControlError.d.ts +12 -0
  10. package/dist/cliControlError.js +47 -0
  11. package/dist/cliGrammar.d.ts +11 -0
  12. package/dist/cliGrammar.js +551 -0
  13. package/dist/cliHelp.d.ts +13 -0
  14. package/dist/cliHelp.js +19 -0
  15. package/dist/cliHelpTexto.d.ts +3 -0
  16. package/dist/cliHelpTexto.js +168 -0
  17. package/dist/cliRuntime.d.ts +2 -0
  18. package/dist/cliRuntime.js +31 -0
  19. package/dist/comandos.js +9 -22
  20. package/dist/contexto.js +5 -5
  21. package/dist/dev/index.d.ts +1 -0
  22. package/dist/dev/index.js +51 -9
  23. package/dist/discovery/catalog.js +3 -3
  24. package/dist/distribuicao/filesystemGlobal.d.ts +63 -0
  25. package/dist/distribuicao/filesystemGlobal.js +701 -0
  26. package/dist/distribuicao/index.d.ts +7 -0
  27. package/dist/distribuicao/index.js +227 -0
  28. package/dist/distribuicao/launcherGlobal.d.ts +53 -0
  29. package/dist/distribuicao/launcherGlobal.js +643 -0
  30. package/dist/distribuicao/launcherWindows.d.ts +28 -0
  31. package/dist/distribuicao/launcherWindows.js +326 -0
  32. package/dist/distribuicao/lockContextGlobal.d.ts +10 -0
  33. package/dist/distribuicao/lockContextGlobal.js +17 -0
  34. package/dist/distribuicao/lockGlobal.d.ts +6 -0
  35. package/dist/distribuicao/lockGlobal.js +520 -0
  36. package/dist/distribuicao/skillGlobal.d.ts +48 -0
  37. package/dist/distribuicao/skillGlobal.js +652 -0
  38. package/dist/distribuicao/skillIntentPolicy.d.ts +21 -0
  39. package/dist/distribuicao/skillIntentPolicy.js +115 -0
  40. package/dist/distribuicao/tipos.d.ts +50 -0
  41. package/dist/distribuicao/tipos.js +10 -0
  42. package/dist/distribuicao/versaoSemantica.d.ts +3 -0
  43. package/dist/distribuicao/versaoSemantica.js +62 -0
  44. package/dist/drift.part01.d.ts +26 -24
  45. package/dist/drift.part01.js +2 -1
  46. package/dist/drift.part04.d.ts +12 -3
  47. package/dist/drift.part04.js +88 -17
  48. package/dist/drift.part05.d.ts +2 -2
  49. package/dist/drift.part05.js +8 -6
  50. package/dist/drift.part06.d.ts +2 -2
  51. package/dist/drift.part06.js +113 -26
  52. package/dist/drift.part07.d.ts +11 -11
  53. package/dist/drift.part07.js +261 -265
  54. package/dist/drift.part08.d.ts +2 -2
  55. package/dist/drift.part08.js +35 -26
  56. package/dist/drift.part11.js +238 -56
  57. package/dist/drift.part12.d.ts +1 -1
  58. package/dist/drift.part12.js +193 -21
  59. package/dist/drift.part13.d.ts +20 -39
  60. package/dist/drift.part13.js +601 -647
  61. package/dist/drift.part14.js +21 -7
  62. package/dist/driftCacheCas.d.ts +43 -0
  63. package/dist/driftCacheCas.js +351 -0
  64. package/dist/driftCacheFilesystem.d.ts +64 -0
  65. package/dist/driftCacheFilesystem.js +313 -0
  66. package/dist/driftCacheModes.d.ts +38 -0
  67. package/dist/driftCacheModes.js +147 -0
  68. package/dist/driftCacheStore.d.ts +80 -0
  69. package/dist/driftCacheStore.js +603 -0
  70. package/dist/driftCatalogo.d.ts +2 -28
  71. package/dist/driftCatalogo.js +143 -284
  72. package/dist/driftEscopo.d.ts +1 -3
  73. package/dist/driftEscopo.js +235 -151
  74. package/dist/driftEscopoReferencias.d.ts +5 -1
  75. package/dist/driftEscopoReferencias.js +375 -28
  76. package/dist/driftOrcamento.d.ts +0 -6
  77. package/dist/driftOrcamento.js +2 -1
  78. package/dist/execucoesExternas.js +19 -5
  79. package/dist/geracaoCore.js +4 -6
  80. package/dist/iaPrompts.d.ts +3 -3
  81. package/dist/iaPrompts.js +312 -313
  82. package/dist/index.d.ts +4 -1
  83. package/dist/index.js +6 -25
  84. package/dist/index.part01.d.ts +20 -28
  85. package/dist/index.part01.js +16 -237
  86. package/dist/index.part02.js +36 -22
  87. package/dist/index.part03.d.ts +24 -2
  88. package/dist/index.part03.js +83 -19
  89. package/dist/index.part04.d.ts +10 -2
  90. package/dist/index.part04.js +142 -120
  91. package/dist/index.part05.js +80 -78
  92. package/dist/index.part06.js +34 -17
  93. package/dist/index.part07.js +7 -3
  94. package/dist/index.part08.d.ts +1 -1
  95. package/dist/index.part08.js +22 -27
  96. package/dist/initCommand.js +5 -1
  97. package/dist/initTemplatesBase.js +81 -79
  98. package/dist/pipelineConteudo/command.d.ts +1 -0
  99. package/dist/pipelineConteudo/command.js +9 -2
  100. package/dist/pipelineConteudo/help.d.ts +2 -0
  101. package/dist/pipelineConteudo/help.js +33 -0
  102. package/dist/profileAuthorCommand.js +3 -7
  103. package/dist/profileCommand.js +3 -7
  104. package/dist/projetoCarregar.js +35 -17
  105. package/dist/projetoCatalogo.d.ts +1 -0
  106. package/dist/projetoCatalogo.js +64 -25
  107. package/dist/projetoOrigens.d.ts +2 -0
  108. package/dist/projetoOrigens.js +65 -9
  109. package/dist/projetoTipos.d.ts +1 -0
  110. package/dist/resultadoCli.d.ts +20 -0
  111. package/dist/resultadoCli.js +57 -0
  112. package/dist/saidaCli.d.ts +35 -0
  113. package/dist/saidaCli.js +118 -0
  114. package/dist/sistemasInterativos/acceptanceEvidence.d.ts +22 -0
  115. package/dist/sistemasInterativos/acceptanceEvidence.js +345 -0
  116. package/dist/sistemasInterativos/engineObservation.d.ts +12 -0
  117. package/dist/sistemasInterativos/engineObservation.js +438 -0
  118. package/dist/sistemasInterativos/jobOrchestration.d.ts +2 -0
  119. package/dist/sistemasInterativos/jobOrchestration.js +204 -0
  120. package/dist/sistemasInterativos/operationPrimitives.d.ts +21 -0
  121. package/dist/sistemasInterativos/operationPrimitives.js +194 -0
  122. package/dist/sistemasInterativos/operations.d.ts +4 -39
  123. package/dist/sistemasInterativos/operations.js +5 -1164
  124. package/dist/skillCommand.d.ts +5 -0
  125. package/dist/skillCommand.js +88 -0
  126. package/docs/README.md +34 -30
  127. package/docs/ai-integration.md +25 -12
  128. package/docs/ai-onboarding.md +37 -18
  129. package/docs/ai-workflow.md +9 -7
  130. package/docs/cli.md +125 -7
  131. package/docs/commands.md +41 -20
  132. package/docs/deploy.md +21 -8
  133. package/docs/descoberta-capacidades.md +106 -106
  134. package/docs/documentation.md +49 -39
  135. package/docs/drift-cache.md +108 -0
  136. package/docs/getting-started.md +43 -18
  137. package/docs/pipeline-conteudo.md +246 -246
  138. package/docs/profiles.md +54 -54
  139. package/docs/repositories.md +19 -2
  140. package/docs/rollback.md +15 -8
  141. package/docs/security.md +25 -3
  142. package/docs/sistemas-interativos.md +379 -374
  143. package/docs/testing.md +139 -40
  144. package/exemplos/pipeline-conteudo/README.md +44 -44
  145. package/exemplos/pipeline-conteudo/alvos.json +23 -23
  146. package/exemplos/pipeline-conteudo/definicao.json +136 -136
  147. package/exemplos/profile_simulation.sema +211 -211
  148. package/exemplos/sistemas-interativos/README.md +100 -100
  149. package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -5
  150. package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -16
  151. package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -32
  152. package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -93
  153. package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -78
  154. package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -27
  155. package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -79
  156. package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -42
  157. package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -32
  158. package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -23
  159. package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -39
  160. package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -46
  161. package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -39
  162. package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -37
  163. package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -104
  164. package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -27
  165. package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -118
  166. package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -459
  167. package/exemplos/sistemas-interativos/game-2d.json +83 -83
  168. package/exemplos/sistemas-interativos/game-3d-human.json +81 -81
  169. package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -97
  170. package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -94
  171. package/exemplos/sistemas-interativos/game-xr-human.json +80 -80
  172. package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -108
  173. package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -75
  174. package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -58
  175. package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -97
  176. package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -141
  177. package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -112
  178. package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -103
  179. package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -95
  180. package/node_modules/@sema/gerador-cpp/package.json +1 -1
  181. package/node_modules/@sema/gerador-dotnet/package.json +1 -1
  182. package/node_modules/@sema/gerador-lua/dist/index.js +51 -51
  183. package/node_modules/@sema/gerador-php/dist/index.js +113 -113
  184. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -0
  185. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1 -0
  186. package/package.json +9 -4
  187. package/scripts/postinstall.mjs +148 -0
  188. package/skills/sema/SKILL.md +199 -0
  189. package/skills/sema/agents/openai.yaml +4 -0
  190. package/dist/driftCache.d.ts +0 -49
  191. package/dist/driftCache.js +0 -311
  192. package/dist/driftCacheIncremental.d.ts +0 -98
  193. package/dist/driftCacheIncremental.js +0 -596
  194. package/dist/driftCatalogoPersistente.d.ts +0 -8
  195. package/dist/driftCatalogoPersistente.js +0 -77
  196. package/node_modules/@sema/gerador-cpp/dist/index.js.map +0 -1
  197. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  198. package/node_modules/@sema/gerador-css/dist/index.part01.js.map +0 -1
  199. package/node_modules/@sema/gerador-css/dist/index.part02.js.map +0 -1
  200. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  201. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +0 -1
  202. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  203. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  204. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  205. package/node_modules/@sema/gerador-php/dist/index.js.map +0 -1
  206. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  207. package/node_modules/@sema/gerador-python/dist/index.part01.js.map +0 -1
  208. package/node_modules/@sema/gerador-python/dist/index.part02.js.map +0 -1
  209. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  210. package/node_modules/@sema/gerador-typescript/dist/index.part01.js.map +0 -1
  211. package/node_modules/@sema/gerador-typescript/dist/index.part02.js.map +0 -1
  212. package/node_modules/@sema/gerador-typescript/dist/index.part03.js.map +0 -1
  213. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  214. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  215. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +0 -1
  216. package/node_modules/@sema/nucleo/dist/diagnosticos/snippets.js.map +0 -1
  217. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  218. package/node_modules/@sema/nucleo/dist/formatador/index.part01.js.map +0 -1
  219. package/node_modules/@sema/nucleo/dist/formatador/index.part02.js.map +0 -1
  220. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  221. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  222. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js.map +0 -1
  223. package/node_modules/@sema/nucleo/dist/ir/conversor.part02.js.map +0 -1
  224. package/node_modules/@sema/nucleo/dist/ir/conversor.part03.js.map +0 -1
  225. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  226. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  227. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  228. package/node_modules/@sema/nucleo/dist/parser/parser.declaracoes.js.map +0 -1
  229. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  230. package/node_modules/@sema/nucleo/dist/parser/parser.modulo.js.map +0 -1
  231. package/node_modules/@sema/nucleo/dist/parser/parser.part01.js.map +0 -1
  232. package/node_modules/@sema/nucleo/dist/parser/parser.part02.js.map +0 -1
  233. package/node_modules/@sema/nucleo/dist/parser/parser.part03.js.map +0 -1
  234. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  235. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  236. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js.map +0 -1
  237. package/node_modules/@sema/nucleo/dist/semantico/analisador.part02.js.map +0 -1
  238. package/node_modules/@sema/nucleo/dist/semantico/analisador.part03.js.map +0 -1
  239. package/node_modules/@sema/nucleo/dist/semantico/analisador.part04.js.map +0 -1
  240. package/node_modules/@sema/nucleo/dist/semantico/analisador.part05.js.map +0 -1
  241. package/node_modules/@sema/nucleo/dist/semantico/analisador.part06.js.map +0 -1
  242. package/node_modules/@sema/nucleo/dist/semantico/analisador.part07.js.map +0 -1
  243. package/node_modules/@sema/nucleo/dist/semantico/analisador.part08.js.map +0 -1
  244. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  245. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part01.js.map +0 -1
  246. package/node_modules/@sema/nucleo/dist/semantico/estruturas.part02.js.map +0 -1
  247. package/node_modules/@sema/nucleo/dist/semantico/orcamentoSemantico.js.map +0 -1
  248. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  249. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  250. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
@@ -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
+ }>;