chore: checkpoint web Blender migration source, tools and docs
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

Accumulated uncommitted work: GHOST Web backend, WebGL/GPU web layer,
web workflow engine and protocol, tooling, docs and task records.
Large generated evidence, user-testing archives, build snapshots and
imported test assets remain untracked.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
mes123456
2026-11-10 11:18:01 +08:00
parent 122142c26c
commit f3e21c6b98
6887 changed files with 257154 additions and 12294 deletions

View File

@@ -32,6 +32,7 @@ export interface SequencerStripIR {
sourceStart: number;
sourceEnd: number;
speed: number;
selected?: boolean;
muted: boolean;
locked: boolean;
sourceId?: string;
@@ -70,7 +71,7 @@ export interface SequencerRuntimeCapabilityIR {
export const SEQUENCER_CODEC_PROBE_SCHEMA = 1 as const;
export const SEQUENCER_CODEC_PROBE_MAX_BYTES = 512 * 1024 * 1024;
export type SequencerCodecStripType = "IMAGE" | "SOUND" | "MOVIE";
export type SequencerCodecProbeBackend = "IMAGE_BITMAP" | "WEB_AUDIO" | "HTML_MEDIA";
export type SequencerCodecProbeBackend = "IMAGE_BITMAP" | "WEB_AUDIO" | "HTML_MEDIA" | "FFMPEG_WASM";
export type SequencerCodecProbeBlockReason =
| "RUNTIME_UNAVAILABLE"
| "MIME_UNSUPPORTED"
@@ -200,6 +201,7 @@ export function parseSequencerTimeline(value: unknown): SequencerTimelineIR {
sourceStart,
sourceEnd,
speed,
selected: typeof item.selected === "boolean" ? item.selected : undefined,
muted: typeof item.muted === "boolean" ? item.muted : false,
locked: typeof item.locked === "boolean" ? item.locked : false,
proxy: parseProxy(item.proxy, index),
@@ -388,14 +390,16 @@ export function parseSequencerCodecProbeResult(value: unknown): SequencerCodecPr
sourceSha256: value.sourceSha256,
});
if (value.status !== "READY" && value.status !== "BLOCKED") throw new SequencerValidationError("SEQUENCER_SCHEMA_INVALID", "Codec probe status is invalid");
const backendAllowed = value.backend === null || value.backend === CODEC_BACKENDS[request.stripType] ||
(request.stripType === "MOVIE" && value.backend === "FFMPEG_WASM");
if (value.status === "BLOCKED") {
if ((value.backend !== null && value.backend !== CODEC_BACKENDS[request.stripType]) ||
if (!backendAllowed ||
!CODEC_BLOCK_REASONS.has(value.reason as SequencerCodecProbeBlockReason) || value.decoded !== null) {
throw new SequencerValidationError("SEQUENCER_SCHEMA_INVALID", "Blocked codec probe result is invalid");
}
}
else {
if (value.backend !== CODEC_BACKENDS[request.stripType] || value.reason !== null || !record(value.decoded)) {
if (!backendAllowed || value.backend === null || value.reason !== null || !record(value.decoded)) {
throw new SequencerValidationError("SEQUENCER_SCHEMA_INVALID", "Ready codec probe result is invalid");
}
const decodedKeys = request.stripType === "IMAGE" ? ["width", "height"] :