@aelionsdk/sdk 0.1.0-beta.1 → 1.0.0-rc.1

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/README.md CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  Browser-first video editing, preview, playback and export APIs for AelionSDK.
4
4
 
5
- ## Install the public Beta
5
+ ## Install the 1.0 Release Candidate
6
6
 
7
7
  ```bash
8
8
  npm install @aelionsdk/sdk@next
9
9
  npm install --save-dev @aelionsdk/vite-plugin@next vite
10
10
  ```
11
11
 
12
- `next` currently resolves to `0.1.0-beta.1`. Pin the exact version after
12
+ `next` currently resolves to `1.0.0-rc.1`. Pin the exact version after
13
13
  validation instead of following a moving prerelease tag.
14
14
 
15
15
  ## Vite setup
@@ -52,9 +52,24 @@ See the [AelionSDK documentation](https://foyonaczy.github.io/AelionSDK/) for
52
52
  media registration, Composition APIs, preview, local export, persistent
53
53
  checkpoints, deployment headers and capability preflight.
54
54
 
55
- ## Beta contract
55
+ ## Migrate WebAV or Diffusion projects
56
56
 
57
- The Beta is tested on the automated Chromium and Firefox matrix. Playwright
57
+ The package also installs `aelion-migrate`. It produces a validated Project
58
+ and a versioned loss report; strict mode never writes a Project when rendering
59
+ semantics cannot be preserved.
60
+
61
+ ```bash
62
+ pnpm exec aelion-migrate --from webav --input webav.json --out project.aelion.json
63
+ pnpm exec aelion-migrate --from diffusion --input checkpoint.json \
64
+ --assets assets.json --dry-run
65
+ ```
66
+
67
+ Use the `@aelionsdk/sdk/migrate-cli` subpath to call the same file migration
68
+ API from Node.js.
69
+
70
+ ## Release Candidate contract
71
+
72
+ The RC is tested on the automated Chromium and Firefox matrix. Playwright
58
73
  WebKit and a mobile viewport cover public capability and fallback contracts;
59
74
  physical Safari, iOS and Android devices are not yet certified. Local color
60
75
  execution is RGBA8 SDR. Public APIs may still change before the first stable
@@ -6,7 +6,7 @@ function deepFreeze(value) {
6
6
  }
7
7
  return value;
8
8
  }
9
- const projectSchema = JSON.parse(String.raw `{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://schemas.aelion.dev/project/v1.json","title":"Aelion Project Document v1","type":"object","additionalProperties":false,"required":["$schema","schemaVersion","projectId","metadata","settings","assets","sequences","tracks","items","materialInstances","transitions","markers","linkGroups","extensions"],"properties":{"$schema":{"const":"https://schemas.aelion.dev/project/v1.json"},"schemaVersion":{"const":"1.0.0"},"projectId":{"$ref":"#/$defs/entityId"},"metadata":{"$ref":"#/$defs/jsonObject"},"settings":{"$ref":"#/$defs/settings"},"assets":{"$ref":"#/$defs/assetMap"},"sequences":{"$ref":"#/$defs/sequenceMap"},"tracks":{"$ref":"#/$defs/trackMap"},"items":{"$ref":"#/$defs/itemMap"},"materialInstances":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"https://schemas.aelion.dev/material/instance/v1.json"}},"transitions":{"$ref":"#/$defs/transitionMap"},"markers":{"$ref":"#/$defs/markerMap"},"linkGroups":{"$ref":"#/$defs/linkGroupMap"},"extensions":{"$ref":"#/$defs/extensions"}},"$defs":{"entityId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z][A-Za-z0-9._:-]*$"},"safeInteger":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeUs":{"type":"integer","minimum":0,"maximum":9007199254740991},"positiveDurationUs":{"type":"integer","minimum":1,"maximum":9007199254740991},"jsonValue":{"oneOf":[{"type":"null"},{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"array","maxItems":16384,"items":{"$ref":"#/$defs/jsonValue"}},{"type":"object","maxProperties":4096,"additionalProperties":{"$ref":"#/$defs/jsonValue"}}]},"jsonObject":{"type":"object","maxProperties":4096,"additionalProperties":{"$ref":"#/$defs/jsonValue"}},"extensions":{"type":"object","maxProperties":4096,"propertyNames":{"type":"string","pattern":"^[a-z0-9]+(?:\\.[a-z0-9-]+)+$"},"additionalProperties":{"$ref":"#/$defs/jsonValue"}},"rational":{"type":"object","additionalProperties":false,"required":["numerator","denominator"],"properties":{"numerator":{"type":"integer","minimum":1,"maximum":9007199254740991},"denominator":{"type":"integer","minimum":1,"maximum":9007199254740991}}},"range":{"type":"object","additionalProperties":false,"required":["startUs","durationUs"],"properties":{"startUs":{"$ref":"#/$defs/timeUs"},"durationUs":{"$ref":"#/$defs/positiveDurationUs"}}},"color":{"type":"object","additionalProperties":false,"required":["space","rgba"],"properties":{"space":{"enum":["srgb-linear","display-p3-linear","rec2020-linear"]},"rgba":{"type":"array","minItems":4,"maxItems":4,"items":{"type":"number"}}}},"vec2":{"type":"object","additionalProperties":false,"required":["x","y"],"properties":{"x":{"type":"number"},"y":{"type":"number"}}},"animation":{"type":"object","additionalProperties":false,"required":["animation"],"properties":{"animation":{"type":"object","additionalProperties":false,"required":["timeSpace","preInfinity","postInfinity","keyframes"],"properties":{"timeSpace":{"enum":["item","sequence"]},"preInfinity":{"enum":["hold","linear","none","cycle","ping-pong"]},"postInfinity":{"enum":["hold","linear","none","cycle","ping-pong"]},"keyframes":{"type":"array","minItems":1,"maxItems":4096,"items":{"type":"object","additionalProperties":false,"required":["timeUs","value","interpolation"],"properties":{"timeUs":{"$ref":"#/$defs/timeUs"},"value":{"$ref":"#/$defs/jsonValue"},"interpolation":{"enum":["hold","linear","cubic-bezier"]},"easing":{"type":"object","required":["type"],"properties":{"type":{"enum":["linear","steps","cubic-bezier"]},"count":{"type":"integer","minimum":1},"position":{"enum":["start","end"]},"x1":{"type":"number"},"y1":{"type":"number"},"x2":{"type":"number"},"y2":{"type":"number"}},"additionalProperties":false}}}}}}}},"animatableNumber":{"oneOf":[{"type":"number"},{"$ref":"#/$defs/animation"}]},"animatableVec2":{"oneOf":[{"$ref":"#/$defs/vec2"},{"$ref":"#/$defs/animation"}]},"settings":{"type":"object","additionalProperties":false,"required":["defaultSequenceId","defaultStillDurationUs","missingAssetPolicy","missingMaterialPolicy","missingPluginPolicy"],"properties":{"defaultSequenceId":{"$ref":"#/$defs/entityId"},"defaultStillDurationUs":{"$ref":"#/$defs/positiveDurationUs"},"locale":{"type":"string","minLength":1,"maxLength":128},"timezone":{"type":"string","minLength":1,"maxLength":128},"missingAssetPolicy":{"enum":["placeholder","error"]},"missingMaterialPolicy":{"enum":["placeholder","error"]},"missingPluginPolicy":{"enum":["placeholder","error"]}}},"assetLocator":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","uri"],"properties":{"type":{"const":"url"},"uri":{"type":"string","minLength":1,"maxLength":8192}}},{"type":"object","additionalProperties":false,"required":["type","bindingId"],"properties":{"type":{"const":"runtime-binding"},"bindingId":{"$ref":"#/$defs/entityId"}}},{"type":"object","additionalProperties":false,"required":["type","path"],"properties":{"type":{"const":"opfs"},"path":{"type":"string","minLength":1,"maxLength":4096}}},{"type":"object","additionalProperties":false,"required":["type","mimeType","base64"],"properties":{"type":{"const":"data"},"mimeType":{"type":"string","minLength":1,"maxLength":256},"base64":{"type":"string","maxLength":349528}}}]},"asset":{"type":"object","additionalProperties":false,"required":["id","kind","locator"],"properties":{"id":{"$ref":"#/$defs/entityId"},"kind":{"enum":["video","audio","image","font","lut","binary"]},"name":{"type":"string","maxLength":256},"locator":{"$ref":"#/$defs/assetLocator"},"contentHash":{"type":"object","additionalProperties":false,"required":["algorithm","value"],"properties":{"algorithm":{"const":"sha256"},"value":{"type":"string","pattern":"^[0-9a-f]{64}$"}}},"byteLength":{"type":"integer","minimum":0,"maximum":9007199254740991},"mimeType":{"type":"string","minLength":1,"maxLength":256},"representations":{"type":"array","maxItems":32,"items":{"type":"object","maxProperties":4096,"additionalProperties":true,"required":["id","role","locator"],"properties":{"id":{"$ref":"#/$defs/entityId"},"role":{"enum":["original","proxy","thumbnail","waveform"]},"locator":{"$ref":"#/$defs/assetLocator"}}}},"probeHint":{"type":"object","additionalProperties":false,"properties":{"durationUs":{"$ref":"#/$defs/positiveDurationUs"},"width":{"type":"integer","minimum":1,"maximum":65535},"height":{"type":"integer","minimum":1,"maximum":65535},"videoCodec":{"type":"string","maxLength":256},"audioCodec":{"type":"string","maxLength":256}}},"metadata":{"$ref":"#/$defs/jsonObject"},"extensions":{"$ref":"#/$defs/extensions"}}},"assetMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/asset"}},"sequence":{"type":"object","additionalProperties":false,"required":["id","format","duration","trackIds","transitionIds","materialInstanceIds","markerIds"],"properties":{"id":{"$ref":"#/$defs/entityId"},"name":{"type":"string","maxLength":256},"format":{"type":"object","additionalProperties":false,"required":["width","height","pixelAspectRatio","frameRate","sampleRate","channelLayout","workingColorSpace","backgroundColor"],"properties":{"width":{"type":"integer","minimum":1,"maximum":65535},"height":{"type":"integer","minimum":1,"maximum":65535},"pixelAspectRatio":{"$ref":"#/$defs/rational"},"frameRate":{"$ref":"#/$defs/rational"},"sampleRate":{"enum":[44100,48000,96000]},"channelLayout":{"enum":["mono","stereo","5.1"]},"workingColorSpace":{"enum":["srgb-linear","display-p3-linear","rec2020-linear"]},"transferFunction":{"enum":["srgb","gamma22","pq","hlg"],"default":"srgb"},"bitDepth":{"enum":[8,10],"default":8},"backgroundColor":{"$ref":"#/$defs/color"}}},"duration":{"oneOf":[{"type":"object","additionalProperties":false,"required":["mode"],"properties":{"mode":{"const":"content"}}},{"type":"object","additionalProperties":false,"required":["mode","durationUs","overflow"],"properties":{"mode":{"const":"fixed"},"durationUs":{"$ref":"#/$defs/timeUs"},"overflow":{"enum":["clip","allow"]}}}]},"trackIds":{"$ref":"#/$defs/idList"},"transitionIds":{"$ref":"#/$defs/idList"},"materialInstanceIds":{"$ref":"#/$defs/idList"},"markerIds":{"$ref":"#/$defs/idList"},"extensions":{"$ref":"#/$defs/extensions"}}},"sequenceMap":{"type":"object","minProperties":1,"maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/sequence"}},"idList":{"type":"array","maxItems":16384,"items":{"$ref":"#/$defs/entityId"}},"track":{"type":"object","additionalProperties":false,"required":["id","sequenceId","kind","enabled","locked","itemIds","materialInstanceIds"],"properties":{"id":{"$ref":"#/$defs/entityId"},"sequenceId":{"$ref":"#/$defs/entityId"},"kind":{"enum":["visual","audio","caption"]},"name":{"type":"string","maxLength":256},"enabled":{"type":"boolean"},"locked":{"type":"boolean"},"itemIds":{"$ref":"#/$defs/idList"},"materialInstanceIds":{"$ref":"#/$defs/idList"},"audio":{"type":"object","additionalProperties":false,"required":["gainDb","pan","muted"],"properties":{"gainDb":{"$ref":"#/$defs/animatableNumber"},"pan":{"$ref":"#/$defs/animatableNumber"},"muted":{"type":"boolean"},"solo":{"type":"boolean","default":false}}},"extensions":{"$ref":"#/$defs/extensions"}}},"trackMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/track"}},"baseItem":{"type":"object","required":["id","trackId","type","enabled","range","materialInstanceIds"],"properties":{"id":{"$ref":"#/$defs/entityId"},"trackId":{"$ref":"#/$defs/entityId"},"type":{"enum":["video","audio","image","text","caption","shape","generator","nested-sequence","adjustment","material-content"]},"name":{"type":"string","maxLength":256},"enabled":{"type":"boolean"},"range":{"$ref":"#/$defs/range"},"materialInstanceIds":{"$ref":"#/$defs/idList"},"linkGroupId":{"$ref":"#/$defs/entityId"},"markerIds":{"$ref":"#/$defs/idList"},"metadata":{"$ref":"#/$defs/jsonObject"},"extensions":{"$ref":"#/$defs/extensions"}}},"mediaSource":{"type":"object","additionalProperties":false,"required":["assetId","stream","sourceRange","timeMapping"],"properties":{"assetId":{"$ref":"#/$defs/entityId"},"stream":{"type":"object","additionalProperties":false,"required":["type","index"],"properties":{"type":{"enum":["video","audio"]},"index":{"type":"integer","minimum":0,"maximum":1024}}},"sourceRange":{"$ref":"#/$defs/range"},"timeMapping":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","rate","reverse","boundary"],"properties":{"type":{"const":"linear"},"rate":{"$ref":"#/$defs/rational"},"reverse":{"type":"boolean"},"boundary":{"enum":["error","hold","loop","transparent"]}}},{"type":"object","additionalProperties":false,"required":["type","points","boundary"],"properties":{"type":{"const":"curve"},"points":{"type":"array","minItems":2,"maxItems":4096,"items":{"type":"object","maxProperties":4096,"additionalProperties":true,"required":["itemTimeUs","sourceTimeUs","interpolation"],"properties":{"itemTimeUs":{"$ref":"#/$defs/timeUs"},"sourceTimeUs":{"$ref":"#/$defs/timeUs"},"interpolation":{"enum":["linear","hold","cubic"]}}}},"boundary":{"enum":["error","hold","loop","transparent"]}}}]}}},"visual":{"type":"object","additionalProperties":false,"required":["fit","transform","crop","opacity","blendMode"],"properties":{"fit":{"enum":["contain","cover","fill","none"]},"transform":{"type":"object","additionalProperties":false,"required":["positionPx","anchor","scale","rotationDeg","skewDeg"],"properties":{"positionPx":{"$ref":"#/$defs/animatableVec2"},"anchor":{"$ref":"#/$defs/animatableVec2"},"scale":{"$ref":"#/$defs/animatableVec2"},"rotationDeg":{"$ref":"#/$defs/animatableNumber"},"skewDeg":{"$ref":"#/$defs/animatableVec2"}}},"crop":{"oneOf":[{"type":"object","additionalProperties":false,"required":["left","top","right","bottom"],"properties":{"left":{"type":"number","minimum":0,"maximum":1},"top":{"type":"number","minimum":0,"maximum":1},"right":{"type":"number","minimum":0,"maximum":1},"bottom":{"type":"number","minimum":0,"maximum":1}}},{"$ref":"#/$defs/animation"}]},"opacity":{"$ref":"#/$defs/animatableNumber"},"blendMode":{"enum":["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion"]},"mask":{"type":"object","additionalProperties":false,"required":["sourceItemId","channel","invert","featherPx","space","consumeSource"],"properties":{"sourceItemId":{"$ref":"#/$defs/entityId"},"channel":{"enum":["alpha","luma"]},"invert":{"type":"boolean"},"featherPx":{"type":"number","minimum":0,"maximum":4096},"space":{"enum":["source","canvas"]},"consumeSource":{"type":"boolean"}}}}},"audioProperties":{"type":"object","additionalProperties":false,"required":["gainDb","pan"],"properties":{"gainDb":{"$ref":"#/$defs/animatableNumber"},"pan":{"$ref":"#/$defs/animatableNumber"},"fadeInUs":{"$ref":"#/$defs/timeUs"},"fadeOutUs":{"$ref":"#/$defs/timeUs"},"pitchPolicy":{"enum":["varispeed","preserve"],"description":"Varispeed follows source time directly; preserve uses deterministic overlap-add time stretching."},"channelMap":{"type":"array","maxItems":16384,"items":{"type":"array","maxItems":16384,"items":{"type":"number"}}}}},"videoItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["source","visual"],"properties":{"type":{"const":"video"},"source":{"$ref":"#/$defs/mediaSource"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"audioItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["source","audio"],"properties":{"type":{"const":"audio"},"source":{"$ref":"#/$defs/mediaSource"},"audio":{"$ref":"#/$defs/audioProperties"}}}],"unevaluatedProperties":false},"imageItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["source","visual"],"properties":{"type":{"const":"image"},"source":{"$ref":"#/$defs/mediaSource"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"textItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["box","overflow","writingMode","paragraphs","visual"],"properties":{"type":{"const":"text"},"box":{"type":"object","additionalProperties":false,"required":["x","y","width","height"],"properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}}},"overflow":{"enum":["clip","ellipsis","visible","auto-fit"]},"writingMode":{"enum":["horizontal-tb","vertical-rl","vertical-lr"]},"paragraphs":{"type":"array","minItems":1,"maxItems":10000,"items":{"type":"object","additionalProperties":false,"required":["style","runs"],"properties":{"style":{"$ref":"#/$defs/jsonObject"},"runs":{"type":"array","minItems":1,"maxItems":10000,"items":{"type":"object","additionalProperties":false,"required":["text","style"],"properties":{"text":{"type":"string","maxLength":1000000},"style":{"$ref":"#/$defs/jsonObject"}}}}}}},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"captionItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["text","box","style","visual"],"properties":{"type":{"const":"caption"},"text":{"type":"string","maxLength":1000000},"box":{"type":"object","additionalProperties":false,"required":["x","y","width","height"],"properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}}},"style":{"$ref":"#/$defs/jsonObject"},"overflow":{"enum":["clip","auto-fit"]},"cueSettings":{"$ref":"#/$defs/jsonObject"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"nestedSequenceItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["source","visual"],"properties":{"type":{"const":"nested-sequence"},"source":{"type":"object","additionalProperties":false,"required":["sequenceId","sourceRange","timeMapping"],"properties":{"sequenceId":{"$ref":"#/$defs/entityId"},"sourceRange":{"$ref":"#/$defs/range"},"timeMapping":{"$ref":"#/$defs/mediaSource/properties/timeMapping"}}},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"generatorItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["generator","visual"],"properties":{"type":{"const":"generator"},"generator":{"type":"object","additionalProperties":false,"required":["kind","colors"],"properties":{"kind":{"enum":["solid","linear-gradient"]},"colors":{"type":"array","minItems":1,"maxItems":16,"items":{"$ref":"#/$defs/color"}},"angleDeg":{"type":"number"}}},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"adjustmentItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["visual"],"properties":{"type":{"const":"adjustment"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"shapeItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["shape","visual"],"properties":{"type":{"const":"shape"},"shape":{"type":"object","additionalProperties":false,"required":["kind","box","fill"],"properties":{"kind":{"enum":["rectangle","ellipse","polygon"]},"box":{"type":"object","additionalProperties":false,"required":["x","y","width","height"],"properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}}},"fill":{"$ref":"#/$defs/color"},"stroke":{"$ref":"#/$defs/color"},"strokeWidthPx":{"type":"number","minimum":0,"maximum":4096},"cornerRadiusPx":{"type":"number","minimum":0,"maximum":32768},"points":{"type":"array","minItems":3,"maxItems":1024,"items":{"$ref":"#/$defs/vec2"}}}},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"materialContentItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["materialInstanceId","visual"],"properties":{"type":{"const":"material-content"},"materialInstanceId":{"$ref":"#/$defs/entityId"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"item":{"oneOf":[{"$ref":"#/$defs/videoItem"},{"$ref":"#/$defs/audioItem"},{"$ref":"#/$defs/imageItem"},{"$ref":"#/$defs/textItem"},{"$ref":"#/$defs/captionItem"},{"$ref":"#/$defs/nestedSequenceItem"},{"$ref":"#/$defs/generatorItem"},{"$ref":"#/$defs/adjustmentItem"},{"$ref":"#/$defs/materialContentItem"},{"$ref":"#/$defs/shapeItem"}]},"itemMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/item"}},"transition":{"type":"object","additionalProperties":false,"required":["id","sequenceId","trackId","kind","fromItemId","toItemId","range","materialInstanceId"],"properties":{"id":{"$ref":"#/$defs/entityId"},"sequenceId":{"$ref":"#/$defs/entityId"},"trackId":{"$ref":"#/$defs/entityId"},"kind":{"enum":["visual","audio"]},"fromItemId":{"$ref":"#/$defs/entityId"},"toItemId":{"$ref":"#/$defs/entityId"},"range":{"$ref":"#/$defs/range"},"materialInstanceId":{"$ref":"#/$defs/entityId"},"extensions":{"$ref":"#/$defs/extensions"}}},"transitionMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/transition"}},"marker":{"type":"object","additionalProperties":false,"required":["id","owner","timeUs","durationUs"],"properties":{"id":{"$ref":"#/$defs/entityId"},"owner":{"type":"object","additionalProperties":false,"required":["type","id"],"properties":{"type":{"enum":["sequence","item"]},"id":{"$ref":"#/$defs/entityId"}}},"timeUs":{"$ref":"#/$defs/timeUs"},"durationUs":{"$ref":"#/$defs/timeUs"},"label":{"type":"string","maxLength":1024},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}(?:[0-9a-fA-F]{2})?$"},"payload":{"$ref":"#/$defs/jsonValue"}}},"markerMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/marker"}},"linkGroup":{"type":"object","additionalProperties":false,"required":["id","kind","itemIds"],"properties":{"id":{"$ref":"#/$defs/entityId"},"kind":{"enum":["av-sync","edit-group"]},"itemIds":{"$ref":"#/$defs/idList"},"syncOffsetsUs":{"type":"object","maxProperties":4096,"additionalProperties":{"$ref":"#/$defs/safeInteger"}}}},"linkGroupMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/linkGroup"}}}}`);
9
+ const projectSchema = JSON.parse(String.raw `{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://schemas.aelion.dev/project/v1.json","title":"Aelion Project Document v1","type":"object","additionalProperties":false,"required":["$schema","schemaVersion","projectId","metadata","settings","assets","sequences","tracks","items","materialInstances","transitions","markers","linkGroups","extensions"],"properties":{"$schema":{"const":"https://schemas.aelion.dev/project/v1.json"},"schemaVersion":{"const":"1.0.0"},"projectId":{"$ref":"#/$defs/entityId"},"metadata":{"$ref":"#/$defs/jsonObject"},"settings":{"$ref":"#/$defs/settings"},"assets":{"$ref":"#/$defs/assetMap"},"sequences":{"$ref":"#/$defs/sequenceMap"},"tracks":{"$ref":"#/$defs/trackMap"},"items":{"$ref":"#/$defs/itemMap"},"materialInstances":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"https://schemas.aelion.dev/material/instance/v1.json"}},"transitions":{"$ref":"#/$defs/transitionMap"},"markers":{"$ref":"#/$defs/markerMap"},"linkGroups":{"$ref":"#/$defs/linkGroupMap"},"extensions":{"$ref":"#/$defs/extensions"}},"$defs":{"entityId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z][A-Za-z0-9._:-]*$"},"safeInteger":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timeUs":{"type":"integer","minimum":0,"maximum":9007199254740991},"positiveDurationUs":{"type":"integer","minimum":1,"maximum":9007199254740991},"jsonValue":{"oneOf":[{"type":"null"},{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"array","maxItems":16384,"items":{"$ref":"#/$defs/jsonValue"}},{"type":"object","maxProperties":4096,"additionalProperties":{"$ref":"#/$defs/jsonValue"}}]},"jsonObject":{"type":"object","maxProperties":4096,"additionalProperties":{"$ref":"#/$defs/jsonValue"}},"extensions":{"type":"object","maxProperties":4096,"propertyNames":{"type":"string","pattern":"^[a-z0-9]+(?:\\.[a-z0-9-]+)+$"},"additionalProperties":{"$ref":"#/$defs/jsonValue"}},"rational":{"type":"object","additionalProperties":false,"required":["numerator","denominator"],"properties":{"numerator":{"type":"integer","minimum":1,"maximum":9007199254740991},"denominator":{"type":"integer","minimum":1,"maximum":9007199254740991}}},"range":{"type":"object","additionalProperties":false,"required":["startUs","durationUs"],"properties":{"startUs":{"$ref":"#/$defs/timeUs"},"durationUs":{"$ref":"#/$defs/positiveDurationUs"}}},"color":{"type":"object","additionalProperties":false,"required":["space","rgba"],"properties":{"space":{"enum":["srgb-linear","display-p3-linear","rec2020-linear"]},"rgba":{"type":"array","minItems":4,"maxItems":4,"items":{"type":"number"}}}},"vec2":{"type":"object","additionalProperties":false,"required":["x","y"],"properties":{"x":{"type":"number"},"y":{"type":"number"}}},"animation":{"type":"object","additionalProperties":false,"required":["animation"],"properties":{"animation":{"type":"object","additionalProperties":false,"required":["timeSpace","preInfinity","postInfinity","keyframes"],"properties":{"timeSpace":{"enum":["item","sequence"]},"preInfinity":{"enum":["hold","linear","none","cycle","ping-pong"]},"postInfinity":{"enum":["hold","linear","none","cycle","ping-pong"]},"keyframes":{"type":"array","minItems":1,"maxItems":4096,"items":{"type":"object","additionalProperties":false,"required":["timeUs","value","interpolation"],"properties":{"timeUs":{"$ref":"#/$defs/timeUs"},"value":{"$ref":"#/$defs/jsonValue"},"interpolation":{"enum":["hold","linear","cubic-bezier"]},"easing":{"type":"object","required":["type"],"properties":{"type":{"enum":["linear","steps","cubic-bezier"]},"count":{"type":"integer","minimum":1},"position":{"enum":["start","end"]},"x1":{"type":"number"},"y1":{"type":"number"},"x2":{"type":"number"},"y2":{"type":"number"}},"additionalProperties":false}}}}}}}},"animatableNumber":{"oneOf":[{"type":"number"},{"$ref":"#/$defs/animation"}]},"animatableVec2":{"oneOf":[{"$ref":"#/$defs/vec2"},{"$ref":"#/$defs/animation"}]},"settings":{"type":"object","additionalProperties":false,"required":["defaultSequenceId","defaultStillDurationUs","missingAssetPolicy","missingMaterialPolicy","missingPluginPolicy"],"properties":{"defaultSequenceId":{"$ref":"#/$defs/entityId"},"defaultStillDurationUs":{"$ref":"#/$defs/positiveDurationUs"},"locale":{"type":"string","minLength":1,"maxLength":128},"timezone":{"type":"string","minLength":1,"maxLength":128},"missingAssetPolicy":{"enum":["placeholder","error"]},"missingMaterialPolicy":{"enum":["placeholder","error"]},"missingPluginPolicy":{"enum":["placeholder","error"]}}},"assetLocator":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","uri"],"properties":{"type":{"const":"url"},"uri":{"type":"string","minLength":1,"maxLength":8192}}},{"type":"object","additionalProperties":false,"required":["type","bindingId"],"properties":{"type":{"const":"runtime-binding"},"bindingId":{"$ref":"#/$defs/entityId"}}},{"type":"object","additionalProperties":false,"required":["type","path"],"properties":{"type":{"const":"opfs"},"path":{"type":"string","minLength":1,"maxLength":4096}}},{"type":"object","additionalProperties":false,"required":["type","mimeType","base64"],"properties":{"type":{"const":"data"},"mimeType":{"type":"string","minLength":1,"maxLength":256},"base64":{"type":"string","maxLength":349528}}}]},"asset":{"type":"object","additionalProperties":false,"required":["id","kind","locator"],"properties":{"id":{"$ref":"#/$defs/entityId"},"kind":{"enum":["video","audio","image","font","lut","binary"]},"name":{"type":"string","maxLength":256},"locator":{"$ref":"#/$defs/assetLocator"},"contentHash":{"type":"object","additionalProperties":false,"required":["algorithm","value"],"properties":{"algorithm":{"const":"sha256"},"value":{"type":"string","pattern":"^[0-9a-f]{64}$"}}},"byteLength":{"type":"integer","minimum":0,"maximum":9007199254740991},"mimeType":{"type":"string","minLength":1,"maxLength":256},"representations":{"type":"array","maxItems":32,"items":{"type":"object","maxProperties":4096,"additionalProperties":true,"required":["id","role","locator"],"properties":{"id":{"$ref":"#/$defs/entityId"},"role":{"enum":["original","proxy","thumbnail","waveform"]},"locator":{"$ref":"#/$defs/assetLocator"}}}},"probeHint":{"type":"object","additionalProperties":false,"properties":{"durationUs":{"$ref":"#/$defs/positiveDurationUs"},"width":{"type":"integer","minimum":1,"maximum":65535},"height":{"type":"integer","minimum":1,"maximum":65535},"videoCodec":{"type":"string","maxLength":256},"audioCodec":{"type":"string","maxLength":256}}},"metadata":{"$ref":"#/$defs/jsonObject"},"extensions":{"$ref":"#/$defs/extensions"}}},"assetMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/asset"}},"sequence":{"type":"object","additionalProperties":false,"required":["id","format","duration","trackIds","transitionIds","materialInstanceIds","markerIds"],"properties":{"id":{"$ref":"#/$defs/entityId"},"name":{"type":"string","maxLength":256},"format":{"type":"object","additionalProperties":false,"required":["width","height","pixelAspectRatio","frameRate","sampleRate","channelLayout","workingColorSpace","backgroundColor"],"properties":{"width":{"type":"integer","minimum":1,"maximum":65535},"height":{"type":"integer","minimum":1,"maximum":65535},"pixelAspectRatio":{"$ref":"#/$defs/rational"},"frameRate":{"$ref":"#/$defs/rational"},"sampleRate":{"enum":[44100,48000,96000]},"channelLayout":{"enum":["mono","stereo","5.1"]},"workingColorSpace":{"enum":["srgb-linear","display-p3-linear","rec2020-linear"]},"transferFunction":{"enum":["srgb","gamma22","pq","hlg"],"default":"srgb"},"colorPrimaries":{"enum":["bt709","display-p3","bt2020"],"default":"bt709"},"matrixCoefficients":{"enum":["rgb","bt709","bt2020-ncl"],"default":"rgb"},"colorRange":{"enum":["full","limited"],"default":"full"},"chromaSubsampling":{"enum":["rgb","4:4:4","4:2:2","4:2:0"],"default":"4:4:4"},"alphaMode":{"enum":["opaque","premultiplied"],"default":"premultiplied"},"toneMapping":{"enum":["none","bt2390","reinhard"],"default":"none"},"bitDepth":{"enum":[8,10],"default":8},"backgroundColor":{"$ref":"#/$defs/color"}}},"duration":{"oneOf":[{"type":"object","additionalProperties":false,"required":["mode"],"properties":{"mode":{"const":"content"}}},{"type":"object","additionalProperties":false,"required":["mode","durationUs","overflow"],"properties":{"mode":{"const":"fixed"},"durationUs":{"$ref":"#/$defs/timeUs"},"overflow":{"enum":["clip","allow"]}}}]},"trackIds":{"$ref":"#/$defs/idList"},"transitionIds":{"$ref":"#/$defs/idList"},"materialInstanceIds":{"$ref":"#/$defs/idList"},"markerIds":{"$ref":"#/$defs/idList"},"extensions":{"$ref":"#/$defs/extensions"}}},"sequenceMap":{"type":"object","minProperties":1,"maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/sequence"}},"idList":{"type":"array","maxItems":16384,"items":{"$ref":"#/$defs/entityId"}},"track":{"type":"object","additionalProperties":false,"required":["id","sequenceId","kind","enabled","locked","itemIds","materialInstanceIds"],"properties":{"id":{"$ref":"#/$defs/entityId"},"sequenceId":{"$ref":"#/$defs/entityId"},"kind":{"enum":["visual","audio","caption"]},"name":{"type":"string","maxLength":256},"enabled":{"type":"boolean"},"locked":{"type":"boolean"},"itemIds":{"$ref":"#/$defs/idList"},"materialInstanceIds":{"$ref":"#/$defs/idList"},"audio":{"type":"object","additionalProperties":false,"required":["gainDb","pan","muted"],"properties":{"gainDb":{"$ref":"#/$defs/animatableNumber"},"pan":{"$ref":"#/$defs/animatableNumber"},"muted":{"type":"boolean"},"solo":{"type":"boolean","default":false}}},"extensions":{"$ref":"#/$defs/extensions"}}},"trackMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/track"}},"baseItem":{"type":"object","required":["id","trackId","type","enabled","range","materialInstanceIds"],"properties":{"id":{"$ref":"#/$defs/entityId"},"trackId":{"$ref":"#/$defs/entityId"},"type":{"enum":["video","audio","image","text","caption","shape","generator","nested-sequence","adjustment","material-content"]},"name":{"type":"string","maxLength":256},"enabled":{"type":"boolean"},"range":{"$ref":"#/$defs/range"},"materialInstanceIds":{"$ref":"#/$defs/idList"},"linkGroupId":{"$ref":"#/$defs/entityId"},"markerIds":{"$ref":"#/$defs/idList"},"metadata":{"$ref":"#/$defs/jsonObject"},"extensions":{"$ref":"#/$defs/extensions"}}},"mediaSource":{"type":"object","additionalProperties":false,"required":["assetId","stream","sourceRange","timeMapping"],"properties":{"assetId":{"$ref":"#/$defs/entityId"},"stream":{"type":"object","additionalProperties":false,"required":["type","index"],"properties":{"type":{"enum":["video","audio"]},"index":{"type":"integer","minimum":0,"maximum":1024}}},"sourceRange":{"$ref":"#/$defs/range"},"timeMapping":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","rate","reverse","boundary"],"properties":{"type":{"const":"linear"},"rate":{"$ref":"#/$defs/rational"},"reverse":{"type":"boolean"},"boundary":{"enum":["error","hold","loop","transparent"]}}},{"type":"object","additionalProperties":false,"required":["type","points","boundary"],"properties":{"type":{"const":"curve"},"points":{"type":"array","minItems":2,"maxItems":4096,"items":{"type":"object","maxProperties":4096,"additionalProperties":true,"required":["itemTimeUs","sourceTimeUs","interpolation"],"properties":{"itemTimeUs":{"$ref":"#/$defs/timeUs"},"sourceTimeUs":{"$ref":"#/$defs/timeUs"},"interpolation":{"enum":["linear","hold","cubic"]}}}},"boundary":{"enum":["error","hold","loop","transparent"]}}}]}}},"visual":{"type":"object","additionalProperties":false,"required":["fit","transform","crop","opacity","blendMode"],"properties":{"fit":{"enum":["contain","cover","fill","none"]},"transform":{"type":"object","additionalProperties":false,"required":["positionPx","anchor","scale","rotationDeg","skewDeg"],"properties":{"positionPx":{"$ref":"#/$defs/animatableVec2"},"anchor":{"$ref":"#/$defs/animatableVec2"},"scale":{"$ref":"#/$defs/animatableVec2"},"rotationDeg":{"$ref":"#/$defs/animatableNumber"},"skewDeg":{"$ref":"#/$defs/animatableVec2"}}},"crop":{"oneOf":[{"type":"object","additionalProperties":false,"required":["left","top","right","bottom"],"properties":{"left":{"type":"number","minimum":0,"maximum":1},"top":{"type":"number","minimum":0,"maximum":1},"right":{"type":"number","minimum":0,"maximum":1},"bottom":{"type":"number","minimum":0,"maximum":1}}},{"$ref":"#/$defs/animation"}]},"opacity":{"$ref":"#/$defs/animatableNumber"},"blendMode":{"enum":["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion"]},"mask":{"type":"object","additionalProperties":false,"required":["sourceItemId","channel","invert","featherPx","space","consumeSource"],"properties":{"sourceItemId":{"$ref":"#/$defs/entityId"},"channel":{"enum":["alpha","luma"]},"invert":{"type":"boolean"},"featherPx":{"type":"number","minimum":0,"maximum":4096},"space":{"enum":["source","canvas"]},"consumeSource":{"type":"boolean"}}}}},"audioProperties":{"type":"object","additionalProperties":false,"required":["gainDb","pan"],"properties":{"gainDb":{"$ref":"#/$defs/animatableNumber"},"pan":{"$ref":"#/$defs/animatableNumber"},"fadeInUs":{"$ref":"#/$defs/timeUs"},"fadeOutUs":{"$ref":"#/$defs/timeUs"},"pitchPolicy":{"enum":["varispeed","preserve"],"description":"Varispeed follows source time directly; preserve uses deterministic overlap-add time stretching."},"channelMap":{"type":"array","maxItems":16384,"items":{"type":"array","maxItems":16384,"items":{"type":"number"}}}}},"videoItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["source","visual"],"properties":{"type":{"const":"video"},"source":{"$ref":"#/$defs/mediaSource"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"audioItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["source","audio"],"properties":{"type":{"const":"audio"},"source":{"$ref":"#/$defs/mediaSource"},"audio":{"$ref":"#/$defs/audioProperties"}}}],"unevaluatedProperties":false},"imageItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["source","visual"],"properties":{"type":{"const":"image"},"source":{"$ref":"#/$defs/mediaSource"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"textItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["box","overflow","writingMode","paragraphs","visual"],"properties":{"type":{"const":"text"},"box":{"type":"object","additionalProperties":false,"required":["x","y","width","height"],"properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}}},"overflow":{"enum":["clip","ellipsis","visible","auto-fit"]},"writingMode":{"enum":["horizontal-tb","vertical-rl","vertical-lr"]},"paragraphs":{"type":"array","minItems":1,"maxItems":10000,"items":{"type":"object","additionalProperties":false,"required":["style","runs"],"properties":{"style":{"$ref":"#/$defs/jsonObject"},"runs":{"type":"array","minItems":1,"maxItems":10000,"items":{"type":"object","additionalProperties":false,"required":["text","style"],"properties":{"text":{"type":"string","maxLength":1000000},"style":{"$ref":"#/$defs/jsonObject"}}}}}}},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"captionItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["text","box","style","visual"],"properties":{"type":{"const":"caption"},"text":{"type":"string","maxLength":1000000},"box":{"type":"object","additionalProperties":false,"required":["x","y","width","height"],"properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}}},"style":{"$ref":"#/$defs/jsonObject"},"overflow":{"enum":["clip","auto-fit"]},"cueSettings":{"$ref":"#/$defs/jsonObject"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"nestedSequenceItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["source","visual"],"properties":{"type":{"const":"nested-sequence"},"source":{"type":"object","additionalProperties":false,"required":["sequenceId","sourceRange","timeMapping"],"properties":{"sequenceId":{"$ref":"#/$defs/entityId"},"sourceRange":{"$ref":"#/$defs/range"},"timeMapping":{"$ref":"#/$defs/mediaSource/properties/timeMapping"}}},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"generatorItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["generator","visual"],"properties":{"type":{"const":"generator"},"generator":{"type":"object","additionalProperties":false,"required":["kind","colors"],"properties":{"kind":{"enum":["solid","linear-gradient"]},"colors":{"type":"array","minItems":1,"maxItems":16,"items":{"$ref":"#/$defs/color"}},"angleDeg":{"type":"number"}}},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"adjustmentItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["visual"],"properties":{"type":{"const":"adjustment"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"shapeItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["shape","visual"],"properties":{"type":{"const":"shape"},"shape":{"type":"object","additionalProperties":false,"required":["kind","box","fill"],"properties":{"kind":{"enum":["rectangle","ellipse","polygon"]},"box":{"type":"object","additionalProperties":false,"required":["x","y","width","height"],"properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}}},"fill":{"$ref":"#/$defs/color"},"stroke":{"$ref":"#/$defs/color"},"strokeWidthPx":{"type":"number","minimum":0,"maximum":4096},"cornerRadiusPx":{"type":"number","minimum":0,"maximum":32768},"points":{"type":"array","minItems":3,"maxItems":1024,"items":{"$ref":"#/$defs/vec2"}}}},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"materialContentItem":{"type":"object","allOf":[{"$ref":"#/$defs/baseItem"},{"type":"object","required":["materialInstanceId","visual"],"properties":{"type":{"const":"material-content"},"materialInstanceId":{"$ref":"#/$defs/entityId"},"visual":{"$ref":"#/$defs/visual"}}}],"unevaluatedProperties":false},"item":{"oneOf":[{"$ref":"#/$defs/videoItem"},{"$ref":"#/$defs/audioItem"},{"$ref":"#/$defs/imageItem"},{"$ref":"#/$defs/textItem"},{"$ref":"#/$defs/captionItem"},{"$ref":"#/$defs/nestedSequenceItem"},{"$ref":"#/$defs/generatorItem"},{"$ref":"#/$defs/adjustmentItem"},{"$ref":"#/$defs/materialContentItem"},{"$ref":"#/$defs/shapeItem"}]},"itemMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/item"}},"transition":{"type":"object","additionalProperties":false,"required":["id","sequenceId","trackId","kind","fromItemId","toItemId","range","materialInstanceId"],"properties":{"id":{"$ref":"#/$defs/entityId"},"sequenceId":{"$ref":"#/$defs/entityId"},"trackId":{"$ref":"#/$defs/entityId"},"kind":{"enum":["visual","audio"]},"fromItemId":{"$ref":"#/$defs/entityId"},"toItemId":{"$ref":"#/$defs/entityId"},"range":{"$ref":"#/$defs/range"},"materialInstanceId":{"$ref":"#/$defs/entityId"},"extensions":{"$ref":"#/$defs/extensions"}}},"transitionMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/transition"}},"marker":{"type":"object","additionalProperties":false,"required":["id","owner","timeUs","durationUs"],"properties":{"id":{"$ref":"#/$defs/entityId"},"owner":{"type":"object","additionalProperties":false,"required":["type","id"],"properties":{"type":{"enum":["sequence","item"]},"id":{"$ref":"#/$defs/entityId"}}},"timeUs":{"$ref":"#/$defs/timeUs"},"durationUs":{"$ref":"#/$defs/timeUs"},"label":{"type":"string","maxLength":1024},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}(?:[0-9a-fA-F]{2})?$"},"payload":{"$ref":"#/$defs/jsonValue"}}},"markerMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/marker"}},"linkGroup":{"type":"object","additionalProperties":false,"required":["id","kind","itemIds"],"properties":{"id":{"$ref":"#/$defs/entityId"},"kind":{"enum":["av-sync","edit-group"]},"itemIds":{"$ref":"#/$defs/idList"},"syncOffsetsUs":{"type":"object","maxProperties":4096,"additionalProperties":{"$ref":"#/$defs/safeInteger"}}}},"linkGroupMap":{"type":"object","maxProperties":4096,"propertyNames":{"$ref":"#/$defs/entityId"},"additionalProperties":{"$ref":"#/$defs/linkGroup"}}}}`);
10
10
  const materialInstanceSchema = JSON.parse(String.raw `{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://schemas.aelion.dev/material/instance/v1.json","title":"Aelion Project Material Instance v1","type":"object","additionalProperties":false,"required":["id","definition","enabled","parameters"],"properties":{"id":{"type":"string","minLength":1,"maxLength":128},"definition":{"type":"object","additionalProperties":false,"required":["packageId","packageVersion","packageIntegrity","materialId"],"properties":{"packageId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[a-z0-9]+(?:[._-][a-z0-9]+)*$"},"packageVersion":{"type":"string","pattern":"^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"},"packageIntegrity":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"},"materialId":{"type":"string","minLength":1,"maxLength":96,"pattern":"^[A-Za-z][A-Za-z0-9_-]*$"}}},"name":{"type":"string","maxLength":256},"enabled":{"type":"boolean"},"previewPolicy":{"enum":["required","skippable-when-degraded"]},"parameters":{"type":"object","maxProperties":64,"additionalProperties":true},"resourceBindings":{"type":"object","maxProperties":16,"additionalProperties":true},"inputBindings":{"type":"object","maxProperties":16,"additionalProperties":true},"randomSeed":{"type":"integer","minimum":0,"maximum":4294967295},"extensions":{"type":"object","additionalProperties":true}}}`);
11
11
  /**
12
12
  * The canonical v1 validators bundled into the JavaScript artifact. Consumers
@@ -0,0 +1,13 @@
1
+ import type { CapabilityReport } from '@aelionsdk/capability';
2
+ import type { Diagnostic, JsonObject } from '@aelionsdk/core';
3
+ import type { AelionDiagnosticReport, AelionDiagnosticReportOptions, AelionSessionState, AelionSessionStats } from './types.js';
4
+ export declare function createAelionDiagnosticReport(input: {
5
+ readonly state: AelionSessionState;
6
+ readonly revision: bigint | null;
7
+ readonly capability: CapabilityReport | null;
8
+ readonly diagnostics: readonly Diagnostic[];
9
+ readonly stats: AelionSessionStats;
10
+ readonly media: JsonObject | null;
11
+ readonly options?: AelionDiagnosticReportOptions;
12
+ }): AelionDiagnosticReport;
13
+ //# sourceMappingURL=diagnostic-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic-report.d.ts","sourceRoot":"","sources":["../src/diagnostic-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAa,MAAM,iBAAiB,CAAC;AAEzE,OAAO,KAAK,EACV,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAwFpB,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,6BAA6B,CAAC;CAClD,GAAG,sBAAsB,CAgBzB"}
@@ -0,0 +1,107 @@
1
+ function jsonValue(value) {
2
+ if (value === null || typeof value === 'string' || typeof value === 'boolean')
3
+ return value;
4
+ if (typeof value === 'number')
5
+ return Number.isFinite(value) ? value : null;
6
+ if (typeof value === 'bigint')
7
+ return value.toString();
8
+ if (Array.isArray(value))
9
+ return value.map(jsonValue);
10
+ if (typeof value === 'object') {
11
+ const result = {};
12
+ for (const [key, member] of Object.entries(value)) {
13
+ if (member === undefined || typeof member === 'function' || typeof member === 'symbol') {
14
+ continue;
15
+ }
16
+ result[key] = jsonValue(member);
17
+ }
18
+ return result;
19
+ }
20
+ if (typeof value === 'symbol')
21
+ return value.description ?? '';
22
+ if (typeof value === 'function')
23
+ return `[function ${value.name || 'anonymous'}]`;
24
+ return null;
25
+ }
26
+ function safeDiagnostic(value, full) {
27
+ return {
28
+ code: value.code,
29
+ severity: value.severity,
30
+ recoverable: value.recoverable,
31
+ ...(value.path === undefined ? {} : { path: jsonValue(value.path) }),
32
+ ...(value.rangeUs === undefined ? {} : { rangeUs: jsonValue(value.rangeUs) }),
33
+ ...(full
34
+ ? {
35
+ message: value.message,
36
+ ...(value.entityId === undefined ? {} : { entityId: value.entityId }),
37
+ ...(value.details === undefined ? {} : { details: jsonValue(value.details) }),
38
+ }
39
+ : {}),
40
+ };
41
+ }
42
+ function safeProbe(value) {
43
+ return {
44
+ status: value.status,
45
+ available: value.available,
46
+ };
47
+ }
48
+ function capability(value, full) {
49
+ if (value === null)
50
+ return null;
51
+ if (full)
52
+ return jsonValue(value);
53
+ return jsonValue({
54
+ schemaVersion: value.schemaVersion,
55
+ generatedAt: value.generatedAt,
56
+ tier: value.tier,
57
+ codecs: value.codecs.map(codec => ({
58
+ id: codec.id,
59
+ kind: codec.kind,
60
+ codec: codec.codec,
61
+ supported: codec.supported,
62
+ })),
63
+ gpu: {
64
+ webgpu: safeProbe(value.gpu.webgpu),
65
+ webgl2: safeProbe(value.gpu.webgl2),
66
+ offscreenCanvas: safeProbe(value.gpu.offscreenCanvas),
67
+ worker: safeProbe(value.gpu.worker),
68
+ },
69
+ audio: {
70
+ audioContext: safeProbe(value.audio.audioContext),
71
+ audioWorklet: safeProbe(value.audio.audioWorklet),
72
+ sharedArrayBuffer: safeProbe(value.audio.sharedArrayBuffer),
73
+ },
74
+ storage: {
75
+ opfs: safeProbe(value.storage.opfs),
76
+ fileSystemAccess: safeProbe(value.storage.fileSystemAccess),
77
+ transferableStreams: safeProbe(value.storage.transferableStreams),
78
+ },
79
+ color: {
80
+ displayP3Gamut: safeProbe(value.color.displayP3Gamut),
81
+ highDynamicRange: safeProbe(value.color.highDynamicRange),
82
+ localExecution: value.color.localExecution,
83
+ },
84
+ wasm: { available: safeProbe(value.wasm.available) },
85
+ environment: {
86
+ secureContext: value.environment.secureContext,
87
+ crossOriginIsolated: value.environment.crossOriginIsolated,
88
+ },
89
+ });
90
+ }
91
+ export function createAelionDiagnosticReport(input) {
92
+ const privacy = input.options?.privacy ?? 'safe';
93
+ const full = privacy === 'full';
94
+ return Object.freeze({
95
+ schemaVersion: '1.0.0',
96
+ generatedAt: new Date().toISOString(),
97
+ privacy,
98
+ session: Object.freeze({
99
+ state: input.state,
100
+ revision: input.revision?.toString() ?? null,
101
+ }),
102
+ capability: capability(input.capability, full),
103
+ diagnostics: Object.freeze(input.diagnostics.map(value => safeDiagnostic(value, full))),
104
+ stats: jsonValue(input.stats),
105
+ media: input.media === null ? null : jsonValue(input.media),
106
+ });
107
+ }
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from './media-provider.js';
4
4
  export * from './production-media-provider.js';
5
5
  export * from './project-builder.js';
6
6
  export * from './composition.js';
7
+ export * from './diagnostic-report.js';
7
8
  export * from './migration.js';
8
9
  export * from './migration-materials.js';
9
10
  export * from './audio-controller.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAE3B,eAAO,MAAM,MAAM,EAAE,SAEpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAE3B,eAAO,MAAM,MAAM,EAAE,SAEpB,CAAC"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ export * from './media-provider.js';
4
4
  export * from './production-media-provider.js';
5
5
  export * from './project-builder.js';
6
6
  export * from './composition.js';
7
+ export * from './diagnostic-report.js';
7
8
  export * from './migration.js';
8
9
  export * from './migration-materials.js';
9
10
  export * from './audio-controller.js';
@@ -1,4 +1,5 @@
1
1
  import type { PcmSourceBlock } from '@aelionsdk/audio';
2
+ import { type JsonObject } from '@aelionsdk/core';
2
3
  import type { AelionMediaProvider } from './types.js';
3
4
  export type AelionAssetBytesResolver = (assetId: string, signal?: AbortSignal) => Promise<Uint8Array>;
4
5
  export interface ByteMediaProviderOptions {
@@ -45,5 +46,6 @@ export declare class ByteMediaProvider implements AelionMediaProvider {
45
46
  /** Compatibility alias for maxConcurrentOperations. */
46
47
  readonly maxConcurrentLoads: number;
47
48
  };
49
+ getDiagnosticSnapshot(): JsonObject;
48
50
  }
49
51
  //# sourceMappingURL=media-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"media-provider.d.ts","sourceRoot":"","sources":["../src/media-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAWvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,2FAA2F;IAC3F,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,qEAAqE;IACrE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,2FAA2F;IAC3F,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAgID;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,mBAAmB;;gBAgBxC,OAAO,EAAE,wBAAwB;IA2BvC,OAAO,CAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IA+BT,QAAQ,CACnB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC;IAiBnB,KAAK,IAAI,IAAI;IAOb,QAAQ,IAAI;QACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;QACvC,oFAAoF;QACpF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,mFAAmF;QACnF,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,8EAA8E;QAC9E,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;QAC5C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;QACzC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;QACtC,gDAAgD;QAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,iDAAiD;QACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,uDAAuD;QACvD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;KACrC;CA4NF"}
1
+ {"version":3,"file":"media-provider.d.ts","sourceRoot":"","sources":["../src/media-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAU/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;IACrD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,2FAA2F;IAC3F,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,qEAAqE;IACrE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,2FAA2F;IAC3F,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAgID;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,mBAAmB;;gBAgBxC,OAAO,EAAE,wBAAwB;IA2BvC,OAAO,CAClB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IA+BT,QAAQ,CACnB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC;IAiBnB,KAAK,IAAI,IAAI;IAOb,QAAQ,IAAI;QACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;QACvC,oFAAoF;QACpF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,mFAAmF;QACnF,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,8EAA8E;QAC9E,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;QAC5C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;QACzC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;QACtC,gDAAgD;QAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,iDAAiD;QACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,uDAAuD;QACvD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;KACrC;IAuBM,qBAAqB,IAAI,UAAU;CAyM3C"}
@@ -190,6 +190,9 @@ export class ByteMediaProvider {
190
190
  maxConcurrentLoads: this.#maxConcurrentOperations,
191
191
  };
192
192
  }
193
+ getDiagnosticSnapshot() {
194
+ return this.snapshot();
195
+ }
193
196
  async #asset(assetId, signal) {
194
197
  if (signal?.aborted === true)
195
198
  throw abortReason(signal);
@@ -0,0 +1,39 @@
1
+ import { type MigrationDiagnostic } from './migration.js';
2
+ export type MigrationSource = 'webav' | 'diffusion';
3
+ export interface MigrateProjectFileOptions {
4
+ readonly source: MigrationSource;
5
+ readonly inputPath: string;
6
+ readonly assetsPath?: string;
7
+ readonly outputPath?: string;
8
+ readonly reportPath?: string;
9
+ /** Reject migrations with unsupported rendering semantics. Defaults to true. */
10
+ readonly strict?: boolean;
11
+ /** Generate and validate the project without writing it. */
12
+ readonly dryRun?: boolean;
13
+ }
14
+ export interface ProjectMigrationFileReport {
15
+ readonly reportVersion: '1.0.0';
16
+ readonly source: MigrationSource;
17
+ readonly inputPath: string;
18
+ readonly assetsPath?: string;
19
+ readonly outputPath?: string;
20
+ readonly reportPath: string;
21
+ readonly strict: boolean;
22
+ readonly dryRun: boolean;
23
+ readonly status: 'passed' | 'lossy' | 'failed';
24
+ readonly projectId: string;
25
+ readonly projectBytes: number;
26
+ readonly projectSha256: string;
27
+ readonly diagnosticSummary: Readonly<Record<'info' | 'warning' | 'error', number>>;
28
+ readonly diagnostics: readonly MigrationDiagnostic[];
29
+ readonly entityMap: Readonly<Record<string, string>>;
30
+ }
31
+ /**
32
+ * Migrates a serialized WebAV snapshot or Diffusion Studio Core checkpoint.
33
+ *
34
+ * The report is always written before returning. Strict failures never write a
35
+ * project file, while `strict: false` makes an explicitly lossy project
36
+ * available together with the full loss report.
37
+ */
38
+ export declare function migrateProjectFile(options: MigrateProjectFileOptions): Promise<ProjectMigrationFileReport>;
39
+ //# sourceMappingURL=migrate-cli-lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-cli-lib.d.ts","sourceRoot":"","sources":["../src/migrate-cli-lib.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,mBAAmB,EAIzB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,WAAW,CAAC;AAEpD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACnF,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD;AA2ED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,0BAA0B,CAAC,CA+CrC"}
@@ -0,0 +1,119 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
3
+ import { basename, dirname, extname, resolve } from 'node:path';
4
+ import { migrateDiffusionCheckpoint, migrateWebAvProject, } from './migration.js';
5
+ function parseJson(source, path) {
6
+ try {
7
+ return JSON.parse(source);
8
+ }
9
+ catch (error) {
10
+ throw new TypeError(`${path} is not valid JSON`, { cause: error });
11
+ }
12
+ }
13
+ function object(value, path) {
14
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
15
+ throw new TypeError(`${path} must contain a JSON object`);
16
+ }
17
+ return value;
18
+ }
19
+ function array(value, path) {
20
+ if (!Array.isArray(value))
21
+ throw new TypeError(`${path} must contain a JSON array`);
22
+ return value;
23
+ }
24
+ async function readJson(path) {
25
+ return parseJson(await readFile(path, 'utf8'), path);
26
+ }
27
+ async function atomicWrite(path, data) {
28
+ const absolute = resolve(path);
29
+ await mkdir(dirname(absolute), { recursive: true });
30
+ const temporary = `${absolute}.${process.pid.toString()}.${randomUUID()}.tmp`;
31
+ await writeFile(temporary, data, 'utf8');
32
+ await rename(temporary, absolute);
33
+ }
34
+ function defaultOutputPath(inputPath) {
35
+ const absolute = resolve(inputPath);
36
+ const extension = extname(absolute);
37
+ const stem = basename(absolute, extension);
38
+ return resolve(dirname(absolute), `${stem}.aelion.json`);
39
+ }
40
+ function defaultReportPath(inputPath) {
41
+ const absolute = resolve(inputPath);
42
+ const extension = extname(absolute);
43
+ const stem = basename(absolute, extension);
44
+ return resolve(dirname(absolute), `${stem}.migration-report.json`);
45
+ }
46
+ function assetArray(value, path) {
47
+ if (Array.isArray(value))
48
+ return array(value, path);
49
+ const container = object(value, path);
50
+ return array(container.assets, `${path}.assets`);
51
+ }
52
+ function migrate(source, input, assets) {
53
+ if (source === 'webav') {
54
+ const snapshot = object(input, 'input');
55
+ const withAssets = assets === undefined
56
+ ? snapshot
57
+ : {
58
+ ...snapshot,
59
+ assets: assetArray(assets, 'assets'),
60
+ };
61
+ return migrateWebAvProject(withAssets, { strict: false });
62
+ }
63
+ return migrateDiffusionCheckpoint(input, {
64
+ strict: false,
65
+ assets: assets === undefined
66
+ ? []
67
+ : assetArray(assets, 'assets'),
68
+ });
69
+ }
70
+ /**
71
+ * Migrates a serialized WebAV snapshot or Diffusion Studio Core checkpoint.
72
+ *
73
+ * The report is always written before returning. Strict failures never write a
74
+ * project file, while `strict: false` makes an explicitly lossy project
75
+ * available together with the full loss report.
76
+ */
77
+ export async function migrateProjectFile(options) {
78
+ const inputPath = resolve(options.inputPath);
79
+ const assetsPath = options.assetsPath === undefined ? undefined : resolve(options.assetsPath);
80
+ const outputPath = options.outputPath === undefined ? defaultOutputPath(inputPath) : resolve(options.outputPath);
81
+ const reportPath = options.reportPath === undefined ? defaultReportPath(inputPath) : resolve(options.reportPath);
82
+ const strict = options.strict ?? true;
83
+ const dryRun = options.dryRun ?? false;
84
+ const [input, assets] = await Promise.all([
85
+ readJson(inputPath),
86
+ assetsPath === undefined ? Promise.resolve(undefined) : readJson(assetsPath),
87
+ ]);
88
+ const result = migrate(options.source, input, assets);
89
+ const projectSource = `${JSON.stringify(result.project, null, 2)}\n`;
90
+ const projectBytes = Buffer.byteLength(projectSource);
91
+ const projectSha256 = createHash('sha256').update(projectSource).digest('hex');
92
+ const diagnosticSummary = result.diagnostics.reduce((summary, diagnostic) => {
93
+ summary[diagnostic.severity] += 1;
94
+ return summary;
95
+ }, { info: 0, warning: 0, error: 0 });
96
+ const hasErrors = diagnosticSummary.error > 0;
97
+ const status = hasErrors ? (strict ? 'failed' : 'lossy') : 'passed';
98
+ if (!dryRun && status !== 'failed')
99
+ await atomicWrite(outputPath, projectSource);
100
+ const report = {
101
+ reportVersion: '1.0.0',
102
+ source: options.source,
103
+ inputPath,
104
+ ...(assetsPath === undefined ? {} : { assetsPath }),
105
+ ...(!dryRun && status !== 'failed' ? { outputPath } : {}),
106
+ reportPath,
107
+ strict,
108
+ dryRun,
109
+ status,
110
+ projectId: result.project.projectId,
111
+ projectBytes,
112
+ projectSha256,
113
+ diagnosticSummary,
114
+ diagnostics: result.diagnostics,
115
+ entityMap: result.entityMap,
116
+ };
117
+ await atomicWrite(reportPath, `${JSON.stringify(report, null, 2)}\n`);
118
+ return report;
119
+ }
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=migrate-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-cli.d.ts","sourceRoot":"","sources":["../src/migrate-cli.ts"],"names":[],"mappings":""}