@prestyj/cli 5.28.1 → 5.29.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.
- package/assets/motion/bin/contact-sheet.mjs +9 -3
- package/assets/motion/bin/cues.mjs +337 -0
- package/assets/motion/bin/library.mjs +53 -10
- package/assets/motion/bin/motion-blur.mjs +943 -0
- package/assets/motion/bin/motion-check.mjs +354 -3
- package/assets/motion/bin/music-fit.mjs +436 -0
- package/assets/motion/bin/pdf-extract.mjs +22 -10
- package/assets/motion/bin/reference-study.mjs +346 -0
- package/assets/motion/bin/score-synth.mjs +1052 -93
- package/assets/motion/library/README.md +50 -14
- package/assets/motion/library/kit/moves.js +1981 -0
- package/assets/motion/library/library.json +232 -0
- package/assets/motion/library/pieces/camera-rig/meta.json +13 -0
- package/assets/motion/library/pieces/camera-rig/piece.html +153 -0
- package/assets/motion/library/pieces/camera-rig/preview.jpg +0 -0
- package/assets/motion/library/pieces/chain-knock/meta.json +13 -0
- package/assets/motion/library/pieces/chain-knock/piece.html +195 -0
- package/assets/motion/library/pieces/chain-knock/preview.jpg +0 -0
- package/assets/motion/library/pieces/gather-to-logo/meta.json +13 -0
- package/assets/motion/library/pieces/gather-to-logo/piece.html +159 -0
- package/assets/motion/library/pieces/gather-to-logo/preview.jpg +0 -0
- package/assets/motion/library/pieces/morph-carry/meta.json +13 -0
- package/assets/motion/library/pieces/morph-carry/piece.html +173 -0
- package/assets/motion/library/pieces/morph-carry/preview.jpg +0 -0
- package/assets/motion/library/pieces/one-shape-journey/meta.json +13 -0
- package/assets/motion/library/pieces/one-shape-journey/piece.html +195 -0
- package/assets/motion/library/pieces/one-shape-journey/preview.jpg +0 -0
- package/assets/motion/library/pieces/open-from-subject/meta.json +13 -0
- package/assets/motion/library/pieces/open-from-subject/piece.html +168 -0
- package/assets/motion/library/pieces/open-from-subject/preview.jpg +0 -0
- package/assets/motion/library/pieces/request-to-result/meta.json +13 -0
- package/assets/motion/library/pieces/request-to-result/piece.html +212 -0
- package/assets/motion/library/pieces/request-to-result/preview.jpg +0 -0
- package/assets/motion/library/pieces/scale-dive/meta.json +13 -0
- package/assets/motion/library/pieces/scale-dive/piece.html +321 -0
- package/assets/motion/library/pieces/scale-dive/preview.jpg +0 -0
- package/assets/motion/library/pieces/screen-replica-steps/meta.json +13 -0
- package/assets/motion/library/pieces/screen-replica-steps/piece.html +366 -0
- package/assets/motion/library/pieces/screen-replica-steps/preview.jpg +0 -0
- package/assets/motion/library/pieces/zoom-into-card/meta.json +13 -0
- package/assets/motion/library/pieces/zoom-into-card/piece.html +179 -0
- package/assets/motion/library/pieces/zoom-into-card/preview.jpg +0 -0
- package/assets/motion/library/sheets/diagram.jpg +0 -0
- package/assets/motion/library/sheets/frame.jpg +0 -0
- package/assets/motion/library/sheets/transition.jpg +0 -0
- package/assets/motion/library/sheets/ui.jpg +0 -0
- package/assets/motion/references/build-sheet.md +206 -0
- package/assets/motion/references/runtime/determinism-rules.md +1 -1
- package/assets/motion/references/runtime/gsap-easing-and-stagger.md +29 -29
- package/assets/motion/references/runtime/inputs-and-assets.md +7 -12
- package/assets/motion/references/runtime/lint-validate-inspect.md +3 -3
- package/assets/motion/references/runtime/minimal-composition.md +1 -1
- package/assets/motion/references/runtime/preview-render.md +3 -3
- package/assets/motion/skills/app-walkthrough/SKILL.md +66 -0
- package/assets/motion/skills/before-after/SKILL.md +53 -0
- package/assets/motion/skills/brand-kit/SKILL.md +3 -3
- package/assets/motion/skills/dev-tool-video/SKILL.md +57 -0
- package/assets/motion/skills/launch-video/SKILL.md +62 -0
- package/assets/motion/skills/match-reference/SKILL.md +58 -0
- package/assets/motion/skills/motion/SKILL.md +78 -85
- package/assets/motion/skills/source-ingest/SKILL.md +17 -6
- package/assets/motion/skills/website-video/SKILL.md +59 -0
- package/assets/skills/bulletproof/SKILL.md +36 -11
- package/assets/skills/bulletproof/references/agent-surface.md +19 -9
- package/assets/skills/bulletproof/references/audit-protocol.md +20 -5
- package/assets/skills/bulletproof/references/platform-playbooks.md +5 -4
- package/assets/skills/bulletproof/references/provenance.md +26 -1
- package/assets/skills/bulletproof/references/secure-defaults.md +6 -5
- package/assets/skills/bulletproof/references/supply-chain.md +21 -17
- package/assets/skills/bulletproof/references/threat-landscape.md +28 -26
- package/assets/skills/bulletproof/references/verification.md +2 -0
- package/assets/skills/clarify/SKILL.md +25 -16
- package/assets/skills/code-review/SKILL.md +71 -13
- package/assets/skills/code-review/references/agent-diffs.md +27 -0
- package/assets/skills/code-review/references/tests.md +19 -0
- package/assets/skills/compliance-guard/SKILL.md +20 -5
- package/assets/skills/compliance-guard/references/artifacts.md +1 -1
- package/assets/skills/compliance-guard/references/eu-uk.md +16 -16
- package/assets/skills/compliance-guard/references/lawsuit-vectors.md +5 -5
- package/assets/skills/compliance-guard/references/provenance.md +41 -2
- package/assets/skills/compliance-guard/references/sector-gates.md +3 -3
- package/assets/skills/compliance-guard/references/security-baseline.md +2 -2
- package/assets/skills/compliance-guard/references/trigger-map.md +5 -5
- package/assets/skills/compliance-guard/references/us.md +27 -21
- package/assets/skills/durable/SKILL.md +87 -79
- package/assets/skills/durable/references/agent-db-safety.md +69 -0
- package/assets/skills/durable/references/backups-and-runtime.md +19 -12
- package/assets/skills/durable/references/migrations-and-schema.md +13 -6
- package/assets/skills/evidence-led-ui/SKILL.md +69 -127
- package/assets/skills/evidence-led-ui/references/anti-defaults.md +107 -208
- package/assets/skills/evidence-led-ui/references/direction.md +124 -0
- package/assets/skills/evidence-led-ui/references/production-contract.md +8 -0
- package/assets/skills/evidence-led-ui/references/provenance.md +24 -1
- package/assets/skills/lean/SKILL.md +90 -71
- package/assets/skills/lean/references/memory-and-processes.md +3 -2
- package/assets/skills/lean/references/playbooks.md +37 -12
- package/assets/skills/refactoring/SKILL.md +24 -3
- package/assets/skills/refactoring/references/agent-pitfalls.md +4 -1
- package/assets/skills/refactoring/references/legacy.md +21 -0
- package/assets/skills/root-cause/SKILL.md +20 -10
- package/assets/skills/shared-language/SKILL.md +16 -14
- package/assets/skills/tdd/SKILL.md +27 -15
- package/dist/app-sidecar.js +203 -47
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.js +17 -26
- package/dist/cli.js.map +1 -1
- package/dist/core/acceptance-checks.d.ts +48 -0
- package/dist/core/acceptance-checks.js +144 -0
- package/dist/core/acceptance-checks.js.map +1 -0
- package/dist/core/agent-session.d.ts +106 -72
- package/dist/core/agent-session.js +539 -399
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +6 -5
- package/dist/core/agents.js.map +1 -1
- package/dist/core/ask-user.d.ts +90 -8
- package/dist/core/ask-user.js +124 -13
- package/dist/core/ask-user.js.map +1 -1
- package/dist/core/bundled-agents.js +1 -3
- package/dist/core/bundled-agents.js.map +1 -1
- package/dist/core/cache-diagnostics.d.ts +68 -0
- package/dist/core/cache-diagnostics.js +196 -0
- package/dist/core/cache-diagnostics.js.map +1 -0
- package/dist/core/cache-expiry.d.ts +87 -0
- package/dist/core/cache-expiry.js +111 -0
- package/dist/core/cache-expiry.js.map +1 -0
- package/dist/core/compaction/compactor.js +78 -48
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/plan-step-policy.d.ts +46 -0
- package/dist/core/compaction/plan-step-policy.js +57 -0
- package/dist/core/compaction/plan-step-policy.js.map +1 -0
- package/dist/core/destructive-git-guard.d.ts +90 -0
- package/dist/core/destructive-git-guard.js +871 -0
- package/dist/core/destructive-git-guard.js.map +1 -0
- package/dist/core/event-bus.d.ts +3 -0
- package/dist/core/event-bus.js +5 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/injection-detect.d.ts +38 -0
- package/dist/core/injection-detect.js +232 -0
- package/dist/core/injection-detect.js.map +1 -0
- package/dist/core/keep-awake.d.ts +88 -0
- package/dist/core/keep-awake.js +251 -0
- package/dist/core/keep-awake.js.map +1 -0
- package/dist/core/mcp/client.d.ts +72 -0
- package/dist/core/mcp/client.js +264 -41
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/content.js +6 -2
- package/dist/core/mcp/content.js.map +1 -1
- package/dist/core/mcp/store.d.ts +6 -1
- package/dist/core/mcp/store.js +12 -1
- package/dist/core/mcp/store.js.map +1 -1
- package/dist/core/mcp/types.d.ts +18 -0
- package/dist/core/model-unavailable.d.ts +14 -0
- package/dist/core/model-unavailable.js +23 -0
- package/dist/core/model-unavailable.js.map +1 -0
- package/dist/core/node-debugger.d.ts +148 -0
- package/dist/core/node-debugger.js +642 -0
- package/dist/core/node-debugger.js.map +1 -0
- package/dist/core/package-threats.d.ts +18 -0
- package/dist/core/package-threats.js +168 -0
- package/dist/core/package-threats.js.map +1 -0
- package/dist/core/persistent-shell.d.ts +58 -6
- package/dist/core/persistent-shell.js +331 -49
- package/dist/core/persistent-shell.js.map +1 -1
- package/dist/core/process-manager.d.ts +14 -0
- package/dist/core/process-manager.js +61 -0
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/progress/git-xp.js +8 -14
- package/dist/core/progress/git-xp.js.map +1 -1
- package/dist/core/session-history.d.ts +12 -0
- package/dist/core/session-history.js +27 -0
- package/dist/core/session-history.js.map +1 -1
- package/dist/core/session-manager.d.ts +13 -1
- package/dist/core/session-manager.js +38 -18
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-summary-index.d.ts +37 -0
- package/dist/core/session-summary-index.js +172 -0
- package/dist/core/session-summary-index.js.map +1 -0
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.js +10 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shell-threats-popular-packages.d.ts +11 -0
- package/dist/core/shell-threats-popular-packages.js +675 -0
- package/dist/core/shell-threats-popular-packages.js.map +1 -0
- package/dist/core/shell-threats.d.ts +8 -0
- package/dist/core/shell-threats.js +186 -0
- package/dist/core/shell-threats.js.map +1 -0
- package/dist/core/skills.js +3 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/stream-rules.d.ts +30 -0
- package/dist/core/stream-rules.js +151 -0
- package/dist/core/stream-rules.js.map +1 -0
- package/dist/core/subagent-manager.d.ts +20 -5
- package/dist/core/subagent-manager.js +22 -8
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-receipt.d.ts +54 -0
- package/dist/core/subagent-receipt.js +276 -0
- package/dist/core/subagent-receipt.js.map +1 -0
- package/dist/core/subagent-turn-record.d.ts +2 -0
- package/dist/core/subagent-turn-record.js.map +1 -1
- package/dist/core/test-impact.d.ts +73 -0
- package/dist/core/test-impact.js +467 -0
- package/dist/core/test-impact.js.map +1 -0
- package/dist/core/thinking-level.d.ts +1 -1
- package/dist/core/thinking-level.js +1 -1
- package/dist/core/thinking-level.js.map +1 -1
- package/dist/core/verification-gate.d.ts +2 -0
- package/dist/core/verification-gate.js +4 -0
- package/dist/core/verification-gate.js.map +1 -1
- package/dist/core/verification-snapshot.js +3 -5
- package/dist/core/verification-snapshot.js.map +1 -1
- package/dist/core/workspace-guard.d.ts +18 -7
- package/dist/core/workspace-guard.js +227 -60
- package/dist/core/workspace-guard.js.map +1 -1
- package/dist/interactive.js +2 -1
- package/dist/interactive.js.map +1 -1
- package/dist/modes/subagent-worker-mode.js +34 -6
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/motion-agent/motion-agent.d.ts +6 -2
- package/dist/motion-agent/motion-agent.js +5 -7
- package/dist/motion-agent/motion-agent.js.map +1 -1
- package/dist/motion-agent/motion-prompt.d.ts +1 -1
- package/dist/motion-agent/motion-prompt.js +14 -19
- package/dist/motion-agent/motion-prompt.js.map +1 -1
- package/dist/motion-agent/motion-review.d.ts +10 -3
- package/dist/motion-agent/motion-review.js +15 -7
- package/dist/motion-agent/motion-review.js.map +1 -1
- package/dist/motion-agent/motion-studio-context.js +1 -1
- package/dist/motion-agent/motion-studio-context.js.map +1 -1
- package/dist/system-prompt.js +3 -1
- package/dist/system-prompt.js.map +1 -1
- package/dist/test-support/keep-alive.d.ts +14 -0
- package/dist/test-support/keep-alive.js +17 -0
- package/dist/test-support/keep-alive.js.map +1 -0
- package/dist/tools/ask-user.js +3 -3
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/bash-read-evidence.d.ts +10 -0
- package/dist/tools/bash-read-evidence.js +133 -0
- package/dist/tools/bash-read-evidence.js.map +1 -0
- package/dist/tools/bash.d.ts +10 -1
- package/dist/tools/bash.js +115 -7
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/debug.d.ts +54 -0
- package/dist/tools/debug.js +233 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/edit.js +12 -4
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/goals.d.ts +1 -1
- package/dist/tools/index.d.ts +19 -2
- package/dist/tools/index.js +47 -7
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/prompt-hints.js +2 -0
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read-tracker.d.ts +5 -0
- package/dist/tools/read-tracker.js +19 -9
- package/dist/tools/read-tracker.js.map +1 -1
- package/dist/tools/read.js +3 -2
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/skill.js +5 -0
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-control.js +44 -8
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/subagent-shared.d.ts +29 -8
- package/dist/tools/subagent-shared.js +45 -14
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent.d.ts +8 -2
- package/dist/tools/subagent.js +28 -10
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/task-output.js +3 -2
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/task-send.d.ts +1 -1
- package/dist/tools/task-send.js +15 -1
- package/dist/tools/task-send.js.map +1 -1
- package/dist/tools/tool-tiers.d.ts +2 -2
- package/dist/tools/tool-tiers.js +3 -2
- package/dist/tools/tool-tiers.js.map +1 -1
- package/dist/tools/truncate.d.ts +21 -0
- package/dist/tools/truncate.js +187 -0
- package/dist/tools/truncate.js.map +1 -1
- package/dist/tools/ui-adopt.js +2 -0
- package/dist/tools/ui-adopt.js.map +1 -1
- package/dist/ui/App.d.ts +0 -4
- package/dist/ui/App.js +5 -28
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +1 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +1 -8
- package/dist/ui/hooks/useAgentLoop.js +1 -119
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/render.d.ts +0 -4
- package/dist/ui/render.js +0 -2
- package/dist/ui/render.js.map +1 -1
- package/dist/utils/git.d.ts +77 -0
- package/dist/utils/git.js +285 -21
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/github-ci.js +2 -1
- package/dist/utils/github-ci.js.map +1 -1
- package/dist/utils/github.js +11 -9
- package/dist/utils/github.js.map +1 -1
- package/dist/utils/image.d.ts +14 -0
- package/dist/utils/image.js +16 -0
- package/dist/utils/image.js.map +1 -1
- package/dist/utils/process.d.ts +20 -0
- package/dist/utils/process.js +98 -0
- package/dist/utils/process.js.map +1 -1
- package/package.json +5 -5
- package/assets/motion/references/motion-language.md +0 -128
- package/assets/motion/skills/video-qa/SKILL.md +0 -89
- package/dist/core/ideal-review-subagent.d.ts +0 -56
- package/dist/core/ideal-review-subagent.js +0 -112
- package/dist/core/ideal-review-subagent.js.map +0 -1
- package/dist/core/ideal-review.d.ts +0 -82
- package/dist/core/ideal-review.js +0 -242
- package/dist/core/ideal-review.js.map +0 -1
- package/dist/motion-agent/motion-check-tool.d.ts +0 -35
- package/dist/motion-agent/motion-check-tool.js +0 -514
- package/dist/motion-agent/motion-check-tool.js.map +0 -1
|
@@ -1,514 +0,0 @@
|
|
|
1
|
-
import { execFile } from "node:child_process";
|
|
2
|
-
import { randomUUID } from "node:crypto";
|
|
3
|
-
import fs from "node:fs/promises";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { promisify } from "node:util";
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
import { log } from "../core/logger.js";
|
|
9
|
-
import { isMotionTechnicalReport, motionPath, motionRegistrationSchema, motionSourceHash, validateMotionManifest, } from "./motion-review.js";
|
|
10
|
-
const exec = promisify(execFile);
|
|
11
|
-
const parameters = motionRegistrationSchema.omit({ depth: true, references: true }).extend({
|
|
12
|
-
spot: z
|
|
13
|
-
.boolean()
|
|
14
|
-
.optional()
|
|
15
|
-
.describe("Quick pre-check of only the rendered frames inside `windows`; never the delivery check."),
|
|
16
|
-
});
|
|
17
|
-
const binariesSchema = z.object({
|
|
18
|
-
ffmpeg: z.string().refine(path.isAbsolute),
|
|
19
|
-
ffprobe: z.string().refine(path.isAbsolute),
|
|
20
|
-
});
|
|
21
|
-
const audioSchema = z.object({ streams: z.array(z.object({ codec_type: z.literal("audio") })) });
|
|
22
|
-
const videoSchema = z.object({
|
|
23
|
-
streams: z.tuple([z.object({ avg_frame_rate: z.string() })]),
|
|
24
|
-
format: z.object({ duration: z.string() }),
|
|
25
|
-
});
|
|
26
|
-
const levelsSchema = z.object({ input_i: z.string(), input_tp: z.string() });
|
|
27
|
-
const pixelsSchema = z.object({
|
|
28
|
-
ok: z.literal(true),
|
|
29
|
-
videoSha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
30
|
-
});
|
|
31
|
-
const flashChannelSchema = z.object({
|
|
32
|
-
maxFlashesPerSecond: z.number(),
|
|
33
|
-
failures: z.array(z.object({ start: z.number(), end: z.number() })),
|
|
34
|
-
});
|
|
35
|
-
const flashSchema = z.object({
|
|
36
|
-
ok: z.boolean(),
|
|
37
|
-
videoSha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
38
|
-
general: flashChannelSchema,
|
|
39
|
-
red: flashChannelSchema,
|
|
40
|
-
});
|
|
41
|
-
/** A busy 15 s WebGL composition sampled at every transition measured ~130 s on an M4 Pro. */
|
|
42
|
-
const SOURCE_CHECK_MS = 240_000;
|
|
43
|
-
const STEP_MS = 120_000;
|
|
44
|
-
/** A full 30 s check measured ~0.2 s per layout sample on an M4 Pro: 240 stay under a minute. */
|
|
45
|
-
const SPOT_MAX_FRAMES = 240;
|
|
46
|
-
const SOURCE_CHECK = "Runtime/layout/contrast (includes lint)";
|
|
47
|
-
const FLASH_CHECK = "No harmful flashing (WCAG 2.3.1)";
|
|
48
|
-
/** Errors beyond this many keep their where/when line but drop the repeated message and fix. */
|
|
49
|
-
const DETAILED_ERRORS = 15;
|
|
50
|
-
/** Keeps the error list inside the 12,000-character details cap, with room for notes. */
|
|
51
|
-
const ERROR_LIST_CHARS = 9_000;
|
|
52
|
-
const findingSchema = z.object({
|
|
53
|
-
code: z.string(),
|
|
54
|
-
severity: z.string(),
|
|
55
|
-
message: z.string().optional(),
|
|
56
|
-
time: z.number().optional(),
|
|
57
|
-
selector: z.string().optional(),
|
|
58
|
-
text: z.string().optional(),
|
|
59
|
-
fixHint: z.string().optional(),
|
|
60
|
-
});
|
|
61
|
-
const sectionSchema = z.object({
|
|
62
|
-
ok: z.boolean().optional(),
|
|
63
|
-
errorCount: z.number().optional(),
|
|
64
|
-
warningCount: z.number().optional(),
|
|
65
|
-
samples: z.union([z.array(z.number()), z.number()]).optional(),
|
|
66
|
-
findings: z.array(findingSchema).optional(),
|
|
67
|
-
});
|
|
68
|
-
const checkReportSchema = z.object({
|
|
69
|
-
ok: z.boolean(),
|
|
70
|
-
lint: sectionSchema.optional(),
|
|
71
|
-
runtime: sectionSchema.optional(),
|
|
72
|
-
layout: sectionSchema.optional(),
|
|
73
|
-
motion: sectionSchema.optional(),
|
|
74
|
-
contrast: sectionSchema.optional(),
|
|
75
|
-
});
|
|
76
|
-
const SECTIONS = ["lint", "runtime", "layout", "motion", "contrast"];
|
|
77
|
-
const clip = (text, size) => text.length <= size ? text : `${text.slice(0, size - 1)}…`;
|
|
78
|
-
/**
|
|
79
|
-
* Times of every frame the export contains inside `windows`, so a spot check audits what
|
|
80
|
-
* viewers see. Never a thinned set: across several samples the layout audit reports a
|
|
81
|
-
* collision seen only once as info, so skipped frames would hide the brief collisions a
|
|
82
|
-
* spot check exists to catch.
|
|
83
|
-
*/
|
|
84
|
-
export function spotSampleTimes(windows, fps, duration) {
|
|
85
|
-
const frames = new Set();
|
|
86
|
-
for (const window of windows) {
|
|
87
|
-
const first = Math.max(0, Math.ceil(window.start * fps - 1e-6));
|
|
88
|
-
for (let frame = first; frame <= window.end * fps + 1e-6; frame++) {
|
|
89
|
-
if (frame / fps < duration)
|
|
90
|
-
frames.add(frame);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return [...frames].sort((a, b) => a - b).map((frame) => Math.round((frame / fps) * 1000) / 1000);
|
|
94
|
-
}
|
|
95
|
-
/** What the agent acts on: whether it flashes, when, how fast, and the levers that fix it. */
|
|
96
|
-
function summarizeFlashes(output) {
|
|
97
|
-
let json;
|
|
98
|
-
try {
|
|
99
|
-
json = JSON.parse(output.stdout);
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
return `${output.stdout}\n${output.stderr}`;
|
|
103
|
-
}
|
|
104
|
-
const parsed = flashSchema.safeParse(json);
|
|
105
|
-
if (!parsed.success)
|
|
106
|
-
return `${output.stdout}\n${output.stderr}`;
|
|
107
|
-
const { general, red } = parsed.data;
|
|
108
|
-
if (parsed.data.ok) {
|
|
109
|
-
const peak = Math.max(general.maxFlashesPerSecond, red.maxFlashesPerSecond);
|
|
110
|
-
return (`Passed: at most ${peak} flashes in any one second (the limit is 3), measured on the ` +
|
|
111
|
-
"rendered pixels. A screening, not a formal photosensitivity certification.");
|
|
112
|
-
}
|
|
113
|
-
const spans = (failures) => failures.map(({ start, end }) => `${start}–${end} s`).join(", ");
|
|
114
|
-
const found = [
|
|
115
|
-
general.failures.length
|
|
116
|
-
? `brightness flashes at ${spans(general.failures)} (up to ${general.maxFlashesPerSecond} per second)`
|
|
117
|
-
: "",
|
|
118
|
-
red.failures.length
|
|
119
|
-
? `saturated red flashes at ${spans(red.failures)} (up to ${red.maxFlashesPerSecond} per second)`
|
|
120
|
-
: "",
|
|
121
|
-
].filter(Boolean);
|
|
122
|
-
return (`Fails: ${found.join("; ")}. More than three flashes in one second can trigger seizures ` +
|
|
123
|
-
"in people with photosensitive epilepsy. Fix it by keeping light/dark or red swaps to at " +
|
|
124
|
-
"most three in any second, shrinking the flashing area below about 3% of the frame, or " +
|
|
125
|
-
"reducing the brightness difference between the alternating states.");
|
|
126
|
-
}
|
|
127
|
-
/** Source fingerprint for reusing a passing audit; a project it cannot fingerprint is re-audited. */
|
|
128
|
-
async function sourceFingerprint(project, output, signal) {
|
|
129
|
-
try {
|
|
130
|
-
return await motionSourceHash(project, output, signal);
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
signal.throwIfAborted();
|
|
134
|
-
return undefined;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* `hf check --json` prints ~100 KB for a busy video. Give the agent what it acts on:
|
|
139
|
-
* per-section counts, every error with where and when, warning types, and
|
|
140
|
-
* renderer contract notes (e.g. undeclared fonts) that only appear on stderr.
|
|
141
|
-
*/
|
|
142
|
-
function summarizeSourceCheck(output) {
|
|
143
|
-
let json;
|
|
144
|
-
try {
|
|
145
|
-
json = JSON.parse(output.stdout);
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
return `${output.stdout}\n${output.stderr}`;
|
|
149
|
-
}
|
|
150
|
-
const parsed = checkReportSchema.safeParse(json);
|
|
151
|
-
if (!parsed.success)
|
|
152
|
-
return `${output.stdout}\n${output.stderr}`;
|
|
153
|
-
const report = parsed.data;
|
|
154
|
-
const lines = [`HyperFrames check: ${report.ok ? "passed" : "found problems"}`];
|
|
155
|
-
// One line per problem and element; later sightings add times instead of lines.
|
|
156
|
-
const errors = new Map();
|
|
157
|
-
const warnings = new Map();
|
|
158
|
-
for (const name of SECTIONS) {
|
|
159
|
-
const section = report[name];
|
|
160
|
-
if (!section)
|
|
161
|
-
continue;
|
|
162
|
-
const samples = Array.isArray(section.samples) ? section.samples.length : section.samples;
|
|
163
|
-
lines.push(`${name}: ${section.errorCount ?? 0} errors, ${section.warningCount ?? 0} warnings` +
|
|
164
|
-
(samples ? ` (${samples} samples)` : ""));
|
|
165
|
-
for (const finding of section.findings ?? []) {
|
|
166
|
-
if (finding.severity !== "error") {
|
|
167
|
-
const key = `${name} ${finding.code}`;
|
|
168
|
-
warnings.set(key, (warnings.get(key) ?? 0) + 1);
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
const key = `${name} ${finding.code} ${finding.selector ?? ""}`;
|
|
172
|
-
const seen = errors.get(key);
|
|
173
|
-
if (seen) {
|
|
174
|
-
if (finding.time !== undefined)
|
|
175
|
-
seen.times.push(finding.time);
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
const where = [
|
|
179
|
-
finding.selector ?? "",
|
|
180
|
-
finding.text ? JSON.stringify(clip(finding.text, 40)) : "",
|
|
181
|
-
]
|
|
182
|
-
.filter(Boolean)
|
|
183
|
-
.join(" ");
|
|
184
|
-
const fix = finding.fixHint ? ` Fix: ${clip(finding.fixHint, 200)}` : "";
|
|
185
|
-
const brief = `- ${name} ${finding.code} ${where}`;
|
|
186
|
-
errors.set(key, {
|
|
187
|
-
brief,
|
|
188
|
-
detail: `${brief}: ${clip(finding.message ?? "", 200)}${fix}`,
|
|
189
|
-
times: finding.time === undefined ? [] : [finding.time],
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
if (errors.size) {
|
|
194
|
-
// List where and when for as many problems as the report fits, not a fixed few: a
|
|
195
|
-
// short list hides later scenes' problems until another render and full check.
|
|
196
|
-
const listed = [];
|
|
197
|
-
let size = 0;
|
|
198
|
-
for (const [index, { brief, detail, times }] of [...errors.values()].entries()) {
|
|
199
|
-
const at = times.length
|
|
200
|
-
? ` [at ${times.slice(0, 4).join("s, ")}s${times.length > 4 ? " …" : ""}]`
|
|
201
|
-
: "";
|
|
202
|
-
const line = `${index < DETAILED_ERRORS ? detail : brief}${at}`;
|
|
203
|
-
size += line.length + 1;
|
|
204
|
-
if (size > ERROR_LIST_CHARS)
|
|
205
|
-
break;
|
|
206
|
-
listed.push(line);
|
|
207
|
-
}
|
|
208
|
-
lines.push(`Errors (${listed.length} of ${errors.size} distinct problems listed):`, ...listed);
|
|
209
|
-
}
|
|
210
|
-
if (warnings.size) {
|
|
211
|
-
const types = [...warnings].sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]));
|
|
212
|
-
lines.push(`Warnings by type: ${types.map(([code, count]) => `${code} ×${count}`).join(", ")}`);
|
|
213
|
-
}
|
|
214
|
-
const notes = [
|
|
215
|
-
...new Set(output.stderr
|
|
216
|
-
.split(/\r?\n/)
|
|
217
|
-
.map((line) => line.trim())
|
|
218
|
-
.filter((line) => line.startsWith("[StaticGuard]"))),
|
|
219
|
-
];
|
|
220
|
-
if (notes.length)
|
|
221
|
-
lines.push("Renderer notes:", ...notes.map((note) => `- ${clip(note, 400)}`));
|
|
222
|
-
return lines.join("\n");
|
|
223
|
-
}
|
|
224
|
-
/** One explicit check; the working agent sees the frames, with no separate model or approval loop. */
|
|
225
|
-
export function createMotionCheckTool(cwd, bundle, limits = {}) {
|
|
226
|
-
const sourceCheckMs = limits.sourceCheckMs ?? SOURCE_CHECK_MS;
|
|
227
|
-
const spotMaxFrames = limits.spotMaxFrames ?? SPOT_MAX_FRAMES;
|
|
228
|
-
// The source audit reads the project, never the export: re-checking unchanged source
|
|
229
|
-
// (e.g. after correcting only a hold plan) reuses its last full pass.
|
|
230
|
-
const passedSources = new Map();
|
|
231
|
-
return {
|
|
232
|
-
name: "motion_check",
|
|
233
|
-
description: "Check a current rendered Motion video once: source lint/runtime/layout/contrast, decoded pixels, " +
|
|
234
|
-
"and audio levels when present. Returns technical findings plus actual rendered images for YOU " +
|
|
235
|
-
"to inspect against the video's plan and inputs. Supply representative action " +
|
|
236
|
-
"windows (start/end seconds); for videos over 180 seconds select a range to inspect. " +
|
|
237
|
-
"With spot: true the layout check covers only the rendered frames inside the windows " +
|
|
238
|
-
`(at most ${spotMaxFrames} in total), much faster than the full check: use it on the ` +
|
|
239
|
-
"moments a targeted fix or small edit changed, then run the full check once on the " +
|
|
240
|
-
"export you deliver. A spot check is never delivery verification. " +
|
|
241
|
-
"Unchanged project source reuses its last passing full source check. " +
|
|
242
|
-
"This does not approve creative quality or watch/listen to the full video. Do not repeat the " +
|
|
243
|
-
"same checks manually or recheck an unchanged export unless you corrected its hold plan. " +
|
|
244
|
-
"All paths must stay inside the workspace.",
|
|
245
|
-
parameters,
|
|
246
|
-
executionMode: "sequential",
|
|
247
|
-
async execute(args, context) {
|
|
248
|
-
const started = Date.now();
|
|
249
|
-
const signal = AbortSignal.any([context.signal, AbortSignal.timeout(330_000)]);
|
|
250
|
-
const checks = [];
|
|
251
|
-
let config;
|
|
252
|
-
let technical = false;
|
|
253
|
-
try {
|
|
254
|
-
const input = parameters.parse(args);
|
|
255
|
-
signal.throwIfAborted();
|
|
256
|
-
const project = await motionPath(cwd, input.project);
|
|
257
|
-
const output = await motionPath(cwd, input.output);
|
|
258
|
-
const holds = input.holds ? await motionPath(cwd, input.holds) : undefined;
|
|
259
|
-
if (!(await fs.stat(project)).isDirectory())
|
|
260
|
-
throw new Error("Expected a project folder");
|
|
261
|
-
const outputInfo = await fs.stat(output);
|
|
262
|
-
if (!outputInfo.isFile() || outputInfo.size > 2 * 1024 ** 3)
|
|
263
|
-
throw new Error("Expected a rendered video file under 2 GiB");
|
|
264
|
-
const run = async (name, binary, argv, options = {}) => {
|
|
265
|
-
const timeoutMs = options.timeoutMs ?? STEP_MS;
|
|
266
|
-
const describe = options.describe ?? ((out) => `${out.stdout}\n${out.stderr}`);
|
|
267
|
-
// A signal, not execFile's `timeout`: the launcher forwards SIGTERM and the CLI
|
|
268
|
-
// then exits 0 with no report, which `timeout` would record as a pass.
|
|
269
|
-
const step = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
|
|
270
|
-
try {
|
|
271
|
-
const result = await exec(binary, argv, {
|
|
272
|
-
signal: step,
|
|
273
|
-
maxBuffer: 8 * 1024 * 1024,
|
|
274
|
-
windowsHide: true,
|
|
275
|
-
});
|
|
276
|
-
checks.push({ name, ok: true, details: describe(result).slice(0, 12_000) });
|
|
277
|
-
return result;
|
|
278
|
-
}
|
|
279
|
-
catch (error) {
|
|
280
|
-
signal.throwIfAborted();
|
|
281
|
-
if (step.aborted) {
|
|
282
|
-
checks.push({
|
|
283
|
-
name,
|
|
284
|
-
ok: false,
|
|
285
|
-
details: `Did not finish within ${timeoutMs / 1000} s, so it produced no result.`,
|
|
286
|
-
});
|
|
287
|
-
return null;
|
|
288
|
-
}
|
|
289
|
-
// A failing check still prints its report; keep it so its findings can be acted on.
|
|
290
|
-
const failed = error;
|
|
291
|
-
const output = { stdout: failed.stdout ?? "", stderr: failed.stderr ?? "" };
|
|
292
|
-
const details = output.stdout ? describe(output) : `${String(error)}\n${output.stderr}`;
|
|
293
|
-
checks.push({ name, ok: false, details: details.slice(0, 12_000) });
|
|
294
|
-
return null;
|
|
295
|
-
}
|
|
296
|
-
};
|
|
297
|
-
const validate = (name, ok) => {
|
|
298
|
-
checks.push({ name, ok, details: ok ? "passed" : "Missing or failed check evidence" });
|
|
299
|
-
};
|
|
300
|
-
const binaries = await exec(process.execPath, [path.join(bundle.root, "bin", "media-binaries.mjs")], {
|
|
301
|
-
signal: AbortSignal.any([signal, AbortSignal.timeout(10_000)]),
|
|
302
|
-
maxBuffer: 64 * 1024,
|
|
303
|
-
windowsHide: true,
|
|
304
|
-
});
|
|
305
|
-
const { ffmpeg, ffprobe } = binariesSchema.parse(JSON.parse(binaries.stdout));
|
|
306
|
-
let sampling = ["--at-transitions"];
|
|
307
|
-
let spotFrames;
|
|
308
|
-
if (input.spot) {
|
|
309
|
-
const probe = await exec(ffprobe, [
|
|
310
|
-
"-v",
|
|
311
|
-
"error",
|
|
312
|
-
"-protocol_whitelist",
|
|
313
|
-
"file,pipe",
|
|
314
|
-
"-select_streams",
|
|
315
|
-
"v:0",
|
|
316
|
-
"-show_entries",
|
|
317
|
-
"stream=avg_frame_rate:format=duration",
|
|
318
|
-
"-of",
|
|
319
|
-
"json",
|
|
320
|
-
output,
|
|
321
|
-
], {
|
|
322
|
-
signal: AbortSignal.any([signal, AbortSignal.timeout(STEP_MS)]),
|
|
323
|
-
maxBuffer: 64 * 1024,
|
|
324
|
-
windowsHide: true,
|
|
325
|
-
});
|
|
326
|
-
const video = videoSchema.parse(JSON.parse(probe.stdout));
|
|
327
|
-
const [num, den] = video.streams[0].avg_frame_rate.split("/").map(Number);
|
|
328
|
-
const fps = Number(num) / Number(den);
|
|
329
|
-
const duration = Number(video.format.duration);
|
|
330
|
-
if (!(fps >= 1 && fps <= 120 && duration > 0 && duration <= 3600))
|
|
331
|
-
throw new Error("Unsupported video metadata for a spot check");
|
|
332
|
-
const times = spotSampleTimes(input.windows, fps, duration);
|
|
333
|
-
if (!times.length)
|
|
334
|
-
throw new Error("Spot windows contain no rendered frames");
|
|
335
|
-
if (times.length > spotMaxFrames)
|
|
336
|
-
throw new Error(`Spot windows cover ${times.length} rendered frames; keep them to at most ` +
|
|
337
|
-
`${spotMaxFrames} (${(spotMaxFrames / fps).toFixed(1)} s at this video's ` +
|
|
338
|
-
`${Math.round(fps * 100) / 100} fps) around the moments you changed, or run the full check.`);
|
|
339
|
-
spotFrames = times.length;
|
|
340
|
-
sampling = ["--at", times.join(",")];
|
|
341
|
-
}
|
|
342
|
-
const fingerprint = input.spot
|
|
343
|
-
? undefined
|
|
344
|
-
: await sourceFingerprint(project, output, signal);
|
|
345
|
-
const passed = passedSources.get(project);
|
|
346
|
-
let runtime;
|
|
347
|
-
if (fingerprint !== undefined && passed?.fingerprint === fingerprint) {
|
|
348
|
-
runtime = passed.result;
|
|
349
|
-
checks.push({
|
|
350
|
-
name: SOURCE_CHECK,
|
|
351
|
-
ok: true,
|
|
352
|
-
details: `Reused: the project source is unchanged since this check passed.\n${summarizeSourceCheck(runtime)}`.slice(0, 12_000),
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
// HyperFrames check includes lint; running `hf lint` separately duplicates that work.
|
|
357
|
-
runtime = await run(SOURCE_CHECK, process.execPath, [bundle.launcher, "check", project, "--json", "--contrast", ...sampling], { timeoutMs: sourceCheckMs, describe: summarizeSourceCheck });
|
|
358
|
-
// Keep a pass only if the source did not change while it was being audited.
|
|
359
|
-
if (fingerprint !== undefined &&
|
|
360
|
-
runtime !== null &&
|
|
361
|
-
isMotionTechnicalReport(runtime.stdout) &&
|
|
362
|
-
(await sourceFingerprint(project, output, signal)) === fingerprint)
|
|
363
|
-
passedSources.set(project, { fingerprint, result: runtime });
|
|
364
|
-
}
|
|
365
|
-
validate("Structured runtime report", runtime !== null && isMotionTechnicalReport(runtime.stdout));
|
|
366
|
-
const pixels = await run("Decoded pixel motion", process.execPath, [
|
|
367
|
-
path.join(bundle.root, "bin", "motion-check.mjs"),
|
|
368
|
-
output,
|
|
369
|
-
...(holds ? ["--holds", holds] : []),
|
|
370
|
-
...(input.slideshowRequested ? ["--slideshow-requested"] : []),
|
|
371
|
-
]);
|
|
372
|
-
const pixelReport = pixels ? pixelsSchema.safeParse(JSON.parse(pixels.stdout)) : null;
|
|
373
|
-
validate("Structured pixel report", pixelReport?.success === true);
|
|
374
|
-
// Always the whole export, spot or not: about 2 s for 30 s of 1080p60 on an M4 Pro.
|
|
375
|
-
const flashes = await run(FLASH_CHECK, process.execPath, [path.join(bundle.root, "bin", "flash-check.mjs"), output], { describe: summarizeFlashes });
|
|
376
|
-
const flashReport = flashes ? flashSchema.safeParse(JSON.parse(flashes.stdout)) : null;
|
|
377
|
-
// A failing check already reports its findings; only a passing exit needs its report proven.
|
|
378
|
-
if (flashes)
|
|
379
|
-
validate("Structured flash report", flashReport?.success === true && flashReport.data.ok);
|
|
380
|
-
const audio = await run("Audio metadata", ffprobe, [
|
|
381
|
-
"-v",
|
|
382
|
-
"error",
|
|
383
|
-
"-protocol_whitelist",
|
|
384
|
-
"file,pipe",
|
|
385
|
-
"-select_streams",
|
|
386
|
-
"a",
|
|
387
|
-
"-show_entries",
|
|
388
|
-
"stream=codec_type",
|
|
389
|
-
"-of",
|
|
390
|
-
"json",
|
|
391
|
-
output,
|
|
392
|
-
]);
|
|
393
|
-
const streams = audio ? audioSchema.safeParse(JSON.parse(audio.stdout)) : null;
|
|
394
|
-
validate("Structured audio report", streams?.success === true);
|
|
395
|
-
if (streams?.success && streams.data.streams.length > 0) {
|
|
396
|
-
const levels = await run("Audio levels", ffmpeg, [
|
|
397
|
-
"-hide_banner",
|
|
398
|
-
"-nostdin",
|
|
399
|
-
"-xerror",
|
|
400
|
-
"-protocol_whitelist",
|
|
401
|
-
"file,pipe",
|
|
402
|
-
"-i",
|
|
403
|
-
output,
|
|
404
|
-
"-vn",
|
|
405
|
-
"-af",
|
|
406
|
-
"loudnorm=I=-14:TP=-1:LRA=11:print_format=json",
|
|
407
|
-
"-f",
|
|
408
|
-
"null",
|
|
409
|
-
"-",
|
|
410
|
-
]);
|
|
411
|
-
if (levels) {
|
|
412
|
-
const start = levels.stderr.lastIndexOf("\n{");
|
|
413
|
-
const end = levels.stderr.indexOf("\n}", start);
|
|
414
|
-
if (start < 0 || end < 0)
|
|
415
|
-
throw new Error("Missing structured audio measurements");
|
|
416
|
-
const measured = levelsSchema.parse(JSON.parse(levels.stderr.slice(start, end + 2)));
|
|
417
|
-
const loudness = Number(measured.input_i);
|
|
418
|
-
const peak = Number(measured.input_tp);
|
|
419
|
-
const finite = Number.isFinite(loudness) && Number.isFinite(peak);
|
|
420
|
-
// Measure, don't impose a new mix. Clipping is a failure; distribution-specific
|
|
421
|
-
// loudness targets remain the user's contract, so the numbers are reported as is.
|
|
422
|
-
checks.push({
|
|
423
|
-
name: "Audio is finite and not clipping",
|
|
424
|
-
ok: finite && peak <= 0,
|
|
425
|
-
details: `Integrated loudness ${measured.input_i} LUFS, true peak ${measured.input_tp} dBTP. ` +
|
|
426
|
-
(!finite
|
|
427
|
-
? "Not measurable: the audio may be silent or unreadable."
|
|
428
|
-
: peak > 0
|
|
429
|
-
? "Clipping: the true peak is above 0 dBTP."
|
|
430
|
-
: peak > -1
|
|
431
|
-
? "No clipping, but peaks above -1 dBTP can distort once a platform re-encodes the audio."
|
|
432
|
-
: "No clipping."),
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
const id = randomUUID();
|
|
437
|
-
const directory = path.join(path.dirname(output), `.motion-review-${id}`);
|
|
438
|
-
config = path.join(os.tmpdir(), `ez-motion-check-${id}.json`);
|
|
439
|
-
await fs.writeFile(config, JSON.stringify({ windows: input.windows, range: input.range }), {
|
|
440
|
-
flag: "wx",
|
|
441
|
-
signal,
|
|
442
|
-
});
|
|
443
|
-
const frames = await run("Rendered frames", process.execPath, [
|
|
444
|
-
path.join(bundle.root, "bin", "review-frames.mjs"),
|
|
445
|
-
output,
|
|
446
|
-
directory,
|
|
447
|
-
config,
|
|
448
|
-
]);
|
|
449
|
-
if (!frames)
|
|
450
|
-
return JSON.stringify({ technical: false, output, checks, visual: "not inspected" });
|
|
451
|
-
const evidence = await validateMotionManifest(directory, output, input.windows, signal, input.range);
|
|
452
|
-
validate("Pixel report matches rendered frames", pixelReport?.success === true &&
|
|
453
|
-
pixelReport.data.videoSha256 === evidence.manifest.video.sha256 &&
|
|
454
|
-
(flashReport === null ||
|
|
455
|
-
(flashReport.success &&
|
|
456
|
-
flashReport.data.videoSha256 === evidence.manifest.video.sha256)));
|
|
457
|
-
if (spotFrames !== undefined) {
|
|
458
|
-
// Honest scope: frames outside the windows, and the instants between frames that
|
|
459
|
-
// the full check samples at every transition, were not audited.
|
|
460
|
-
checks.push({
|
|
461
|
-
name: "Full-video source check",
|
|
462
|
-
ok: false,
|
|
463
|
-
details: `Not run: the spot check audited the ${spotFrames} rendered frames inside the windows ` +
|
|
464
|
-
"only. Fix what it found; before delivery, call motion_check without spot on the " +
|
|
465
|
-
"export you deliver.",
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
technical = checks.every((check) => check.ok);
|
|
469
|
-
return {
|
|
470
|
-
content: [
|
|
471
|
-
{
|
|
472
|
-
type: "text",
|
|
473
|
-
text: JSON.stringify({
|
|
474
|
-
technical,
|
|
475
|
-
...(spotFrames !== undefined ? { scope: "spot" } : {}),
|
|
476
|
-
output,
|
|
477
|
-
checks,
|
|
478
|
-
coverage: evidence.manifest.range,
|
|
479
|
-
visual: "Inspect the attached rendered frames against the video's plan and inputs. These are samples, not playback or audio listening. No creative approval has been granted.",
|
|
480
|
-
}),
|
|
481
|
-
},
|
|
482
|
-
...evidence.images.map((image) => ({
|
|
483
|
-
type: "image",
|
|
484
|
-
mediaType: "image/jpeg",
|
|
485
|
-
data: image.toString("base64"),
|
|
486
|
-
})),
|
|
487
|
-
],
|
|
488
|
-
};
|
|
489
|
-
}
|
|
490
|
-
catch (error) {
|
|
491
|
-
if (context.signal.aborted)
|
|
492
|
-
throw context.signal.reason;
|
|
493
|
-
return JSON.stringify({
|
|
494
|
-
technical: false,
|
|
495
|
-
checks,
|
|
496
|
-
error: String(error).slice(0, 4000),
|
|
497
|
-
visual: "unverified",
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
finally {
|
|
501
|
-
if (config)
|
|
502
|
-
await fs.rm(config, { force: true });
|
|
503
|
-
log("INFO", "motion-check", "Output check finished", {
|
|
504
|
-
project: args.project,
|
|
505
|
-
output: args.output,
|
|
506
|
-
elapsedMs: Date.now() - started,
|
|
507
|
-
technical,
|
|
508
|
-
spot: args.spot === true,
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
},
|
|
512
|
-
};
|
|
513
|
-
}
|
|
514
|
-
//# sourceMappingURL=motion-check-tool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"motion-check-tool.js","sourceRoot":"","sources":["../../src/motion-agent/motion-check-tool.ts"],"names":[],"mappings":"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"}
|