stillmade-sdk 0.1.41 → 0.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/.stillmade/sdk-baseline.json +19 -21
  2. package/AGENTS.md +17 -12
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +67 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +42 -32
  8. package/README.md +3 -2
  9. package/SDK.md +1028 -563
  10. package/UI_AESTHETIC.md +30 -3
  11. package/blocks/generate/package.js +1 -0
  12. package/blocks/generate/versions/1.0.0/package.js +463 -0
  13. package/docs/build/audio-to-editor.md +36 -0
  14. package/docs/build/block-builder-contract.md +150 -0
  15. package/docs/build/comfyui.md +227 -0
  16. package/docs/build/concepts.md +40 -0
  17. package/docs/build/context.md +159 -0
  18. package/docs/build/cookbook.md +57 -0
  19. package/docs/build/custom-interface.md +617 -0
  20. package/docs/build/data-types.md +83 -0
  21. package/docs/build/frame-views.md +259 -0
  22. package/docs/build/generate-media.md +59 -0
  23. package/docs/build/github-applications.md +314 -0
  24. package/docs/build/hosted-images.md +214 -0
  25. package/docs/build/hosted-music.md +39 -0
  26. package/docs/build/hosted-speech.md +157 -0
  27. package/docs/build/hosted-text.md +246 -0
  28. package/docs/build/image-description.md +49 -0
  29. package/docs/build/interface-design.md +343 -0
  30. package/docs/build/javascript.md +63 -0
  31. package/docs/build/local-preview.md +61 -0
  32. package/docs/build/media-analysis.md +27 -0
  33. package/docs/build/media.md +400 -0
  34. package/docs/build/mobile-ui.md +106 -0
  35. package/docs/build/modules.md +487 -0
  36. package/docs/build/original-blocks.md +70 -0
  37. package/docs/build/outside-apis.md +128 -0
  38. package/docs/build/production-context-templates.md +12 -0
  39. package/docs/build/project-storage.md +94 -0
  40. package/docs/build/quickstart.md +48 -0
  41. package/docs/build/recipes.md +103 -0
  42. package/docs/build/script-handoff.md +45 -0
  43. package/docs/build/script-writer.md +34 -0
  44. package/docs/build/state.md +223 -0
  45. package/docs/build/testing.md +112 -0
  46. package/docs/build/timeline-edits.md +116 -0
  47. package/docs/build/timeline-proposals.md +76 -0
  48. package/docs/build/transcription.md +59 -0
  49. package/docs/build/triggers.md +59 -0
  50. package/docs/build/tutorial.md +52 -0
  51. package/docs/build/typescript.md +34 -0
  52. package/docs/build/video-generation.md +61 -0
  53. package/docs/build/web-reading.md +37 -0
  54. package/docs/build/with-your-ai.md +27 -0
  55. package/docs/changelog.md +9 -0
  56. package/docs/creators.md +21 -0
  57. package/docs/distribute/discovery.md +43 -0
  58. package/docs/distribute/imports.md +58 -0
  59. package/docs/distribute/publishing.md +29 -0
  60. package/docs/distribute/sdk-versions.md +36 -0
  61. package/docs/distribute/selling.md +14 -0
  62. package/docs/distribute/teams.md +60 -0
  63. package/docs/distribute/versioning.md +28 -0
  64. package/docs/examples.md +23 -0
  65. package/docs/gallery.md +26 -0
  66. package/docs/index.md +50 -0
  67. package/docs/native-mcp.md +307 -0
  68. package/docs/project-types/automation.md +43 -0
  69. package/docs/project-types/batches.md +50 -0
  70. package/docs/project-types/build.md +42 -0
  71. package/docs/project-types/completion.md +15 -0
  72. package/docs/project-types/conditions.md +21 -0
  73. package/docs/project-types/hosted-review.md +115 -0
  74. package/docs/project-types/onboarding.md +75 -0
  75. package/docs/project-types/running.md +309 -0
  76. package/docs/project-types/testing.md +72 -0
  77. package/docs/reference/application-artifacts.md +87 -0
  78. package/docs/reference/authoring-guide.md +134 -0
  79. package/docs/reference/browser-applications.md +267 -0
  80. package/docs/reference/capabilities.md +45 -0
  81. package/docs/reference/cli.md +71 -0
  82. package/docs/reference/connection-api.md +59 -0
  83. package/docs/reference/cooperative-jobs.md +13 -0
  84. package/docs/reference/desktop-capabilities.md +172 -0
  85. package/docs/reference/desktop-execution.md +77 -0
  86. package/docs/reference/errors.md +233 -0
  87. package/docs/reference/execution.md +800 -0
  88. package/docs/reference/first-party-blocks.md +40 -0
  89. package/docs/reference/generation-models.md +59 -0
  90. package/docs/reference/limits.md +306 -0
  91. package/docs/reference/manifest-kinds-controls.md +36 -0
  92. package/docs/reference/manifest.md +181 -0
  93. package/docs/reference/operations.md +36 -0
  94. package/docs/reference/package-jobs.md +35 -0
  95. package/docs/reference/parity.md +55 -0
  96. package/docs/reference/permissions.md +86 -0
  97. package/docs/reference/ports.md +26 -0
  98. package/docs/reference/types.md +268 -0
  99. package/docs/reference/universal-resolver.md +303 -0
  100. package/docs/reference/view-bridge.md +60 -0
  101. package/docs/reference/view-rules.md +15 -0
  102. package/docs/reference/workspace-sync.md +25 -0
  103. package/docs/sdk.md +34 -0
  104. package/docs/tools/block-remix.md +211 -0
  105. package/docs/tools/llm.md +2213 -0
  106. package/docs/tools/repository-adaptation.md +613 -0
  107. package/examples/check-clip.stillmade.json +8 -1
  108. package/examples/clean-text.stillmade.json +4 -0
  109. package/examples/custom-interface.stillmade.json +4 -0
  110. package/examples/describe-image.stillmade.json +4 -0
  111. package/examples/foley-cue.stillmade.json +4 -0
  112. package/examples/generate-image.stillmade.json +4 -0
  113. package/examples/generate-video.stillmade.json +10 -2
  114. package/examples/module-word-stats/stillmade.block.json +4 -0
  115. package/examples/narrate-script.stillmade.json +4 -0
  116. package/examples/numbered-takes.stillmade.json +4 -0
  117. package/examples/research-topic.stillmade.json +9 -1
  118. package/examples/score-a-scene.stillmade.json +4 -0
  119. package/examples/script-draft.stillmade.json +4 -0
  120. package/examples/summarize-page.stillmade.json +4 -0
  121. package/examples/text-workflow.stillmade.json +7 -32
  122. package/examples/thicken-lines.stillmade.json +4 -0
  123. package/examples/timeline-polish.stillmade.json +15 -3
  124. package/examples/transcribe-audio.stillmade.json +15 -3
  125. package/examples/word-count.stillmade.json +4 -0
  126. package/package.json +1 -1
  127. package/packages/block-cli/cli.js +13 -6
  128. package/packages/block-cli/dev-host/assets/host.js +81 -38
  129. package/packages/block-cli/dev-host/assets/index.css +1 -1
  130. package/packages/block-cli/format.js +1 -1
  131. package/packages/block-cli/ready-gate.js +4 -0
  132. package/packages/block-cli/templates.js +37 -19
  133. package/packages/block-cli/type-packages.js +119 -0
  134. package/packages/block-platform/block-readiness.js +8 -1
  135. package/packages/block-platform/canvas.js +2 -1
  136. package/packages/block-platform/catalog.js +27 -48
  137. package/packages/block-platform/native-host-inventory.js +0 -226
  138. package/packages/block-platform/plain-descriptions.js +1 -25
  139. package/packages/block-platform/project-type-starters.js +13 -53
  140. package/packages/block-platform/script-handoff.js +2 -4
  141. package/packages/block-platform/type-workspace.js +2 -0
  142. package/packages/block-sdk/appearance.js +3 -1
  143. package/packages/block-sdk/audio-generation-example.js +2 -2
  144. package/packages/block-sdk/block-tier.js +1 -1
  145. package/packages/block-sdk/builder-contract.js +13 -11
  146. package/packages/block-sdk/capabilities.js +1 -1
  147. package/packages/block-sdk/capability-example.js +1 -1
  148. package/packages/block-sdk/contracts.js +6 -2
  149. package/packages/block-sdk/examples.js +3 -3
  150. package/packages/block-sdk/first-party-identities.js +1 -84
  151. package/packages/block-sdk/first-party-packages.js +3 -85
  152. package/packages/block-sdk/generation-catalog.js +15 -3
  153. package/packages/block-sdk/image-description-example.js +1 -1
  154. package/packages/block-sdk/image-generation-example.js +1 -1
  155. package/packages/block-sdk/index.d.ts +2 -1
  156. package/packages/block-sdk/media-analysis-example.js +2 -2
  157. package/packages/block-sdk/mock-host.js +7 -1
  158. package/packages/block-sdk/module-example.js +1 -1
  159. package/packages/block-sdk/module-host-calls.js +35 -10
  160. package/packages/block-sdk/module-hosted.js +15 -2
  161. package/packages/block-sdk/module-media-access.js +71 -0
  162. package/packages/block-sdk/module-node.js +1 -1
  163. package/packages/block-sdk/portable-media-actions.js +1 -1
  164. package/packages/block-sdk/runtime.js +1 -1
  165. package/packages/block-sdk/speech-example.js +1 -1
  166. package/packages/block-sdk/state-example.js +1 -1
  167. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  168. package/packages/block-sdk/transcription-example.js +1 -1
  169. package/packages/block-sdk/trigger-examples.js +2 -2
  170. package/packages/block-sdk/video-generation-example.js +1 -1
  171. package/packages/block-sdk/view-bridge.js +4 -1
  172. package/packages/block-sdk/view-design.js +44 -15
  173. package/packages/block-sdk/web-example.js +2 -2
  174. package/packages/design-system/block-kit.css +53 -12
  175. package/packages/design-system/block-kit.html +3 -2
  176. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  177. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  178. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  179. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  180. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  181. package/blocks/narration/package.js +0 -1
  182. package/blocks/narration/versions/1.0.0/package.js +0 -221
  183. package/blocks/narration/versions/1.0.1/package.js +0 -221
  184. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  185. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  186. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  187. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  188. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  189. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  190. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  191. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  192. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  193. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  194. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  195. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  196. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  197. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  198. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  199. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  200. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  201. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  202. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  203. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  204. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  205. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  206. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  207. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  208. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  209. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  210. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  211. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  212. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  213. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  214. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  215. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  216. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  217. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  218. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  219. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  220. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  221. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  222. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  223. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  224. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  225. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  226. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  227. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  228. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  229. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  230. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  231. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  232. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  233. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  234. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  235. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  236. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  237. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  238. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  239. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  240. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  241. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  242. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  243. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  244. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  245. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  246. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  247. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  248. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  249. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  250. package/blocks/occasion-story/package.js +0 -1
  251. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  252. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  253. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  254. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  255. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  256. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  257. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  258. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  259. package/blocks/release-visuals/package.js +0 -1
  260. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  261. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  262. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  263. package/blocks/screen-recorder/package.js +0 -1
  264. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  265. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  266. package/blocks/short-form-finish/package.js +0 -1
  267. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  268. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  269. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  270. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  271. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  272. package/examples/saas-product-launch.stillmade.json +0 -304
  273. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  274. package/packages/block-platform/first-revenue-project-types.js +0 -46
  275. package/packages/block-platform/fixture-starters.js +0 -13
  276. package/packages/block-platform/launch-project-source.js +0 -10
  277. package/packages/block-platform/launch-project.js +0 -30
  278. package/packages/block-platform/motion-project-types.js +0 -55
  279. package/packages/block-platform/motion-starters.js +0 -14
  280. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  281. package/packages/block-platform/product-launch-updated.js +0 -90
  282. package/packages/block-platform/revenue-review-project-types.js +0 -36
  283. package/packages/block-platform/revenue-review-starters.js +0 -13
  284. package/packages/block-platform/script-writer.js +0 -29
  285. package/packages/block-platform/website-source-block.js +0 -14
@@ -1,2911 +0,0 @@
1
- // Generated from the independently owned versioned source.
2
- export default {
3
- "manifest": {
4
- "schemaVersion": 1,
5
- "sdkVersion": "0.1.0",
6
- "id": "stillmade.product-ad-variants",
7
- "version": "1.0.0",
8
- "name": "Product Ad Variants",
9
- "description": "Create three distinct source-footage previews and approved hooks ahead of the same full product demonstration. No generated scenes or invented claims.",
10
- "kind": "task",
11
- "runtime": "javascript",
12
- "entry": "src/run.js",
13
- "license": "MIT",
14
- "inputs": {
15
- "timeline": {
16
- "type": "timeline",
17
- "primary": true,
18
- "required": true,
19
- "default": {
20
- "schemaVersion": 1,
21
- "clips": [],
22
- "audioItems": [],
23
- "captions": [],
24
- "textOverlays": []
25
- },
26
- "semantic": "legacy.timeline.updatededitor",
27
- "sources": [
28
- "upstream",
29
- "user"
30
- ],
31
- "description": "Reviewed portrait demonstration from one original video. Keep its complete frame, source-speed cuts, approved copy and optional original speech/captions."
32
- },
33
- "hookA": {
34
- "type": "text",
35
- "default": "",
36
- "required": true,
37
- "description": "Exact approved hook A. Up to 64 characters; it must be supported by the real footage and offer.",
38
- "semantic": "stillmade.product_ad_variants.hooka",
39
- "sources": [
40
- "user",
41
- "default"
42
- ]
43
- },
44
- "hookB": {
45
- "type": "text",
46
- "default": "",
47
- "required": true,
48
- "description": "Exact approved hook B. Use a genuinely different opening angle, without inventing a benefit or claim.",
49
- "semantic": "stillmade.product_ad_variants.hookb",
50
- "sources": [
51
- "user",
52
- "default"
53
- ]
54
- },
55
- "hookC": {
56
- "type": "text",
57
- "default": "",
58
- "required": true,
59
- "description": "Exact approved hook C. Keep this distinct from A and B and supported by the source.",
60
- "semantic": "stillmade.product_ad_variants.hookc",
61
- "sources": [
62
- "user",
63
- "default"
64
- ]
65
- },
66
- "openingA": {
67
- "type": "number",
68
- "min": 0,
69
- "default": 0,
70
- "description": "Source-video start in seconds for preview A. Choose a visible product moment.",
71
- "semantic": "stillmade.product_ad_variants.openinga",
72
- "sources": [
73
- "user",
74
- "default"
75
- ],
76
- "required": false
77
- },
78
- "openingB": {
79
- "type": "number",
80
- "min": 0,
81
- "default": 2,
82
- "description": "Source-video start in seconds for preview B. It must not overlap the other two previews.",
83
- "semantic": "stillmade.product_ad_variants.openingb",
84
- "sources": [
85
- "user",
86
- "default"
87
- ],
88
- "required": false
89
- },
90
- "openingC": {
91
- "type": "number",
92
- "min": 0,
93
- "default": 4,
94
- "description": "Source-video start in seconds for preview C. Choose a different visible source moment.",
95
- "semantic": "stillmade.product_ad_variants.openingc",
96
- "sources": [
97
- "user",
98
- "default"
99
- ],
100
- "required": false
101
- },
102
- "openingDuration": {
103
- "type": "number",
104
- "min": 1,
105
- "max": 3,
106
- "default": 2,
107
- "description": "Length of each source preview, 1–3 seconds. The full unchanged demonstration follows each preview.",
108
- "semantic": "stillmade.product_ad_variants.openingduration",
109
- "sources": [
110
- "user",
111
- "default"
112
- ],
113
- "required": false
114
- },
115
- "copyApproved": {
116
- "type": "boolean",
117
- "default": false,
118
- "required": true,
119
- "sources": [
120
- "user"
121
- ],
122
- "description": "I have permission to use this footage and have approved all three exact hooks against what it actually shows.",
123
- "semantic": "stillmade.product_ad_variants.copyapproved"
124
- }
125
- },
126
- "outputs": {
127
- "variantA": {
128
- "type": "timeline",
129
- "primary": true,
130
- "semantic": "legacy.timeline.updatededitor",
131
- "description": "Variant A: its selected actual-footage preview and approved hook, followed by the full demonstration. Review and export separately."
132
- },
133
- "variantB": {
134
- "type": "timeline",
135
- "semantic": "legacy.timeline.updatededitor",
136
- "description": "Variant B: its selected actual-footage preview and approved hook, followed by the full demonstration. Review and export separately."
137
- },
138
- "variantC": {
139
- "type": "timeline",
140
- "semantic": "legacy.timeline.updatededitor",
141
- "description": "Variant C: its selected actual-footage preview and approved hook, followed by the full demonstration. Review and export separately."
142
- },
143
- "review": {
144
- "type": "json",
145
- "semantic": "stillmade.product_ad_variants.review",
146
- "description": "Exact source, opening selections, approved hooks and outstanding human review.",
147
- "schema": {
148
- "schemaVersion": "integer",
149
- "state": "string",
150
- "humanApproved": "boolean",
151
- "providerCalls": "integer",
152
- "source": {
153
- "assetId": "string",
154
- "versionId": "string"
155
- },
156
- "bodyDuration": "number",
157
- "outputDuration": "number",
158
- "variants": [
159
- {
160
- "id": "string",
161
- "hook": "string",
162
- "openingFrom": "number",
163
- "openingTo": "number"
164
- }
165
- ],
166
- "warnings": "string[]"
167
- }
168
- }
169
- },
170
- "permissions": {
171
- "project": [
172
- "asset.read"
173
- ],
174
- "network": [],
175
- "filesystem": [],
176
- "secrets": []
177
- },
178
- "ui": [
179
- {
180
- "port": "openingDuration",
181
- "control": "slider",
182
- "min": 1,
183
- "max": 3,
184
- "step": 0.1
185
- }
186
- ],
187
- "provenance": {
188
- "notice": "Original source (authorship declared by the packager)\nLicense: MIT\nChanges: Original implementation declared by the packager; no reused repository or dependency code.\nFiles: LICENSE, src/run.js\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to deal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT \nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO \nEVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER \nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE \nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n",
189
- "portableSources": [
190
- {
191
- "kind": "original",
192
- "license": "MIT",
193
- "paths": [
194
- "LICENSE",
195
- "src/run.js"
196
- ],
197
- "evidence": [
198
- "upstream/0/LICENSE",
199
- "upstream/0/src/run.js"
200
- ],
201
- "changes": "Original implementation declared by the packager; no reused repository or dependency code."
202
- }
203
- ]
204
- },
205
- "semantics": [
206
- {
207
- "name": "stillmade.product_ad_variants.hooka",
208
- "description": "Exact approved hook A. Up to 64 characters; it must be supported by the real footage and offer.",
209
- "parents": []
210
- },
211
- {
212
- "name": "stillmade.product_ad_variants.hookb",
213
- "description": "Exact approved hook B. Use a genuinely different opening angle, without inventing a benefit or claim.",
214
- "parents": []
215
- },
216
- {
217
- "name": "stillmade.product_ad_variants.hookc",
218
- "description": "Exact approved hook C. Keep this distinct from A and B and supported by the source.",
219
- "parents": []
220
- },
221
- {
222
- "name": "stillmade.product_ad_variants.openinga",
223
- "description": "Source-video start in seconds for preview A. Choose a visible product moment.",
224
- "parents": []
225
- },
226
- {
227
- "name": "stillmade.product_ad_variants.openingb",
228
- "description": "Source-video start in seconds for preview B. It must not overlap the other two previews.",
229
- "parents": []
230
- },
231
- {
232
- "name": "stillmade.product_ad_variants.openingc",
233
- "description": "Source-video start in seconds for preview C. Choose a different visible source moment.",
234
- "parents": []
235
- },
236
- {
237
- "name": "stillmade.product_ad_variants.openingduration",
238
- "description": "Length of each source preview, 1–3 seconds. The full unchanged demonstration follows each preview.",
239
- "parents": []
240
- },
241
- {
242
- "name": "stillmade.product_ad_variants.copyapproved",
243
- "description": "I have permission to use this footage and have approved all three exact hooks against what it actually shows.",
244
- "parents": []
245
- },
246
- {
247
- "name": "stillmade.product_ad_variants.review",
248
- "description": "Exact source, opening selections, approved hooks and outstanding human review.",
249
- "parents": []
250
- }
251
- ]
252
- },
253
- "code": "// Block-owned source editing, executed only inside the declared SDK sandbox.\nconst clone = value => JSON.parse(JSON.stringify(value));\nconst check = (condition, message) => { if (!condition) throw Error(message); };\nconst round = value => Math.round(value * 1000000) / 1000000;\nconst base = input.timeline;\ncheck(base && base.schemaVersion === 1 && Array.isArray(base.clips) && base.clips.length > 0 && base.clips.length <= 12, 'Connect the reviewed Product Demonstration timeline.');\ncheck(base.aspect === '9:16', 'Prepare a portrait 9:16 demonstration before making variants.');\ncheck(Number.isFinite(base.targetDuration) && base.targetDuration >= 5 && base.targetDuration <= 60, 'Use a complete 5–60 second product demonstration.');\ncheck(input.copyApproved === true, 'Confirm permission for the source footage and review all three exact hooks against what it actually shows.');\ncheck(!base.stillmadeWatermark && !base.stillmadeEndScreen, 'Use an editable source timeline, before host export branding.');\ncheck(!(base.effects || []).length && !(base.stickers || []).length, 'Use the simple demonstration timeline before adding effects or graphic layers.');\nconst source = base.clips[0].asset;\ncheck(source && source.kind === 'video' && source.assetId && source.versionId && Number.isFinite(source.duration) && source.duration > 0 && Number.isFinite(source.width) && source.width > 0 && Number.isFinite(source.height) && source.height > 0, 'The original video needs its saved asset/version, duration and dimensions.');\ncheck(typeof source.url === 'string' && /^(https:\\/\\/|http:\\/\\/(localhost|127\\.0\\.0\\.1)(:\\d+)?\\/|\\/api\\/media\\/[a-zA-Z0-9_-]+\\/|sm-media:|blob:)/.test(source.url) && !/^https?:\\/\\/[^/?#]*@/.test(source.url), 'Use an authorized saved source video reference.');\nlet end = 0;\nfor (const clip of base.clips) {\n check(clip.kind === 'video' && clip.asset?.assetId === source.assetId && clip.asset?.versionId === source.versionId && clip.url === source.url, 'All demonstration selections must use the same exact original footage.');\n check(Number.isFinite(clip.start) && Math.abs(clip.start - end) < .001 && Number.isFinite(clip.duration) && clip.duration > 0, 'Keep the demonstration selections sequential, without gaps or overlaps.');\n check(clip.speed === 1 && Number.isFinite(clip.trimStart) && clip.trimStart >= 0 && clip.trimStart + clip.duration <= source.duration + .02, 'Use source-speed cuts within the original footage.');\n check(clip.transform?.fit === 'contain' && clip.transform?.rotation === 0 && clip.transform?.scale === 1 && clip.transform?.x === 0 && clip.transform?.y === 0, 'Keep the complete original frame for these evidence-preserving variants.');\n end = round(clip.start + clip.duration);\n}\ncheck(Math.abs(end - base.targetDuration) < .02, 'The demonstration duration must match its actual source selections.');\nconst length = input.openingDuration;\ncheck(Number.isFinite(length) && length >= 1 && length <= 3, 'Choose a 1–3 second opening preview.');\nconst options = ['A', 'B', 'C'].map(id => {\n const hook = input['hook' + id];\n check(typeof hook === 'string' && hook.trim() && hook.length <= 64 && !/[\\u0000-\\u001f<>]/.test(hook) && hook.split(/\\s+/).every(word => word.length <= 28), 'Supply a distinct approved hook of up to 64 plain-text characters for each variant.');\n const from = input['opening' + id];\n check(Number.isFinite(from) && from >= 0 && from + length <= source.duration + .001, 'Every opening preview must fit inside the original source video.');\n return {id, hook: hook.trim(), from, to: round(from + length)};\n});\ncheck(new Set(options.map(option => option.hook.toLowerCase())).size === 3, 'Use three distinct approved hooks.');\nfor (let i = 0; i < options.length; i++) for (let j = i + 1; j < options.length; j++) check(Math.abs(options[i].from - options[j].from) >= length - .001, 'Choose three non-overlapping source moments so the openings genuinely differ.');\nconst duration = round(base.targetDuration + length);\nconst shift = row => ({...clone(row), start: round((row.start || 0) + length), ...(Number.isFinite(row.end) ? {end: round(row.end + length)} : {})});\nconst rows = key => { check(base[key] === undefined || Array.isArray(base[key]), 'The demonstration contains unsupported editing data.'); return base[key] || []; };\nconst originalAudio = rows('audioItems'), originalCaptions = rows('captions'), originalCopy = rows('textOverlays');\ncheck(originalCaptions.length <= 500 && originalCopy.length <= 20 && originalAudio.length <= 20, 'Use a bounded demonstration timeline.');\nconst openingText = (id, text, y, size) => ({id,trackId:'variant-hook',type:'text',text,start:0,end:length,font:'Hanken Grotesk',size,color:'#F7F0DB',background:'#0A0A0A',backgroundOpacity:85,backgroundPadding:5,width:.82,x:50,y,position:'center',animation:'fade',animIn:.12,animOut:.1});\nconst outputs = {};\nfor (const option of options) {\n const timeline = clone(base);\n timeline.name = 'Variant ' + option.id + ' · ' + option.hook;\n timeline.targetDuration = duration;\n timeline.clips = [{...clone(base.clips[0]), id:'opening-preview-' + option.id, title:'Source preview ' + option.id, start:0, duration:length, trimStart:option.from, volume:0, transition:{type:'Cut',duration:0}, motion:{type:'none'}}, ...base.clips.map(shift)];\n timeline.audioItems = originalAudio.map(row => {\n // Only the existing explicitly named music bed may continue across the new\n // preview. Original speech stays attached to the untouched demonstration.\n if (row.id !== 'music-bed' || row.asset?.kind !== 'audio' || row.start !== 0) return shift(row);\n const offset = row.sourceOffset || row.trimStart || 0;\n check(Number.isFinite(row.asset.duration) && row.asset.duration >= offset + duration, 'The licensed music is too short for the opening plus full demonstration. Choose a longer soundtrack or omit it.');\n return {...clone(row), duration};\n });\n timeline.captions = originalCaptions.map(shift);\n const hookSize = Math.min(16, (369 * 9 / 16 * .82 - 12) / Math.max(18, ...option.hook.split(/\\s+/).map(word => word.length)));\n timeline.textOverlays = originalCopy.filter(row => row.id !== 'opening').map(row => row.id === 'disclosure' ? {...clone(row),start:0,end:duration} : shift(row));\n timeline.textOverlays.push(openingText('preview-label', 'Preview · actual footage', 8, 7), openingText('approved-hook-' + option.id, option.hook, 18, hookSize));\n timeline.tracks = [...(timeline.tracks || []), {id:'variant-hook',type:'text',label:'Approved opening hook'}];\n timeline.trackOrder = [...(timeline.trackOrder || []), 'variant-hook'];\n timeline.audio = clone(timeline.audioItems);\n timeline.overlays = clone([...timeline.captions, ...timeline.textOverlays]);\n timeline.productAdVariant = {schemaVersion:1,block:{id:'stillmade.product-ad-variants',version:'1.0.0'},variant:option.id,opening:{from:option.from,to:option.to,silent:true},bodyOffset:length,source:{assetId:source.assetId,versionId:source.versionId},hook:option.hook};\n outputs['variant' + option.id] = timeline;\n}\noutputs.review = {schemaVersion:1,state:'needs-human-review',humanApproved:false,providerCalls:0,source:{assetId:source.assetId,versionId:source.versionId},bodyDuration:base.targetDuration,outputDuration:duration,variants:options.map(option => ({id:option.id,hook:option.hook,openingFrom:option.from,openingTo:option.to})),warnings:['The three previews use different supplied source moments, followed by the same complete demonstration. They are not generated product scenes.','Preview sound is muted to avoid presenting partial speech as a quote. Original body speech and captions retain their timing and exact words.','Watch and listen to all three exports at phone size. Verify each hook against the actual footage and approved offer.','No conversion performance, customer endorsement or independent rights verification is claimed.']};\nreturn outputs;\n",
254
- "tests": [
255
- {
256
- "name": "Make three exact source previews and preserve the complete demonstration",
257
- "input": {
258
- "timeline": {
259
- "schemaVersion": 1,
260
- "activeTimelineId": "short-form",
261
- "name": "Approved demonstration",
262
- "aspect": "9:16",
263
- "aspectRatio": "9:16",
264
- "previewH": 369,
265
- "backgroundColor": "#0A0A0A",
266
- "tracks": [
267
- {
268
- "id": "video",
269
- "type": "video",
270
- "label": "Source selections"
271
- },
272
- {
273
- "id": "speech",
274
- "type": "audio",
275
- "label": "Original speech"
276
- },
277
- {
278
- "id": "music",
279
- "type": "audio",
280
- "label": "Music"
281
- },
282
- {
283
- "id": "captions",
284
- "type": "caption",
285
- "label": "Reviewed subtitles"
286
- },
287
- {
288
- "id": "copy",
289
- "type": "text",
290
- "label": "Approved copy"
291
- }
292
- ],
293
- "trackOrder": [
294
- "video",
295
- "speech",
296
- "music",
297
- "captions",
298
- "copy"
299
- ],
300
- "clips": [
301
- {
302
- "id": "selection-1",
303
- "kind": "video",
304
- "trackId": "video",
305
- "asset": {
306
- "kind": "video",
307
- "assetId": "approved-video",
308
- "versionId": "v1",
309
- "url": "https://media.example/approved.mp4",
310
- "width": 1080,
311
- "height": 1920,
312
- "duration": 12
313
- },
314
- "assetId": "approved-video",
315
- "versionId": "v1",
316
- "url": "https://media.example/approved.mp4",
317
- "title": "Original video",
318
- "start": 0,
319
- "duration": 12,
320
- "trimStart": 0,
321
- "speed": 1,
322
- "volume": 0,
323
- "transform": {
324
- "fit": "contain",
325
- "scale": 1,
326
- "x": 0,
327
- "y": 0,
328
- "rotation": 0,
329
- "opacity": 1
330
- },
331
- "motion": {
332
- "type": "none"
333
- },
334
- "transition": {
335
- "type": "Cut",
336
- "duration": 0
337
- }
338
- }
339
- ],
340
- "audioItems": [
341
- {
342
- "id": "selection-1-sound",
343
- "trackId": "speech",
344
- "asset": {
345
- "kind": "video",
346
- "assetId": "approved-video",
347
- "versionId": "v1",
348
- "url": "https://media.example/approved.mp4",
349
- "width": 1080,
350
- "height": 1920,
351
- "duration": 12
352
- },
353
- "assetId": "approved-video",
354
- "versionId": "v1",
355
- "url": "https://media.example/approved.mp4",
356
- "title": "Original speech",
357
- "start": 0,
358
- "duration": 12,
359
- "sourceOffset": 0,
360
- "trimStart": 0,
361
- "volume": 100,
362
- "rate": 1,
363
- "fadeIn": 0,
364
- "fadeOut": 0
365
- }
366
- ],
367
- "captions": [],
368
- "textOverlays": [
369
- {
370
- "id": "opening",
371
- "trackId": "copy",
372
- "type": "text",
373
- "text": "Approved demonstration",
374
- "start": 0,
375
- "end": 3,
376
- "font": "Hanken Grotesk",
377
- "size": 16,
378
- "color": "#F7F0DB",
379
- "background": "#0A0A0A",
380
- "backgroundOpacity": 80,
381
- "backgroundPadding": 5,
382
- "width": 0.82,
383
- "x": 50,
384
- "y": 16,
385
- "position": "center",
386
- "animation": "fade",
387
- "animIn": 0.2,
388
- "animOut": 0.15
389
- },
390
- {
391
- "id": "cta",
392
- "trackId": "copy",
393
- "type": "text",
394
- "text": "See the details",
395
- "start": 9,
396
- "end": 12,
397
- "font": "Hanken Grotesk",
398
- "size": 14,
399
- "color": "#F7F0DB",
400
- "background": "#0A0A0A",
401
- "backgroundOpacity": 80,
402
- "backgroundPadding": 5,
403
- "width": 0.82,
404
- "x": 50,
405
- "y": 17,
406
- "position": "center",
407
- "animation": "fade",
408
- "animIn": 0.2,
409
- "animOut": 0.15
410
- }
411
- ],
412
- "stickers": [],
413
- "effects": [],
414
- "audio": [
415
- {
416
- "id": "selection-1-sound",
417
- "trackId": "speech",
418
- "asset": {
419
- "kind": "video",
420
- "assetId": "approved-video",
421
- "versionId": "v1",
422
- "url": "https://media.example/approved.mp4",
423
- "width": 1080,
424
- "height": 1920,
425
- "duration": 12
426
- },
427
- "assetId": "approved-video",
428
- "versionId": "v1",
429
- "url": "https://media.example/approved.mp4",
430
- "title": "Original speech",
431
- "start": 0,
432
- "duration": 12,
433
- "sourceOffset": 0,
434
- "trimStart": 0,
435
- "volume": 100,
436
- "rate": 1,
437
- "fadeIn": 0,
438
- "fadeOut": 0
439
- }
440
- ],
441
- "overlays": [
442
- {
443
- "id": "opening",
444
- "trackId": "copy",
445
- "type": "text",
446
- "text": "Approved demonstration",
447
- "start": 0,
448
- "end": 3,
449
- "font": "Hanken Grotesk",
450
- "size": 16,
451
- "color": "#F7F0DB",
452
- "background": "#0A0A0A",
453
- "backgroundOpacity": 80,
454
- "backgroundPadding": 5,
455
- "width": 0.82,
456
- "x": 50,
457
- "y": 16,
458
- "position": "center",
459
- "animation": "fade",
460
- "animIn": 0.2,
461
- "animOut": 0.15
462
- },
463
- {
464
- "id": "cta",
465
- "trackId": "copy",
466
- "type": "text",
467
- "text": "See the details",
468
- "start": 9,
469
- "end": 12,
470
- "font": "Hanken Grotesk",
471
- "size": 14,
472
- "color": "#F7F0DB",
473
- "background": "#0A0A0A",
474
- "backgroundOpacity": 80,
475
- "backgroundPadding": 5,
476
- "width": 0.82,
477
- "x": 50,
478
- "y": 17,
479
- "position": "center",
480
- "animation": "fade",
481
- "animIn": 0.2,
482
- "animOut": 0.15
483
- }
484
- ],
485
- "targetDuration": 12,
486
- "exportSettings": {
487
- "aspect": "9:16",
488
- "fps": 30,
489
- "resolution": "1080p",
490
- "quality": "high"
491
- }
492
- },
493
- "hookA": "Watch the preparation",
494
- "hookB": "Look at the process",
495
- "hookC": "See the finished pour",
496
- "openingA": 0,
497
- "openingB": 2,
498
- "openingC": 4,
499
- "openingDuration": 2,
500
- "copyApproved": true
501
- },
502
- "expected": {
503
- "variantA": {
504
- "schemaVersion": 1,
505
- "activeTimelineId": "short-form",
506
- "name": "Variant A · Watch the preparation",
507
- "aspect": "9:16",
508
- "aspectRatio": "9:16",
509
- "previewH": 369,
510
- "backgroundColor": "#0A0A0A",
511
- "tracks": [
512
- {
513
- "id": "video",
514
- "type": "video",
515
- "label": "Source selections"
516
- },
517
- {
518
- "id": "speech",
519
- "type": "audio",
520
- "label": "Original speech"
521
- },
522
- {
523
- "id": "music",
524
- "type": "audio",
525
- "label": "Music"
526
- },
527
- {
528
- "id": "captions",
529
- "type": "caption",
530
- "label": "Reviewed subtitles"
531
- },
532
- {
533
- "id": "copy",
534
- "type": "text",
535
- "label": "Approved copy"
536
- },
537
- {
538
- "id": "variant-hook",
539
- "type": "text",
540
- "label": "Approved opening hook"
541
- }
542
- ],
543
- "trackOrder": [
544
- "video",
545
- "speech",
546
- "music",
547
- "captions",
548
- "copy",
549
- "variant-hook"
550
- ],
551
- "clips": [
552
- {
553
- "id": "opening-preview-A",
554
- "kind": "video",
555
- "trackId": "video",
556
- "asset": {
557
- "kind": "video",
558
- "assetId": "approved-video",
559
- "versionId": "v1",
560
- "url": "https://media.example/approved.mp4",
561
- "width": 1080,
562
- "height": 1920,
563
- "duration": 12
564
- },
565
- "assetId": "approved-video",
566
- "versionId": "v1",
567
- "url": "https://media.example/approved.mp4",
568
- "title": "Source preview A",
569
- "start": 0,
570
- "duration": 2,
571
- "trimStart": 0,
572
- "speed": 1,
573
- "volume": 0,
574
- "transform": {
575
- "fit": "contain",
576
- "scale": 1,
577
- "x": 0,
578
- "y": 0,
579
- "rotation": 0,
580
- "opacity": 1
581
- },
582
- "motion": {
583
- "type": "none"
584
- },
585
- "transition": {
586
- "type": "Cut",
587
- "duration": 0
588
- }
589
- },
590
- {
591
- "id": "selection-1",
592
- "kind": "video",
593
- "trackId": "video",
594
- "asset": {
595
- "kind": "video",
596
- "assetId": "approved-video",
597
- "versionId": "v1",
598
- "url": "https://media.example/approved.mp4",
599
- "width": 1080,
600
- "height": 1920,
601
- "duration": 12
602
- },
603
- "assetId": "approved-video",
604
- "versionId": "v1",
605
- "url": "https://media.example/approved.mp4",
606
- "title": "Original video",
607
- "start": 2,
608
- "duration": 12,
609
- "trimStart": 0,
610
- "speed": 1,
611
- "volume": 0,
612
- "transform": {
613
- "fit": "contain",
614
- "scale": 1,
615
- "x": 0,
616
- "y": 0,
617
- "rotation": 0,
618
- "opacity": 1
619
- },
620
- "motion": {
621
- "type": "none"
622
- },
623
- "transition": {
624
- "type": "Cut",
625
- "duration": 0
626
- }
627
- }
628
- ],
629
- "audioItems": [
630
- {
631
- "id": "selection-1-sound",
632
- "trackId": "speech",
633
- "asset": {
634
- "kind": "video",
635
- "assetId": "approved-video",
636
- "versionId": "v1",
637
- "url": "https://media.example/approved.mp4",
638
- "width": 1080,
639
- "height": 1920,
640
- "duration": 12
641
- },
642
- "assetId": "approved-video",
643
- "versionId": "v1",
644
- "url": "https://media.example/approved.mp4",
645
- "title": "Original speech",
646
- "start": 2,
647
- "duration": 12,
648
- "sourceOffset": 0,
649
- "trimStart": 0,
650
- "volume": 100,
651
- "rate": 1,
652
- "fadeIn": 0,
653
- "fadeOut": 0
654
- }
655
- ],
656
- "captions": [],
657
- "textOverlays": [
658
- {
659
- "id": "cta",
660
- "trackId": "copy",
661
- "type": "text",
662
- "text": "See the details",
663
- "start": 11,
664
- "end": 14,
665
- "font": "Hanken Grotesk",
666
- "size": 14,
667
- "color": "#F7F0DB",
668
- "background": "#0A0A0A",
669
- "backgroundOpacity": 80,
670
- "backgroundPadding": 5,
671
- "width": 0.82,
672
- "x": 50,
673
- "y": 17,
674
- "position": "center",
675
- "animation": "fade",
676
- "animIn": 0.2,
677
- "animOut": 0.15
678
- },
679
- {
680
- "id": "preview-label",
681
- "trackId": "variant-hook",
682
- "type": "text",
683
- "text": "Preview · actual footage",
684
- "start": 0,
685
- "end": 2,
686
- "font": "Hanken Grotesk",
687
- "size": 7,
688
- "color": "#F7F0DB",
689
- "background": "#0A0A0A",
690
- "backgroundOpacity": 85,
691
- "backgroundPadding": 5,
692
- "width": 0.82,
693
- "x": 50,
694
- "y": 8,
695
- "position": "center",
696
- "animation": "fade",
697
- "animIn": 0.12,
698
- "animOut": 0.1
699
- },
700
- {
701
- "id": "approved-hook-A",
702
- "trackId": "variant-hook",
703
- "type": "text",
704
- "text": "Watch the preparation",
705
- "start": 0,
706
- "end": 2,
707
- "font": "Hanken Grotesk",
708
- "size": 8.788958333333333,
709
- "color": "#F7F0DB",
710
- "background": "#0A0A0A",
711
- "backgroundOpacity": 85,
712
- "backgroundPadding": 5,
713
- "width": 0.82,
714
- "x": 50,
715
- "y": 18,
716
- "position": "center",
717
- "animation": "fade",
718
- "animIn": 0.12,
719
- "animOut": 0.1
720
- }
721
- ],
722
- "stickers": [],
723
- "effects": [],
724
- "audio": [
725
- {
726
- "id": "selection-1-sound",
727
- "trackId": "speech",
728
- "asset": {
729
- "kind": "video",
730
- "assetId": "approved-video",
731
- "versionId": "v1",
732
- "url": "https://media.example/approved.mp4",
733
- "width": 1080,
734
- "height": 1920,
735
- "duration": 12
736
- },
737
- "assetId": "approved-video",
738
- "versionId": "v1",
739
- "url": "https://media.example/approved.mp4",
740
- "title": "Original speech",
741
- "start": 2,
742
- "duration": 12,
743
- "sourceOffset": 0,
744
- "trimStart": 0,
745
- "volume": 100,
746
- "rate": 1,
747
- "fadeIn": 0,
748
- "fadeOut": 0
749
- }
750
- ],
751
- "overlays": [
752
- {
753
- "id": "cta",
754
- "trackId": "copy",
755
- "type": "text",
756
- "text": "See the details",
757
- "start": 11,
758
- "end": 14,
759
- "font": "Hanken Grotesk",
760
- "size": 14,
761
- "color": "#F7F0DB",
762
- "background": "#0A0A0A",
763
- "backgroundOpacity": 80,
764
- "backgroundPadding": 5,
765
- "width": 0.82,
766
- "x": 50,
767
- "y": 17,
768
- "position": "center",
769
- "animation": "fade",
770
- "animIn": 0.2,
771
- "animOut": 0.15
772
- },
773
- {
774
- "id": "preview-label",
775
- "trackId": "variant-hook",
776
- "type": "text",
777
- "text": "Preview · actual footage",
778
- "start": 0,
779
- "end": 2,
780
- "font": "Hanken Grotesk",
781
- "size": 7,
782
- "color": "#F7F0DB",
783
- "background": "#0A0A0A",
784
- "backgroundOpacity": 85,
785
- "backgroundPadding": 5,
786
- "width": 0.82,
787
- "x": 50,
788
- "y": 8,
789
- "position": "center",
790
- "animation": "fade",
791
- "animIn": 0.12,
792
- "animOut": 0.1
793
- },
794
- {
795
- "id": "approved-hook-A",
796
- "trackId": "variant-hook",
797
- "type": "text",
798
- "text": "Watch the preparation",
799
- "start": 0,
800
- "end": 2,
801
- "font": "Hanken Grotesk",
802
- "size": 8.788958333333333,
803
- "color": "#F7F0DB",
804
- "background": "#0A0A0A",
805
- "backgroundOpacity": 85,
806
- "backgroundPadding": 5,
807
- "width": 0.82,
808
- "x": 50,
809
- "y": 18,
810
- "position": "center",
811
- "animation": "fade",
812
- "animIn": 0.12,
813
- "animOut": 0.1
814
- }
815
- ],
816
- "targetDuration": 14,
817
- "exportSettings": {
818
- "aspect": "9:16",
819
- "fps": 30,
820
- "resolution": "1080p",
821
- "quality": "high"
822
- },
823
- "productAdVariant": {
824
- "schemaVersion": 1,
825
- "block": {
826
- "id": "stillmade.product-ad-variants",
827
- "version": "1.0.0"
828
- },
829
- "variant": "A",
830
- "opening": {
831
- "from": 0,
832
- "to": 2,
833
- "silent": true
834
- },
835
- "bodyOffset": 2,
836
- "source": {
837
- "assetId": "approved-video",
838
- "versionId": "v1"
839
- },
840
- "hook": "Watch the preparation"
841
- }
842
- },
843
- "variantB": {
844
- "schemaVersion": 1,
845
- "activeTimelineId": "short-form",
846
- "name": "Variant B · Look at the process",
847
- "aspect": "9:16",
848
- "aspectRatio": "9:16",
849
- "previewH": 369,
850
- "backgroundColor": "#0A0A0A",
851
- "tracks": [
852
- {
853
- "id": "video",
854
- "type": "video",
855
- "label": "Source selections"
856
- },
857
- {
858
- "id": "speech",
859
- "type": "audio",
860
- "label": "Original speech"
861
- },
862
- {
863
- "id": "music",
864
- "type": "audio",
865
- "label": "Music"
866
- },
867
- {
868
- "id": "captions",
869
- "type": "caption",
870
- "label": "Reviewed subtitles"
871
- },
872
- {
873
- "id": "copy",
874
- "type": "text",
875
- "label": "Approved copy"
876
- },
877
- {
878
- "id": "variant-hook",
879
- "type": "text",
880
- "label": "Approved opening hook"
881
- }
882
- ],
883
- "trackOrder": [
884
- "video",
885
- "speech",
886
- "music",
887
- "captions",
888
- "copy",
889
- "variant-hook"
890
- ],
891
- "clips": [
892
- {
893
- "id": "opening-preview-B",
894
- "kind": "video",
895
- "trackId": "video",
896
- "asset": {
897
- "kind": "video",
898
- "assetId": "approved-video",
899
- "versionId": "v1",
900
- "url": "https://media.example/approved.mp4",
901
- "width": 1080,
902
- "height": 1920,
903
- "duration": 12
904
- },
905
- "assetId": "approved-video",
906
- "versionId": "v1",
907
- "url": "https://media.example/approved.mp4",
908
- "title": "Source preview B",
909
- "start": 0,
910
- "duration": 2,
911
- "trimStart": 2,
912
- "speed": 1,
913
- "volume": 0,
914
- "transform": {
915
- "fit": "contain",
916
- "scale": 1,
917
- "x": 0,
918
- "y": 0,
919
- "rotation": 0,
920
- "opacity": 1
921
- },
922
- "motion": {
923
- "type": "none"
924
- },
925
- "transition": {
926
- "type": "Cut",
927
- "duration": 0
928
- }
929
- },
930
- {
931
- "id": "selection-1",
932
- "kind": "video",
933
- "trackId": "video",
934
- "asset": {
935
- "kind": "video",
936
- "assetId": "approved-video",
937
- "versionId": "v1",
938
- "url": "https://media.example/approved.mp4",
939
- "width": 1080,
940
- "height": 1920,
941
- "duration": 12
942
- },
943
- "assetId": "approved-video",
944
- "versionId": "v1",
945
- "url": "https://media.example/approved.mp4",
946
- "title": "Original video",
947
- "start": 2,
948
- "duration": 12,
949
- "trimStart": 0,
950
- "speed": 1,
951
- "volume": 0,
952
- "transform": {
953
- "fit": "contain",
954
- "scale": 1,
955
- "x": 0,
956
- "y": 0,
957
- "rotation": 0,
958
- "opacity": 1
959
- },
960
- "motion": {
961
- "type": "none"
962
- },
963
- "transition": {
964
- "type": "Cut",
965
- "duration": 0
966
- }
967
- }
968
- ],
969
- "audioItems": [
970
- {
971
- "id": "selection-1-sound",
972
- "trackId": "speech",
973
- "asset": {
974
- "kind": "video",
975
- "assetId": "approved-video",
976
- "versionId": "v1",
977
- "url": "https://media.example/approved.mp4",
978
- "width": 1080,
979
- "height": 1920,
980
- "duration": 12
981
- },
982
- "assetId": "approved-video",
983
- "versionId": "v1",
984
- "url": "https://media.example/approved.mp4",
985
- "title": "Original speech",
986
- "start": 2,
987
- "duration": 12,
988
- "sourceOffset": 0,
989
- "trimStart": 0,
990
- "volume": 100,
991
- "rate": 1,
992
- "fadeIn": 0,
993
- "fadeOut": 0
994
- }
995
- ],
996
- "captions": [],
997
- "textOverlays": [
998
- {
999
- "id": "cta",
1000
- "trackId": "copy",
1001
- "type": "text",
1002
- "text": "See the details",
1003
- "start": 11,
1004
- "end": 14,
1005
- "font": "Hanken Grotesk",
1006
- "size": 14,
1007
- "color": "#F7F0DB",
1008
- "background": "#0A0A0A",
1009
- "backgroundOpacity": 80,
1010
- "backgroundPadding": 5,
1011
- "width": 0.82,
1012
- "x": 50,
1013
- "y": 17,
1014
- "position": "center",
1015
- "animation": "fade",
1016
- "animIn": 0.2,
1017
- "animOut": 0.15
1018
- },
1019
- {
1020
- "id": "preview-label",
1021
- "trackId": "variant-hook",
1022
- "type": "text",
1023
- "text": "Preview · actual footage",
1024
- "start": 0,
1025
- "end": 2,
1026
- "font": "Hanken Grotesk",
1027
- "size": 7,
1028
- "color": "#F7F0DB",
1029
- "background": "#0A0A0A",
1030
- "backgroundOpacity": 85,
1031
- "backgroundPadding": 5,
1032
- "width": 0.82,
1033
- "x": 50,
1034
- "y": 8,
1035
- "position": "center",
1036
- "animation": "fade",
1037
- "animIn": 0.12,
1038
- "animOut": 0.1
1039
- },
1040
- {
1041
- "id": "approved-hook-B",
1042
- "trackId": "variant-hook",
1043
- "type": "text",
1044
- "text": "Look at the process",
1045
- "start": 0,
1046
- "end": 2,
1047
- "font": "Hanken Grotesk",
1048
- "size": 8.788958333333333,
1049
- "color": "#F7F0DB",
1050
- "background": "#0A0A0A",
1051
- "backgroundOpacity": 85,
1052
- "backgroundPadding": 5,
1053
- "width": 0.82,
1054
- "x": 50,
1055
- "y": 18,
1056
- "position": "center",
1057
- "animation": "fade",
1058
- "animIn": 0.12,
1059
- "animOut": 0.1
1060
- }
1061
- ],
1062
- "stickers": [],
1063
- "effects": [],
1064
- "audio": [
1065
- {
1066
- "id": "selection-1-sound",
1067
- "trackId": "speech",
1068
- "asset": {
1069
- "kind": "video",
1070
- "assetId": "approved-video",
1071
- "versionId": "v1",
1072
- "url": "https://media.example/approved.mp4",
1073
- "width": 1080,
1074
- "height": 1920,
1075
- "duration": 12
1076
- },
1077
- "assetId": "approved-video",
1078
- "versionId": "v1",
1079
- "url": "https://media.example/approved.mp4",
1080
- "title": "Original speech",
1081
- "start": 2,
1082
- "duration": 12,
1083
- "sourceOffset": 0,
1084
- "trimStart": 0,
1085
- "volume": 100,
1086
- "rate": 1,
1087
- "fadeIn": 0,
1088
- "fadeOut": 0
1089
- }
1090
- ],
1091
- "overlays": [
1092
- {
1093
- "id": "cta",
1094
- "trackId": "copy",
1095
- "type": "text",
1096
- "text": "See the details",
1097
- "start": 11,
1098
- "end": 14,
1099
- "font": "Hanken Grotesk",
1100
- "size": 14,
1101
- "color": "#F7F0DB",
1102
- "background": "#0A0A0A",
1103
- "backgroundOpacity": 80,
1104
- "backgroundPadding": 5,
1105
- "width": 0.82,
1106
- "x": 50,
1107
- "y": 17,
1108
- "position": "center",
1109
- "animation": "fade",
1110
- "animIn": 0.2,
1111
- "animOut": 0.15
1112
- },
1113
- {
1114
- "id": "preview-label",
1115
- "trackId": "variant-hook",
1116
- "type": "text",
1117
- "text": "Preview · actual footage",
1118
- "start": 0,
1119
- "end": 2,
1120
- "font": "Hanken Grotesk",
1121
- "size": 7,
1122
- "color": "#F7F0DB",
1123
- "background": "#0A0A0A",
1124
- "backgroundOpacity": 85,
1125
- "backgroundPadding": 5,
1126
- "width": 0.82,
1127
- "x": 50,
1128
- "y": 8,
1129
- "position": "center",
1130
- "animation": "fade",
1131
- "animIn": 0.12,
1132
- "animOut": 0.1
1133
- },
1134
- {
1135
- "id": "approved-hook-B",
1136
- "trackId": "variant-hook",
1137
- "type": "text",
1138
- "text": "Look at the process",
1139
- "start": 0,
1140
- "end": 2,
1141
- "font": "Hanken Grotesk",
1142
- "size": 8.788958333333333,
1143
- "color": "#F7F0DB",
1144
- "background": "#0A0A0A",
1145
- "backgroundOpacity": 85,
1146
- "backgroundPadding": 5,
1147
- "width": 0.82,
1148
- "x": 50,
1149
- "y": 18,
1150
- "position": "center",
1151
- "animation": "fade",
1152
- "animIn": 0.12,
1153
- "animOut": 0.1
1154
- }
1155
- ],
1156
- "targetDuration": 14,
1157
- "exportSettings": {
1158
- "aspect": "9:16",
1159
- "fps": 30,
1160
- "resolution": "1080p",
1161
- "quality": "high"
1162
- },
1163
- "productAdVariant": {
1164
- "schemaVersion": 1,
1165
- "block": {
1166
- "id": "stillmade.product-ad-variants",
1167
- "version": "1.0.0"
1168
- },
1169
- "variant": "B",
1170
- "opening": {
1171
- "from": 2,
1172
- "to": 4,
1173
- "silent": true
1174
- },
1175
- "bodyOffset": 2,
1176
- "source": {
1177
- "assetId": "approved-video",
1178
- "versionId": "v1"
1179
- },
1180
- "hook": "Look at the process"
1181
- }
1182
- },
1183
- "variantC": {
1184
- "schemaVersion": 1,
1185
- "activeTimelineId": "short-form",
1186
- "name": "Variant C · See the finished pour",
1187
- "aspect": "9:16",
1188
- "aspectRatio": "9:16",
1189
- "previewH": 369,
1190
- "backgroundColor": "#0A0A0A",
1191
- "tracks": [
1192
- {
1193
- "id": "video",
1194
- "type": "video",
1195
- "label": "Source selections"
1196
- },
1197
- {
1198
- "id": "speech",
1199
- "type": "audio",
1200
- "label": "Original speech"
1201
- },
1202
- {
1203
- "id": "music",
1204
- "type": "audio",
1205
- "label": "Music"
1206
- },
1207
- {
1208
- "id": "captions",
1209
- "type": "caption",
1210
- "label": "Reviewed subtitles"
1211
- },
1212
- {
1213
- "id": "copy",
1214
- "type": "text",
1215
- "label": "Approved copy"
1216
- },
1217
- {
1218
- "id": "variant-hook",
1219
- "type": "text",
1220
- "label": "Approved opening hook"
1221
- }
1222
- ],
1223
- "trackOrder": [
1224
- "video",
1225
- "speech",
1226
- "music",
1227
- "captions",
1228
- "copy",
1229
- "variant-hook"
1230
- ],
1231
- "clips": [
1232
- {
1233
- "id": "opening-preview-C",
1234
- "kind": "video",
1235
- "trackId": "video",
1236
- "asset": {
1237
- "kind": "video",
1238
- "assetId": "approved-video",
1239
- "versionId": "v1",
1240
- "url": "https://media.example/approved.mp4",
1241
- "width": 1080,
1242
- "height": 1920,
1243
- "duration": 12
1244
- },
1245
- "assetId": "approved-video",
1246
- "versionId": "v1",
1247
- "url": "https://media.example/approved.mp4",
1248
- "title": "Source preview C",
1249
- "start": 0,
1250
- "duration": 2,
1251
- "trimStart": 4,
1252
- "speed": 1,
1253
- "volume": 0,
1254
- "transform": {
1255
- "fit": "contain",
1256
- "scale": 1,
1257
- "x": 0,
1258
- "y": 0,
1259
- "rotation": 0,
1260
- "opacity": 1
1261
- },
1262
- "motion": {
1263
- "type": "none"
1264
- },
1265
- "transition": {
1266
- "type": "Cut",
1267
- "duration": 0
1268
- }
1269
- },
1270
- {
1271
- "id": "selection-1",
1272
- "kind": "video",
1273
- "trackId": "video",
1274
- "asset": {
1275
- "kind": "video",
1276
- "assetId": "approved-video",
1277
- "versionId": "v1",
1278
- "url": "https://media.example/approved.mp4",
1279
- "width": 1080,
1280
- "height": 1920,
1281
- "duration": 12
1282
- },
1283
- "assetId": "approved-video",
1284
- "versionId": "v1",
1285
- "url": "https://media.example/approved.mp4",
1286
- "title": "Original video",
1287
- "start": 2,
1288
- "duration": 12,
1289
- "trimStart": 0,
1290
- "speed": 1,
1291
- "volume": 0,
1292
- "transform": {
1293
- "fit": "contain",
1294
- "scale": 1,
1295
- "x": 0,
1296
- "y": 0,
1297
- "rotation": 0,
1298
- "opacity": 1
1299
- },
1300
- "motion": {
1301
- "type": "none"
1302
- },
1303
- "transition": {
1304
- "type": "Cut",
1305
- "duration": 0
1306
- }
1307
- }
1308
- ],
1309
- "audioItems": [
1310
- {
1311
- "id": "selection-1-sound",
1312
- "trackId": "speech",
1313
- "asset": {
1314
- "kind": "video",
1315
- "assetId": "approved-video",
1316
- "versionId": "v1",
1317
- "url": "https://media.example/approved.mp4",
1318
- "width": 1080,
1319
- "height": 1920,
1320
- "duration": 12
1321
- },
1322
- "assetId": "approved-video",
1323
- "versionId": "v1",
1324
- "url": "https://media.example/approved.mp4",
1325
- "title": "Original speech",
1326
- "start": 2,
1327
- "duration": 12,
1328
- "sourceOffset": 0,
1329
- "trimStart": 0,
1330
- "volume": 100,
1331
- "rate": 1,
1332
- "fadeIn": 0,
1333
- "fadeOut": 0
1334
- }
1335
- ],
1336
- "captions": [],
1337
- "textOverlays": [
1338
- {
1339
- "id": "cta",
1340
- "trackId": "copy",
1341
- "type": "text",
1342
- "text": "See the details",
1343
- "start": 11,
1344
- "end": 14,
1345
- "font": "Hanken Grotesk",
1346
- "size": 14,
1347
- "color": "#F7F0DB",
1348
- "background": "#0A0A0A",
1349
- "backgroundOpacity": 80,
1350
- "backgroundPadding": 5,
1351
- "width": 0.82,
1352
- "x": 50,
1353
- "y": 17,
1354
- "position": "center",
1355
- "animation": "fade",
1356
- "animIn": 0.2,
1357
- "animOut": 0.15
1358
- },
1359
- {
1360
- "id": "preview-label",
1361
- "trackId": "variant-hook",
1362
- "type": "text",
1363
- "text": "Preview · actual footage",
1364
- "start": 0,
1365
- "end": 2,
1366
- "font": "Hanken Grotesk",
1367
- "size": 7,
1368
- "color": "#F7F0DB",
1369
- "background": "#0A0A0A",
1370
- "backgroundOpacity": 85,
1371
- "backgroundPadding": 5,
1372
- "width": 0.82,
1373
- "x": 50,
1374
- "y": 8,
1375
- "position": "center",
1376
- "animation": "fade",
1377
- "animIn": 0.12,
1378
- "animOut": 0.1
1379
- },
1380
- {
1381
- "id": "approved-hook-C",
1382
- "trackId": "variant-hook",
1383
- "type": "text",
1384
- "text": "See the finished pour",
1385
- "start": 0,
1386
- "end": 2,
1387
- "font": "Hanken Grotesk",
1388
- "size": 8.788958333333333,
1389
- "color": "#F7F0DB",
1390
- "background": "#0A0A0A",
1391
- "backgroundOpacity": 85,
1392
- "backgroundPadding": 5,
1393
- "width": 0.82,
1394
- "x": 50,
1395
- "y": 18,
1396
- "position": "center",
1397
- "animation": "fade",
1398
- "animIn": 0.12,
1399
- "animOut": 0.1
1400
- }
1401
- ],
1402
- "stickers": [],
1403
- "effects": [],
1404
- "audio": [
1405
- {
1406
- "id": "selection-1-sound",
1407
- "trackId": "speech",
1408
- "asset": {
1409
- "kind": "video",
1410
- "assetId": "approved-video",
1411
- "versionId": "v1",
1412
- "url": "https://media.example/approved.mp4",
1413
- "width": 1080,
1414
- "height": 1920,
1415
- "duration": 12
1416
- },
1417
- "assetId": "approved-video",
1418
- "versionId": "v1",
1419
- "url": "https://media.example/approved.mp4",
1420
- "title": "Original speech",
1421
- "start": 2,
1422
- "duration": 12,
1423
- "sourceOffset": 0,
1424
- "trimStart": 0,
1425
- "volume": 100,
1426
- "rate": 1,
1427
- "fadeIn": 0,
1428
- "fadeOut": 0
1429
- }
1430
- ],
1431
- "overlays": [
1432
- {
1433
- "id": "cta",
1434
- "trackId": "copy",
1435
- "type": "text",
1436
- "text": "See the details",
1437
- "start": 11,
1438
- "end": 14,
1439
- "font": "Hanken Grotesk",
1440
- "size": 14,
1441
- "color": "#F7F0DB",
1442
- "background": "#0A0A0A",
1443
- "backgroundOpacity": 80,
1444
- "backgroundPadding": 5,
1445
- "width": 0.82,
1446
- "x": 50,
1447
- "y": 17,
1448
- "position": "center",
1449
- "animation": "fade",
1450
- "animIn": 0.2,
1451
- "animOut": 0.15
1452
- },
1453
- {
1454
- "id": "preview-label",
1455
- "trackId": "variant-hook",
1456
- "type": "text",
1457
- "text": "Preview · actual footage",
1458
- "start": 0,
1459
- "end": 2,
1460
- "font": "Hanken Grotesk",
1461
- "size": 7,
1462
- "color": "#F7F0DB",
1463
- "background": "#0A0A0A",
1464
- "backgroundOpacity": 85,
1465
- "backgroundPadding": 5,
1466
- "width": 0.82,
1467
- "x": 50,
1468
- "y": 8,
1469
- "position": "center",
1470
- "animation": "fade",
1471
- "animIn": 0.12,
1472
- "animOut": 0.1
1473
- },
1474
- {
1475
- "id": "approved-hook-C",
1476
- "trackId": "variant-hook",
1477
- "type": "text",
1478
- "text": "See the finished pour",
1479
- "start": 0,
1480
- "end": 2,
1481
- "font": "Hanken Grotesk",
1482
- "size": 8.788958333333333,
1483
- "color": "#F7F0DB",
1484
- "background": "#0A0A0A",
1485
- "backgroundOpacity": 85,
1486
- "backgroundPadding": 5,
1487
- "width": 0.82,
1488
- "x": 50,
1489
- "y": 18,
1490
- "position": "center",
1491
- "animation": "fade",
1492
- "animIn": 0.12,
1493
- "animOut": 0.1
1494
- }
1495
- ],
1496
- "targetDuration": 14,
1497
- "exportSettings": {
1498
- "aspect": "9:16",
1499
- "fps": 30,
1500
- "resolution": "1080p",
1501
- "quality": "high"
1502
- },
1503
- "productAdVariant": {
1504
- "schemaVersion": 1,
1505
- "block": {
1506
- "id": "stillmade.product-ad-variants",
1507
- "version": "1.0.0"
1508
- },
1509
- "variant": "C",
1510
- "opening": {
1511
- "from": 4,
1512
- "to": 6,
1513
- "silent": true
1514
- },
1515
- "bodyOffset": 2,
1516
- "source": {
1517
- "assetId": "approved-video",
1518
- "versionId": "v1"
1519
- },
1520
- "hook": "See the finished pour"
1521
- }
1522
- },
1523
- "review": {
1524
- "schemaVersion": 1,
1525
- "state": "needs-human-review",
1526
- "humanApproved": false,
1527
- "providerCalls": 0,
1528
- "source": {
1529
- "assetId": "approved-video",
1530
- "versionId": "v1"
1531
- },
1532
- "bodyDuration": 12,
1533
- "outputDuration": 14,
1534
- "variants": [
1535
- {
1536
- "id": "A",
1537
- "hook": "Watch the preparation",
1538
- "openingFrom": 0,
1539
- "openingTo": 2
1540
- },
1541
- {
1542
- "id": "B",
1543
- "hook": "Look at the process",
1544
- "openingFrom": 2,
1545
- "openingTo": 4
1546
- },
1547
- {
1548
- "id": "C",
1549
- "hook": "See the finished pour",
1550
- "openingFrom": 4,
1551
- "openingTo": 6
1552
- }
1553
- ],
1554
- "warnings": [
1555
- "The three previews use different supplied source moments, followed by the same complete demonstration. They are not generated product scenes.",
1556
- "Preview sound is muted to avoid presenting partial speech as a quote. Original body speech and captions retain their timing and exact words.",
1557
- "Watch and listen to all three exports at phone size. Verify each hook against the actual footage and approved offer.",
1558
- "No conversion performance, customer endorsement or independent rights verification is claimed."
1559
- ]
1560
- }
1561
- }
1562
- },
1563
- {
1564
- "name": "Keep trimmed original speech and captions together after short previews",
1565
- "input": {
1566
- "timeline": {
1567
- "schemaVersion": 1,
1568
- "activeTimelineId": "short-form",
1569
- "name": "An approved hook",
1570
- "aspect": "9:16",
1571
- "aspectRatio": "9:16",
1572
- "previewH": 369,
1573
- "backgroundColor": "#0A0A0A",
1574
- "tracks": [
1575
- {
1576
- "id": "video",
1577
- "type": "video",
1578
- "label": "Source selections"
1579
- },
1580
- {
1581
- "id": "speech",
1582
- "type": "audio",
1583
- "label": "Original speech"
1584
- },
1585
- {
1586
- "id": "music",
1587
- "type": "audio",
1588
- "label": "Music"
1589
- },
1590
- {
1591
- "id": "captions",
1592
- "type": "caption",
1593
- "label": "Reviewed subtitles"
1594
- },
1595
- {
1596
- "id": "copy",
1597
- "type": "text",
1598
- "label": "Approved copy"
1599
- }
1600
- ],
1601
- "trackOrder": [
1602
- "video",
1603
- "speech",
1604
- "music",
1605
- "captions",
1606
- "copy"
1607
- ],
1608
- "clips": [
1609
- {
1610
- "id": "selection-1",
1611
- "kind": "video",
1612
- "trackId": "video",
1613
- "asset": {
1614
- "kind": "video",
1615
- "assetId": "approved-video",
1616
- "versionId": "v1",
1617
- "url": "https://media.example/approved.mp4",
1618
- "width": 1080,
1619
- "height": 1920,
1620
- "duration": 12
1621
- },
1622
- "assetId": "approved-video",
1623
- "versionId": "v1",
1624
- "url": "https://media.example/approved.mp4",
1625
- "title": "Original video",
1626
- "start": 0,
1627
- "duration": 8,
1628
- "trimStart": 4,
1629
- "speed": 1,
1630
- "volume": 0,
1631
- "transform": {
1632
- "fit": "contain",
1633
- "scale": 1,
1634
- "x": 0,
1635
- "y": 0,
1636
- "rotation": 0,
1637
- "opacity": 1
1638
- },
1639
- "motion": {
1640
- "type": "none"
1641
- },
1642
- "transition": {
1643
- "type": "Cut",
1644
- "duration": 0
1645
- }
1646
- }
1647
- ],
1648
- "audioItems": [
1649
- {
1650
- "id": "selection-1-sound",
1651
- "trackId": "speech",
1652
- "asset": {
1653
- "kind": "video",
1654
- "assetId": "approved-video",
1655
- "versionId": "v1",
1656
- "url": "https://media.example/approved.mp4",
1657
- "width": 1080,
1658
- "height": 1920,
1659
- "duration": 12
1660
- },
1661
- "assetId": "approved-video",
1662
- "versionId": "v1",
1663
- "url": "https://media.example/approved.mp4",
1664
- "title": "Original speech",
1665
- "start": 0,
1666
- "duration": 8,
1667
- "sourceOffset": 4,
1668
- "trimStart": 4,
1669
- "volume": 100,
1670
- "rate": 1,
1671
- "fadeIn": 0,
1672
- "fadeOut": 0
1673
- }
1674
- ],
1675
- "captions": [
1676
- {
1677
- "id": "caption-0",
1678
- "trackId": "captions",
1679
- "type": "text",
1680
- "text": "Keep the complete thought in the clip.",
1681
- "start": 0,
1682
- "end": 8,
1683
- "font": "Hanken Grotesk",
1684
- "size": 15,
1685
- "color": "#FFFFFF",
1686
- "background": "#0A0A0A",
1687
- "backgroundOpacity": 75,
1688
- "backgroundPadding": 5,
1689
- "backgroundRadius": 3,
1690
- "width": 0.82,
1691
- "x": 50,
1692
- "y": 76,
1693
- "position": "center",
1694
- "animation": "none",
1695
- "animIn": 0.12,
1696
- "animOut": 0
1697
- }
1698
- ],
1699
- "textOverlays": [
1700
- {
1701
- "id": "opening",
1702
- "trackId": "copy",
1703
- "type": "text",
1704
- "text": "An approved hook",
1705
- "start": 0,
1706
- "end": 3,
1707
- "font": "Hanken Grotesk",
1708
- "size": 16,
1709
- "color": "#F7F0DB",
1710
- "background": "#0A0A0A",
1711
- "backgroundOpacity": 80,
1712
- "backgroundPadding": 5,
1713
- "width": 0.82,
1714
- "x": 50,
1715
- "y": 16,
1716
- "position": "center",
1717
- "animation": "fade",
1718
- "animIn": 0.2,
1719
- "animOut": 0.15
1720
- }
1721
- ],
1722
- "stickers": [],
1723
- "effects": [],
1724
- "audio": [
1725
- {
1726
- "id": "selection-1-sound",
1727
- "trackId": "speech",
1728
- "asset": {
1729
- "kind": "video",
1730
- "assetId": "approved-video",
1731
- "versionId": "v1",
1732
- "url": "https://media.example/approved.mp4",
1733
- "width": 1080,
1734
- "height": 1920,
1735
- "duration": 12
1736
- },
1737
- "assetId": "approved-video",
1738
- "versionId": "v1",
1739
- "url": "https://media.example/approved.mp4",
1740
- "title": "Original speech",
1741
- "start": 0,
1742
- "duration": 8,
1743
- "sourceOffset": 4,
1744
- "trimStart": 4,
1745
- "volume": 100,
1746
- "rate": 1,
1747
- "fadeIn": 0,
1748
- "fadeOut": 0
1749
- }
1750
- ],
1751
- "overlays": [
1752
- {
1753
- "id": "caption-0",
1754
- "trackId": "captions",
1755
- "type": "text",
1756
- "text": "Keep the complete thought in the clip.",
1757
- "start": 0,
1758
- "end": 8,
1759
- "font": "Hanken Grotesk",
1760
- "size": 15,
1761
- "color": "#FFFFFF",
1762
- "background": "#0A0A0A",
1763
- "backgroundOpacity": 75,
1764
- "backgroundPadding": 5,
1765
- "backgroundRadius": 3,
1766
- "width": 0.82,
1767
- "x": 50,
1768
- "y": 76,
1769
- "position": "center",
1770
- "animation": "none",
1771
- "animIn": 0.12,
1772
- "animOut": 0
1773
- },
1774
- {
1775
- "id": "opening",
1776
- "trackId": "copy",
1777
- "type": "text",
1778
- "text": "An approved hook",
1779
- "start": 0,
1780
- "end": 3,
1781
- "font": "Hanken Grotesk",
1782
- "size": 16,
1783
- "color": "#F7F0DB",
1784
- "background": "#0A0A0A",
1785
- "backgroundOpacity": 80,
1786
- "backgroundPadding": 5,
1787
- "width": 0.82,
1788
- "x": 50,
1789
- "y": 16,
1790
- "position": "center",
1791
- "animation": "fade",
1792
- "animIn": 0.2,
1793
- "animOut": 0.15
1794
- }
1795
- ],
1796
- "targetDuration": 8,
1797
- "exportSettings": {
1798
- "aspect": "9:16",
1799
- "fps": 30,
1800
- "resolution": "1080p",
1801
- "quality": "high"
1802
- }
1803
- },
1804
- "hookA": "Watch the preparation",
1805
- "hookB": "Look at the process",
1806
- "hookC": "See the finished pour",
1807
- "openingA": 0,
1808
- "openingB": 2,
1809
- "openingC": 4,
1810
- "openingDuration": 1,
1811
- "copyApproved": true
1812
- },
1813
- "expected": {
1814
- "variantA": {
1815
- "schemaVersion": 1,
1816
- "activeTimelineId": "short-form",
1817
- "name": "Variant A · Watch the preparation",
1818
- "aspect": "9:16",
1819
- "aspectRatio": "9:16",
1820
- "previewH": 369,
1821
- "backgroundColor": "#0A0A0A",
1822
- "tracks": [
1823
- {
1824
- "id": "video",
1825
- "type": "video",
1826
- "label": "Source selections"
1827
- },
1828
- {
1829
- "id": "speech",
1830
- "type": "audio",
1831
- "label": "Original speech"
1832
- },
1833
- {
1834
- "id": "music",
1835
- "type": "audio",
1836
- "label": "Music"
1837
- },
1838
- {
1839
- "id": "captions",
1840
- "type": "caption",
1841
- "label": "Reviewed subtitles"
1842
- },
1843
- {
1844
- "id": "copy",
1845
- "type": "text",
1846
- "label": "Approved copy"
1847
- },
1848
- {
1849
- "id": "variant-hook",
1850
- "type": "text",
1851
- "label": "Approved opening hook"
1852
- }
1853
- ],
1854
- "trackOrder": [
1855
- "video",
1856
- "speech",
1857
- "music",
1858
- "captions",
1859
- "copy",
1860
- "variant-hook"
1861
- ],
1862
- "clips": [
1863
- {
1864
- "id": "opening-preview-A",
1865
- "kind": "video",
1866
- "trackId": "video",
1867
- "asset": {
1868
- "kind": "video",
1869
- "assetId": "approved-video",
1870
- "versionId": "v1",
1871
- "url": "https://media.example/approved.mp4",
1872
- "width": 1080,
1873
- "height": 1920,
1874
- "duration": 12
1875
- },
1876
- "assetId": "approved-video",
1877
- "versionId": "v1",
1878
- "url": "https://media.example/approved.mp4",
1879
- "title": "Source preview A",
1880
- "start": 0,
1881
- "duration": 1,
1882
- "trimStart": 0,
1883
- "speed": 1,
1884
- "volume": 0,
1885
- "transform": {
1886
- "fit": "contain",
1887
- "scale": 1,
1888
- "x": 0,
1889
- "y": 0,
1890
- "rotation": 0,
1891
- "opacity": 1
1892
- },
1893
- "motion": {
1894
- "type": "none"
1895
- },
1896
- "transition": {
1897
- "type": "Cut",
1898
- "duration": 0
1899
- }
1900
- },
1901
- {
1902
- "id": "selection-1",
1903
- "kind": "video",
1904
- "trackId": "video",
1905
- "asset": {
1906
- "kind": "video",
1907
- "assetId": "approved-video",
1908
- "versionId": "v1",
1909
- "url": "https://media.example/approved.mp4",
1910
- "width": 1080,
1911
- "height": 1920,
1912
- "duration": 12
1913
- },
1914
- "assetId": "approved-video",
1915
- "versionId": "v1",
1916
- "url": "https://media.example/approved.mp4",
1917
- "title": "Original video",
1918
- "start": 1,
1919
- "duration": 8,
1920
- "trimStart": 4,
1921
- "speed": 1,
1922
- "volume": 0,
1923
- "transform": {
1924
- "fit": "contain",
1925
- "scale": 1,
1926
- "x": 0,
1927
- "y": 0,
1928
- "rotation": 0,
1929
- "opacity": 1
1930
- },
1931
- "motion": {
1932
- "type": "none"
1933
- },
1934
- "transition": {
1935
- "type": "Cut",
1936
- "duration": 0
1937
- }
1938
- }
1939
- ],
1940
- "audioItems": [
1941
- {
1942
- "id": "selection-1-sound",
1943
- "trackId": "speech",
1944
- "asset": {
1945
- "kind": "video",
1946
- "assetId": "approved-video",
1947
- "versionId": "v1",
1948
- "url": "https://media.example/approved.mp4",
1949
- "width": 1080,
1950
- "height": 1920,
1951
- "duration": 12
1952
- },
1953
- "assetId": "approved-video",
1954
- "versionId": "v1",
1955
- "url": "https://media.example/approved.mp4",
1956
- "title": "Original speech",
1957
- "start": 1,
1958
- "duration": 8,
1959
- "sourceOffset": 4,
1960
- "trimStart": 4,
1961
- "volume": 100,
1962
- "rate": 1,
1963
- "fadeIn": 0,
1964
- "fadeOut": 0
1965
- }
1966
- ],
1967
- "captions": [
1968
- {
1969
- "id": "caption-0",
1970
- "trackId": "captions",
1971
- "type": "text",
1972
- "text": "Keep the complete thought in the clip.",
1973
- "start": 1,
1974
- "end": 9,
1975
- "font": "Hanken Grotesk",
1976
- "size": 15,
1977
- "color": "#FFFFFF",
1978
- "background": "#0A0A0A",
1979
- "backgroundOpacity": 75,
1980
- "backgroundPadding": 5,
1981
- "backgroundRadius": 3,
1982
- "width": 0.82,
1983
- "x": 50,
1984
- "y": 76,
1985
- "position": "center",
1986
- "animation": "none",
1987
- "animIn": 0.12,
1988
- "animOut": 0
1989
- }
1990
- ],
1991
- "textOverlays": [
1992
- {
1993
- "id": "preview-label",
1994
- "trackId": "variant-hook",
1995
- "type": "text",
1996
- "text": "Preview · actual footage",
1997
- "start": 0,
1998
- "end": 1,
1999
- "font": "Hanken Grotesk",
2000
- "size": 7,
2001
- "color": "#F7F0DB",
2002
- "background": "#0A0A0A",
2003
- "backgroundOpacity": 85,
2004
- "backgroundPadding": 5,
2005
- "width": 0.82,
2006
- "x": 50,
2007
- "y": 8,
2008
- "position": "center",
2009
- "animation": "fade",
2010
- "animIn": 0.12,
2011
- "animOut": 0.1
2012
- },
2013
- {
2014
- "id": "approved-hook-A",
2015
- "trackId": "variant-hook",
2016
- "type": "text",
2017
- "text": "Watch the preparation",
2018
- "start": 0,
2019
- "end": 1,
2020
- "font": "Hanken Grotesk",
2021
- "size": 8.788958333333333,
2022
- "color": "#F7F0DB",
2023
- "background": "#0A0A0A",
2024
- "backgroundOpacity": 85,
2025
- "backgroundPadding": 5,
2026
- "width": 0.82,
2027
- "x": 50,
2028
- "y": 18,
2029
- "position": "center",
2030
- "animation": "fade",
2031
- "animIn": 0.12,
2032
- "animOut": 0.1
2033
- }
2034
- ],
2035
- "stickers": [],
2036
- "effects": [],
2037
- "audio": [
2038
- {
2039
- "id": "selection-1-sound",
2040
- "trackId": "speech",
2041
- "asset": {
2042
- "kind": "video",
2043
- "assetId": "approved-video",
2044
- "versionId": "v1",
2045
- "url": "https://media.example/approved.mp4",
2046
- "width": 1080,
2047
- "height": 1920,
2048
- "duration": 12
2049
- },
2050
- "assetId": "approved-video",
2051
- "versionId": "v1",
2052
- "url": "https://media.example/approved.mp4",
2053
- "title": "Original speech",
2054
- "start": 1,
2055
- "duration": 8,
2056
- "sourceOffset": 4,
2057
- "trimStart": 4,
2058
- "volume": 100,
2059
- "rate": 1,
2060
- "fadeIn": 0,
2061
- "fadeOut": 0
2062
- }
2063
- ],
2064
- "overlays": [
2065
- {
2066
- "id": "caption-0",
2067
- "trackId": "captions",
2068
- "type": "text",
2069
- "text": "Keep the complete thought in the clip.",
2070
- "start": 1,
2071
- "end": 9,
2072
- "font": "Hanken Grotesk",
2073
- "size": 15,
2074
- "color": "#FFFFFF",
2075
- "background": "#0A0A0A",
2076
- "backgroundOpacity": 75,
2077
- "backgroundPadding": 5,
2078
- "backgroundRadius": 3,
2079
- "width": 0.82,
2080
- "x": 50,
2081
- "y": 76,
2082
- "position": "center",
2083
- "animation": "none",
2084
- "animIn": 0.12,
2085
- "animOut": 0
2086
- },
2087
- {
2088
- "id": "preview-label",
2089
- "trackId": "variant-hook",
2090
- "type": "text",
2091
- "text": "Preview · actual footage",
2092
- "start": 0,
2093
- "end": 1,
2094
- "font": "Hanken Grotesk",
2095
- "size": 7,
2096
- "color": "#F7F0DB",
2097
- "background": "#0A0A0A",
2098
- "backgroundOpacity": 85,
2099
- "backgroundPadding": 5,
2100
- "width": 0.82,
2101
- "x": 50,
2102
- "y": 8,
2103
- "position": "center",
2104
- "animation": "fade",
2105
- "animIn": 0.12,
2106
- "animOut": 0.1
2107
- },
2108
- {
2109
- "id": "approved-hook-A",
2110
- "trackId": "variant-hook",
2111
- "type": "text",
2112
- "text": "Watch the preparation",
2113
- "start": 0,
2114
- "end": 1,
2115
- "font": "Hanken Grotesk",
2116
- "size": 8.788958333333333,
2117
- "color": "#F7F0DB",
2118
- "background": "#0A0A0A",
2119
- "backgroundOpacity": 85,
2120
- "backgroundPadding": 5,
2121
- "width": 0.82,
2122
- "x": 50,
2123
- "y": 18,
2124
- "position": "center",
2125
- "animation": "fade",
2126
- "animIn": 0.12,
2127
- "animOut": 0.1
2128
- }
2129
- ],
2130
- "targetDuration": 9,
2131
- "exportSettings": {
2132
- "aspect": "9:16",
2133
- "fps": 30,
2134
- "resolution": "1080p",
2135
- "quality": "high"
2136
- },
2137
- "productAdVariant": {
2138
- "schemaVersion": 1,
2139
- "block": {
2140
- "id": "stillmade.product-ad-variants",
2141
- "version": "1.0.0"
2142
- },
2143
- "variant": "A",
2144
- "opening": {
2145
- "from": 0,
2146
- "to": 1,
2147
- "silent": true
2148
- },
2149
- "bodyOffset": 1,
2150
- "source": {
2151
- "assetId": "approved-video",
2152
- "versionId": "v1"
2153
- },
2154
- "hook": "Watch the preparation"
2155
- }
2156
- },
2157
- "variantB": {
2158
- "schemaVersion": 1,
2159
- "activeTimelineId": "short-form",
2160
- "name": "Variant B · Look at the process",
2161
- "aspect": "9:16",
2162
- "aspectRatio": "9:16",
2163
- "previewH": 369,
2164
- "backgroundColor": "#0A0A0A",
2165
- "tracks": [
2166
- {
2167
- "id": "video",
2168
- "type": "video",
2169
- "label": "Source selections"
2170
- },
2171
- {
2172
- "id": "speech",
2173
- "type": "audio",
2174
- "label": "Original speech"
2175
- },
2176
- {
2177
- "id": "music",
2178
- "type": "audio",
2179
- "label": "Music"
2180
- },
2181
- {
2182
- "id": "captions",
2183
- "type": "caption",
2184
- "label": "Reviewed subtitles"
2185
- },
2186
- {
2187
- "id": "copy",
2188
- "type": "text",
2189
- "label": "Approved copy"
2190
- },
2191
- {
2192
- "id": "variant-hook",
2193
- "type": "text",
2194
- "label": "Approved opening hook"
2195
- }
2196
- ],
2197
- "trackOrder": [
2198
- "video",
2199
- "speech",
2200
- "music",
2201
- "captions",
2202
- "copy",
2203
- "variant-hook"
2204
- ],
2205
- "clips": [
2206
- {
2207
- "id": "opening-preview-B",
2208
- "kind": "video",
2209
- "trackId": "video",
2210
- "asset": {
2211
- "kind": "video",
2212
- "assetId": "approved-video",
2213
- "versionId": "v1",
2214
- "url": "https://media.example/approved.mp4",
2215
- "width": 1080,
2216
- "height": 1920,
2217
- "duration": 12
2218
- },
2219
- "assetId": "approved-video",
2220
- "versionId": "v1",
2221
- "url": "https://media.example/approved.mp4",
2222
- "title": "Source preview B",
2223
- "start": 0,
2224
- "duration": 1,
2225
- "trimStart": 2,
2226
- "speed": 1,
2227
- "volume": 0,
2228
- "transform": {
2229
- "fit": "contain",
2230
- "scale": 1,
2231
- "x": 0,
2232
- "y": 0,
2233
- "rotation": 0,
2234
- "opacity": 1
2235
- },
2236
- "motion": {
2237
- "type": "none"
2238
- },
2239
- "transition": {
2240
- "type": "Cut",
2241
- "duration": 0
2242
- }
2243
- },
2244
- {
2245
- "id": "selection-1",
2246
- "kind": "video",
2247
- "trackId": "video",
2248
- "asset": {
2249
- "kind": "video",
2250
- "assetId": "approved-video",
2251
- "versionId": "v1",
2252
- "url": "https://media.example/approved.mp4",
2253
- "width": 1080,
2254
- "height": 1920,
2255
- "duration": 12
2256
- },
2257
- "assetId": "approved-video",
2258
- "versionId": "v1",
2259
- "url": "https://media.example/approved.mp4",
2260
- "title": "Original video",
2261
- "start": 1,
2262
- "duration": 8,
2263
- "trimStart": 4,
2264
- "speed": 1,
2265
- "volume": 0,
2266
- "transform": {
2267
- "fit": "contain",
2268
- "scale": 1,
2269
- "x": 0,
2270
- "y": 0,
2271
- "rotation": 0,
2272
- "opacity": 1
2273
- },
2274
- "motion": {
2275
- "type": "none"
2276
- },
2277
- "transition": {
2278
- "type": "Cut",
2279
- "duration": 0
2280
- }
2281
- }
2282
- ],
2283
- "audioItems": [
2284
- {
2285
- "id": "selection-1-sound",
2286
- "trackId": "speech",
2287
- "asset": {
2288
- "kind": "video",
2289
- "assetId": "approved-video",
2290
- "versionId": "v1",
2291
- "url": "https://media.example/approved.mp4",
2292
- "width": 1080,
2293
- "height": 1920,
2294
- "duration": 12
2295
- },
2296
- "assetId": "approved-video",
2297
- "versionId": "v1",
2298
- "url": "https://media.example/approved.mp4",
2299
- "title": "Original speech",
2300
- "start": 1,
2301
- "duration": 8,
2302
- "sourceOffset": 4,
2303
- "trimStart": 4,
2304
- "volume": 100,
2305
- "rate": 1,
2306
- "fadeIn": 0,
2307
- "fadeOut": 0
2308
- }
2309
- ],
2310
- "captions": [
2311
- {
2312
- "id": "caption-0",
2313
- "trackId": "captions",
2314
- "type": "text",
2315
- "text": "Keep the complete thought in the clip.",
2316
- "start": 1,
2317
- "end": 9,
2318
- "font": "Hanken Grotesk",
2319
- "size": 15,
2320
- "color": "#FFFFFF",
2321
- "background": "#0A0A0A",
2322
- "backgroundOpacity": 75,
2323
- "backgroundPadding": 5,
2324
- "backgroundRadius": 3,
2325
- "width": 0.82,
2326
- "x": 50,
2327
- "y": 76,
2328
- "position": "center",
2329
- "animation": "none",
2330
- "animIn": 0.12,
2331
- "animOut": 0
2332
- }
2333
- ],
2334
- "textOverlays": [
2335
- {
2336
- "id": "preview-label",
2337
- "trackId": "variant-hook",
2338
- "type": "text",
2339
- "text": "Preview · actual footage",
2340
- "start": 0,
2341
- "end": 1,
2342
- "font": "Hanken Grotesk",
2343
- "size": 7,
2344
- "color": "#F7F0DB",
2345
- "background": "#0A0A0A",
2346
- "backgroundOpacity": 85,
2347
- "backgroundPadding": 5,
2348
- "width": 0.82,
2349
- "x": 50,
2350
- "y": 8,
2351
- "position": "center",
2352
- "animation": "fade",
2353
- "animIn": 0.12,
2354
- "animOut": 0.1
2355
- },
2356
- {
2357
- "id": "approved-hook-B",
2358
- "trackId": "variant-hook",
2359
- "type": "text",
2360
- "text": "Look at the process",
2361
- "start": 0,
2362
- "end": 1,
2363
- "font": "Hanken Grotesk",
2364
- "size": 8.788958333333333,
2365
- "color": "#F7F0DB",
2366
- "background": "#0A0A0A",
2367
- "backgroundOpacity": 85,
2368
- "backgroundPadding": 5,
2369
- "width": 0.82,
2370
- "x": 50,
2371
- "y": 18,
2372
- "position": "center",
2373
- "animation": "fade",
2374
- "animIn": 0.12,
2375
- "animOut": 0.1
2376
- }
2377
- ],
2378
- "stickers": [],
2379
- "effects": [],
2380
- "audio": [
2381
- {
2382
- "id": "selection-1-sound",
2383
- "trackId": "speech",
2384
- "asset": {
2385
- "kind": "video",
2386
- "assetId": "approved-video",
2387
- "versionId": "v1",
2388
- "url": "https://media.example/approved.mp4",
2389
- "width": 1080,
2390
- "height": 1920,
2391
- "duration": 12
2392
- },
2393
- "assetId": "approved-video",
2394
- "versionId": "v1",
2395
- "url": "https://media.example/approved.mp4",
2396
- "title": "Original speech",
2397
- "start": 1,
2398
- "duration": 8,
2399
- "sourceOffset": 4,
2400
- "trimStart": 4,
2401
- "volume": 100,
2402
- "rate": 1,
2403
- "fadeIn": 0,
2404
- "fadeOut": 0
2405
- }
2406
- ],
2407
- "overlays": [
2408
- {
2409
- "id": "caption-0",
2410
- "trackId": "captions",
2411
- "type": "text",
2412
- "text": "Keep the complete thought in the clip.",
2413
- "start": 1,
2414
- "end": 9,
2415
- "font": "Hanken Grotesk",
2416
- "size": 15,
2417
- "color": "#FFFFFF",
2418
- "background": "#0A0A0A",
2419
- "backgroundOpacity": 75,
2420
- "backgroundPadding": 5,
2421
- "backgroundRadius": 3,
2422
- "width": 0.82,
2423
- "x": 50,
2424
- "y": 76,
2425
- "position": "center",
2426
- "animation": "none",
2427
- "animIn": 0.12,
2428
- "animOut": 0
2429
- },
2430
- {
2431
- "id": "preview-label",
2432
- "trackId": "variant-hook",
2433
- "type": "text",
2434
- "text": "Preview · actual footage",
2435
- "start": 0,
2436
- "end": 1,
2437
- "font": "Hanken Grotesk",
2438
- "size": 7,
2439
- "color": "#F7F0DB",
2440
- "background": "#0A0A0A",
2441
- "backgroundOpacity": 85,
2442
- "backgroundPadding": 5,
2443
- "width": 0.82,
2444
- "x": 50,
2445
- "y": 8,
2446
- "position": "center",
2447
- "animation": "fade",
2448
- "animIn": 0.12,
2449
- "animOut": 0.1
2450
- },
2451
- {
2452
- "id": "approved-hook-B",
2453
- "trackId": "variant-hook",
2454
- "type": "text",
2455
- "text": "Look at the process",
2456
- "start": 0,
2457
- "end": 1,
2458
- "font": "Hanken Grotesk",
2459
- "size": 8.788958333333333,
2460
- "color": "#F7F0DB",
2461
- "background": "#0A0A0A",
2462
- "backgroundOpacity": 85,
2463
- "backgroundPadding": 5,
2464
- "width": 0.82,
2465
- "x": 50,
2466
- "y": 18,
2467
- "position": "center",
2468
- "animation": "fade",
2469
- "animIn": 0.12,
2470
- "animOut": 0.1
2471
- }
2472
- ],
2473
- "targetDuration": 9,
2474
- "exportSettings": {
2475
- "aspect": "9:16",
2476
- "fps": 30,
2477
- "resolution": "1080p",
2478
- "quality": "high"
2479
- },
2480
- "productAdVariant": {
2481
- "schemaVersion": 1,
2482
- "block": {
2483
- "id": "stillmade.product-ad-variants",
2484
- "version": "1.0.0"
2485
- },
2486
- "variant": "B",
2487
- "opening": {
2488
- "from": 2,
2489
- "to": 3,
2490
- "silent": true
2491
- },
2492
- "bodyOffset": 1,
2493
- "source": {
2494
- "assetId": "approved-video",
2495
- "versionId": "v1"
2496
- },
2497
- "hook": "Look at the process"
2498
- }
2499
- },
2500
- "variantC": {
2501
- "schemaVersion": 1,
2502
- "activeTimelineId": "short-form",
2503
- "name": "Variant C · See the finished pour",
2504
- "aspect": "9:16",
2505
- "aspectRatio": "9:16",
2506
- "previewH": 369,
2507
- "backgroundColor": "#0A0A0A",
2508
- "tracks": [
2509
- {
2510
- "id": "video",
2511
- "type": "video",
2512
- "label": "Source selections"
2513
- },
2514
- {
2515
- "id": "speech",
2516
- "type": "audio",
2517
- "label": "Original speech"
2518
- },
2519
- {
2520
- "id": "music",
2521
- "type": "audio",
2522
- "label": "Music"
2523
- },
2524
- {
2525
- "id": "captions",
2526
- "type": "caption",
2527
- "label": "Reviewed subtitles"
2528
- },
2529
- {
2530
- "id": "copy",
2531
- "type": "text",
2532
- "label": "Approved copy"
2533
- },
2534
- {
2535
- "id": "variant-hook",
2536
- "type": "text",
2537
- "label": "Approved opening hook"
2538
- }
2539
- ],
2540
- "trackOrder": [
2541
- "video",
2542
- "speech",
2543
- "music",
2544
- "captions",
2545
- "copy",
2546
- "variant-hook"
2547
- ],
2548
- "clips": [
2549
- {
2550
- "id": "opening-preview-C",
2551
- "kind": "video",
2552
- "trackId": "video",
2553
- "asset": {
2554
- "kind": "video",
2555
- "assetId": "approved-video",
2556
- "versionId": "v1",
2557
- "url": "https://media.example/approved.mp4",
2558
- "width": 1080,
2559
- "height": 1920,
2560
- "duration": 12
2561
- },
2562
- "assetId": "approved-video",
2563
- "versionId": "v1",
2564
- "url": "https://media.example/approved.mp4",
2565
- "title": "Source preview C",
2566
- "start": 0,
2567
- "duration": 1,
2568
- "trimStart": 4,
2569
- "speed": 1,
2570
- "volume": 0,
2571
- "transform": {
2572
- "fit": "contain",
2573
- "scale": 1,
2574
- "x": 0,
2575
- "y": 0,
2576
- "rotation": 0,
2577
- "opacity": 1
2578
- },
2579
- "motion": {
2580
- "type": "none"
2581
- },
2582
- "transition": {
2583
- "type": "Cut",
2584
- "duration": 0
2585
- }
2586
- },
2587
- {
2588
- "id": "selection-1",
2589
- "kind": "video",
2590
- "trackId": "video",
2591
- "asset": {
2592
- "kind": "video",
2593
- "assetId": "approved-video",
2594
- "versionId": "v1",
2595
- "url": "https://media.example/approved.mp4",
2596
- "width": 1080,
2597
- "height": 1920,
2598
- "duration": 12
2599
- },
2600
- "assetId": "approved-video",
2601
- "versionId": "v1",
2602
- "url": "https://media.example/approved.mp4",
2603
- "title": "Original video",
2604
- "start": 1,
2605
- "duration": 8,
2606
- "trimStart": 4,
2607
- "speed": 1,
2608
- "volume": 0,
2609
- "transform": {
2610
- "fit": "contain",
2611
- "scale": 1,
2612
- "x": 0,
2613
- "y": 0,
2614
- "rotation": 0,
2615
- "opacity": 1
2616
- },
2617
- "motion": {
2618
- "type": "none"
2619
- },
2620
- "transition": {
2621
- "type": "Cut",
2622
- "duration": 0
2623
- }
2624
- }
2625
- ],
2626
- "audioItems": [
2627
- {
2628
- "id": "selection-1-sound",
2629
- "trackId": "speech",
2630
- "asset": {
2631
- "kind": "video",
2632
- "assetId": "approved-video",
2633
- "versionId": "v1",
2634
- "url": "https://media.example/approved.mp4",
2635
- "width": 1080,
2636
- "height": 1920,
2637
- "duration": 12
2638
- },
2639
- "assetId": "approved-video",
2640
- "versionId": "v1",
2641
- "url": "https://media.example/approved.mp4",
2642
- "title": "Original speech",
2643
- "start": 1,
2644
- "duration": 8,
2645
- "sourceOffset": 4,
2646
- "trimStart": 4,
2647
- "volume": 100,
2648
- "rate": 1,
2649
- "fadeIn": 0,
2650
- "fadeOut": 0
2651
- }
2652
- ],
2653
- "captions": [
2654
- {
2655
- "id": "caption-0",
2656
- "trackId": "captions",
2657
- "type": "text",
2658
- "text": "Keep the complete thought in the clip.",
2659
- "start": 1,
2660
- "end": 9,
2661
- "font": "Hanken Grotesk",
2662
- "size": 15,
2663
- "color": "#FFFFFF",
2664
- "background": "#0A0A0A",
2665
- "backgroundOpacity": 75,
2666
- "backgroundPadding": 5,
2667
- "backgroundRadius": 3,
2668
- "width": 0.82,
2669
- "x": 50,
2670
- "y": 76,
2671
- "position": "center",
2672
- "animation": "none",
2673
- "animIn": 0.12,
2674
- "animOut": 0
2675
- }
2676
- ],
2677
- "textOverlays": [
2678
- {
2679
- "id": "preview-label",
2680
- "trackId": "variant-hook",
2681
- "type": "text",
2682
- "text": "Preview · actual footage",
2683
- "start": 0,
2684
- "end": 1,
2685
- "font": "Hanken Grotesk",
2686
- "size": 7,
2687
- "color": "#F7F0DB",
2688
- "background": "#0A0A0A",
2689
- "backgroundOpacity": 85,
2690
- "backgroundPadding": 5,
2691
- "width": 0.82,
2692
- "x": 50,
2693
- "y": 8,
2694
- "position": "center",
2695
- "animation": "fade",
2696
- "animIn": 0.12,
2697
- "animOut": 0.1
2698
- },
2699
- {
2700
- "id": "approved-hook-C",
2701
- "trackId": "variant-hook",
2702
- "type": "text",
2703
- "text": "See the finished pour",
2704
- "start": 0,
2705
- "end": 1,
2706
- "font": "Hanken Grotesk",
2707
- "size": 8.788958333333333,
2708
- "color": "#F7F0DB",
2709
- "background": "#0A0A0A",
2710
- "backgroundOpacity": 85,
2711
- "backgroundPadding": 5,
2712
- "width": 0.82,
2713
- "x": 50,
2714
- "y": 18,
2715
- "position": "center",
2716
- "animation": "fade",
2717
- "animIn": 0.12,
2718
- "animOut": 0.1
2719
- }
2720
- ],
2721
- "stickers": [],
2722
- "effects": [],
2723
- "audio": [
2724
- {
2725
- "id": "selection-1-sound",
2726
- "trackId": "speech",
2727
- "asset": {
2728
- "kind": "video",
2729
- "assetId": "approved-video",
2730
- "versionId": "v1",
2731
- "url": "https://media.example/approved.mp4",
2732
- "width": 1080,
2733
- "height": 1920,
2734
- "duration": 12
2735
- },
2736
- "assetId": "approved-video",
2737
- "versionId": "v1",
2738
- "url": "https://media.example/approved.mp4",
2739
- "title": "Original speech",
2740
- "start": 1,
2741
- "duration": 8,
2742
- "sourceOffset": 4,
2743
- "trimStart": 4,
2744
- "volume": 100,
2745
- "rate": 1,
2746
- "fadeIn": 0,
2747
- "fadeOut": 0
2748
- }
2749
- ],
2750
- "overlays": [
2751
- {
2752
- "id": "caption-0",
2753
- "trackId": "captions",
2754
- "type": "text",
2755
- "text": "Keep the complete thought in the clip.",
2756
- "start": 1,
2757
- "end": 9,
2758
- "font": "Hanken Grotesk",
2759
- "size": 15,
2760
- "color": "#FFFFFF",
2761
- "background": "#0A0A0A",
2762
- "backgroundOpacity": 75,
2763
- "backgroundPadding": 5,
2764
- "backgroundRadius": 3,
2765
- "width": 0.82,
2766
- "x": 50,
2767
- "y": 76,
2768
- "position": "center",
2769
- "animation": "none",
2770
- "animIn": 0.12,
2771
- "animOut": 0
2772
- },
2773
- {
2774
- "id": "preview-label",
2775
- "trackId": "variant-hook",
2776
- "type": "text",
2777
- "text": "Preview · actual footage",
2778
- "start": 0,
2779
- "end": 1,
2780
- "font": "Hanken Grotesk",
2781
- "size": 7,
2782
- "color": "#F7F0DB",
2783
- "background": "#0A0A0A",
2784
- "backgroundOpacity": 85,
2785
- "backgroundPadding": 5,
2786
- "width": 0.82,
2787
- "x": 50,
2788
- "y": 8,
2789
- "position": "center",
2790
- "animation": "fade",
2791
- "animIn": 0.12,
2792
- "animOut": 0.1
2793
- },
2794
- {
2795
- "id": "approved-hook-C",
2796
- "trackId": "variant-hook",
2797
- "type": "text",
2798
- "text": "See the finished pour",
2799
- "start": 0,
2800
- "end": 1,
2801
- "font": "Hanken Grotesk",
2802
- "size": 8.788958333333333,
2803
- "color": "#F7F0DB",
2804
- "background": "#0A0A0A",
2805
- "backgroundOpacity": 85,
2806
- "backgroundPadding": 5,
2807
- "width": 0.82,
2808
- "x": 50,
2809
- "y": 18,
2810
- "position": "center",
2811
- "animation": "fade",
2812
- "animIn": 0.12,
2813
- "animOut": 0.1
2814
- }
2815
- ],
2816
- "targetDuration": 9,
2817
- "exportSettings": {
2818
- "aspect": "9:16",
2819
- "fps": 30,
2820
- "resolution": "1080p",
2821
- "quality": "high"
2822
- },
2823
- "productAdVariant": {
2824
- "schemaVersion": 1,
2825
- "block": {
2826
- "id": "stillmade.product-ad-variants",
2827
- "version": "1.0.0"
2828
- },
2829
- "variant": "C",
2830
- "opening": {
2831
- "from": 4,
2832
- "to": 5,
2833
- "silent": true
2834
- },
2835
- "bodyOffset": 1,
2836
- "source": {
2837
- "assetId": "approved-video",
2838
- "versionId": "v1"
2839
- },
2840
- "hook": "See the finished pour"
2841
- }
2842
- },
2843
- "review": {
2844
- "schemaVersion": 1,
2845
- "state": "needs-human-review",
2846
- "humanApproved": false,
2847
- "providerCalls": 0,
2848
- "source": {
2849
- "assetId": "approved-video",
2850
- "versionId": "v1"
2851
- },
2852
- "bodyDuration": 8,
2853
- "outputDuration": 9,
2854
- "variants": [
2855
- {
2856
- "id": "A",
2857
- "hook": "Watch the preparation",
2858
- "openingFrom": 0,
2859
- "openingTo": 1
2860
- },
2861
- {
2862
- "id": "B",
2863
- "hook": "Look at the process",
2864
- "openingFrom": 2,
2865
- "openingTo": 3
2866
- },
2867
- {
2868
- "id": "C",
2869
- "hook": "See the finished pour",
2870
- "openingFrom": 4,
2871
- "openingTo": 5
2872
- }
2873
- ],
2874
- "warnings": [
2875
- "The three previews use different supplied source moments, followed by the same complete demonstration. They are not generated product scenes.",
2876
- "Preview sound is muted to avoid presenting partial speech as a quote. Original body speech and captions retain their timing and exact words.",
2877
- "Watch and listen to all three exports at phone size. Verify each hook against the actual footage and approved offer.",
2878
- "No conversion performance, customer endorsement or independent rights verification is claimed."
2879
- ]
2880
- }
2881
- }
2882
- }
2883
- ],
2884
- "portable": {
2885
- "format": "stillmade-block/1",
2886
- "dependencies": [],
2887
- "sources": [
2888
- {
2889
- "kind": "original",
2890
- "license": "MIT",
2891
- "paths": [
2892
- "LICENSE",
2893
- "src/run.js"
2894
- ],
2895
- "evidence": [
2896
- "upstream/0/LICENSE",
2897
- "upstream/0/src/run.js"
2898
- ],
2899
- "changes": "Original implementation declared by the packager; no reused repository or dependency code."
2900
- }
2901
- ],
2902
- "files": {
2903
- "upstream/0/LICENSE": "MIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to deal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT \nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO \nEVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER \nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE \nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n",
2904
- "upstream/0/src/run.js": "// Block-owned source editing, executed only inside the declared SDK sandbox.\nconst clone = value => JSON.parse(JSON.stringify(value));\nconst check = (condition, message) => { if (!condition) throw Error(message); };\nconst round = value => Math.round(value * 1000000) / 1000000;\nconst base = input.timeline;\ncheck(base && base.schemaVersion === 1 && Array.isArray(base.clips) && base.clips.length > 0 && base.clips.length <= 12, 'Connect the reviewed Product Demonstration timeline.');\ncheck(base.aspect === '9:16', 'Prepare a portrait 9:16 demonstration before making variants.');\ncheck(Number.isFinite(base.targetDuration) && base.targetDuration >= 5 && base.targetDuration <= 60, 'Use a complete 5–60 second product demonstration.');\ncheck(input.copyApproved === true, 'Confirm permission for the source footage and review all three exact hooks against what it actually shows.');\ncheck(!base.stillmadeWatermark && !base.stillmadeEndScreen, 'Use an editable source timeline, before host export branding.');\ncheck(!(base.effects || []).length && !(base.stickers || []).length, 'Use the simple demonstration timeline before adding effects or graphic layers.');\nconst source = base.clips[0].asset;\ncheck(source && source.kind === 'video' && source.assetId && source.versionId && Number.isFinite(source.duration) && source.duration > 0 && Number.isFinite(source.width) && source.width > 0 && Number.isFinite(source.height) && source.height > 0, 'The original video needs its saved asset/version, duration and dimensions.');\ncheck(typeof source.url === 'string' && /^(https:\\/\\/|http:\\/\\/(localhost|127\\.0\\.0\\.1)(:\\d+)?\\/|\\/api\\/media\\/[a-zA-Z0-9_-]+\\/|sm-media:|blob:)/.test(source.url) && !/^https?:\\/\\/[^/?#]*@/.test(source.url), 'Use an authorized saved source video reference.');\nlet end = 0;\nfor (const clip of base.clips) {\n check(clip.kind === 'video' && clip.asset?.assetId === source.assetId && clip.asset?.versionId === source.versionId && clip.url === source.url, 'All demonstration selections must use the same exact original footage.');\n check(Number.isFinite(clip.start) && Math.abs(clip.start - end) < .001 && Number.isFinite(clip.duration) && clip.duration > 0, 'Keep the demonstration selections sequential, without gaps or overlaps.');\n check(clip.speed === 1 && Number.isFinite(clip.trimStart) && clip.trimStart >= 0 && clip.trimStart + clip.duration <= source.duration + .02, 'Use source-speed cuts within the original footage.');\n check(clip.transform?.fit === 'contain' && clip.transform?.rotation === 0 && clip.transform?.scale === 1 && clip.transform?.x === 0 && clip.transform?.y === 0, 'Keep the complete original frame for these evidence-preserving variants.');\n end = round(clip.start + clip.duration);\n}\ncheck(Math.abs(end - base.targetDuration) < .02, 'The demonstration duration must match its actual source selections.');\nconst length = input.openingDuration;\ncheck(Number.isFinite(length) && length >= 1 && length <= 3, 'Choose a 1–3 second opening preview.');\nconst options = ['A', 'B', 'C'].map(id => {\n const hook = input['hook' + id];\n check(typeof hook === 'string' && hook.trim() && hook.length <= 64 && !/[\\u0000-\\u001f<>]/.test(hook) && hook.split(/\\s+/).every(word => word.length <= 28), 'Supply a distinct approved hook of up to 64 plain-text characters for each variant.');\n const from = input['opening' + id];\n check(Number.isFinite(from) && from >= 0 && from + length <= source.duration + .001, 'Every opening preview must fit inside the original source video.');\n return {id, hook: hook.trim(), from, to: round(from + length)};\n});\ncheck(new Set(options.map(option => option.hook.toLowerCase())).size === 3, 'Use three distinct approved hooks.');\nfor (let i = 0; i < options.length; i++) for (let j = i + 1; j < options.length; j++) check(Math.abs(options[i].from - options[j].from) >= length - .001, 'Choose three non-overlapping source moments so the openings genuinely differ.');\nconst duration = round(base.targetDuration + length);\nconst shift = row => ({...clone(row), start: round((row.start || 0) + length), ...(Number.isFinite(row.end) ? {end: round(row.end + length)} : {})});\nconst rows = key => { check(base[key] === undefined || Array.isArray(base[key]), 'The demonstration contains unsupported editing data.'); return base[key] || []; };\nconst originalAudio = rows('audioItems'), originalCaptions = rows('captions'), originalCopy = rows('textOverlays');\ncheck(originalCaptions.length <= 500 && originalCopy.length <= 20 && originalAudio.length <= 20, 'Use a bounded demonstration timeline.');\nconst openingText = (id, text, y, size) => ({id,trackId:'variant-hook',type:'text',text,start:0,end:length,font:'Hanken Grotesk',size,color:'#F7F0DB',background:'#0A0A0A',backgroundOpacity:85,backgroundPadding:5,width:.82,x:50,y,position:'center',animation:'fade',animIn:.12,animOut:.1});\nconst outputs = {};\nfor (const option of options) {\n const timeline = clone(base);\n timeline.name = 'Variant ' + option.id + ' · ' + option.hook;\n timeline.targetDuration = duration;\n timeline.clips = [{...clone(base.clips[0]), id:'opening-preview-' + option.id, title:'Source preview ' + option.id, start:0, duration:length, trimStart:option.from, volume:0, transition:{type:'Cut',duration:0}, motion:{type:'none'}}, ...base.clips.map(shift)];\n timeline.audioItems = originalAudio.map(row => {\n // Only the existing explicitly named music bed may continue across the new\n // preview. Original speech stays attached to the untouched demonstration.\n if (row.id !== 'music-bed' || row.asset?.kind !== 'audio' || row.start !== 0) return shift(row);\n const offset = row.sourceOffset || row.trimStart || 0;\n check(Number.isFinite(row.asset.duration) && row.asset.duration >= offset + duration, 'The licensed music is too short for the opening plus full demonstration. Choose a longer soundtrack or omit it.');\n return {...clone(row), duration};\n });\n timeline.captions = originalCaptions.map(shift);\n const hookSize = Math.min(16, (369 * 9 / 16 * .82 - 12) / Math.max(18, ...option.hook.split(/\\s+/).map(word => word.length)));\n timeline.textOverlays = originalCopy.filter(row => row.id !== 'opening').map(row => row.id === 'disclosure' ? {...clone(row),start:0,end:duration} : shift(row));\n timeline.textOverlays.push(openingText('preview-label', 'Preview · actual footage', 8, 7), openingText('approved-hook-' + option.id, option.hook, 18, hookSize));\n timeline.tracks = [...(timeline.tracks || []), {id:'variant-hook',type:'text',label:'Approved opening hook'}];\n timeline.trackOrder = [...(timeline.trackOrder || []), 'variant-hook'];\n timeline.audio = clone(timeline.audioItems);\n timeline.overlays = clone([...timeline.captions, ...timeline.textOverlays]);\n timeline.productAdVariant = {schemaVersion:1,block:{id:'stillmade.product-ad-variants',version:'1.0.0'},variant:option.id,opening:{from:option.from,to:option.to,silent:true},bodyOffset:length,source:{assetId:source.assetId,versionId:source.versionId},hook:option.hook};\n outputs['variant' + option.id] = timeline;\n}\noutputs.review = {schemaVersion:1,state:'needs-human-review',humanApproved:false,providerCalls:0,source:{assetId:source.assetId,versionId:source.versionId},bodyDuration:base.targetDuration,outputDuration:duration,variants:options.map(option => ({id:option.id,hook:option.hook,openingFrom:option.from,openingTo:option.to})),warnings:['The three previews use different supplied source moments, followed by the same complete demonstration. They are not generated product scenes.','Preview sound is muted to avoid presenting partial speech as a quote. Original body speech and captions retain their timing and exact words.','Watch and listen to all three exports at phone size. Verify each hook against the actual footage and approved offer.','No conversion performance, customer endorsement or independent rights verification is claimed.']};\nreturn outputs;\n"
2905
- },
2906
- "lineage": {
2907
- "parents": [],
2908
- "changes": "Packaged original Block source for StillMade."
2909
- }
2910
- }
2911
- };