@semacode/cli 2.2.0 → 2.3.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 (127) hide show
  1. package/README.md +91 -4
  2. package/dist/agentContext.d.ts +1 -1
  3. package/dist/agentContextPack.js +6 -1
  4. package/dist/agentContextTipos.d.ts +4 -2
  5. package/dist/agentContextTipos.js +7 -0
  6. package/dist/agentEntryPoints.js +70 -19
  7. package/dist/comandos.js +4 -0
  8. package/dist/discovery/catalog.d.ts +11 -0
  9. package/dist/discovery/catalog.js +521 -0
  10. package/dist/discovery/command.d.ts +11 -0
  11. package/dist/discovery/command.js +226 -0
  12. package/dist/discovery/index.d.ts +5 -0
  13. package/dist/discovery/index.js +8 -0
  14. package/dist/discovery/ranker.d.ts +3 -0
  15. package/dist/discovery/ranker.js +310 -0
  16. package/dist/discovery/redaction.d.ts +2 -0
  17. package/dist/discovery/redaction.js +21 -0
  18. package/dist/discovery/render.d.ts +2 -0
  19. package/dist/discovery/render.js +100 -0
  20. package/dist/discovery/types.d.ts +119 -0
  21. package/dist/discovery/types.js +13 -0
  22. package/dist/exemplosOficiais.js +29 -8
  23. package/dist/iaPrompts.d.ts +1 -1
  24. package/dist/iaPrompts.js +3 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.js +23 -5
  27. package/dist/index.part01.d.ts +1 -1
  28. package/dist/index.part01.js +39 -4
  29. package/dist/index.part06.js +3 -0
  30. package/dist/initTemplatesBase.js +3 -2
  31. package/dist/profileArtefatoValidadores.d.ts +3 -2
  32. package/dist/profileArtefatoValidadores.js +81 -0
  33. package/dist/profileAuthorTipos.d.ts +4 -3
  34. package/dist/profileCatalogo.d.ts +5 -5
  35. package/dist/profileCatalogo.js +30 -0
  36. package/dist/profileCommand.d.ts +8 -2
  37. package/dist/profileCommand.js +15 -5
  38. package/dist/profileRegras.d.ts +5 -5
  39. package/dist/profileRegras.js +13 -1
  40. package/dist/profileRulePacks.js +68 -0
  41. package/dist/sistemasInterativos/adapterProtocol.d.ts +3 -0
  42. package/dist/sistemasInterativos/adapterProtocol.js +240 -0
  43. package/dist/sistemasInterativos/advancedCatalog.d.ts +5 -0
  44. package/dist/sistemasInterativos/advancedCatalog.js +442 -0
  45. package/dist/sistemasInterativos/autonomy.d.ts +230 -0
  46. package/dist/sistemasInterativos/autonomy.js +753 -0
  47. package/dist/sistemasInterativos/canonical.d.ts +3 -0
  48. package/dist/sistemasInterativos/canonical.js +43 -0
  49. package/dist/sistemasInterativos/catalog.d.ts +116 -0
  50. package/dist/sistemasInterativos/catalog.js +543 -0
  51. package/dist/sistemasInterativos/command.d.ts +7 -0
  52. package/dist/sistemasInterativos/command.js +311 -0
  53. package/dist/sistemasInterativos/controlRun.d.ts +56 -0
  54. package/dist/sistemasInterativos/controlRun.js +391 -0
  55. package/dist/sistemasInterativos/evidence.d.ts +5 -0
  56. package/dist/sistemasInterativos/evidence.js +306 -0
  57. package/dist/sistemasInterativos/experienceIr.d.ts +12 -0
  58. package/dist/sistemasInterativos/experienceIr.js +895 -0
  59. package/dist/sistemasInterativos/experienceIrSemantics.d.ts +30 -0
  60. package/dist/sistemasInterativos/experienceIrSemantics.js +368 -0
  61. package/dist/sistemasInterativos/experienceIrTypes.d.ts +370 -0
  62. package/dist/sistemasInterativos/experienceIrTypes.js +5 -0
  63. package/dist/sistemasInterativos/extensionCommand.d.ts +391 -0
  64. package/dist/sistemasInterativos/extensionCommand.js +383 -0
  65. package/dist/sistemasInterativos/index.d.ts +19 -0
  66. package/dist/sistemasInterativos/index.js +22 -0
  67. package/dist/sistemasInterativos/operations.d.ts +40 -0
  68. package/dist/sistemasInterativos/operations.js +1167 -0
  69. package/dist/sistemasInterativos/operationsTypes.d.ts +297 -0
  70. package/dist/sistemasInterativos/operationsTypes.js +11 -0
  71. package/dist/sistemasInterativos/planner.d.ts +2 -0
  72. package/dist/sistemasInterativos/planner.js +159 -0
  73. package/dist/sistemasInterativos/portability.d.ts +164 -0
  74. package/dist/sistemasInterativos/portability.js +539 -0
  75. package/dist/sistemasInterativos/render.d.ts +3 -0
  76. package/dist/sistemasInterativos/render.js +179 -0
  77. package/dist/sistemasInterativos/temporal.d.ts +183 -0
  78. package/dist/sistemasInterativos/temporal.js +543 -0
  79. package/dist/sistemasInterativos/types.d.ts +215 -0
  80. package/dist/sistemasInterativos/types.js +4 -0
  81. package/dist/sistemasInterativos/validator.d.ts +2 -0
  82. package/dist/sistemasInterativos/validator.js +305 -0
  83. package/docs/README.md +6 -0
  84. package/docs/ai-integration.md +7 -1
  85. package/docs/ai-workflow.md +5 -4
  86. package/docs/commands.md +43 -1
  87. package/docs/descoberta-capacidades.md +106 -0
  88. package/docs/documentation.md +11 -2
  89. package/docs/profiles.md +11 -2
  90. package/docs/sistemas-interativos.md +381 -0
  91. package/docs/testing.md +11 -2
  92. package/exemplos/profile_simulation.sema +211 -0
  93. package/exemplos/sistemas-interativos/README.md +100 -0
  94. package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -0
  95. package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -0
  96. package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -0
  97. package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -0
  98. package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -0
  99. package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -0
  100. package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -0
  101. package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -0
  102. package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -0
  103. package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -0
  104. package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -0
  105. package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -0
  106. package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -0
  107. package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -0
  108. package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -0
  109. package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -0
  110. package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -0
  111. package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -0
  112. package/exemplos/sistemas-interativos/game-2d.json +83 -0
  113. package/exemplos/sistemas-interativos/game-3d-human.json +81 -0
  114. package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -0
  115. package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -0
  116. package/exemplos/sistemas-interativos/game-xr-human.json +80 -0
  117. package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -0
  118. package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -0
  119. package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -0
  120. package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -0
  121. package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -0
  122. package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -0
  123. package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -0
  124. package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -0
  125. package/node_modules/@sema/gerador-lua/dist/index.js +31 -2
  126. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
  127. package/package.json +1 -1
@@ -0,0 +1,543 @@
1
+ // SEMA-GOVERNED: sema.produto.sistemas_interativos.temporal
2
+ // Descricao: contratos 4D e verificacao estrutural local de timeline, camera, fisica, QA, build e hardware.
3
+ import { digestJsonSistemaInterativo, digestSha256Valido, } from "./canonical.js";
4
+ export const SCHEMA_CONTRATO_TEMPORAL = "sema.interactive.temporal/v1";
5
+ export const SCHEMA_EVIDENCIA_TEMPORAL = "sema.interactive.temporal-evidence/v1";
6
+ const IDS_SEGUROS = /^[a-z0-9][a-z0-9._:/-]{0,127}$/;
7
+ const TIPOS_TRACK = new Set(["TRANSFORM", "ANIMATION", "VFX", "AUDIO", "SPEECH", "SUBTITLE", "EVENT"]);
8
+ const TIPOS_INVARIANT = new Set(["ORDER", "SYNC", "VISIBILITY", "BOUNDS", "NO_OVERLAP", "CONTINUITY"]);
9
+ const TIPOS_FISICA = new Set(["COLLISION", "ATTACHMENT", "SEPARATION", "CONSTRAINT"]);
10
+ const TIPOS_QA = new Set(["FLICKER", "GHOSTING", "POPPING", "EXPOSURE", "JITTER"]);
11
+ const TIPOS_EVIDENCIA = new Set([
12
+ "SCREENSHOT", "VIDEO", "DEPTH", "NORMALS", "OBJECT_ID", "MOTION_VECTORS", "TRANSFORMS",
13
+ "EVENT_TRACE", "COLLISION_TRACE", "AUDIO_TRACE", "TELEMETRY", "INSTALL_LOG", "LAUNCH_LOG", "PLAYTEST_TRACE",
14
+ ]);
15
+ const UNIDADES_TEMPO = new Set(["FRAME", "MILLISECOND", "SECOND", "TICK"]);
16
+ const DECISOES = new Set(["PASS", "FAIL", "INCONCLUSIVE"]);
17
+ const CHAVE_SENSIVEL = /(?:password|passwd|senha|secret|token|api.?key|private.?key|credential|authorization|cookie)/i;
18
+ const VALOR_SENSIVEL = /(?:\bBearer\s+[A-Za-z0-9._~+/-]{8,}|\b(?:sk|pk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{8,}|-----BEGIN [A-Z ]*PRIVATE KEY-----|[?&](?:access_token|token|api_?key|signature|x-amz-signature)=)/i;
19
+ const CHAVES_CONTRATO = new Set([
20
+ "schemaVersion", "contractId", "systemId", "experienceIrDigest", "coordinateSystem", "phases", "tracks",
21
+ "invariants", "shots", "physics", "temporalQa", "buildAcceptance", "hardwareTargets",
22
+ ]);
23
+ const CHAVES_BUNDLE = new Set([
24
+ "schemaVersion", "runId", "contractDigest", "producerId", "producerVersion", "producerConfigurationDigest",
25
+ "verifierId", "verifierVersion", "verifierConfigurationDigest", "independentOfProducer", "observations",
26
+ ]);
27
+ const LIMITE_METRICA = 1_000_000_000_000;
28
+ function objeto(valor) {
29
+ return typeof valor === "object" && valor !== null && !Array.isArray(valor);
30
+ }
31
+ function digestJsonSeguro(valor) {
32
+ try {
33
+ const serializado = JSON.stringify(valor);
34
+ if (typeof serializado !== "string")
35
+ throw new TypeError("json_nao_serializavel");
36
+ return digestJsonSistemaInterativo(JSON.parse(serializado));
37
+ }
38
+ catch {
39
+ return digestJsonSistemaInterativo({ invalidCanonicalInput: true });
40
+ }
41
+ }
42
+ function texto(valor) {
43
+ return typeof valor === "string" && valor.trim().length > 0;
44
+ }
45
+ function idSeguro(valor) {
46
+ return typeof valor === "string" && IDS_SEGUROS.test(valor);
47
+ }
48
+ function numeroFinito(valor) {
49
+ return typeof valor === "number" && Number.isFinite(valor);
50
+ }
51
+ function positivo(valor) {
52
+ return numeroFinito(valor) && valor > 0;
53
+ }
54
+ function naoNegativo(valor) {
55
+ return numeroFinito(valor) && valor >= 0;
56
+ }
57
+ function numeroMetricoSeguro(valor) {
58
+ return naoNegativo(valor) && valor <= LIMITE_METRICA;
59
+ }
60
+ function idsUnicosValidos(valores) {
61
+ return valores.every(idSeguro) && new Set(valores).size === valores.length;
62
+ }
63
+ function stringsUnicasValidas(valores) {
64
+ return Array.isArray(valores) && valores.length > 0 && valores.every(texto) && new Set(valores).size === valores.length;
65
+ }
66
+ function contemMaterialSensivel(valor, visitados = new Set()) {
67
+ if (typeof valor === "string")
68
+ return VALOR_SENSIVEL.test(valor);
69
+ if (!objeto(valor) && !Array.isArray(valor))
70
+ return false;
71
+ if (visitados.has(valor))
72
+ return true;
73
+ visitados.add(valor);
74
+ try {
75
+ if (Array.isArray(valor))
76
+ return valor.some((item) => contemMaterialSensivel(item, visitados));
77
+ return Object.entries(valor).some(([chave, item]) => CHAVE_SENSIVEL.test(chave) || contemMaterialSensivel(item, visitados));
78
+ }
79
+ finally {
80
+ visitados.delete(valor);
81
+ }
82
+ }
83
+ function somenteChaves(valor, permitidas) {
84
+ return Object.keys(valor).every((chave) => permitidas.has(chave));
85
+ }
86
+ function adicionar(bloqueios, condicao, codigo) {
87
+ if (!condicao)
88
+ bloqueios.push(codigo);
89
+ }
90
+ function faseValida(valor) {
91
+ return objeto(valor)
92
+ && idSeguro(valor.phaseId)
93
+ && naoNegativo(valor.start)
94
+ && positivo(valor.end)
95
+ && valor.start < valor.end
96
+ && UNIDADES_TEMPO.has(valor.timeUnit);
97
+ }
98
+ function intervaloNaFase(valor, fases) {
99
+ const fase = fases.get(valor.phaseId);
100
+ return Boolean(fase && fase.timeUnit === valor.timeUnit && valor.start >= fase.start && valor.end <= fase.end && valor.start < valor.end);
101
+ }
102
+ function checkIdsContrato(contrato) {
103
+ const ids = [
104
+ ...contrato.invariants.map((item) => item.invariantId),
105
+ ...contrato.shots.map((item) => item.shotId),
106
+ ...contrato.physics.map((item) => item.relationId),
107
+ ...contrato.temporalQa.checks.map((item) => item.checkId),
108
+ ...contrato.hardwareTargets.map((item) => `hardware:${item.profileId}`),
109
+ ];
110
+ if (contrato.buildAcceptance.required) {
111
+ ids.push("build.materialize", "build.clean_install", "build.launch", "build.smoke_playtest");
112
+ }
113
+ return ids.sort((a, b) => a.localeCompare(b));
114
+ }
115
+ function validarContratoInterno(entrada) {
116
+ const bloqueios = [];
117
+ let digest = "sha256:invalid";
118
+ if (!objeto(entrada))
119
+ return { digest, checks: [], bloqueios: ["contrato_invalido"] };
120
+ const contemSensivel = contemMaterialSensivel(entrada);
121
+ if (contemSensivel)
122
+ bloqueios.push("contrato_contem_dado_sensivel");
123
+ adicionar(bloqueios, somenteChaves(entrada, CHAVES_CONTRATO), "contrato_campo_top_level_desconhecido");
124
+ adicionar(bloqueios, entrada.schemaVersion === SCHEMA_CONTRATO_TEMPORAL, "schema_version_nao_suportada");
125
+ adicionar(bloqueios, idSeguro(entrada.contractId), "contract_id_invalido");
126
+ adicionar(bloqueios, idSeguro(entrada.systemId), "system_id_invalido");
127
+ adicionar(bloqueios, digestSha256Valido(entrada.experienceIrDigest), "experience_ir_digest_invalido");
128
+ const coordenadas = entrada.coordinateSystem;
129
+ adicionar(bloqueios, objeto(coordenadas)
130
+ && texto(coordenadas.unit)
131
+ && (coordenadas.handedness === "LEFT" || coordenadas.handedness === "RIGHT")
132
+ && ["X", "Y", "Z"].includes(String(coordenadas.upAxis))
133
+ && ["X", "Y", "Z"].includes(String(coordenadas.forwardAxis))
134
+ && coordenadas.upAxis !== coordenadas.forwardAxis, "coordinate_system_invalido");
135
+ const fasesBrutas = Array.isArray(entrada.phases) ? entrada.phases : [];
136
+ adicionar(bloqueios, fasesBrutas.length > 0 && fasesBrutas.every(faseValida), "phases_invalidas");
137
+ const fases = new Map();
138
+ if (fasesBrutas.every(faseValida)) {
139
+ adicionar(bloqueios, idsUnicosValidos(fasesBrutas.map((item) => item.phaseId)), "phase_ids_invalidos_ou_duplicados");
140
+ for (const fase of fasesBrutas)
141
+ fases.set(fase.phaseId, fase);
142
+ for (let indice = 1; indice < fasesBrutas.length; indice += 1) {
143
+ if (fasesBrutas[indice].start < fasesBrutas[indice - 1].start)
144
+ bloqueios.push("phases_fora_de_ordem");
145
+ }
146
+ }
147
+ const tracksBrutos = Array.isArray(entrada.tracks) ? entrada.tracks : [];
148
+ adicionar(bloqueios, tracksBrutos.length > 0, "tracks_ausentes");
149
+ adicionar(bloqueios, idsUnicosValidos(tracksBrutos.map((item) => objeto(item) ? item.trackId : undefined)), "track_ids_invalidos_ou_duplicados");
150
+ const trackTypes = new Map();
151
+ for (const track of tracksBrutos) {
152
+ if (!objeto(track) || !idSeguro(track.trackId) || !TIPOS_TRACK.has(track.type) || !Array.isArray(track.clips) || track.clips.length === 0) {
153
+ bloqueios.push("track_invalido");
154
+ continue;
155
+ }
156
+ trackTypes.set(track.trackId, track.type);
157
+ adicionar(bloqueios, idsUnicosValidos(track.clips.map((clip) => objeto(clip) ? clip.clipId : undefined)), "clip_ids_invalidos_ou_duplicados");
158
+ for (const clip of track.clips) {
159
+ const valido = objeto(clip)
160
+ && idSeguro(clip.clipId)
161
+ && idSeguro(clip.phaseId)
162
+ && idSeguro(clip.semanticTargetId)
163
+ && naoNegativo(clip.start)
164
+ && positivo(clip.end)
165
+ && UNIDADES_TEMPO.has(clip.timeUnit)
166
+ && intervaloNaFase(clip, fases);
167
+ adicionar(bloqueios, valido, "clip_invalido_ou_fora_da_phase");
168
+ }
169
+ }
170
+ const invariantsBrutos = Array.isArray(entrada.invariants) ? entrada.invariants : [];
171
+ adicionar(bloqueios, idsUnicosValidos(invariantsBrutos.map((item) => objeto(item) ? item.invariantId : undefined)), "invariant_ids_invalidos_ou_duplicados");
172
+ for (const item of invariantsBrutos) {
173
+ const valido = objeto(item)
174
+ && idSeguro(item.invariantId)
175
+ && TIPOS_INVARIANT.has(item.type)
176
+ && idSeguro(item.phaseId)
177
+ && fases.has(item.phaseId)
178
+ && stringsUnicasValidas(item.trackIds)
179
+ && item.trackIds.every((id) => trackTypes.has(id))
180
+ && stringsUnicasValidas(item.subjectIds)
181
+ && naoNegativo(item.threshold)
182
+ && texto(item.unit);
183
+ adicionar(bloqueios, valido, "invariant_invalido");
184
+ }
185
+ const shotsBrutos = Array.isArray(entrada.shots) ? entrada.shots : [];
186
+ adicionar(bloqueios, idsUnicosValidos(shotsBrutos.map((item) => objeto(item) ? item.shotId : undefined)), "shot_ids_invalidos_ou_duplicados");
187
+ for (const shot of shotsBrutos) {
188
+ const valido = objeto(shot)
189
+ && idSeguro(shot.shotId)
190
+ && idSeguro(shot.phaseId)
191
+ && idSeguro(shot.cameraId)
192
+ && stringsUnicasValidas(shot.subjectIds)
193
+ && !shot.subjectIds.includes(shot.cameraId)
194
+ && naoNegativo(shot.start)
195
+ && positivo(shot.end)
196
+ && UNIDADES_TEMPO.has(shot.timeUnit)
197
+ && intervaloNaFase(shot, fases)
198
+ && texto(shot.composition)
199
+ && numeroFinito(shot.minimumVisibilityRatio)
200
+ && shot.minimumVisibilityRatio >= 0
201
+ && shot.minimumVisibilityRatio <= 1
202
+ && naoNegativo(shot.maximumJitter);
203
+ adicionar(bloqueios, valido, "shot_invalido");
204
+ }
205
+ const physicsBrutos = Array.isArray(entrada.physics) ? entrada.physics : [];
206
+ adicionar(bloqueios, idsUnicosValidos(physicsBrutos.map((item) => objeto(item) ? item.relationId : undefined)), "physics_ids_invalidos_ou_duplicados");
207
+ for (const item of physicsBrutos) {
208
+ const valido = objeto(item)
209
+ && idSeguro(item.relationId)
210
+ && TIPOS_FISICA.has(item.type)
211
+ && idSeguro(item.phaseId)
212
+ && idSeguro(item.sourceId)
213
+ && idSeguro(item.targetId)
214
+ && item.sourceId !== item.targetId
215
+ && naoNegativo(item.start)
216
+ && positivo(item.end)
217
+ && UNIDADES_TEMPO.has(item.timeUnit)
218
+ && intervaloNaFase(item, fases)
219
+ && naoNegativo(item.tolerance)
220
+ && texto(item.unit);
221
+ adicionar(bloqueios, valido, "physics_relation_invalida");
222
+ }
223
+ const qaChecks = objeto(entrada.temporalQa) && Array.isArray(entrada.temporalQa.checks) ? entrada.temporalQa.checks : [];
224
+ adicionar(bloqueios, idsUnicosValidos(qaChecks.map((item) => objeto(item) ? item.checkId : undefined)), "qa_check_ids_invalidos_ou_duplicados");
225
+ const tiposQa = new Set();
226
+ for (const check of qaChecks) {
227
+ const valido = objeto(check)
228
+ && idSeguro(check.checkId)
229
+ && TIPOS_QA.has(check.type)
230
+ && idSeguro(check.phaseId)
231
+ && fases.has(check.phaseId)
232
+ && positivo(check.threshold)
233
+ && texto(check.unit);
234
+ if (valido)
235
+ tiposQa.add(check.type);
236
+ adicionar(bloqueios, valido, "qa_check_invalido");
237
+ }
238
+ for (const tipo of TIPOS_QA)
239
+ adicionar(bloqueios, tiposQa.has(tipo), `qa_check_${tipo.toLowerCase()}_ausente`);
240
+ const build = entrada.buildAcceptance;
241
+ const buildValido = objeto(build)
242
+ && typeof build.required === "boolean"
243
+ && typeof build.cleanInstallRequired === "boolean"
244
+ && typeof build.launchRequired === "boolean"
245
+ && typeof build.smokePlaytestRequired === "boolean"
246
+ && (!build.required || (digestSha256Valido(build.artifactDigest)
247
+ && build.cleanInstallRequired === true
248
+ && build.launchRequired === true
249
+ && build.smokePlaytestRequired === true));
250
+ adicionar(bloqueios, buildValido, "build_acceptance_invalida");
251
+ const hardware = Array.isArray(entrada.hardwareTargets) ? entrada.hardwareTargets : [];
252
+ adicionar(bloqueios, idsUnicosValidos(hardware.map((item) => objeto(item) ? item.profileId : undefined)), "hardware_profile_ids_invalidos_ou_duplicados");
253
+ for (const alvo of hardware) {
254
+ const resolucao = objeto(alvo) && objeto(alvo.resolution) ? alvo.resolution : undefined;
255
+ const valido = objeto(alvo)
256
+ && idSeguro(alvo.profileId)
257
+ && texto(alvo.gpu)
258
+ && texto(alvo.cpu)
259
+ && Boolean(resolucao && positivo(resolucao.width) && positivo(resolucao.height))
260
+ && positivo(alvo.targetFps)
261
+ && positivo(alvo.frameTimeP95Ms)
262
+ && positivo(alvo.maxRamMb)
263
+ && positivo(alvo.maxVramMb)
264
+ && positivo(alvo.maxDiskMb);
265
+ adicionar(bloqueios, valido, "hardware_target_invalido");
266
+ }
267
+ const contrato = entrada;
268
+ let checks = [];
269
+ try {
270
+ digest = digestJsonSistemaInterativo(entrada);
271
+ checks = contemSensivel ? [] : checkIdsContrato(contrato);
272
+ adicionar(bloqueios, idsUnicosValidos(checks), "required_check_ids_invalidos_ou_duplicados");
273
+ }
274
+ catch {
275
+ bloqueios.push("contrato_nao_canonicalizavel");
276
+ }
277
+ return { contrato, digest, checks, bloqueios: [...new Set(bloqueios)].sort() };
278
+ }
279
+ export function validarContratoTemporalInterativo(entrada) {
280
+ const resultado = validarContratoInterno(entrada);
281
+ return {
282
+ valido: resultado.bloqueios.length === 0,
283
+ contractDigest: resultado.digest,
284
+ requiredCheckIds: resultado.checks,
285
+ bloqueios: resultado.bloqueios,
286
+ executed: false,
287
+ authoritative: false,
288
+ };
289
+ }
290
+ function categoriaCheck(contrato, checkId) {
291
+ if (contrato.invariants.some((item) => item.invariantId === checkId))
292
+ return "INVARIANT";
293
+ if (contrato.shots.some((item) => item.shotId === checkId))
294
+ return "SHOT";
295
+ if (contrato.physics.some((item) => item.relationId === checkId))
296
+ return "PHYSICS";
297
+ if (contrato.temporalQa.checks.some((item) => item.checkId === checkId))
298
+ return "QA";
299
+ if (checkId.startsWith("build."))
300
+ return "BUILD";
301
+ return "HARDWARE";
302
+ }
303
+ function faseDoCheck(contrato, checkId) {
304
+ return contrato.invariants.find((item) => item.invariantId === checkId)?.phaseId
305
+ ?? contrato.shots.find((item) => item.shotId === checkId)?.phaseId
306
+ ?? contrato.physics.find((item) => item.relationId === checkId)?.phaseId
307
+ ?? contrato.temporalQa.checks.find((item) => item.checkId === checkId)?.phaseId;
308
+ }
309
+ function causasProvaveis(contrato, checkId) {
310
+ const invariant = contrato.invariants.find((item) => item.invariantId === checkId);
311
+ if (invariant) {
312
+ return {
313
+ ORDER: ["event_order_diverged"],
314
+ SYNC: ["timeline_tracks_out_of_sync"],
315
+ VISIBILITY: ["subject_visibility_below_contract"],
316
+ BOUNDS: ["target_left_declared_bounds"],
317
+ NO_OVERLAP: ["tracks_or_objects_overlap"],
318
+ CONTINUITY: ["temporal_discontinuity_detected"],
319
+ }[invariant.type].slice();
320
+ }
321
+ const categoria = categoriaCheck(contrato, checkId);
322
+ if (categoria === "SHOT")
323
+ return ["camera_or_subject_contract_diverged"];
324
+ if (categoria === "PHYSICS")
325
+ return ["physics_relation_diverged"];
326
+ if (categoria === "QA")
327
+ return ["temporal_quality_threshold_exceeded"];
328
+ if (categoria === "BUILD")
329
+ return ["packaged_artifact_chain_incomplete"];
330
+ return ["hardware_budget_exceeded"];
331
+ }
332
+ function observacaoEstruturalmenteValida(valor, checks) {
333
+ if (!objeto(valor)
334
+ || !idSeguro(valor.observationId)
335
+ || !idSeguro(valor.checkId)
336
+ || !checks.has(valor.checkId)
337
+ || !DECISOES.has(valor.decision)
338
+ || !Array.isArray(valor.evidenceTypes)
339
+ || valor.evidenceTypes.length === 0
340
+ || !valor.evidenceTypes.every((tipo) => TIPOS_EVIDENCIA.has(tipo))
341
+ || new Set(valor.evidenceTypes).size !== valor.evidenceTypes.length
342
+ || !Array.isArray(valor.artifactDigests)
343
+ || valor.artifactDigests.length === 0
344
+ || !valor.artifactDigests.every(digestSha256Valido)
345
+ || !Number.isInteger(valor.sampleCount)
346
+ || valor.sampleCount < 1)
347
+ return false;
348
+ if (valor.traceDigest !== undefined && !digestSha256Valido(valor.traceDigest))
349
+ return false;
350
+ if (valor.phaseId !== undefined && !idSeguro(valor.phaseId))
351
+ return false;
352
+ if (valor.frame !== undefined && !naoNegativo(valor.frame))
353
+ return false;
354
+ if (valor.time !== undefined && !naoNegativo(valor.time))
355
+ return false;
356
+ if (valor.timeUnit !== undefined && !UNIDADES_TEMPO.has(valor.timeUnit))
357
+ return false;
358
+ if (valor.metrics !== undefined && (!Array.isArray(valor.metrics)
359
+ || valor.metrics.length === 0
360
+ || !valor.metrics.every((metrica) => objeto(metrica)
361
+ && idSeguro(metrica.name)
362
+ && numeroMetricoSeguro(metrica.value)
363
+ && texto(metrica.unit)
364
+ && numeroMetricoSeguro(metrica.threshold))
365
+ || new Set(valor.metrics.map((metrica) => objeto(metrica) ? metrica.name : undefined)).size !== valor.metrics.length))
366
+ return false;
367
+ return true;
368
+ }
369
+ function expectativasMetricas(contrato, checkId) {
370
+ const qa = contrato.temporalQa.checks.find((item) => item.checkId === checkId);
371
+ if (qa)
372
+ return [{ name: qa.type.toLowerCase(), unit: qa.unit, threshold: qa.threshold, direction: "MAX" }];
373
+ const hardware = contrato.hardwareTargets.find((item) => `hardware:${item.profileId}` === checkId);
374
+ if (!hardware)
375
+ return [];
376
+ return [
377
+ { name: "target_fps", unit: "fps", threshold: hardware.targetFps, direction: "MIN" },
378
+ { name: "frame_time_p95_ms", unit: "ms", threshold: hardware.frameTimeP95Ms, direction: "MAX" },
379
+ { name: "ram_mb", unit: "mb", threshold: hardware.maxRamMb, direction: "MAX" },
380
+ { name: "vram_mb", unit: "mb", threshold: hardware.maxVramMb, direction: "MAX" },
381
+ { name: "disk_mb", unit: "mb", threshold: hardware.maxDiskMb, direction: "MAX" },
382
+ ];
383
+ }
384
+ function validarMetricasContraContrato(contrato, observacao, bloqueios) {
385
+ const esperadas = expectativasMetricas(contrato, observacao.checkId);
386
+ if (esperadas.length === 0)
387
+ return;
388
+ const metricas = new Map((observacao.metrics ?? []).map((item) => [item.name, item]));
389
+ const contratoCoerente = metricas.size === esperadas.length && esperadas.every((esperada) => {
390
+ const recebida = metricas.get(esperada.name);
391
+ return recebida?.unit === esperada.unit && recebida.threshold === esperada.threshold;
392
+ });
393
+ if (!contratoCoerente) {
394
+ bloqueios.push("metricas_divergem_do_contrato");
395
+ return;
396
+ }
397
+ const excedeu = esperadas.some((esperada) => {
398
+ const value = metricas.get(esperada.name)?.value;
399
+ return esperada.direction === "MAX" ? value > esperada.threshold : value < esperada.threshold;
400
+ });
401
+ if (observacao.decision === "PASS" && excedeu)
402
+ bloqueios.push("decision_pass_incoerente_com_metricas");
403
+ if (observacao.decision === "FAIL" && !excedeu)
404
+ bloqueios.push("decision_fail_incoerente_com_metricas");
405
+ }
406
+ function validarEvidenciaPorCategoria(contrato, observacao, bloqueios) {
407
+ const tipos = new Set(observacao.evidenceTypes);
408
+ const categoria = categoriaCheck(contrato, observacao.checkId);
409
+ const temporal = categoria === "INVARIANT" || categoria === "SHOT" || categoria === "PHYSICS" || categoria === "QA";
410
+ const faseEsperada = faseDoCheck(contrato, observacao.checkId);
411
+ if (faseEsperada !== undefined && observacao.phaseId !== faseEsperada)
412
+ bloqueios.push("check_phase_divergente");
413
+ if (temporal && observacao.sampleCount < 2 && !observacao.traceDigest)
414
+ bloqueios.push("check_temporal_exige_amostras_ou_trace");
415
+ if ((categoria === "SHOT" || categoria === "PHYSICS") && ![
416
+ "DEPTH", "NORMALS", "OBJECT_ID", "TRANSFORMS", "COLLISION_TRACE",
417
+ ].some((tipo) => tipos.has(tipo)))
418
+ bloqueios.push("check_geometrico_exige_evidencia_geometrica");
419
+ const invariant = contrato.invariants.find((item) => item.invariantId === observacao.checkId);
420
+ const tracks = invariant?.trackIds.map((id) => contrato.tracks.find((track) => track.trackId === id)?.type).filter(Boolean) ?? [];
421
+ if (tracks.some((tipo) => tipo === "AUDIO" || tipo === "SPEECH")
422
+ && (!tipos.has("AUDIO_TRACE") || !tipos.has("EVENT_TRACE")))
423
+ bloqueios.push("check_audio_exige_audio_trace_e_event_trace");
424
+ if ((categoria === "QA" || categoria === "HARDWARE") && (!observacao.metrics || observacao.metrics.length === 0)) {
425
+ bloqueios.push("check_metrico_exige_metricas");
426
+ }
427
+ validarMetricasContraContrato(contrato, observacao, bloqueios);
428
+ if (categoria === "BUILD") {
429
+ const tipoEsperado = {
430
+ "build.materialize": "TELEMETRY",
431
+ "build.clean_install": "INSTALL_LOG",
432
+ "build.launch": "LAUNCH_LOG",
433
+ "build.smoke_playtest": "PLAYTEST_TRACE",
434
+ };
435
+ const esperado = tipoEsperado[observacao.checkId];
436
+ if (esperado && !tipos.has(esperado))
437
+ bloqueios.push("build_check_exige_evidencia_especifica");
438
+ }
439
+ }
440
+ export function validarBundleVerificacaoTemporal(contratoEntrada, bundleEntrada) {
441
+ const bundleDigest = digestJsonSeguro(bundleEntrada);
442
+ const contratoValidado = validarContratoInterno(contratoEntrada);
443
+ const bloqueios = contratoValidado.bloqueios.map((item) => `contrato_invalido:${item}`);
444
+ const contrato = contratoValidado.contrato;
445
+ const checksAceitos = [];
446
+ const checksFalhos = [];
447
+ const diagnostics = [];
448
+ const observados = new Set();
449
+ let bundleSensivel = false;
450
+ if (!contrato || !objeto(bundleEntrada)) {
451
+ bloqueios.push("bundle_invalido");
452
+ }
453
+ else {
454
+ bundleSensivel = contemMaterialSensivel(bundleEntrada);
455
+ if (bundleSensivel)
456
+ bloqueios.push("bundle_contem_dado_sensivel");
457
+ adicionar(bloqueios, somenteChaves(bundleEntrada, CHAVES_BUNDLE), "bundle_campo_top_level_desconhecido");
458
+ adicionar(bloqueios, bundleEntrada.schemaVersion === SCHEMA_EVIDENCIA_TEMPORAL, "bundle_schema_version_nao_suportada");
459
+ adicionar(bloqueios, idSeguro(bundleEntrada.runId), "bundle_run_id_invalido");
460
+ adicionar(bloqueios, bundleEntrada.contractDigest === contratoValidado.digest, "bundle_contract_digest_divergente");
461
+ adicionar(bloqueios, idSeguro(bundleEntrada.producerId), "bundle_producer_id_invalido");
462
+ adicionar(bloqueios, texto(bundleEntrada.producerVersion), "bundle_producer_version_invalida");
463
+ adicionar(bloqueios, digestSha256Valido(bundleEntrada.producerConfigurationDigest), "bundle_producer_configuration_digest_invalido");
464
+ adicionar(bloqueios, idSeguro(bundleEntrada.verifierId), "bundle_verifier_id_invalido");
465
+ adicionar(bloqueios, texto(bundleEntrada.verifierVersion), "bundle_verifier_version_invalida");
466
+ adicionar(bloqueios, digestSha256Valido(bundleEntrada.verifierConfigurationDigest), "bundle_verifier_configuration_digest_invalido");
467
+ adicionar(bloqueios, bundleEntrada.independentOfProducer === true, "verifier_deve_ser_independente_do_produtor");
468
+ adicionar(bloqueios, bundleEntrada.producerId !== bundleEntrada.verifierId, "verifier_id_deve_diferir_do_produtor");
469
+ const brutas = Array.isArray(bundleEntrada.observations) ? bundleEntrada.observations : [];
470
+ adicionar(bloqueios, Array.isArray(bundleEntrada.observations), "bundle_observations_invalidas");
471
+ adicionar(bloqueios, idsUnicosValidos(brutas.map((item) => objeto(item) ? item.observationId : undefined)), "observation_ids_invalidos_ou_duplicados");
472
+ const required = new Set(contratoValidado.checks);
473
+ const checkIdsBrutos = brutas.map((item) => objeto(item) ? item.checkId : undefined);
474
+ adicionar(bloqueios, idsUnicosValidos(checkIdsBrutos), "observation_check_ids_invalidos_ou_duplicados");
475
+ for (const bruta of brutas) {
476
+ if (!observacaoEstruturalmenteValida(bruta, required)) {
477
+ bloqueios.push("observacao_invalida");
478
+ continue;
479
+ }
480
+ const observacao = bruta;
481
+ observados.add(observacao.checkId);
482
+ const bloqueiosAntes = bloqueios.length;
483
+ validarEvidenciaPorCategoria(contrato, observacao, bloqueios);
484
+ if (observacao.decision === "PASS") {
485
+ if (bloqueios.length === bloqueiosAntes)
486
+ checksAceitos.push(observacao.checkId);
487
+ }
488
+ else {
489
+ checksFalhos.push(observacao.checkId);
490
+ diagnostics.push({
491
+ failedInvariant: observacao.checkId,
492
+ phase: faseDoCheck(contrato, observacao.checkId),
493
+ frame: observacao.frame,
494
+ time: observacao.time,
495
+ timeUnit: observacao.timeUnit,
496
+ evidenceIds: [observacao.observationId],
497
+ decision: observacao.decision,
498
+ likelyCauses: causasProvaveis(contrato, observacao.checkId),
499
+ });
500
+ }
501
+ }
502
+ }
503
+ const bloqueiosUnicos = [...new Set(bloqueios)].sort();
504
+ const bloqueioEstrutural = bloqueiosUnicos.length > 0;
505
+ const checksAceitosFinais = bloqueioEstrutural ? [] : [...new Set(checksAceitos)].sort();
506
+ const checksFalhosFinais = bundleSensivel ? [] : [...new Set(checksFalhos)].sort();
507
+ const diagnosticsFinais = bundleSensivel ? [] : diagnostics;
508
+ const checksAusentes = bloqueioEstrutural
509
+ ? [...contratoValidado.checks]
510
+ : contratoValidado.checks.filter((id) => !observados.has(id));
511
+ const valido = !bloqueioEstrutural && checksAusentes.length === 0 && checksFalhosFinais.length === 0;
512
+ const nextActions = bloqueioEstrutural
513
+ ? ["corrigir_bundle_temporal"]
514
+ : [
515
+ ...checksAusentes.map((id) => `capturar_evidencia_temporal:${id}`),
516
+ ...checksFalhosFinais.map((id) => `diagnosticar_e_corrigir_sem_apply:${id}`),
517
+ ...checksFalhosFinais.map((id) => `reexecutar_check_temporal:${id}`),
518
+ ];
519
+ if (valido)
520
+ nextActions.push("solicitar_atestacao_externa");
521
+ const resultadoSemDigest = {
522
+ valido,
523
+ contractDigest: contratoValidado.digest,
524
+ bundleDigest,
525
+ checksAceitos: checksAceitosFinais,
526
+ checksAusentes,
527
+ checksFalhos: checksFalhosFinais,
528
+ diagnostics: diagnosticsFinais,
529
+ nextActions,
530
+ bloqueios: bloqueiosUnicos,
531
+ completed: false,
532
+ localCoverageComplete: valido,
533
+ awaitingExternalAttestation: true,
534
+ completionScope: "STRUCTURAL_LOCAL",
535
+ authoritative: false,
536
+ executed: false,
537
+ };
538
+ return {
539
+ ...resultadoSemDigest,
540
+ resultDigest: digestJsonSeguro(resultadoSemDigest),
541
+ };
542
+ }
543
+ //# sourceMappingURL=temporal.js.map