stillmade-sdk 0.1.42 → 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 (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
@@ -54,6 +54,11 @@ export function jobWordingNotes(pkg){
54
54
  // Days and times are picked, never typed: a text input that holds one is a date input, which StillMade shows as a calendar.
55
55
  const typedDates=Object.entries(manifest.inputs||{}).filter(([name,port])=>port?.type==='text'&&/(?:date|time|when|deadline|schedule)|(?:At|_at)$/.test(name)).map(([name])=>name);
56
56
  if(typedDates.length)notes.push(`${typedDates.length===1?`The input ${typedDates[0]} is`:`The inputs ${typedDates.join(', ')} are`} text, so a day or time is typed. Make ${typedDates.length===1?'it':'each'} a date input: StillMade shows a calendar, and a list of times when it is about a time.`);
57
+ // November 3, 2026: a "one fact per line" input showed its example as one line ("Austin$549,0003 bedrooms"). Text whose
58
+ // examples hold line breaks declares it, so every host draws a box that keeps them. A `text` control is already a growing
59
+ // box on the Step page, so only an input with no control at all is noted.
60
+ const lined=Object.entries(manifest.inputs||{}).filter(([name,port])=>{const control=(manifest.ui||[]).find(item=>item?.port===name);return port?.type==='text'&&!control&&(pkg?.tests||[]).some(test=>typeof test?.input?.[name]==='string'&&test.input[name].includes('\n'));}).map(([name])=>name);
61
+ if(lined.length)notes.push(`${lined.length===1?`The input ${lined[0]} has examples`:`The inputs ${lined.join(', ')} have examples`} of several lines but ${lined.length===1?'is':'are'} not declared multi-line, so a host can draw one line and lose the line breaks. Add {"control":"text","port":"${lined[0]}","multiline":true} to manifest.ui${lined.length===1?'':' for each'}.`);
57
62
  if(pkg?.view)notes.push(...viewWordingNotes(pkg.view));
58
63
  if(bare.length)notes.push(`${bare.length===1?`The input ${bare[0]} is`:`The inputs ${bare.join(', ')} are`} named only by type, so the drop area reads "Drop a ${bare[0].replace(/s$/,'')} here". Name each for what the person brings (sermonVideo), unless any file of that kind does the job.`);
59
64
  return notes;
@@ -141,7 +141,8 @@ export function connectedBlockInputs(node, nodes, edges, {context={},raw=false,a
141
141
  for(const name of Object.keys(node.data?.blockValuePins||{}))if(!edges.some(edge=>edge.target===node.id&&String(edge.targetHandle||'').replace(/^in:/,'')===name)){
142
142
  inputs[name]=undefined;errors.push(`The pinned result for ${name} no longer has a Canvas connection. Review the pin before running.`);
143
143
  }
144
- return { inputs, errors, ...(allowOmissions?{omissions}:{}) };
144
+ // Two wires from one Step that has not run say "Run it first." once, not once per wire.
145
+ return { inputs, errors:[...new Set(errors)], ...(allowOmissions?{omissions}:{}) };
145
146
  }
146
147
 
147
148
  // Called only for data edits, never for position/selection changes. Preserve old
@@ -1,7 +1,5 @@
1
1
  import {FIRST_PARTY_SDK_PACKAGES} from '../block-sdk/first-party-packages.js';
2
- import {DEALER_INVENTORY_VIDEO_PROJECT_TYPE} from './dealer-inventory-video-project-type.js';
3
2
  import { SDK_VERSION, ROOT_CHAT_ID } from '../block-sdk/contracts.js';
4
- import {SCRIPT_WRITER_BLOCK} from './script-writer.js';
5
3
  import {VIDEO_ASSETS_BLOCK} from './video-assets.js';
6
4
  import {HOST_RELEASE_MANIFEST_SNAPSHOTS} from './host-release-manifests.js';
7
5
  // Host releases stay available for saved projects until their complete UI and
@@ -14,13 +12,7 @@ const hostReleaseManifest=(id,version)=>{
14
12
  return structuredClone(manifest);
15
13
  };
16
14
  const definitions = [
17
- ['chat', 'Production chat', 'workspace', 'brief', 'script', 'Develop a script or production decision in a scoped conversation after the protected starting chat.', 'ProductionWorkspaceNode.jsx'],
18
- ['research', 'Research', 'task', 'text', 'research', 'Find supporting material for a topic and return a research dossier with citations.', 'ProductionWorkspaceNode.jsx'],
19
- ['script', 'Script', 'workspace', 'brief', 'script', 'Develop and review a script from the project brief.', 'NarrativeCompiler.jsx'],
20
15
  ['voiceover', 'Voiceover', 'workspace', 'script', 'audio', 'Generate, record, or import narration and prepare it for timed visuals.', 'VoiceoverStep.jsx'],
21
- ['transcribe', 'Transcription', 'task', 'audio', 'transcript', 'Turn audio into editable timed words for captions and shot planning.', 'TranscriptionEditor.jsx'],
22
- ['shot-plan', 'Shot planning', 'workspace', 'transcript', 'shot-plan', 'Break narration into reviewed shots with visual intent and timing.', 'ShotMapReview.jsx'],
23
- ['blueprint', 'Blueprint', 'workspace', 'brief', 'bible', 'Organize the story, cast, locations, and visual style into a reusable production guide.', 'BibleEditor.jsx'],
24
16
  ['character', 'Character reference', 'workspace', 'text', 'character', 'Build a consistent character identity with reusable visual references.', 'CharacterReferenceNode.jsx'],
25
17
  ['location', 'Location reference', 'workspace', 'text', 'location', 'Build a location identity and reference images for consistent settings.', 'LocationReferenceNode.jsx'],
26
18
  ['style', 'Style reference', 'workspace', 'text', 'style', 'Create a reusable art direction and its visual examples.', 'StyleNode.jsx'],
@@ -28,14 +20,9 @@ const definitions = [
28
20
  ['import-media', 'Import media', 'task', null, 'asset[]', 'Bring selected images, video, and audio into the project media library.', 'MediaUploadNode.jsx'],
29
21
  ['generate-image', 'Generate image', 'task', 'text', 'image', 'Generate a new image using a prompt and selected identity or style references.', 'ImageGenNode.jsx'],
30
22
  ['generate-video', 'Generate video', 'task', 'image', 'video', 'Generate a video clip from an image, prompt, and motion settings.', 'VideoGenNode.jsx'],
31
- ['thumbnail', 'Thumbnail', 'task', 'text', 'image', 'Create a thumbnail image for the finished video.', 'ThumbnailNode.jsx'],
32
- ['describe-media', 'Describe media', 'task', 'image', 'text', 'Describe the visible content of an image for production planning.', 'ImageDescriberNode.jsx'],
33
- ['image-editor', 'Image editor', 'workspace', 'image', 'image', 'Crop, adjust, and composite an image while retaining its original version.', 'ProductionWorkspaceNode.jsx'],
34
23
  ['compare', 'Compare assets', 'workspace', 'asset[]', 'asset', 'Review candidate assets and choose a version for the next step.', 'CompareNode.jsx'],
35
- ['stock-search', 'Stock media', 'workspace', 'text', 'asset[]', 'Search real-world media and import selected licensed assets.', 'ProductionWorkspaceNode.jsx'],
36
24
  ['panel-strip', 'Image panels', 'workspace', 'audio', 'panel-document', 'Build a timed sequence of consistent images and diagrams around narration.', 'StripStep.jsx'],
37
25
  ['board-editor', 'White Board Motion', 'workspace', 'audio', 'board-document', 'Arrange and animate editable boards with text, media, and narration.', 'CanvasEditorStep.jsx'],
38
- ['animated-scene', 'Animated scene', 'workspace', 'shot-plan', 'scene-document', 'Compose animated scenes with object motion and camera direction.', 'AnimatedV2AssetStep.jsx'],
39
26
  ['editor', 'Video editor', 'workspace', 'asset[]', 'timeline', 'Assemble and edit video, audio, captions, and effects on a shared timeline.', 'VideoEditor.jsx'],
40
27
  ['captions', 'Captions', 'editor-extension', 'transcript', 'timeline', 'Place timed editable captions on the selected timeline.', 'editorAI.js'],
41
28
  ['grade', 'Color grade', 'editor-extension', 'timeline-range', 'timeline', 'Adjust the color and tone of selected clips without replacing originals.', 'editorAdds.js'],
@@ -48,18 +35,15 @@ const definitions = [
48
35
  ['export-video', 'Export video', 'task', 'timeline', 'video', 'Render an accepted timeline to a video file using available device capabilities.', 'exportRender/index.js'],
49
36
  ['export-audio', 'Export audio', 'task', 'timeline', 'audio', 'Mix and export the timeline audio to a standalone file.', 'exportRender/index.js'],
50
37
  ['export-timeline', 'Export timeline', 'task', 'timeline', 'json', 'Export the timeline structure for another editing application.', 'fcpxml.js'],
51
- ['youtube', 'YouTube hub', 'workspace', 'video', 'json', 'Analyze channel performance and manage an authorized video upload.', 'YouTubeScreen.jsx'],
52
38
  ];
53
39
  const LEGACY_BLOCKS = definitions.map(([key, name, kind, input, output, description, source]) => ({
54
40
  manifest: { schemaVersion: 1, sdkVersion: SDK_VERSION, id: `sm.${key}`, name, version: '1.0.0', kind, runtime: 'host', description, inputs: input ? { input: { type: input } } : {}, outputs: { output: { type: output } }, permissions: { project: [], network: [], filesystem: [], secrets: [] } },
55
41
  source, summary: { text: description, origin: 'llm', generation: 'build-time', generator: 'Codex', status: 'ready' }, adapterStatus: 'legacy',
56
42
  }));
57
43
  const types = [
58
- ['guided', 'Guided', 'Plan a video from an idea, build references and footage, then edit and export.', ['script', 'voiceover', 'shot-plan', 'blueprint', 'pipeline', 'editor', 'export-video']],
59
44
  ['blank', 'Blank Canvas', 'Start with your own media and production canvas, then assemble a video.', ['import-media', 'pipeline', 'editor', 'export-video']],
60
45
  ['imagePanel', 'Image Panels', 'Turn narration into a timed visual sequence, refine the cut, and export.', ['voiceover', 'panel-strip', 'editor', 'export-video']],
61
46
  ['whiteboard', 'White Board Motion', 'Build animated boards around narration, then refine and export the video.', ['voiceover', 'board-editor', 'editor', 'export-video']],
62
- ['animated', 'Animated Studio', 'Plan and compose animated scenes, then assemble and export the sequence.', ['voiceover', 'shot-plan', 'animated-scene', 'editor', 'export-video']],
63
47
  ];
64
48
  const LEGACY_TYPES = types.map(([legacyMode, name, description, stages]) => ({ schemaVersion: 1, id: `sm.${legacyMode.toLowerCase()}`, version: '1.0.0', name, description, legacyMode, stages: stages.map((id, i) => ({ id: `stage-${i + 1}`, blockId: `sm.${id}`, version: '1.0.0', label: LEGACY_BLOCKS.find(b => b.manifest.id === `sm.${id}`).manifest.name })), summary: { text: description, origin: 'llm', generation: 'build-time', generator: 'Codex', status: 'ready' } }));
65
49
 
@@ -67,15 +51,12 @@ const LEGACY_TYPES = types.map(([legacyMode, name, description, stages]) => ({ s
67
51
  // adapters remain version-addressable solely for saved workflow compatibility.
68
52
  const screens = [
69
53
  ['voiceover','Voiceover','voiceover','VoiceoverStep.jsx','Turn your script into speech, or record your own voice.',['Narration and voices','Recording and import','Transcript and timing']],
70
- ['shot-plan','Shots','shotMap','ShotMapReview.jsx','Plan each shot and match it to the voice.',['Shot sequence','Visual directions','Timing and versions']],
71
- ['blueprint','Blueprint','bible','BibleEditor.jsx','Keep your story, characters, places, and art style in one place.',['Story and scenes','Characters and locations','Visual direction']],
72
54
  ['pipeline','Canvas','canvas','WorkflowCanvas.jsx','Make images and videos, and keep your characters looking the same.',['Persistent references','Media generation','Assets and versions']],
73
55
  ['editor','Editor','editor','VideoEditor.jsx','Cut clips, add sound and text, then save your video.',['Video and audio timeline','Captions and effects','Export']],
74
56
  ['panel-strip','Image Panels','shotMap','StripStep.jsx','Turn your script into pictures that play with the voice.',['Scenes and panels','Consistent artwork','Timing and editor handoff']],
75
57
  ['board-editor','White Board Motion','canvasEditor','CanvasEditorStep.jsx','Make text and pictures move on a board with a voice.',['Boards and media','Editable animation','Narration and handoff']],
76
- ['animated-scene','Assets','assetGen','AnimatedV2AssetStep.jsx','Prepare pictures, objects, and camera moves for your scenes.',['Scenes and assets','Object and camera motion','Editor handoff']],
77
58
  ];
78
- const HOST_WORKSPACE_BLOCKS = [SCRIPT_WRITER_BLOCK,...screens.map(([key,name,phase,source,description,features])=>{
59
+ const HOST_WORKSPACE_BLOCKS = [...screens.map(([key,name,phase,source,description,features])=>{
79
60
  const legacy=LEGACY_BLOCKS.find(block=>block.manifest.id===`sm.${key}`);
80
61
  // The Editor's main release is the original one (1.0): the full video editor.
81
62
  // Its portable 2.x releases are a separate, simpler view kept for their exact pins.
@@ -89,7 +70,7 @@ HOST_WORKSPACE_BLOCKS.splice(HOST_WORKSPACE_BLOCKS.findIndex(block=>block.manife
89
70
  // Promote a portable workspace after its accepted production MVP and rendered
90
71
  // acceptance are complete; advanced host extensions can remain on old exact pins. Exact portable releases remain usable as normal
91
72
  // Steps before promotion; this map only controls the default production route.
92
- export const CURRENT_PORTABLE_WORKSPACE_VERSIONS=Object.freeze({'sm.chat':'2.0.3','sm.script':'2.1.5','sm.voiceover':'2.1.6','sm.shot-plan':'2.2.1','sm.blueprint':'2.1.9','sm.pipeline':'2.2.6','sm.video-assets':'2.1.4','sm.panel-strip':'2.4.2','sm.board-editor':'2.2.11','sm.animated-scene':'2.3.9','sm.editor':'2.2.11'});
73
+ export const CURRENT_PORTABLE_WORKSPACE_VERSIONS=Object.freeze({'sm.voiceover':'2.1.6','sm.pipeline':'2.2.6','sm.video-assets':'2.1.4','sm.panel-strip':'2.4.2','sm.board-editor':'2.2.11','sm.editor':'2.2.11'});
93
74
  // Workspaces whose main release stays the host one: the original Editor (1.0) is
94
75
  // the full video editor. Its accepted portable release stays discoverable for
95
76
  // Steps that hand the Editor a prepared timeline, which only it accepts.
@@ -115,10 +96,8 @@ const historicalWorkspaceBlock=(id,version)=>{
115
96
  const current=HOST_WORKSPACE_BLOCKS.find(block=>block.manifest.id===id);
116
97
  return {...current,manifest:hostReleaseManifest(id,version)};
117
98
  };
118
- const HISTORICAL_WORKSPACE_BLOCKS = Object.freeze([SCRIPT_WRITER_BLOCK,historicalWorkspaceBlock('sm.script','1.1.0'),historicalWorkspaceBlock('sm.voiceover','1.1.0'),historicalWorkspaceBlock('sm.shot-plan','1.1.0'),historicalWorkspaceBlock('sm.blueprint','1.1.0'),historicalWorkspaceBlock('sm.panel-strip','1.1.0'),historicalWorkspaceBlock('sm.board-editor','1.1.0'),historicalWorkspaceBlock('sm.animated-scene','1.1.0'),historicalWorkspaceBlock('sm.editor','1.1.0'),historicalWorkspaceBlock('sm.editor','1.2.0'),historicalWorkspaceBlock('sm.editor','1.3.0'),historicalWorkspaceBlock('sm.editor','1.4.0'),historicalWorkspaceBlock('sm.editor','1.5.0'),historicalWorkspaceBlock('sm.pipeline','1.1.0'),historicalWorkspaceBlock('sm.pipeline','1.2.0'),VIDEO_ASSETS_BLOCK,historicalWorkspaceBlock('sm.video-assets','1.0.0'),historicalWorkspaceBlock('sm.video-assets','1.1.0')]);
119
- const DESCRIBE_MEDIA_HOST_1_1=(()=>{const legacy=LEGACY_BLOCKS.find(block=>block.manifest.id==='sm.describe-media');return {...legacy,manifest:{...legacy.manifest,version:'1.1.0'},adapterStatus:'module'};})();
120
- const YOUTUBE_HOST_1_1=(()=>{const legacy=LEGACY_BLOCKS.find(block=>block.manifest.id==='sm.youtube');return {...legacy,manifest:{...legacy.manifest,version:'1.1.0',description:'Review channel performance and upload an account-owned saved MP4 through a retained authorized session.'},adapterStatus:'workspace'};})();
121
- const GENERATION_HOST_RELEASES=Object.freeze(['sm.generate-image','sm.generate-video','sm.thumbnail','sm.compare'].flatMap(id=>{
99
+ const HISTORICAL_WORKSPACE_BLOCKS = Object.freeze([historicalWorkspaceBlock('sm.voiceover','1.1.0'),historicalWorkspaceBlock('sm.panel-strip','1.1.0'),historicalWorkspaceBlock('sm.board-editor','1.1.0'),historicalWorkspaceBlock('sm.editor','1.1.0'),historicalWorkspaceBlock('sm.editor','1.2.0'),historicalWorkspaceBlock('sm.editor','1.3.0'),historicalWorkspaceBlock('sm.editor','1.4.0'),historicalWorkspaceBlock('sm.editor','1.5.0'),historicalWorkspaceBlock('sm.pipeline','1.1.0'),historicalWorkspaceBlock('sm.pipeline','1.2.0'),VIDEO_ASSETS_BLOCK,historicalWorkspaceBlock('sm.video-assets','1.0.0'),historicalWorkspaceBlock('sm.video-assets','1.1.0')]);
100
+ const GENERATION_HOST_RELEASES=Object.freeze(['sm.generate-image','sm.generate-video','sm.compare'].flatMap(id=>{
122
101
  const legacy=LEGACY_BLOCKS.find(block=>block.manifest.id===id);
123
102
  return ['1.1.0','1.2.0'].map(version=>({...legacy,manifest:{...legacy.manifest,version},adapterStatus:'module'}));
124
103
  }));
@@ -145,9 +124,11 @@ export const BLOCK_TOOLS=new Set(['sm.export-video','sm.export-audio','sm.export
145
124
  // The Automation (When 1.1.0) starts from an app's events or checks it every few minutes, handing each new item on
146
125
  // once, and its Only if lets through only the items wanted (October 22, 2026, owner-approved mockup): finding new
147
126
  // items and gating on a decision are no longer Blocks of their own. Saved projects keep running them.
148
- export const AUTOMATION_PARTS=new Set(['sm.new-items','sm.continue-if']);
127
+ export const AUTOMATION_PARTS=new Set([]);
149
128
  // November 2, 2026 (owner): Voiceover is offered again ("voiceover was the original").
150
- export const HIDDEN_BLOCKS=new Set(['sm.script','sm.chat','sm.thumbnail','sm.shot-plan-assistant','sm.blueprint-assistant','sm.animated-scene-assistant','sm.whiteboard-assistant','sm.final-edit','sm.edit-assistant','sm.character','sm.location','sm.style','sm.compare','sm.image-editor','sm.score','sm.research','sm.quality-audit','sm.rough-cut',...BLOCK_TOOLS,...AUTOMATION_PARTS]);
129
+ // November 4, 2026 (owner): Generate (stillmade.generate) is the one Block for every image and video model; Generate
130
+ // image and Generate video stay only as the Canvas's own generation nodes.
131
+ export const HIDDEN_BLOCKS=new Set(['sm.generate-image','sm.generate-video','sm.final-edit','sm.edit-assistant','sm.character','sm.location','sm.style','sm.compare','sm.score','sm.rough-cut',...BLOCK_TOOLS,...AUTOMATION_PARTS]);
151
132
  // Exact releases to hide (id@version) when one release of a shown Block should not be offered; none today.
152
133
  export const HIDDEN_RELEASES=new Set([]);
153
134
  export const isHiddenBlock=block=>HIDDEN_BLOCKS.has(block.manifest.id)||HIDDEN_RELEASES.has(`${block.manifest.id}@${block.manifest.version}`);
@@ -167,7 +148,7 @@ export const DISCOVERABLE_BLOCKS = [STARTING_CHAT_BLOCK,...WORKSPACE_BLOCKS,...A
167
148
  // not results anyone asks for, and the niche cuts that hand a finished timeline to the newer Editor are never put
168
149
  // together by Chat; each becomes a target of an engine. They stay discoverable releases, so built-in Types and saved
169
150
  // projects keep their pins and still get newer releases.
170
- export const FOLDED_BLOCKS=new Set(['sm.shot-plan','sm.video-assets','sm.blueprint','stillmade.product-ad-variants','stillmade.short-form-finish','stillmade.occasion-story','stillmade.release-visuals','stillmade.photo-reel-composer']);
151
+ export const FOLDED_BLOCKS=new Set(['sm.video-assets']);
171
152
  export const isOfferedBlock=block=>block.manifest.id!==STARTING_CHAT_BLOCK.manifest.id&&!FOLDED_BLOCKS.has(block.manifest.id);
172
153
  // Planners pin a finished file to a Block's output port, which the Editor alias has
173
154
  // none of, so planning keeps the newest render-only release in its place. Chat
@@ -185,39 +166,37 @@ const oneCardEach=blocks=>[...blocks.reduce((map,block)=>{
185
166
  // November 2, 2026 (owner: "idc if it's called narration, just make it look and act like voiceover"): Chat
186
167
  // still plans a narration job with Narration, and the Step it places is Voiceover (chatAutomation.js), so
187
168
  // people only ever see Voiceover. Saved projects and Types that pin Narration keep running it.
188
- export const PLACED_AS=new Map([['stillmade.narration',{id:'sm.voiceover',version:'1.2.0',inputs:{script:'input'},outputs:{script:'spokenScript',audio:'output'}}]]);
169
+ export const PLACED_AS=new Map();
189
170
  export const LISTED_BLOCKS=Object.freeze(oneCardEach(DISCOVERABLE_BLOCKS.filter(isOfferedBlock).filter(block=>!PLACED_AS.has(block.manifest.id))));
190
171
  // A folded Block's card, offered only to replace a saved Step of that Block (its "Update to" button).
191
172
  export const FOLDED_CARDS=Object.freeze(oneCardEach(DISCOVERABLE_BLOCKS.filter(block=>FOLDED_BLOCKS.has(block.manifest.id))));
192
173
  export const PLANNING_BLOCKS = DISCOVERABLE_BLOCKS.map(block=>DISCOVERED_AS_HOST.get(block.manifest.id)===block?newestRelease(block.manifest.id)||block:block);
193
- export const BUILTIN_BLOCKS = [STARTING_CHAT_BLOCK,...WORKSPACE_BLOCKS,...HISTORICAL_WORKSPACE_BLOCKS,DESCRIBE_MEDIA_HOST_1_1,YOUTUBE_HOST_1_1,...GENERATION_HOST_RELEASES,...SDK_BUILTIN_BLOCKS.filter(block=>!WORKSPACE_BLOCKS.some(current=>current.manifest.id===block.manifest.id&&current.manifest.version===block.manifest.version)),...LEGACY_BLOCKS.filter(block=>!WORKSPACE_BLOCKS.some(current=>current.manifest.id===block.manifest.id&&current.manifest.version===block.manifest.version))];
194
- const flows={guided:['voiceover','shot-plan','blueprint','pipeline','editor'],blank:['pipeline','editor'],imagePanel:['voiceover','panel-strip','editor'],whiteboard:['voiceover','board-editor','editor'],animated:['voiceover','shot-plan','animated-scene','editor']};
174
+ export const BUILTIN_BLOCKS = [STARTING_CHAT_BLOCK,...WORKSPACE_BLOCKS,...HISTORICAL_WORKSPACE_BLOCKS,...GENERATION_HOST_RELEASES,...SDK_BUILTIN_BLOCKS.filter(block=>!WORKSPACE_BLOCKS.some(current=>current.manifest.id===block.manifest.id&&current.manifest.version===block.manifest.version)),...LEGACY_BLOCKS.filter(block=>!WORKSPACE_BLOCKS.some(current=>current.manifest.id===block.manifest.id&&current.manifest.version===block.manifest.version))];
175
+ const flows={blank:['pipeline','editor'],imagePanel:['voiceover','panel-strip','editor'],whiteboard:['voiceover','board-editor','editor']};
195
176
  const typeDescriptions={
196
- guided:'Turn an idea into a video, from the script to the final cut.',
197
177
  blank:'Start with your own pictures and clips, then make a video.',
198
178
  imagePanel:'Make a video with still pictures and a voice.',
199
179
  whiteboard:'Make a video with moving text, pictures, and a voice.',
200
- animated:'Build scenes with moving objects, then put them into a video.',
201
180
  };
202
181
  // Freeze the actual pre-collaboration-release catalog fallback. Historical type
203
182
  // definitions must not follow future changes to the discoverable Block map.
204
183
  const PINNED_TYPE_WORKSPACE_VERSIONS=Object.freeze({'voiceover':'2.1.3','shot-plan':'2.1.2','blueprint':'2.1.7','pipeline':'2.2.2','editor':'2.2.7','panel-strip':'2.3.5','board-editor':'2.2.8','animated-scene':'2.3.6'});
205
- const currentBuiltinTypes=(version,pipelineVersion,scriptVersion=SCRIPT_WRITER_BLOCK.manifest.version,versions={})=>LEGACY_TYPES.map(type=>({...type,description:typeDescriptions[type.legacyMode],summary:{...type.summary,text:typeDescriptions[type.legacyMode]},version,stages:flows[type.legacyMode].map((key,i)=>{const block=WORKSPACE_BLOCKS.find(block=>block.manifest.id===`sm.${key}`);return {id:`stage-${i+1}`,blockId:block.manifest.id,version:versions[key]||(key==='pipeline'?pipelineVersion:key==='script'?scriptVersion:PINNED_TYPE_WORKSPACE_VERSIONS[key]),label:key==='editor'?'Editor':block.manifest.name};})}));
184
+ const currentBuiltinTypes=(version,pipelineVersion,scriptVersion,versions={})=>LEGACY_TYPES.map(type=>({...type,description:typeDescriptions[type.legacyMode],summary:{...type.summary,text:typeDescriptions[type.legacyMode]},version,stages:flows[type.legacyMode].map((key,i)=>{const block=WORKSPACE_BLOCKS.find(block=>block.manifest.id===`sm.${key}`);return {id:`stage-${i+1}`,blockId:block.manifest.id,version:versions[key]||(key==='pipeline'?pipelineVersion:key==='script'?scriptVersion:PINNED_TYPE_WORKSPACE_VERSIONS[key]),label:key==='editor'?'Editor':block.manifest.name};})}));
206
185
  const PRIOR_HOST_WORKSPACE_VERSIONS={'shot-plan':'1.1.0','blueprint':'1.1.0','panel-strip':'2.3.4','board-editor':'1.1.0','animated-scene':'1.1.0'};
207
- const PREVIOUS_BUILTIN_TYPES=currentBuiltinTypes('1.2.0','1.2.0',SCRIPT_WRITER_BLOCK.manifest.version,PRIOR_HOST_WORKSPACE_VERSIONS);
208
- const SHOTS_MIGRATED_TYPES=currentBuiltinTypes('1.3.0','1.2.0',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'1.1.0','board-editor':'1.1.0','animated-scene':'1.1.0'});
186
+ const PREVIOUS_BUILTIN_TYPES=currentBuiltinTypes('1.2.0','1.2.0',undefined,PRIOR_HOST_WORKSPACE_VERSIONS);
187
+ const SHOTS_MIGRATED_TYPES=currentBuiltinTypes('1.3.0','1.2.0',undefined,{'blueprint':'1.1.0','board-editor':'1.1.0','animated-scene':'1.1.0'});
209
188
  const PRE_PROMOTION_CURRENT_TYPES = PREVIOUS_BUILTIN_TYPES.map(type=>flows[type.legacyMode].includes('shot-plan')?SHOTS_MIGRATED_TYPES.find(next=>next.id===type.id):type);
210
- const PORTABLE_MVP_TYPES = currentBuiltinTypes('1.4.0','2.2.2',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.5','panel-strip':'2.3.4','board-editor':'2.2.6','animated-scene':'2.3.4'});
211
- const ADVANCED_PORTABLE_TYPES = currentBuiltinTypes('1.5.0','2.2.2',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.6','panel-strip':'2.3.4','board-editor':'2.2.7','animated-scene':'2.3.5','editor':'2.2.4'});
212
- const PLAYABLE_EDITOR_TYPES = currentBuiltinTypes('1.6.0','2.2.2',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.6','panel-strip':'2.3.4','board-editor':'2.2.7','animated-scene':'2.3.5','editor':'2.2.5'});
213
- const EDITOR_AUDIO_TYPES = currentBuiltinTypes('1.7.0','2.2.2',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.6','panel-strip':'2.3.4','board-editor':'2.2.7','animated-scene':'2.3.5','editor':'2.2.6'});
214
- const MEDIA_LIBRARY_TYPES = currentBuiltinTypes('1.8.0','2.2.2',SCRIPT_WRITER_BLOCK.manifest.version,{'panel-strip':'2.3.4'});
189
+ const PORTABLE_MVP_TYPES = currentBuiltinTypes('1.4.0','2.2.2',undefined,{'blueprint':'2.1.5','panel-strip':'2.3.4','board-editor':'2.2.6','animated-scene':'2.3.4'});
190
+ const ADVANCED_PORTABLE_TYPES = currentBuiltinTypes('1.5.0','2.2.2',undefined,{'blueprint':'2.1.6','panel-strip':'2.3.4','board-editor':'2.2.7','animated-scene':'2.3.5','editor':'2.2.4'});
191
+ const PLAYABLE_EDITOR_TYPES = currentBuiltinTypes('1.6.0','2.2.2',undefined,{'blueprint':'2.1.6','panel-strip':'2.3.4','board-editor':'2.2.7','animated-scene':'2.3.5','editor':'2.2.5'});
192
+ const EDITOR_AUDIO_TYPES = currentBuiltinTypes('1.7.0','2.2.2',undefined,{'blueprint':'2.1.6','panel-strip':'2.3.4','board-editor':'2.2.7','animated-scene':'2.3.5','editor':'2.2.6'});
193
+ const MEDIA_LIBRARY_TYPES = currentBuiltinTypes('1.8.0','2.2.2',undefined,{'panel-strip':'2.3.4'});
215
194
  const PRIOR_SHARED_TYPES = currentBuiltinTypes('1.9.0','2.2.2');
216
- const SHARED_BLUEPRINT_TYPES = currentBuiltinTypes('1.10.0','2.2.2',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.8'});
217
- const SHARED_CANVAS_TYPES = currentBuiltinTypes('1.11.0','2.2.3',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.8'});
218
- const SHARED_WORKSPACE_TYPES = currentBuiltinTypes('1.12.0','2.2.3',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.8','panel-strip':'2.3.6','board-editor':'2.2.9','animated-scene':'2.3.7'});
219
- const PRIOR_CURRENT_TYPES = currentBuiltinTypes('1.13.0','2.2.3',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.8','panel-strip':'2.3.6','board-editor':'2.2.9','animated-scene':'2.3.7','editor':'2.2.8'});
220
- const PREVIOUS_PORTABLE_TYPES=currentBuiltinTypes('1.14.0','2.2.4',SCRIPT_WRITER_BLOCK.manifest.version,{'blueprint':'2.1.8','panel-strip':'2.3.6','board-editor':'2.2.9','animated-scene':'2.3.7','editor':'2.2.8'});
195
+ const SHARED_BLUEPRINT_TYPES = currentBuiltinTypes('1.10.0','2.2.2',undefined,{'blueprint':'2.1.8'});
196
+ const SHARED_CANVAS_TYPES = currentBuiltinTypes('1.11.0','2.2.3',undefined,{'blueprint':'2.1.8'});
197
+ const SHARED_WORKSPACE_TYPES = currentBuiltinTypes('1.12.0','2.2.3',undefined,{'blueprint':'2.1.8','panel-strip':'2.3.6','board-editor':'2.2.9','animated-scene':'2.3.7'});
198
+ const PRIOR_CURRENT_TYPES = currentBuiltinTypes('1.13.0','2.2.3',undefined,{'blueprint':'2.1.8','panel-strip':'2.3.6','board-editor':'2.2.9','animated-scene':'2.3.7','editor':'2.2.8'});
199
+ const PREVIOUS_PORTABLE_TYPES=currentBuiltinTypes('1.14.0','2.2.4',undefined,{'blueprint':'2.1.8','panel-strip':'2.3.6','board-editor':'2.2.9','animated-scene':'2.3.7','editor':'2.2.8'});
221
200
  // 1.16.0: every built-in type ends in the original Editor (1.0), the full video editor.
222
201
  const PORTABLE_EDITOR_TYPES=currentBuiltinTypes('1.15.0','2.2.4','2.1.4',{'voiceover':'2.1.4','shot-plan':'2.1.3','blueprint':'2.1.9','panel-strip':'2.3.7','board-editor':'2.2.10','animated-scene':'2.3.8','editor':'2.2.9'});
223
202
  const HOST_EDITOR_TYPES=currentBuiltinTypes('1.16.0','2.2.4','2.1.4',{'voiceover':'2.1.4','shot-plan':'2.1.3','blueprint':'2.1.9','panel-strip':'2.3.7','board-editor':'2.2.10','animated-scene':'2.3.8','editor':'1.0.0'});
@@ -227,7 +206,7 @@ const HOST_EDITOR_TYPES=currentBuiltinTypes('1.16.0','2.2.4','2.1.4',{'voiceover
227
206
  const narrates=type=>flows[type.legacyMode].includes('voiceover');
228
207
  const ORIGINAL_VOICEOVER_TYPES=currentBuiltinTypes('1.17.0','2.2.4','2.1.4',{'voiceover':'1.2.0','shot-plan':'2.1.3','blueprint':'2.1.9','panel-strip':'1.2.0','board-editor':'2.2.10','animated-scene':'2.3.8','editor':'1.0.0'}).map(type=>type.legacyMode!=='imagePanel'?type:
229
208
  {...type,connections:[{from:{stage:'stage-1',port:'output'},to:{stage:'stage-2',port:'narrationAudio'}},{from:{stage:'stage-1',port:'timing'},to:{stage:'stage-2',port:'narrationTiming'}}]});
230
- export const CURRENT_BUILTIN_TYPES = [...HOST_EDITOR_TYPES.map(type=>narrates(type)?ORIGINAL_VOICEOVER_TYPES.find(next=>next.id===type.id):type),DEALER_INVENTORY_VIDEO_PROJECT_TYPE];
209
+ export const CURRENT_BUILTIN_TYPES = [...HOST_EDITOR_TYPES.map(type=>narrates(type)?ORIGINAL_VOICEOVER_TYPES.find(next=>next.id===type.id):type)];
231
210
  const HISTORICAL_CURRENT_TYPES=[...HOST_EDITOR_TYPES.filter(narrates),...PORTABLE_EDITOR_TYPES,...PREVIOUS_PORTABLE_TYPES,...PRIOR_CURRENT_TYPES,...SHARED_WORKSPACE_TYPES,...SHARED_CANVAS_TYPES,...SHARED_BLUEPRINT_TYPES,...PRIOR_SHARED_TYPES,...MEDIA_LIBRARY_TYPES,...EDITOR_AUDIO_TYPES,...PLAYABLE_EDITOR_TYPES,...ADVANCED_PORTABLE_TYPES,...PORTABLE_MVP_TYPES,...PRE_PROMOTION_CURRENT_TYPES,...PREVIOUS_BUILTIN_TYPES.filter(type=>flows[type.legacyMode].includes('shot-plan')),...currentBuiltinTypes('1.1.0','1.1.0','1.1.0',PRIOR_HOST_WORKSPACE_VERSIONS)];
232
211
  export const BUILTIN_TYPES = [...CURRENT_BUILTIN_TYPES,...HISTORICAL_CURRENT_TYPES,...LEGACY_TYPES];
233
212
  // Hidden from discovery (October 20, 2026, owner decision: keep only Guided, Image Panels, Blank
@@ -238,7 +217,7 @@ export const BUILTIN_TYPES = [...CURRENT_BUILTIN_TYPES,...HISTORICAL_CURRENT_TYP
238
217
  // Ad Variants and the two photo reels are no longer built-in Types at all: their definitions stay
239
218
  // in the repository only as acceptance fixtures (revenue-review-project-types.js and friends), a
240
219
  // saved project carries its own copy of its Type, and the Blocks they used remain Blocks.
241
- export const HIDDEN_TYPES=new Set(['sm.animated','stillmade.dealer-inventory-video']);
220
+ export const HIDDEN_TYPES=new Set([]);
242
221
  export const isHiddenType=type=>HIDDEN_TYPES.has((type?.manifest||type)?.id);
243
222
  export const DISCOVERABLE_TYPES=Object.freeze(CURRENT_BUILTIN_TYPES.filter(type=>!isHiddenType(type)));
244
223
  export const workspaceBlock = (id,version)=>DISCOVERABLE_BLOCKS.find(block=>block.manifest.id===id && (!version || block.manifest.version===version));
@@ -1,49 +1,5 @@
1
1
  // Generated from blocks/native/*/navigation.js. Run scripts/generate-native-host-inventory.mjs.
2
2
  export const NATIVE_HOST_INVENTORY=[
3
- {
4
- "schemaVersion": 1,
5
- "application": true,
6
- "id": "sm.animated-scene",
7
- "versions": [
8
- "1.0.0",
9
- "1.1.0"
10
- ],
11
- "phase": "assetGen",
12
- "kind": "animation",
13
- "requirements": [
14
- "animation"
15
- ],
16
- "narration": {
17
- "preparation": "shots",
18
- "requireWords": true,
19
- "label": "Assets",
20
- "fallbackIntents": [
21
- "shot-plan"
22
- ]
23
- },
24
- "legacyRoutes": [
25
- {
26
- "phase": "assetGen",
27
- "priority": 0
28
- }
29
- ],
30
- "legacyEngineModes": [
31
- "animated"
32
- ],
33
- "host": {}
34
- },
35
- {
36
- "schemaVersion": 1,
37
- "application": true,
38
- "id": "sm.blueprint",
39
- "versions": [
40
- "1.0.0",
41
- "1.1.0"
42
- ],
43
- "phase": "bible",
44
- "kind": "bible",
45
- "host": {}
46
- },
47
3
  {
48
4
  "schemaVersion": 1,
49
5
  "application": true,
@@ -102,23 +58,6 @@ export const NATIVE_HOST_INVENTORY=[
102
58
  "canvasNode": "characterReferenceNode"
103
59
  }
104
60
  },
105
- {
106
- "schemaVersion": 1,
107
- "application": true,
108
- "id": "sm.chat",
109
- "versions": [
110
- "1.0.0"
111
- ],
112
- "phase": "canvas",
113
- "kind": "canvas",
114
- "host": {
115
- "canvasNode": "productionWorkspaceNode",
116
- "ports": {
117
- "input": "in:input",
118
- "output": "out:output"
119
- }
120
- }
121
- },
122
61
  {
123
62
  "schemaVersion": 1,
124
63
  "application": true,
@@ -134,24 +73,6 @@ export const NATIVE_HOST_INVENTORY=[
134
73
  "canvasNode": "compareNode"
135
74
  }
136
75
  },
137
- {
138
- "schemaVersion": 1,
139
- "application": true,
140
- "id": "sm.describe-media",
141
- "versions": [
142
- "1.0.0",
143
- "1.1.0"
144
- ],
145
- "phase": "canvas",
146
- "kind": "canvas",
147
- "host": {
148
- "canvasNode": "imageDescriberNode",
149
- "ports": {
150
- "input": "in",
151
- "output": "out"
152
- }
153
- }
154
- },
155
76
  {
156
77
  "schemaVersion": 1,
157
78
  "application": true,
@@ -290,23 +211,6 @@ export const NATIVE_HOST_INVENTORY=[
290
211
  "inspectClip": true
291
212
  }
292
213
  },
293
- {
294
- "schemaVersion": 1,
295
- "application": true,
296
- "id": "sm.image-editor",
297
- "versions": [
298
- "1.0.0"
299
- ],
300
- "phase": "canvas",
301
- "kind": "canvas",
302
- "host": {
303
- "canvasNode": "productionWorkspaceNode",
304
- "ports": {
305
- "input": "in:input",
306
- "output": "out:output"
307
- }
308
- }
309
- },
310
214
  {
311
215
  "schemaVersion": 1,
312
216
  "application": true,
@@ -424,23 +328,6 @@ export const NATIVE_HOST_INVENTORY=[
424
328
  ],
425
329
  "host": {}
426
330
  },
427
- {
428
- "schemaVersion": 1,
429
- "application": true,
430
- "id": "sm.research",
431
- "versions": [
432
- "1.0.0"
433
- ],
434
- "phase": "canvas",
435
- "kind": "canvas",
436
- "host": {
437
- "canvasNode": "productionWorkspaceNode",
438
- "ports": {
439
- "input": "in:input",
440
- "output": "out:output"
441
- }
442
- }
443
- },
444
331
  {
445
332
  "schemaVersion": 1,
446
333
  "application": true,
@@ -467,80 +354,6 @@ export const NATIVE_HOST_INVENTORY=[
467
354
  "editorTab": "audio"
468
355
  }
469
356
  },
470
- {
471
- "schemaVersion": 1,
472
- "application": true,
473
- "id": "sm.script",
474
- "versions": [
475
- "1.0.0",
476
- "1.1.0",
477
- "1.2.0"
478
- ],
479
- "phase": "script",
480
- "kind": "script",
481
- "host": {}
482
- },
483
- {
484
- "schemaVersion": 1,
485
- "application": true,
486
- "id": "sm.shot-plan",
487
- "versions": [
488
- "1.0.0",
489
- "1.1.0"
490
- ],
491
- "phase": "shotMap",
492
- "kind": "shot-plan",
493
- "requirements": [
494
- "shots"
495
- ],
496
- "narration": {
497
- "preparation": "shots",
498
- "requireWordsWhenNext": [
499
- "animation"
500
- ],
501
- "requireWordsModes": [
502
- "animated",
503
- "animated-v2"
504
- ],
505
- "label": "Shot Map",
506
- "intents": [
507
- "shot-plan"
508
- ]
509
- },
510
- "legacyRoutes": [
511
- {
512
- "phase": "shotMap",
513
- "priority": 0
514
- }
515
- ],
516
- "legacyNarration": [
517
- {
518
- "priority": 0
519
- },
520
- {
521
- "intent": "shot-plan",
522
- "priority": 20
523
- }
524
- ],
525
- "host": {}
526
- },
527
- {
528
- "schemaVersion": 1,
529
- "application": true,
530
- "id": "sm.stock-search",
531
- "versions": [
532
- "1.0.0"
533
- ],
534
- "phase": "canvas",
535
- "kind": "canvas",
536
- "host": {
537
- "canvasNode": "productionWorkspaceNode",
538
- "ports": {
539
- "input": "in:input",
540
- "output": "out:output"
541
- }
542
- }
543
- },
544
357
  {
545
358
  "schemaVersion": 1,
546
359
  "application": true,
@@ -554,34 +367,6 @@ export const NATIVE_HOST_INVENTORY=[
554
367
  "canvasNode": "styleNode"
555
368
  }
556
369
  },
557
- {
558
- "schemaVersion": 1,
559
- "application": true,
560
- "id": "sm.thumbnail",
561
- "versions": [
562
- "1.0.0",
563
- "1.1.0",
564
- "1.2.0"
565
- ],
566
- "phase": "canvas",
567
- "kind": "canvas",
568
- "host": {
569
- "canvasNode": "thumbnailNode",
570
- "ports": {
571
- "output": "out"
572
- }
573
- }
574
- },
575
- {
576
- "schemaVersion": 1,
577
- "id": "sm.transcribe",
578
- "versions": [
579
- "1.0.0"
580
- ],
581
- "phase": "voiceover",
582
- "kind": "voiceover",
583
- "host": {}
584
- },
585
370
  {
586
371
  "schemaVersion": 1,
587
372
  "application": true,
@@ -639,16 +424,5 @@ export const NATIVE_HOST_INVENTORY=[
639
424
  }
640
425
  }
641
426
  }
642
- },
643
- {
644
- "schemaVersion": 1,
645
- "id": "sm.youtube",
646
- "versions": [
647
- "1.0.0",
648
- "1.1.0"
649
- ],
650
- "phase": "youtube",
651
- "kind": "youtube",
652
- "host": {}
653
427
  }
654
428
  ];
@@ -3,56 +3,32 @@
3
3
  // immutable, so the plain wording for first-party Blocks lives here, by Block id.
4
4
  // A Block whose own description is already plain needs no entry.
5
5
  export const PLAIN_BLOCK_DESCRIPTIONS=Object.freeze({
6
- 'stillmade.narration':'Turn the facts from Chat into a script, hear it in a catalog voice or use your own recording, and pass the script and the voiceover on.',
7
- 'stillmade.screen-recorder':'Record your screen or a window, keep it on your device, cut out the parts you do not want, and pass it on.',
8
- 'sm.script':'Write and edit a script with AI. Set a length, add notes, and go back to earlier versions.',
9
- 'sm.shot-plan':'Turn a script into a list of timed shots, then edit what each shot shows and how long it lasts.',
10
- 'sm.blueprint':'Plan your video’s scenes, characters and look in one place, and lock the parts you want to keep.',
6
+ 'stillmade.generate':'Generate images and videos with any model StillMade runs: pictures from a prompt or your own photos, clips from a start and end frame.',
11
7
  'sm.pipeline':'Lay out your project on a canvas and connect its pieces, keeping your Steps and content.',
12
8
  'sm.video-assets':'Choose which images and clips go into your video, in order, from everything the project has made or imported.',
13
9
  'sm.editor':'The full video editor: text and titles, captions, transitions, music, effects and export are built in.',
14
10
  'sm.panel-strip':'Turn a script into pictures timed to the voice, then edit scenes, images and transitions.',
15
11
  'sm.board-editor':'Make text and pictures move on a whiteboard in time with a voice, then send it to the Editor.',
16
- 'sm.animated-scene':'Build animated scenes from your images and characters, preview them, then send them to the Editor.',
17
- 'stillmade.product-ad-variants':'Make three short product ads with different opening hooks from your own footage. Nothing is invented.',
18
- 'sm.youtube':'Upload a finished video to your connected YouTube channel.',
19
- 'sm.stock-search':'Search free-to-use stock photos and videos and pick one.',
20
12
  'sm.export-video':'Opens the video editor at its Export: change anything on the timeline, then make the video file.',
21
13
  'sm.export-audio':'Turn your timeline into an audio file you can download and keep in the project.',
22
14
  'sm.motion-graphics':'Add animated titles, text, charts and transitions to your timeline. You see the change before it applies.',
23
15
  'sm.score':'Put music, sound effects and voiceover from your project on the timeline. You see the change before it applies.',
24
- 'stillmade.short-form-finish':'Turn your clips and subtitles into a captioned short video you can still edit.',
25
- 'stillmade.occasion-story':'Arrange photos and video messages into a birthday, anniversary or farewell video you can still edit.',
26
- 'stillmade.release-visuals':'Make a social teaser or lyric clip for a song from its cover art and recording.',
27
- 'stillmade.photo-reel-composer':'Arrange property or product photos and your text into a 20–30 second reel. No AI images.',
28
16
  'sm.generate-image':'Make a new photo or picture with AI from a description, square unless you ask otherwise. Add your own photos to keep a product, person or place in it.',
29
17
  'sm.import-media':'Upload or choose your own photos, images, video and audio, and put them in order for the next Step.',
30
- 'sm.chat':'Work out a script by chatting with AI.',
31
18
  'sm.rough-cut':'Put your chosen clips together into a first cut you can review.',
32
19
  'sm.final-edit':'Have AI suggest a final polish for a finished timeline. You review the changes before they apply.',
33
20
  'sm.edit-assistant':'Ask for a timeline change in your own words, such as trimming a section. You review it before it applies.',
34
21
  'sm.grade':'Change the colors of chosen clips with ready-made looks or simple sliders. Your originals stay as they are.',
35
22
  'sm.transition':'Pick transitions between clips, with their timing and sounds, then apply them in the Editor.',
36
- 'sm.quality-audit':'Check your images and clips for quality problems before you export.',
37
23
  'sm.compare':'Compare two images with a slider and keep the one you prefer.',
38
- 'sm.pick-photos':'Keep only the best photos from an upload: sharp, well lit, clear faces, no near-duplicates, and true to your note.',
39
24
  'sm.photo-notes':'Rate up to four photos for sharpness, light, people and faces.',
40
25
  'sm.export-timeline':'Download your timeline to open in another editor, with or without its media.',
41
26
  'sm.captions':'Turn a transcript or text into captions with word highlighting, then add them to the timeline.',
42
- 'sm.thumbnail':'Make a square thumbnail image from a short description.',
43
27
  'sm.write-summary':'Turn data or notes, such as an app’s results, into a short summary in plain words.',
44
28
  'sm.generate-video':'Make a short video clip from a description.',
45
29
  'sm.character':'Describe a character once so your images and videos keep them the same.',
46
30
  'sm.location':'Describe a place once so your images and videos keep it the same.',
47
31
  'sm.style':'Set a look, with colors, lighting and camera style, for your images to follow.',
48
- 'sm.research':'Collect your notes and a source link into research you can reuse. It does not browse the web.',
49
- 'sm.image-editor':'Adjust an image’s brightness and contrast.',
50
- 'sm.describe-media':'Have AI describe what is in an image.',
51
- 'sm.transcribe':'Turn speech in an audio file into text, with a time for each word.',
52
- 'sm.shot-plan-assistant':'Have AI suggest a shot list from your script, keeping the shots you already have.',
53
- 'sm.animated-scene-assistant':'Have AI suggest how an animated scene is laid out and how it moves.',
54
- 'sm.blueprint-assistant':'Have AI suggest edits to your video plan.',
55
- 'sm.whiteboard-assistant':'Have AI build whiteboard boards, timing and motion from what you ask for.',
56
32
  });
57
33
 
58
34
  // Words that describe how StillMade works inside rather than what a person gets.