stillmade-sdk 0.1.42 → 0.1.44

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 (262) hide show
  1. package/.stillmade/sdk-baseline.json +6 -8
  2. package/AGENTS.md +15 -10
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +62 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +35 -25
  8. package/README.md +3 -2
  9. package/SDK.md +994 -550
  10. package/UI_AESTHETIC.md +22 -2
  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 +4 -1
  108. package/examples/generate-video.stillmade.json +6 -2
  109. package/examples/research-topic.stillmade.json +5 -1
  110. package/examples/text-workflow.stillmade.json +3 -32
  111. package/examples/timeline-polish.stillmade.json +11 -3
  112. package/examples/transcribe-audio.stillmade.json +11 -3
  113. package/package.json +1 -1
  114. package/packages/block-cli/cli.js +13 -6
  115. package/packages/block-cli/dev-host/assets/host.js +76 -38
  116. package/packages/block-cli/dev-host/assets/index.css +1 -1
  117. package/packages/block-cli/format.js +1 -1
  118. package/packages/block-cli/templates.js +31 -13
  119. package/packages/block-cli/type-packages.js +119 -0
  120. package/packages/block-platform/block-readiness.js +5 -0
  121. package/packages/block-platform/canvas.js +2 -1
  122. package/packages/block-platform/catalog.js +27 -48
  123. package/packages/block-platform/native-host-inventory.js +0 -226
  124. package/packages/block-platform/plain-descriptions.js +1 -25
  125. package/packages/block-platform/project-type-starters.js +13 -53
  126. package/packages/block-platform/script-handoff.js +2 -4
  127. package/packages/block-platform/type-workspace.js +2 -0
  128. package/packages/block-sdk/appearance.js +3 -1
  129. package/packages/block-sdk/block-tier.js +1 -1
  130. package/packages/block-sdk/builder-contract.js +10 -8
  131. package/packages/block-sdk/capabilities.js +1 -1
  132. package/packages/block-sdk/contracts.js +6 -2
  133. package/packages/block-sdk/first-party-identities.js +1 -84
  134. package/packages/block-sdk/first-party-packages.js +3 -85
  135. package/packages/block-sdk/generation-catalog.js +15 -3
  136. package/packages/block-sdk/index.d.ts +2 -1
  137. package/packages/block-sdk/media-analysis-example.js +1 -1
  138. package/packages/block-sdk/mock-host.js +7 -1
  139. package/packages/block-sdk/module-host-calls.js +35 -10
  140. package/packages/block-sdk/module-hosted.js +15 -2
  141. package/packages/block-sdk/module-media-access.js +71 -0
  142. package/packages/block-sdk/module-node.js +1 -1
  143. package/packages/block-sdk/portable-media-actions.js +1 -1
  144. package/packages/block-sdk/runtime.js +1 -1
  145. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  146. package/packages/block-sdk/transcription-example.js +1 -1
  147. package/packages/block-sdk/video-generation-example.js +1 -1
  148. package/packages/block-sdk/view-bridge.js +4 -1
  149. package/packages/block-sdk/view-design.js +17 -14
  150. package/packages/block-sdk/web-example.js +1 -1
  151. package/packages/design-system/block-kit.css +48 -12
  152. package/packages/design-system/block-kit.html +3 -2
  153. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  154. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  155. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  156. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  157. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  158. package/blocks/narration/package.js +0 -1
  159. package/blocks/narration/versions/1.0.0/package.js +0 -221
  160. package/blocks/narration/versions/1.0.1/package.js +0 -221
  161. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  162. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  163. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  164. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  165. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  166. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  167. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  168. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  169. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  170. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  171. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  172. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  173. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  174. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  175. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  176. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  177. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  178. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  179. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  180. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  181. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  182. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  183. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  184. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  185. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  186. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  187. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  188. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  189. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  190. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  191. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  192. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  193. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  194. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  195. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  196. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  197. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  198. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  199. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  200. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  201. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  202. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  203. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  204. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  205. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  206. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  207. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  208. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  209. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  210. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  211. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  212. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  213. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  214. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  215. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  216. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  217. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  218. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  219. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  220. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  221. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  222. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  223. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  224. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  225. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  226. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  227. package/blocks/occasion-story/package.js +0 -1
  228. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  229. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  230. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  231. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  232. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  233. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  234. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  235. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  236. package/blocks/release-visuals/package.js +0 -1
  237. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  238. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  239. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  240. package/blocks/screen-recorder/package.js +0 -1
  241. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  242. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  243. package/blocks/short-form-finish/package.js +0 -1
  244. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  245. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  246. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  247. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  248. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  249. package/examples/saas-product-launch.stillmade.json +0 -304
  250. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  251. package/packages/block-platform/first-revenue-project-types.js +0 -46
  252. package/packages/block-platform/fixture-starters.js +0 -13
  253. package/packages/block-platform/launch-project-source.js +0 -10
  254. package/packages/block-platform/launch-project.js +0 -30
  255. package/packages/block-platform/motion-project-types.js +0 -55
  256. package/packages/block-platform/motion-starters.js +0 -14
  257. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  258. package/packages/block-platform/product-launch-updated.js +0 -90
  259. package/packages/block-platform/revenue-review-project-types.js +0 -36
  260. package/packages/block-platform/revenue-review-starters.js +0 -13
  261. package/packages/block-platform/script-writer.js +0 -29
  262. package/packages/block-platform/website-source-block.js +0 -14
@@ -1,465 +0,0 @@
1
- // Generated immutable package data.
2
- export default {
3
- "manifest": {
4
- "schemaVersion": 1,
5
- "sdkVersion": "0.1.0",
6
- "id": "stillmade.motion-frame-review",
7
- "name": "Motion Frame Review",
8
- "version": "1.1.1",
9
- "kind": "workspace",
10
- "runtime": "javascript",
11
- "entry": "src/run.js",
12
- "description": "Plan one approved image every 3, 5, or 10 seconds, deterministically match exact supplied product images to visual scenes for free, optionally request a quoted batch for remaining styleframes, and hand only approved images to coded Motion Designer layers.",
13
- "inputs": {
14
- "designPackage": {
15
- "type": "text",
16
- "primary": true,
17
- "required": true,
18
- "role": "motion_design_package",
19
- "description": "Version 1 design package from Motion Director or Product Launch Director."
20
- },
21
- "assets": {
22
- "type": "asset[]",
23
- "context": "assets",
24
- "required": false,
25
- "description": "Exact saved project images reused as styleframes before any generation is proposed."
26
- },
27
- "generatedImages": {
28
- "type": "image[]",
29
- "required": false,
30
- "imageMode": "reference",
31
- "description": "Completed exact styleframe images returned by the separately approved batch action."
32
- },
33
- "cadenceSec": {
34
- "type": "number",
35
- "required": false,
36
- "default": 5,
37
- "min": 3,
38
- "max": 10,
39
- "description": "One planned image every 3, 5, or 10 seconds."
40
- },
41
- "action": {
42
- "type": "text",
43
- "required": false,
44
- "default": "prepare",
45
- "description": "Prepare locally, request a quoted batch for missing images, or confirm reviewed styleframes."
46
- },
47
- "approvals": {
48
- "type": "json",
49
- "required": false,
50
- "description": "Human approval and notes for exact completed styleframes."
51
- }
52
- },
53
- "outputs": {
54
- "designPackage": {
55
- "type": "text",
56
- "primary": true,
57
- "required": false,
58
- "role": "motion_design_package",
59
- "description": "Design package with approved exact styleframe IDs assigned to their coded scenes."
60
- },
61
- "styleframeAssets": {
62
- "type": "image[]",
63
- "required": false,
64
- "role": "approved_motion_styleframes",
65
- "description": "Approved exact image versions for Motion Designer content layers."
66
- },
67
- "styleframePlan": {
68
- "type": "metadata",
69
- "role": "motion_styleframe_plan",
70
- "description": "Deterministic timestamps, prompts, supplied-asset reuse, and generation readiness."
71
- },
72
- "frameReview": {
73
- "type": "metadata",
74
- "required": false,
75
- "role": "motion_frame_review",
76
- "description": "Approved timestamp-to-image mapping and explicit AI/local execution accounting."
77
- },
78
- "generateAction": {
79
- "type": "approval",
80
- "required": false,
81
- "role": "portable_media_action",
82
- "description": "Host-quoted batch request for missing styleframes; provider, model, credentials, pricing, reservation, and settlement remain host-owned."
83
- }
84
- },
85
- "permissions": {
86
- "project": [
87
- "context.assets.read"
88
- ],
89
- "actions": [
90
- "image.generate.batch"
91
- ],
92
- "network": [],
93
- "filesystem": [],
94
- "secrets": []
95
- },
96
- "ui": [],
97
- "platforms": {
98
- "phone": {
99
- "supported": true
100
- },
101
- "browser": {
102
- "supported": true
103
- },
104
- "desktop": {
105
- "supported": true
106
- }
107
- },
108
- "license": "MIT",
109
- "provenance": {
110
- "notice": "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"
111
- }
112
- },
113
- "code": "const reviewPreviousVersion=function reviewMotionFrames(input){\n const clone=value=>JSON.parse(JSON.stringify(value));\n const text=value=>value===undefined||value===null?'':String(value);\n const safeId=value=>text(value).trim().replace(/[^a-zA-Z0-9_-]+/g,'-').replace(/^-+|-+$/g,'').slice(0,120);\n const fingerprint=value=>{const source=JSON.stringify(value);let hash=2166136261;for(let index=0;index<source.length;index++){hash^=source.charCodeAt(index);hash=Math.imul(hash,16777619)}return (hash>>>0).toString(36)};\n const parsePackage=value=>{let candidate=value;if(candidate&&typeof candidate.text==='string')candidate=candidate.text;if(typeof candidate==='string'){try{candidate=JSON.parse(candidate)}catch{throw new Error('The connected design package is not valid JSON.')}}if(!candidate||Array.isArray(candidate)||candidate.schemaVersion!==1||candidate.kind!=='motion-design-package'||!Array.isArray(candidate.scenes)||!candidate.scenes.length)throw new Error('Connect a version 1 motion design package before planning styleframes.');return clone(candidate)};\n const pkg=parsePackage(input.designPackage),assets=Array.isArray(input.assets)?input.assets.filter(asset=>asset&&asset.assetId&&asset.versionId):[],assetById=id=>assets.find(asset=>asset.assetId===id||asset.versionId===id),cadence=Number(input.cadenceSec||5);\n if(![3,5,10].includes(cadence))throw new Error('Choose a 3, 5, or 10 second styleframe interval.');\n const duration=Number(pkg.intendedOutputs?.[0]?.durationSec)||pkg.scenes.reduce((sum,scene)=>sum+Math.max(1,Number(scene.durationSec)||1),0),aspect=text(pkg.intendedOutputs?.[0]?.aspect||'16:9');\n if(!Number.isFinite(duration)||duration<=0||duration>21600||!['16:9','9:16','1:1'].includes(aspect))throw new Error('The design package needs a supported duration and aspect.');\n const regular=Array.from({length:Math.floor(duration/cadence)+1},(_,index)=>Math.min(duration,index*cadence)),timestamps=(duration-regular.at(-1)>.25?[...regular,duration]:regular).map(value=>Number(value.toFixed(3)));\n if(timestamps.length>60)throw new Error('This interval creates more than 60 styleframes. Choose a larger interval.');\n const starts=[];let cursor=0;for(const scene of pkg.scenes){starts.push({scene,start:cursor,end:cursor+Math.max(1,Number(scene.durationSec)||1)});cursor+=Math.max(1,Number(scene.durationSec)||1)}\n const style=pkg.style||{},intent=pkg.creativeIntent||{},planItems=timestamps.map((timestamp,index)=>{const entry=starts.find(item=>timestamp>=item.start&&timestamp<item.end)||starts.at(-1),scene=entry.scene,content=(scene.assetIds||[]).map(assetById).find(asset=>asset&&asset.kind==='image'),copy=scene.copy||{},panelId='styleframe-'+String(index+1).padStart(2,'0')+'-'+String(Math.round(timestamp*1000)),brief=['Create one polished motion-graphics styleframe, not a complete video.','Aspect '+aspect+'. Timestamp '+String(timestamp)+' seconds.','Communication goal: '+text(scene.goal),'Exact on-screen copy: '+[copy.eyebrow,copy.headline,copy.support].map(text).filter(Boolean).join(' / '),'Composition: '+text(scene.layout),'Visual treatment: '+text(scene.visualApproach),'Motion implication: '+text(scene.motionIntent),'Global visual language: '+text(intent.visualLanguage),'Tone and density: '+[intent.tone,intent.density].map(text).filter(Boolean).join(', '),'Palette: background '+text(style.background)+', foreground '+text(style.foreground)+', accent '+text(style.accent)+'.','Make an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.'].filter(line=>!line.endsWith(': ')).join('\\n');return {panelId,timestampSec:timestamp,sceneId:safeId(scene.id)||'scene-'+String(index+1),sceneLabel:text(scene.goal||copy.headline||'Styleframe '+String(index+1)),brief,status:content?'supplied':'missing',image:content?{kind:'image',assetId:content.assetId,versionId:content.versionId,url:content.url,...(content.width?{width:content.width}:{}),...(content.height?{height:content.height}:{})}:null}});\n const generated=Array.isArray(input.generatedImages)?input.generatedImages.filter(image=>image&&image.kind==='image'&&image.assetId&&image.versionId&&image.url):[],byPanel=new Map(generated.map(image=>[text(image.panelId),image])),items=planItems.map(item=>{const image=item.image||byPanel.get(item.panelId);return {...item,status:image?'ready':'missing',image:image?clone(image):null}}),plan={schemaVersion:1,kind:'motion-styleframe-plan',sourceRevision:text(pkg.revision),cadenceSec:cadence,durationSec:Number(duration.toFixed(3)),aspectRatio:aspect,items,execution:{planning:'local-deterministic',imageGeneration:items.some(item=>!item.image)?'explicit-quoted-action-required':'not-required'}};\n const outputs={styleframePlan:plan};\n if(input.action==='generate-batch'){\n const missing=items.filter(item=>!item.image);\n if(!missing.length)throw new Error('Every planned styleframe already has an exact image.');\n outputs.generateAction={schemaVersion:1,kind:'stillmade.media-action',operation:'image.generate.batch',request:{source:{id:'stillmade.motion-frame-review',version:'1.0.0'},items:missing.map(item=>({panelId:item.panelId,prompt:item.brief})),aspectRatio:aspect},resultPort:'generatedImages'};\n }\n if(input.action==='confirm'){\n const approvals=Array.isArray(input.approvals)?input.approvals:[],approvalById=new Map(approvals.map(item=>[text(item.panelId),item])),approved=items.filter(item=>{const decision=approvalById.get(item.panelId);return decision?.approved===true&&item.image}).map(item=>{const decision=approvalById.get(item.panelId);return {...item,notes:text(decision.notes).trim().slice(0,500)}});\n if(!approved.length)throw new Error('Approve at least one completed styleframe before continuing.');\n const next=clone(pkg),approvedByScene=new Map();for(const item of approved){if(!approvedByScene.has(item.sceneId))approvedByScene.set(item.sceneId,[]);approvedByScene.get(item.sceneId).push(item)}\n next.scenes=next.scenes.map(scene=>{const selected=approvedByScene.get(safeId(scene.id))||[],ids=selected.map(item=>item.image.assetId);return {...scene,assetIds:[...new Set([...(scene.assetIds||[]),...ids])],styleframeIds:selected.map(item=>item.panelId)}});\n const existing=new Set((next.references||[]).map(reference=>text(reference.assetId)+'::'+text(reference.versionId)));next.references=[...(next.references||[]),...approved.filter(item=>!existing.has(item.image.assetId+'::'+item.image.versionId)).map(item=>({label:item.sceneLabel,assetId:item.image.assetId,versionId:item.image.versionId,role:'content',confidence:'approved-styleframe',notes:'Approved at '+String(item.timestampSec)+' seconds for coded layer animation.'}))];\n next.styleframeReview={schemaVersion:1,cadenceSec:cadence,durationSec:Number(duration.toFixed(3)),aspectRatio:aspect,approved:approved.map(item=>({panelId:item.panelId,timestampSec:item.timestampSec,sceneId:item.sceneId,assetId:item.image.assetId,versionId:item.image.versionId,notes:item.notes})),execution:{planningAi:false,imageGenerationUsed:approved.some(item=>byPanel.has(item.panelId)),stillmadeCreditsRequiredForPlanning:false,stillmadeCreditsRequiredForGeneratedImages:approved.some(item=>byPanel.has(item.panelId))}};\n next.revision=text(next.revision||'draft-1')+'-styleframes-'+fingerprint(next.styleframeReview);outputs.designPackage=JSON.stringify(next);outputs.styleframeAssets=approved.map(item=>clone(item.image));outputs.frameReview=next.styleframeReview;\n }\n return outputs;\n};\nconst next=JSON.parse(JSON.stringify(input));\nconst assets=Array.isArray(next.assets)?next.assets:[],images=assets.filter(asset=>asset?.kind==='image'&&asset.assetId&&asset.versionId&&asset.url);\nlet pkg=next.designPackage;\nif(pkg&&typeof pkg.text==='string')pkg=pkg.text;\nif(typeof pkg==='string'&&images.length){\n try{\n const parsed=JSON.parse(pkg);\n if(parsed?.schemaVersion===1&&parsed.kind==='motion-design-package'&&Array.isArray(parsed.scenes)){\n let visualIndex=0;\n parsed.scenes=parsed.scenes.map(scene=>{\n if(Array.isArray(scene.assetIds)&&scene.assetIds.length)return scene;\n const direction=[scene.goal,scene.visualApproach,scene.layout].filter(Boolean).join(' ');\n if(!/\\b(ui|interface|image|screenshot|editor|timeline|product|layer stack|composition)\\b/i.test(direction))return scene;\n const image=images[visualIndex++%images.length];\n return {...scene,assetIds:[image.assetId],evidenceRefs:[...new Set([...(Array.isArray(scene.evidenceRefs)?scene.evidenceRefs:[]),image.assetId])]};\n });\n next.designPackage=JSON.stringify(parsed);\n }\n }catch{}\n}\nreturn reviewPreviousVersion(next);",
114
- "view": {
115
- "html": "<main><header><div><small>Styleframe approval gate</small><h1>Motion Frame Review</h1><p>Approve the images the coded motion workspace will build on.</p></div><div class=\"cost\"><strong>Clear cost split</strong><span>Planning and review are local. Only Generate missing images opens a quoted AI action.</span></div></header><section><div class=\"section-head\"><div><h2>1. Choose the visual sampling rate</h2><p id=\"source\">Connect a Director package to plan styleframes.</p></div><label>One image every<select id=\"cadence\"><option value=\"3\">3 seconds</option><option value=\"5\" selected>5 seconds</option><option value=\"10\">10 seconds</option></select></label></div><div class=\"actions\"><button id=\"plan\" type=\"button\">Plan styleframes · free</button><button id=\"generate\" type=\"button\" class=\"paid\">Generate missing images · quoted</button><button id=\"approve-all\" class=\"secondary\" type=\"button\">Approve all ready</button><button id=\"reject-all\" class=\"secondary\" type=\"button\">Clear all</button></div><output id=\"status\" role=\"status\" aria-live=\"polite\">Waiting for a Director package.</output><div id=\"frames\" class=\"frames\"><p>Planned styleframes will appear here.</p></div></section><section class=\"handoff\"><div><h2>2. Confirm images for coded motion</h2><p>Approved exact image versions are attached to their scenes. Motion Designer then creates editable SVG/type/shape/image layers, keyframes, cameras, masks, and transitions around them.</p></div><button id=\"confirm\" type=\"button\">Confirm styleframes</button></section><aside><strong>What stays local</strong><p>Cadence, prompts, supplied-asset reuse, selection, notes, layer planning, motion editing, remixing, and deterministic rendering. Generated art is the only action here that can spend credits, and it cannot run before the host shows the batch maximum.</p></aside></main>",
116
- "css": "main{max-width:1220px;margin:0 auto;padding:22px;color:var(--fg);font-family:var(--font-body)}header,.section-head,.handoff{display:flex;align-items:flex-start;justify-content:space-between;gap:18px}header{margin-bottom:18px}h1{margin:4px 0 8px;font-family:var(--font-display);font-size:40px;font-style:italic;font-weight:200}h2{margin:0 0 6px;font-size:18px}p,small,output,.cost span{color:var(--fg-muted)}section,aside{margin-top:14px;padding:16px;border:1px solid var(--border-tok);border-radius:var(--r-3);background:var(--bg-elev-1)}.cost{display:grid;gap:3px;min-width:250px;padding:12px;border:1px solid var(--signal);border-radius:var(--r-2);background:color-mix(in srgb,var(--signal) 10%,var(--bg))}.cost strong{color:var(--signal)}label{display:grid;gap:6px;font-size:13px;font-weight:650}select,textarea{box-sizing:border-box;width:100%;padding:9px;border:1px solid var(--border-tok);border-radius:var(--r-2);background:var(--bg);color:var(--fg);font:inherit}.actions{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 8px}button{min-height:44px;padding:10px 16px;border:0;border-radius:999px;background:var(--fg);color:var(--bg);font:inherit}.paid{background:var(--signal);color:#111}button.secondary{border:1px solid var(--border-tok);background:transparent;color:var(--fg)}button:disabled{opacity:.5}.frames{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:14px}.frame{overflow:hidden;border:1px solid var(--border-tok);border-radius:var(--r-3);background:var(--bg)}.frame.approved{border-color:var(--signal);box-shadow:0 0 0 1px var(--signal)}.preview{display:grid;place-items:center;width:100%;aspect-ratio:16/9;background:linear-gradient(145deg,#171717,#292929);color:#aaa}.frame img{display:block;width:100%;aspect-ratio:16/9;object-fit:contain;background:#111}.frame-body{display:grid;gap:9px;padding:11px}.frame-head{display:flex;justify-content:space-between;gap:10px}.frame-head small{font-variant-numeric:tabular-nums}.approve{display:flex;grid-template-columns:auto 1fr;align-items:center;gap:8px;margin:0;font-weight:650}.approve input{width:auto}.prompt{max-height:120px;overflow:auto;white-space:pre-wrap;font-size:11px}.handoff{align-items:center}aside{display:grid;grid-template-columns:auto 1fr;gap:12px}aside p{margin:0}output{display:block;min-height:22px}@media(max-width:800px){header,.section-head,.handoff{flex-direction:column}.cost{min-width:0}.frames{grid-template-columns:1fr}aside{grid-template-columns:1fr}}",
117
- "javascript": "const e=id=>document.getElementById(id),status=e('status');let designPackage=null,assets=[],generatedImages=[],plan=null,decisions=new Map(),busy=false;const text=value=>value===undefined||value===null?'':String(value),clock=value=>{const seconds=Math.max(0,Number(value)||0),minutes=Math.floor(seconds/60),rest=(seconds-minutes*60).toFixed(2).padStart(5,'0');return String(minutes).padStart(2,'0')+':'+rest},imageFor=item=>item.image||generatedImages.find(image=>text(image.panelId)===item.panelId),card=(item,index)=>{const image=imageFor(item),decision=decisions.get(item.panelId)||{approved:!!image,notes:''};return {tag:'article',className:'frame'+(decision.approved?' approved':''),children:[image?{tag:'img',id:'styleframe-image-'+String(index),label:'Styleframe at '+clock(item.timestampSec)}:{tag:'div',className:'preview',children:[{tag:'strong',text:'Image needed'},{tag:'small',text:'Quoted generation only'}]},{tag:'div',className:'frame-body',children:[{tag:'div',className:'frame-head',children:[{tag:'strong',text:item.sceneLabel},{tag:'small',text:clock(item.timestampSec)}]},{tag:'label',className:'approve',children:[{tag:'input',type:'checkbox',action:'approve:'+String(index),checked:decision.approved,disabled:!image,label:'Approve '+item.panelId},{tag:'span',text:image?(item.status==='supplied'?'Use supplied asset':'Use generated image'):'Generate before approval'}]},{tag:'label',children:[{tag:'span',text:'Revision note'},{tag:'textarea',action:'notes:'+String(index),value:decision.notes,placeholder:'What should Motion Designer preserve or change?'}]},{tag:'details',children:[{tag:'summary',text:'Styleframe brief'},{tag:'p',className:'prompt',text:item.brief}]}]}]}},draw=()=>{const items=plan?.items||[];StillMade.render('frames',items.length?items.map(card):[{tag:'p',text:'Planned styleframes will appear here.'}]);items.forEach((item,index)=>{const image=imageFor(item),target=e('styleframe-image-'+String(index));if(image&&target)StillMade.previewImage(image).then(preview=>{target.src=preview.url}).catch(()=>{target.hidden=true})});e('generate').disabled=busy||!items.some(item=>!imageFor(item));e('confirm').disabled=busy||!items.some(item=>{const decision=decisions.get(item.panelId);return !!imageFor(item)&&decision?.approved})},request=async action=>{if(!designPackage)throw Error('Connect a Director package first.');return StillMade.run({designPackage,assets,generatedImages,cadenceSec:Number(e('cadence').value),action,...(action==='confirm'?{approvals:(plan?.items||[]).map(item=>({panelId:item.panelId,approved:decisions.get(item.panelId)?.approved===true,notes:text(decisions.get(item.panelId)?.notes)}))}:{})})};StillMade.onInput(values=>{designPackage=values.designPackage||null;assets=(values.assets||[]).filter(asset=>asset&&asset.assetId&&asset.versionId);generatedImages=Array.isArray(values.generatedImages)?values.generatedImages:[];if(generatedImages.length&&plan){plan={...plan,items:plan.items.map(item=>{const image=imageFor(item);return image?{...item,image,status:'ready'}:item})};}e('source').textContent='Director package connected · '+String(assets.length)+' exact project assets available.';status.textContent=generatedImages.length?String(generatedImages.length)+' generated styleframes returned. Review each image, then confirm.':'Choose a cadence and plan the stills.';draw()});StillMade.onAction(event=>{const parts=event.action.split(':'),item=plan?.items?.at(Number(parts.at(1)));if(!item)return;const current=decisions.get(item.panelId)||{approved:!!imageFor(item),notes:''};if(parts.at(0)==='approve')current.approved=event.checked;if(parts.at(0)==='notes')current.notes=event.value.slice(0,500);decisions.set(item.panelId,current);draw()});e('plan').addEventListener('click',async()=>{if(busy)return;busy=true;draw();status.textContent='Planning timestamps and reusing exact supplied assets locally…';try{const result=await request('prepare');plan=result.styleframePlan;decisions=new Map(plan.items.map(item=>[item.panelId,{approved:!!imageFor(item),notes:''}]));status.textContent=String(plan.items.length)+' styleframes planned · '+String(plan.items.filter(item=>!!imageFor(item)).length)+' already use supplied or completed images.'}catch(error){status.textContent=error.message||'The styleframe plan could not be prepared.'}finally{busy=false;draw()}});e('generate').addEventListener('click',async()=>{if(busy)return;busy=true;draw();status.textContent='Preparing the exact missing-image batch. Review the maximum cost before approving it.';try{await request('generate-batch');status.textContent='The quoted generation action is ready below. Approve it only if the batch and maximum look right.'}catch(error){status.textContent=error.message||'The image batch could not be prepared.'}finally{busy=false;draw()}});e('approve-all').addEventListener('click',()=>{(plan?.items||[]).forEach(item=>{if(imageFor(item))decisions.set(item.panelId,{approved:true,notes:text(decisions.get(item.panelId)?.notes)})});draw()});e('reject-all').addEventListener('click',()=>{(plan?.items||[]).forEach(item=>decisions.set(item.panelId,{approved:false,notes:text(decisions.get(item.panelId)?.notes)}));draw()});e('confirm').addEventListener('click',async()=>{if(busy)return;busy=true;draw();status.textContent='Binding approved images to the coded scene handoff…';try{const result=await request('confirm');status.textContent=String(result.frameReview.approved.length)+' exact styleframes approved. Motion Designer can now build the editable layer stack on them.'}catch(error){status.textContent=error.message||'The styleframes could not be confirmed.'}finally{busy=false;draw()}});",
118
- "themedCss": ".cost{background:var(--bg-elev-2);border-color:var(--signal)}.cost strong{color:var(--signal)}.paid{background:var(--signal);color:var(--fg-on-accent)}.preview{background:var(--bg-inset);color:var(--fg-muted)}"
119
- },
120
- "tests": [
121
- {
122
- "name": "Reuse supplied images and approve an exact generated styleframe handoff",
123
- "input": {
124
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"reference-1\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Real product UI inside an editorial composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[\"ui-1\"],\"evidenceRefs\":[],\"locks\":[]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null}}",
125
- "assets": [
126
- {
127
- "kind": "image",
128
- "assetId": "ui-1",
129
- "versionId": "ui-v1",
130
- "url": "https://media.example/ui.png",
131
- "width": 1600,
132
- "height": 900
133
- }
134
- ],
135
- "generatedImages": [
136
- {
137
- "kind": "image",
138
- "assetId": "generated-1",
139
- "versionId": "generated-v1",
140
- "url": "https://media.example/generated.png",
141
- "panelId": "styleframe-03-10000",
142
- "width": 1024,
143
- "height": 1024
144
- }
145
- ],
146
- "cadenceSec": 5,
147
- "action": "confirm",
148
- "approvals": [
149
- {
150
- "panelId": "styleframe-01-0",
151
- "approved": true,
152
- "notes": ""
153
- },
154
- {
155
- "panelId": "styleframe-02-5000",
156
- "approved": false,
157
- "notes": ""
158
- },
159
- {
160
- "panelId": "styleframe-03-10000",
161
- "approved": true,
162
- "notes": ""
163
- },
164
- {
165
- "panelId": "styleframe-04-12000",
166
- "approved": true,
167
- "notes": ""
168
- }
169
- ]
170
- },
171
- "expected": {
172
- "styleframePlan": {
173
- "schemaVersion": 1,
174
- "kind": "motion-styleframe-plan",
175
- "sourceRevision": "reference-1",
176
- "cadenceSec": 5,
177
- "durationSec": 12,
178
- "aspectRatio": "16:9",
179
- "items": [
180
- {
181
- "panelId": "styleframe-01-0",
182
- "timestampSec": 0,
183
- "sceneId": "scene-1",
184
- "sceneLabel": "Show the product",
185
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 0 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
186
- "status": "ready",
187
- "image": {
188
- "kind": "image",
189
- "assetId": "ui-1",
190
- "versionId": "ui-v1",
191
- "url": "https://media.example/ui.png",
192
- "width": 1600,
193
- "height": 900
194
- }
195
- },
196
- {
197
- "panelId": "styleframe-02-5000",
198
- "timestampSec": 5,
199
- "sceneId": "scene-1",
200
- "sceneLabel": "Show the product",
201
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 5 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
202
- "status": "ready",
203
- "image": {
204
- "kind": "image",
205
- "assetId": "ui-1",
206
- "versionId": "ui-v1",
207
- "url": "https://media.example/ui.png",
208
- "width": 1600,
209
- "height": 900
210
- }
211
- },
212
- {
213
- "panelId": "styleframe-03-10000",
214
- "timestampSec": 10,
215
- "sceneId": "scene-2",
216
- "sceneLabel": "Land the brand",
217
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 10 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
218
- "status": "ready",
219
- "image": {
220
- "kind": "image",
221
- "assetId": "generated-1",
222
- "versionId": "generated-v1",
223
- "url": "https://media.example/generated.png",
224
- "panelId": "styleframe-03-10000",
225
- "width": 1024,
226
- "height": 1024
227
- }
228
- },
229
- {
230
- "panelId": "styleframe-04-12000",
231
- "timestampSec": 12,
232
- "sceneId": "scene-2",
233
- "sceneLabel": "Land the brand",
234
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 12 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
235
- "status": "missing",
236
- "image": null
237
- }
238
- ],
239
- "execution": {
240
- "planning": "local-deterministic",
241
- "imageGeneration": "explicit-quoted-action-required"
242
- }
243
- },
244
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"reference-1-styleframes-a6px0m\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[{\"label\":\"Show the product\",\"assetId\":\"ui-1\",\"versionId\":\"ui-v1\",\"role\":\"content\",\"confidence\":\"approved-styleframe\",\"notes\":\"Approved at 0 seconds for coded layer animation.\"},{\"label\":\"Land the brand\",\"assetId\":\"generated-1\",\"versionId\":\"generated-v1\",\"role\":\"content\",\"confidence\":\"approved-styleframe\",\"notes\":\"Approved at 10 seconds for coded layer animation.\"}],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Real product UI inside an editorial composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[\"ui-1\"],\"evidenceRefs\":[],\"locks\":[],\"styleframeIds\":[\"styleframe-01-0\"]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[\"generated-1\"],\"evidenceRefs\":[],\"locks\":[],\"styleframeIds\":[\"styleframe-03-10000\"]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null},\"styleframeReview\":{\"schemaVersion\":1,\"cadenceSec\":5,\"durationSec\":12,\"aspectRatio\":\"16:9\",\"approved\":[{\"panelId\":\"styleframe-01-0\",\"timestampSec\":0,\"sceneId\":\"scene-1\",\"assetId\":\"ui-1\",\"versionId\":\"ui-v1\",\"notes\":\"\"},{\"panelId\":\"styleframe-03-10000\",\"timestampSec\":10,\"sceneId\":\"scene-2\",\"assetId\":\"generated-1\",\"versionId\":\"generated-v1\",\"notes\":\"\"}],\"execution\":{\"planningAi\":false,\"imageGenerationUsed\":true,\"stillmadeCreditsRequiredForPlanning\":false,\"stillmadeCreditsRequiredForGeneratedImages\":true}}}",
245
- "styleframeAssets": [
246
- {
247
- "kind": "image",
248
- "assetId": "ui-1",
249
- "versionId": "ui-v1",
250
- "url": "https://media.example/ui.png",
251
- "width": 1600,
252
- "height": 900
253
- },
254
- {
255
- "kind": "image",
256
- "assetId": "generated-1",
257
- "versionId": "generated-v1",
258
- "url": "https://media.example/generated.png",
259
- "panelId": "styleframe-03-10000",
260
- "width": 1024,
261
- "height": 1024
262
- }
263
- ],
264
- "frameReview": {
265
- "schemaVersion": 1,
266
- "cadenceSec": 5,
267
- "durationSec": 12,
268
- "aspectRatio": "16:9",
269
- "approved": [
270
- {
271
- "panelId": "styleframe-01-0",
272
- "timestampSec": 0,
273
- "sceneId": "scene-1",
274
- "assetId": "ui-1",
275
- "versionId": "ui-v1",
276
- "notes": ""
277
- },
278
- {
279
- "panelId": "styleframe-03-10000",
280
- "timestampSec": 10,
281
- "sceneId": "scene-2",
282
- "assetId": "generated-1",
283
- "versionId": "generated-v1",
284
- "notes": ""
285
- }
286
- ],
287
- "execution": {
288
- "planningAi": false,
289
- "imageGenerationUsed": true,
290
- "stillmadeCreditsRequiredForPlanning": false,
291
- "stillmadeCreditsRequiredForGeneratedImages": true
292
- }
293
- }
294
- }
295
- },
296
- {
297
- "name": "Prepare a free cadence plan before generation",
298
- "input": {
299
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"reference-1\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Real product UI inside an editorial composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[\"ui-1\"],\"evidenceRefs\":[],\"locks\":[]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null}}",
300
- "assets": [
301
- {
302
- "kind": "image",
303
- "assetId": "ui-1",
304
- "versionId": "ui-v1",
305
- "url": "https://media.example/ui.png",
306
- "width": 1600,
307
- "height": 900
308
- }
309
- ],
310
- "cadenceSec": 5,
311
- "action": "prepare"
312
- },
313
- "expected": {
314
- "styleframePlan": {
315
- "schemaVersion": 1,
316
- "kind": "motion-styleframe-plan",
317
- "sourceRevision": "reference-1",
318
- "cadenceSec": 5,
319
- "durationSec": 12,
320
- "aspectRatio": "16:9",
321
- "items": [
322
- {
323
- "panelId": "styleframe-01-0",
324
- "timestampSec": 0,
325
- "sceneId": "scene-1",
326
- "sceneLabel": "Show the product",
327
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 0 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
328
- "status": "ready",
329
- "image": {
330
- "kind": "image",
331
- "assetId": "ui-1",
332
- "versionId": "ui-v1",
333
- "url": "https://media.example/ui.png",
334
- "width": 1600,
335
- "height": 900
336
- }
337
- },
338
- {
339
- "panelId": "styleframe-02-5000",
340
- "timestampSec": 5,
341
- "sceneId": "scene-1",
342
- "sceneLabel": "Show the product",
343
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 5 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
344
- "status": "ready",
345
- "image": {
346
- "kind": "image",
347
- "assetId": "ui-1",
348
- "versionId": "ui-v1",
349
- "url": "https://media.example/ui.png",
350
- "width": 1600,
351
- "height": 900
352
- }
353
- },
354
- {
355
- "panelId": "styleframe-03-10000",
356
- "timestampSec": 10,
357
- "sceneId": "scene-2",
358
- "sceneLabel": "Land the brand",
359
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 10 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
360
- "status": "missing",
361
- "image": null
362
- },
363
- {
364
- "panelId": "styleframe-04-12000",
365
- "timestampSec": 12,
366
- "sceneId": "scene-2",
367
- "sceneLabel": "Land the brand",
368
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 12 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
369
- "status": "missing",
370
- "image": null
371
- }
372
- ],
373
- "execution": {
374
- "planning": "local-deterministic",
375
- "imageGeneration": "explicit-quoted-action-required"
376
- }
377
- }
378
- }
379
- },
380
- {
381
- "name": "Match exact supplied project images to unassigned visual scenes before approval",
382
- "input": {
383
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"automatic-real-media-1\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Actual product UI screenshot inside the composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null}}",
384
- "assets": [
385
- {
386
- "kind": "image",
387
- "assetId": "ui-1",
388
- "versionId": "ui-v1",
389
- "url": "https://media.example/ui.png",
390
- "width": 1600,
391
- "height": 900
392
- }
393
- ],
394
- "cadenceSec": 5,
395
- "action": "prepare"
396
- },
397
- "expected": {
398
- "styleframePlan": {
399
- "schemaVersion": 1,
400
- "kind": "motion-styleframe-plan",
401
- "sourceRevision": "automatic-real-media-1",
402
- "cadenceSec": 5,
403
- "durationSec": 12,
404
- "aspectRatio": "16:9",
405
- "items": [
406
- {
407
- "panelId": "styleframe-01-0",
408
- "timestampSec": 0,
409
- "sceneId": "scene-1",
410
- "sceneLabel": "Show the product",
411
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 0 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Actual product UI screenshot inside the composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
412
- "status": "ready",
413
- "image": {
414
- "kind": "image",
415
- "assetId": "ui-1",
416
- "versionId": "ui-v1",
417
- "url": "https://media.example/ui.png",
418
- "width": 1600,
419
- "height": 900
420
- }
421
- },
422
- {
423
- "panelId": "styleframe-02-5000",
424
- "timestampSec": 5,
425
- "sceneId": "scene-1",
426
- "sceneLabel": "Show the product",
427
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 5 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Actual product UI screenshot inside the composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
428
- "status": "ready",
429
- "image": {
430
- "kind": "image",
431
- "assetId": "ui-1",
432
- "versionId": "ui-v1",
433
- "url": "https://media.example/ui.png",
434
- "width": 1600,
435
- "height": 900
436
- }
437
- },
438
- {
439
- "panelId": "styleframe-03-10000",
440
- "timestampSec": 10,
441
- "sceneId": "scene-2",
442
- "sceneLabel": "Land the brand",
443
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 10 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
444
- "status": "missing",
445
- "image": null
446
- },
447
- {
448
- "panelId": "styleframe-04-12000",
449
- "timestampSec": 12,
450
- "sceneId": "scene-2",
451
- "sceneLabel": "Land the brand",
452
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 12 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
453
- "status": "missing",
454
- "image": null
455
- }
456
- ],
457
- "execution": {
458
- "planning": "local-deterministic",
459
- "imageGeneration": "explicit-quoted-action-required"
460
- }
461
- }
462
- }
463
- }
464
- ]
465
- };