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
@@ -0,0 +1,35 @@
1
+ # In-session package jobs
2
+
3
+ # In-session package jobs
4
+
5
+ Original programmable spec §53 now has an explicit SDK host job handle. `createPackageJob(package, input, options)` returns immediately with an immutable ID, `getSnapshot()`, `subscribe(listener)`, `cancel()` and a `result` Promise. Status advances from queued to loading (contract/input checks), running (executor pending), then completed, failed or cancelled. A final operation count never completes the job.
6
+
7
+ The default executor is `runPackageAsync`. An application may supply an explicit trusted `execute` adapter; BlockPlayground uses its existing `runInWorker`, preserving local worker isolation and existing capability/ComfyUI approval dialogs. The handle is created by host code, never read from a package or guest result. It accepts no polling URLs, tokens, guest functions, server IDs or automatic retry instructions. Opted-in JavaScript cooperative pending envelopes are consumed inside the sandbox; only final declared outputs reach this handle. Arbitrary pending envelopes still fail final-result validation. This is not a serialized or durable job receipt.
8
+
9
+ Source/input/state are captured separately from the clones passed to the executor. Manifest and input/state validation precede execution; final outputs and declared Step state are validated before resolving. Preserved auxiliary host metadata does not become authenticated solely by this helper. Existing source admission, policy checks, output acceptance, stored media verification and attribution remain the host's responsibility.
10
+
11
+ `onProgress` carries actual sequential recipe operation counts or validated cooperative continuation turns and optional declared units. Other runtimes retain their own approval/progress UI. Nothing derives provider percentage, cost or remaining time from elapsed time. The deadline defaults to 15 seconds and an explicit host override is bounded to 15 minutes. Cancellation/deadline abort the executor's signal, settle once, and suppress later outputs; they do not promise remote cancellation or reverse provider billing. Listener failures cannot turn progress into completion. Handles allow up to 64 listeners and release listeners/timers on termination.
12
+
13
+ The shared `PackageJobStatus` renders the real snapshot. Block previews retain terminal states, offer cancellation both during input preparation and pending execution, and clear jobs for changed inputs/reset/new runs. Existing controller/source/revision/account fences remain necessary before accepting outputs. Connected Steps and import samples also use this handle through their existing trusted executors. Parent cancellation remains available during preparation, persistence and final admission after a child job completes.
14
+
15
+ ## Example for a trusted host
16
+
17
+ ```js
18
+ import {createPackageJob} from './packages/block-sdk/index.js';
19
+ const job = createPackageJob(pkg, input, {
20
+ signal: controller.signal,
21
+ execute: (pkg, input, options) => approvedHostExecutor(pkg, input, options),
22
+ });
23
+ const unsubscribe = job.subscribe(() => renderJobStatus(job.getSnapshot()));
24
+ try {
25
+ const final = await job.result;
26
+ // Recheck current project/source and accept through the existing host boundary.
27
+ } finally {
28
+ unsubscribe();
29
+ }
30
+ // A user cancel action calls job.cancel().
31
+ ```
32
+
33
+ ## Remaining scope and verification
34
+
35
+ In-session jobs do not reconnect after reload, persist a provider queue, schedule background work or resume an arbitrary external guest job. Opted-in JavaScript can yield bounded JSON continuations within the original sandbox run; see [Cooperative guest jobs](COOPERATIVE_GUEST_JOBS.md). Existing hosted adapters retain their own durable request protocols. No hosted fallback or financial behavior is changed. SDK downloadable inclusion is wired in the generator; generated artifacts are separate delivery work. No tests, builds, browser QA, provider calls or migrations were performed for this implementation.
@@ -0,0 +1,55 @@
1
+ # StillMade Blocks and the SDK
2
+
3
+ StillMade's own Blocks run on host services. Each one is listed here with the public SDK features that give a creator Block the same capability, so nothing StillMade builds for itself stays out of reach without a stated reason. A test fails when one of StillMade's Blocks starts using a service that is not on this list.
4
+
5
+ | What StillMade's Blocks do | How a creator Block does it | Notes |
6
+ | --- | --- | --- |
7
+ | Canvas generation: images, videos, variations, stock and recording the asset. | hosted `image.generate`, hosted `video.generate`, action `media.generate`, action `stock.search`, `stillmade.assets.create` | Same capability |
8
+ | Canvas media: stock search, uploads and generation with prices. | hosted `image.generate`, hosted `video.generate`, action `media.generate`, action `stock.search`, `stillmade.files.write`, control `file` | Same capability |
9
+ | Canvas node placement for shipped workflow nodes. | permission `context.canvas.read`, permission `workspace.canvas.propose` | Same capability |
10
+ | Canvas workspace chrome (low-balance ribbon, default model). | `IMAGE_GENERATION_MODELS` from the SDK | The credit balance ribbon is account UI; creator Blocks see prices in StillMade's own approval dialog before any paid run. |
11
+ | Composes the Canvas workspace from its native parts. | permission `workspace.canvas.propose` | StillMade React components and hooks only render inside the app; creator interfaces are frame views (any framework) or standard views with generated controls, styled with the same theme variables. |
12
+ | Creates a visual style with generated samples. | hosted `image.generate`, permission `context.styles.read` | Same capability |
13
+ | Credits or the person's own key for image, video, chat, voice, music and effects. | hosted `text.generate`, hosted `image.generate`, hosted `video.generate`, hosted `audio.speech`, hosted `audio.music`, hosted `audio.sfx` | Same capability |
14
+ | Crops panel images. | `stillmade.files.read`, `stillmade.files.write`, `stillmade.media.transform` | Same capability |
15
+ | Downloads the media a controller selected, under the export policy. | control `download`, port type `file-bundle`, action `final.render` | Same capability |
16
+ | Editor asset generation with a model, prompt, aspect, quality and reference images. | hosted `image.generate`, hosted `video.generate`, action `media.generate` | Same capability |
17
+ | Edits panel settings with local runs and confirmations. | `StillMade.run`, `StillMade.updateShared` | Same capability |
18
+ | Embeds the score, vibe and rough-cut panels in the Editor. | port type `timeline-edit`, permission `timeline.propose`, permission `context.timeline.read` | Same capability |
19
+ | Final renders of the timeline on the device, under the export policy. | action `final.render`, `stillmade.media.transform` | Same capability |
20
+ | Finds, loads and tags pipeline assets. | permission `context.assets.read`, `stillmade.project.read`, `stillmade.assets.appendVersion` | Gap: Clearing a generation watermark is tied to the account's plan and is not offered to Blocks. |
21
+ | Generates panel images with model, quality and references. | hosted `image.generate`, hosted `video.generate`, action `media.generate` | Same capability |
22
+ | Lists and applies saved visual styles. | permission `context.styles.read`, `stillmade.storage.get` | Same capability |
23
+ | Live collaborative timeline editing with permitted updates. | `StillMade.getShared`, `StillMade.updateShared`, `StillMade.connectDocument`, permission `workspace.editor.propose` | Same capability |
24
+ | Model lists and price labels for generation settings. | `IMAGE_GENERATION_MODELS` from the SDK, `VIDEO_GENERATION_MODELS` from the SDK, `AUDIO_GENERATION` from the SDK | Same capability |
25
+ | Model, resolution, quality and voice options for pipeline settings. | `IMAGE_GENERATION_MODELS` from the SDK, `VIDEO_GENERATION_MODELS` from the SDK, `AUDIO_GENERATION` from the SDK | Same capability |
26
+ | Notices, StillMade AI's presenter and upgrade prompts. | Not needed | Notices and plan upgrade prompts are account UI; a Block cannot raise them, so it cannot imitate billing or account messages. |
27
+ | Opens and closes StillMade AI's presentation of a Step. | Not needed | This is StillMade AI's own presentation of Steps; creator Blocks are presented the same way automatically and need no API. |
28
+ | Phone or desktop layout detection in the Editor. | `StillMade.render` | Device layout in a creator interface is ordinary responsive CSS inside the frame; StillMade checks it at 320 to 1280 pixels before import. |
29
+ | Places StillMade AI's generated elements on a board or canvas. | permission `workspace.board.propose`, permission `workspace.canvas.propose` | Same capability |
30
+ | Plans a panel strip from the script with a model. | hosted `text.generate`, permission `context.script.read`, permission `workspace.panels.propose` | Same capability |
31
+ | Provisions StillMade AI's paid generation for a presentation. | action `presenter.generate`, action `media.generate` | Same capability |
32
+ | Remembers a person's default image model and quality. | `stillmade.storage.get`, `stillmade.storage.set` | Same capability |
33
+ | Rewrites panel prompts with a model. | hosted `text.generate` | Same capability |
34
+ | Rough cut: frames, local footage, analysis, refinement, transcription and voiceover. | `stillmade.media.transform`, hosted `media.analyze`, hosted `audio.transcribe`, hosted `audio.speech`, hosted `text.generate`, `stillmade.files.write`, permission `timeline.propose` | Gap: Reading footage straight from the person's disk (without uploading it) is a desktop-only first-party path. |
35
+ | Runs a draft recipe or JavaScript Block locally while it is edited. | `StillMade.run` | Same capability |
36
+ | Runs Editor operations: renders, previews and timeline edits. | `stillmade.media.transform`, action `final.render`, permission `timeline.propose` | Same capability |
37
+ | Runs the production pipeline: assembly, generation, budgets, references and deliveries. | hosted `image.generate`, hosted `video.generate`, action `media.generate`, hosted `text.generate`, `stillmade.files.write`, permission `workspace.canvas.propose`, trigger `media.saved` | Same capability |
38
+ | Score and sound effect lanes: generated music and effects placed in the Editor. | hosted `audio.music`, hosted `audio.sfx`, action `media.generate`, action `stock.search`, permission `timeline.propose` | Same capability |
39
+ | Shows a panel image large with its narration and text. | `StillMade.previewImage` | Same capability |
40
+ | StillMade AI presents a workspace and adds board elements. | action `presenter.generate`, permission `workspace.board.propose` | Same capability |
41
+ | StillMade dialogs and notices for Image Panels. | `StillMade.render` | StillMade's own dialogs stay host-owned so a Block cannot imitate account, payment or permission prompts; creator interfaces show their own confirmations inside their frame. |
42
+ | Text, story segments and voiceover inside pipeline nodes. | hosted `text.generate`, hosted `audio.speech` | Same capability |
43
+ | The Canvas preview shown for a Step. | `StillMade.render`, permission `context.canvas.read` | StillMade React components and hooks only render inside the app; creator interfaces are frame views (any framework) or standard views with generated controls, styled with the same theme variables. |
44
+ | The Editor media library: project assets and uploads. | permission `context.assets.read`, `stillmade.project.read`, `stillmade.assets.create`, `stillmade.assets.appendVersion` | Same capability |
45
+ | The Editor preview shown for a Step. | `StillMade.previewMedia`, permission `context.timeline.read` | StillMade React components and hooks only render inside the app; creator interfaces are frame views (any framework) or standard views with generated controls, styled with the same theme variables. |
46
+ | The voiceover preview shown for a Step. | `StillMade.previewMedia` | StillMade React components and hooks only render inside the app; creator interfaces are frame views (any framework) or standard views with generated controls, styled with the same theme variables. |
47
+ | Uploads and checks media files, thumbnails and downloads. | control `file`, `stillmade.files.write`, `stillmade.assets.create` | Same capability |
48
+ | Vectorizes and upscales panel images. | `stillmade.asset`, `stillmade.files.read`, `stillmade.files.write` | Gap: Upscaling with a hosted model is not a hosted operation yet; module Blocks can only upscale with a model they ship in WebAssembly. |
49
+ | Video assets workspace: model limits, durations, voices, prices and batch generation. | hosted `image.generate`, hosted `video.generate`, action `media.generate`, hosted `audio.speech`, `VIDEO_GENERATION_MODELS` from the SDK | Same capability |
50
+ | Voiceover services: voices, takes and transcripts. | hosted `audio.speech`, hosted `audio.transcribe`, permission `context.transcript.read` | Same capability |
51
+ | Voiceover workspace UI with live collaboration. | `StillMade.getShared`, `StillMade.updateShared`, `StillMade.connectDocument`, `StillMade.previewMedia` | StillMade React components and hooks only render inside the app; creator interfaces are frame views (any framework) or standard views with generated controls, styled with the same theme variables. |
52
+ | White Board Motion: live collaborative board edits, elements and assets. | `StillMade.getShared`, `StillMade.updateShared`, `StillMade.connectDocument`, permission `context.board.read`, permission `workspace.board.propose`, permission `context.assets.read` | Same capability |
53
+ | Who may change Image Panels right now. | `StillMade.getShared` | Same capability |
54
+
55
+ Missing something? [Request a primitive](/create?request=primitive).
@@ -0,0 +1,86 @@
1
+ # Permissions
2
+
3
+ ## Permission families
4
+ Every manifest declares `permissions` with these families. Anything not declared is unavailable; declaring a permission never grants access the user has not authorized.
5
+
6
+ | Family | Allowed values |
7
+ | --- | --- |
8
+ | project | Project scopes below (any runtime) |
9
+ | capabilities | Exactly one hosted operation for `runtime: "capability"` (`text.generate`, `audio.speech`, `audio.transcribe`, `audio.music`, `audio.sfx`, `image.generate`, `video.generate`, `image.describe`, `media.analyze`, `web.fetch`, `web.research`, `timeline.propose`, `workspace.propose`, `connection.execute`), or `comfyui.execute` for `runtime: "comfyui"`. See [runtime capabilities](capabilities.md). |
10
+ | actions | Portable media actions below, for `runtime: "javascript"` or `"module"` |
11
+ | desktop | Desktop permissions below, used through the host desktop bridge |
12
+ | network | For `runtime: "module"`: up to 8 exact https origins the Block calls with `stillmade.net.fetch` (and opens live WebSockets to with `stillmade.net.connect`, at their `wss://` form), each optionally with the key it needs (`{origin, auth: {scheme: "bearer" \| "header" \| "query" \| "oauth2", name or app, label, help}}`). People add their own key or sign in once per Block; the host adds it on its servers. Other runtimes: empty. See [Outside APIs](../build/outside-apis.md). |
13
+ | connections | For `runtime: "module"`: up to 8 published adapters by app ID (`app:openapi:notion`), called with `stillmade.connections.call`. Other runtimes: empty. |
14
+ | filesystem, secrets | Must be empty arrays. Blocks have no ambient file or secret access; keys come from the people running the Block, through declared network access. |
15
+
16
+ ## Project scopes
17
+ | Scope | Grants |
18
+ | --- | --- |
19
+ | `context.script.read` | Read the project's script as `script` through a declared `context` input. |
20
+ | `context.transcript.read` | Read the project's transcript as `transcript` through a declared `context` input. |
21
+ | `context.shots.read` | Read the project's shots as `shot[]` through a declared `context` input. |
22
+ | `context.shotPlan.read` | Read the project's shotPlan as `shot-plan` through a declared `context` input. |
23
+ | `context.scenes.read` | Read the project's scenes as `scene[]` through a declared `context` input. |
24
+ | `context.characters.read` | Read the project's characters as `character[]` through a declared `context` input. |
25
+ | `context.locations.read` | Read the project's locations as `location[]` through a declared `context` input. |
26
+ | `context.styles.read` | Read the project's styles as `style[]` through a declared `context` input. |
27
+ | `context.assets.read` | Read the project's assets as `asset[]` through a declared `context` input. |
28
+ | `context.files.read` | Read the project's files as `file[]` through a declared `context` input. |
29
+ | `context.generations.read` | Read the project's generations as `metadata[]` through a declared `context` input. |
30
+ | `context.versions.read` | Read the project's versions as `metadata[]` through a declared `context` input. |
31
+ | `context.timeline.read` | Read the project's timeline as `timeline` through a declared `context` input. |
32
+ | `context.editor.read` | Read the project's editor as `timeline` through a declared `context` input. |
33
+ | `context.canvas.read` | Read the project's canvas as `pipeline` through a declared `context` input. |
34
+ | `context.blueprint.read` | Read the project's blueprint as `bible` through a declared `context` input. |
35
+ | `context.panels.read` | Read the project's panels as `panel-document` through a declared `context` input. |
36
+ | `context.board.read` | Read the project's board as `board-document` through a declared `context` input. |
37
+ | `context.animation.read` | Read the project's animation as `scene-document` through a declared `context` input. |
38
+ | `context.metadata.read` | Read the project's metadata as `metadata` through a declared `context` input. |
39
+ | `asset.read` | Read authorized media references the host supplies through inputs or declared context; declaring it is not permission to any particular asset. |
40
+ | `asset.create` | Module Blocks: add a saved image, video or audio file to the project's media as a new asset with `stillmade.assets.create`. Needs edit access to the project. |
41
+ | `asset.version.append` | Module Blocks: add a saved file as the newest version of a project asset the Block received, read or created, keeping its history, with `stillmade.assets.appendVersion`. |
42
+ | `project.read` | Module Blocks: read the project while running with `stillmade.project.read(fields)`, limited to the metadata and each field declared with `context.FIELD.read`. |
43
+ | `project.patch` | Reserved. Accepted by the manifest validator; no host applies changes through it today. Use a `workspace.FIELD.propose` or `timeline.propose` proposal. |
44
+ | `timeline.read` | Reserved. Accepted by the manifest validator; read the Editor timeline with `context.timeline.read`. |
45
+ | `timeline.propose` | Propose a strict timeline edit (`timeline-edit` output). Requires `context.timeline.read`; the user previews and applies it. |
46
+ | `workspace.animation.propose` | Propose a `workspace-edit` to the animation workspace. Requires the matching `context.animation.read`; the user previews and applies it. |
47
+ | `workspace.canvas.propose` | Propose a `workspace-edit` to the canvas workspace. Requires the matching `context.canvas.read`; the user previews and applies it. |
48
+ | `workspace.blueprint.propose` | Propose a `workspace-edit` to the blueprint workspace. Requires the matching `context.blueprint.read`; the user previews and applies it. |
49
+ | `workspace.shotPlan.propose` | Propose a `workspace-edit` to the shotPlan workspace. Requires the matching `context.shotPlan.read`; the user previews and applies it. |
50
+ | `workspace.panels.propose` | Propose a `workspace-edit` to the panels workspace. Requires the matching `context.panels.read`; the user previews and applies it. |
51
+ | `workspace.board.propose` | Propose a `workspace-edit` to the board workspace. Requires the matching `context.board.read`; the user previews and applies it. |
52
+ | `workspace.editor.propose` | Propose a `workspace-edit` to the editor workspace. Requires the matching `context.editor.read`; the user previews and applies it. |
53
+ | `state.step` | Keep persistent per-Step state for a JavaScript Block that declares `manifest.state`. |
54
+ | `work.shared` | Run shared background work (`sharedWork`) that every collaborator in the project sees. |
55
+
56
+ ## Portable media actions
57
+ A JavaScript Block returns a `{schemaVersion: 1, kind: "stillmade.media-action", operation, request, resultPort}` value for an action it declared; the host validates and performs it.
58
+
59
+ | Action | Performs |
60
+ | --- | --- |
61
+ | `final.render` | Ask the host to render the project timeline to a final video. |
62
+ | `stock.search` | Search approved stock photos, videos or audio by query. |
63
+ | `presenter.generate` | Generate presenter poses for a board from a prompt and its voiceover. |
64
+ | `quality.analyze` | Analyze up to 16 owned images for production quality. |
65
+ | `image.generate` | Generate one image from a bounded visual prompt through the host. |
66
+ | `image.generate.batch` | Generate up to 100 panel images from prompts in one aspect ratio, pinned to the requesting Block version. |
67
+ | `media.generate` | Generate up to 50 images, videos, voice recordings, music tracks or sound effects with any StillMade catalog model, voice and settings (aspect ratio, resolution, quality, duration, sound, seed, reference images, first and last frames, voice, speed, length), paid with the user's StillMade credits after they approve one maximum for the batch. |
68
+ | `youtube.upload` | Upload an owned video to the owner's connected YouTube channel with title, description, tags, visibility, schedule and disclosure fields. |
69
+
70
+ ## Desktop permissions
71
+ | Permission | Allows |
72
+ | --- | --- |
73
+ | `screen.capture` | Choose a screen or window, then record it. |
74
+ | `cursor.track` | Global cursor coordinates and display geometry; no click or keyboard monitoring. |
75
+ | `camera.capture` | Camera recording, or the live camera feed (`StillMade.live`), after device and OS approval. |
76
+ | `microphone.capture` | Microphone recording, or the live microphone feed (`StillMade.live`), after device and OS approval. |
77
+ | `clipboard.read` | Read clipboard text, bounded to 100,000 characters. |
78
+ | `clipboard.write` | Replace clipboard text. |
79
+ | `media.pick` | Native picker for up to 20 media files; no arbitrary path access. |
80
+ | `notifications.show` | A Block-branded desktop notification, at most one every ten seconds. |
81
+ | `power.keep-awake` | Keep the app from suspending until disabled, revoked, closed or expired. |
82
+ | `native.tools` | Use one exact versioned adapter for an approved installed desktop application. |
83
+ | `folder.read` | List and read files in a folder the person picks (StillMade Desktop, Chrome and Edge); the Block sees an opaque folder id and relative paths only, and the folder is remembered for the Block where it is used. |
84
+ | `folder.write` | Create and replace files in a folder the person shared for changing (declare folder.read too). |
85
+
86
+ Details and request shapes: [desktop capabilities](desktop-capabilities.md).
@@ -0,0 +1,26 @@
1
+ # Port fields
2
+
3
+ ## Port fields
4
+ Each input and output is a named port (a lowercase letter, then letters, numbers or underscores). Admission rejects any other field.
5
+
6
+ | Field | Meaning |
7
+ | --- | --- |
8
+ | `type` | Required. A shared StillMade type such as `text`, `image`, `shot-plan`; add `[]` for a list (`image[]`). |
9
+ | `required` | Required on every input of a new Block: `true` or `false`. A required input needs a generated control, a `context` binding or a `default`, or `pack` and import reject it. |
10
+ | `default` | A JSON value matching the type. Satisfies a required input when nothing else supplies it. |
11
+ | `min` | Lowest allowed value for a `number` or `integer` port. |
12
+ | `max` | Highest allowed value for a `number` or `integer` port. |
13
+ | `description` | Required on every input and output of a new Block. One short plain-language sentence about what the value is for. |
14
+ | `role` | Legacy distinct role (for example `character_reference`). Use only when the meaning must not mix with others; downstream roles must match exactly. Prefer `semantic`. |
15
+ | `primary` | Mark exactly one main input and one main output `true`; Project Type Steps connect primary ports automatically. |
16
+ | `context` | The project field this input reads (for example `script`); requires the matching `context.FIELD.read` permission. |
17
+ | `imageMode` | JavaScript image inputs only: `pixels` delivers decoded `{width,height,data}`; `reference` delivers the media reference without pixels. |
18
+ | `key` | Set by the host for resolver requirements. Leave unset in manifests. |
19
+ | `semantic` | Required on every input and output of a new Block. The exact meaning in lowercase snake_case or dotted form (`company_profile`, `production_shot_plan`). Downstream matching uses it; different meanings never connect. |
20
+ | `accepts` | Additional meanings this input also accepts, besides its own `semantic`. |
21
+ | `schema` | Required on every `json` or `object` port (admission rejects one without it). Not JSON Schema: a field-type word or a map of field names to field-type words, nested for objects. Words are `string`, `text`, `number`, `integer`, `boolean`, `object`, `json`; add `[]` for a list and `?` for an optional field, for example `{title:"string",tags:"string[]?",size:{width:"integer",height:"integer"}}`. |
22
+ | `sources` | Where the universal resolver may fill this input from: `upstream`, `project`, `adapter`, `chat`, `default`, `user`, `external`. Omit to allow all. `default` covers only the declared default; values a person enters in the Step or a view passes to `StillMade.run` count as `user`, so leave `user` allowed for anything the interface fills in. |
23
+ | `sensitivity` | A label for sensitive information; values marked secret, credential, password or token are never offered in chat. |
24
+ | `freshnessPolicy` | `{maxAgeMs}`: the resolver rejects values older than this. |
25
+ | `cardinality` | `one` or `many` values. |
26
+ | `batchable` | `true` when the input can run once per item of a selected media batch. |
@@ -0,0 +1,268 @@
1
+ # Types and compatibility
2
+
3
+ ## Supported types
4
+ - `text`
5
+ - `number`
6
+ - `integer`
7
+ - `boolean`
8
+ - `json`
9
+ - `object`
10
+ - `image`
11
+ - `video`
12
+ - `audio`
13
+ - `asset`
14
+ - `script`
15
+ - `transcript`
16
+ - `brief`
17
+ - `bible`
18
+ - `shot-plan`
19
+ - `panel-document`
20
+ - `board-document`
21
+ - `scene-document`
22
+ - `timeline`
23
+ - `timeline-edit`
24
+ - `file-bundle`
25
+ - `workspace-edit`
26
+ - `timeline-range`
27
+ - `research`
28
+ - `character`
29
+ - `location`
30
+ - `style`
31
+ - `pipeline`
32
+ - `approval`
33
+ - `scene`
34
+ - `shot`
35
+ - `mask`
36
+ - `depth`
37
+ - `pose`
38
+ - `metadata`
39
+ - `project-context`
40
+ - `file`
41
+ - `document`
42
+ - `table`
43
+ - `url`
44
+ - `date`
45
+ - `color`
46
+ Any listed type can use an array suffix, for example `shot[]` or `image[]`.
47
+
48
+ ## Runtime values
49
+ | Type family | Value |
50
+ | --- | --- |
51
+ | text | A string up to 1,000,000 characters |
52
+ | number / integer | A finite number, with integer and bounds checks as declared |
53
+ | boolean | true or false |
54
+ | json | Safe finite JSON data |
55
+ | image | Portable media reference or bounded RGBA image |
56
+ | video / audio / asset | Portable media reference |
57
+ | file-bundle | Validated file or ZIP download data; media requires host authorization |
58
+ | Production documents | JSON object with schemaVersion: 1 |
59
+ | Arrays | Array whose members match the base type |
60
+
61
+ A media reference is `{assetId, versionId, kind}`. A decoded image is `{width, height, data}`, with width × height × 4 integer RGBA channels. The current pixel ceiling is 1,048,576.
62
+
63
+ ## Compatibility rules
64
+ The raw `compatible` check requires exact type matching except **integer → number**. Arrays match their full declared type. If an input declares a semantic role, its producer must declare the same role. The host connection registry can additionally apply the guarded conversions below.
65
+ ```js
66
+ compatible({type: 'image', role: 'source_image'},
67
+ {type: 'image', role: 'source_image'});
68
+ // { compatible: true, adapter: null }
69
+ ```
70
+
71
+ ## Primary ports
72
+ Declare one primary input and output for automatic insertion. A sole port is inferred for older packages. Multiple candidates without a declared primary do not produce an arbitrary connection.
73
+
74
+ ## How a project flags connection problems
75
+ Every surface that shows a project's Blocks (the step rail, Flow cards, the Flow map and Canvas nodes) reads one classifier, `placementAttention` in `packages/block-platform/placement-attention.js`. It only explains states the flow inspection already proved; it never changes what may run. Order suggestions keep their own marker between the two Blocks and do not color either Block.
76
+
77
+ | Glow | Meaning | Causes |
78
+ | --- | --- | --- |
79
+ | Red | Needs a fix before it can run correctly | Last run failed; result wasn't saved; Block unavailable; Blocks disagree on a contract or depend on each other; a connection points to a missing Block or input; a chosen source stopped working (pinned version gone, saved setting in the wrong format, two Canvas sources for one input); an input requires project information but allows no project source |
80
+ | Yellow | Can continue once the person answers, reviews or reruns | A required input has no source yet; an unlabeled connection needs review; a schedule needs the owner to enable it; an earlier Block changed, so the result is outdated |
81
+ | None | Normal sequencing | Waiting for an earlier Block, working, paused, skipped by a condition, private, finished, or Flow details unavailable |
82
+
83
+ What authors control:
84
+ - Give every port a `semantic`. A connection whose ports carry no meaning stays yellow until a person reviews it.
85
+ - Mark settings with safe defaults `required: false`. Each required input without a source keeps the Block yellow until it is answered.
86
+ - Allow the sources an input can really use (`user`, `chat`, `project`). A required input that needs project information but allows no project source is red.
87
+ - Return outputs that match their declared type. A mismatched output fails the run, which turns the Block red.
88
+
89
+ ## Safe connection conversions
90
+ StillMade can insert a versioned, deterministic conversion between compatible
91
+ Steps. This is part of the host connection contract; it does not add a visible
92
+ Step or ask the user to wire ports. Advanced connection controls show the
93
+ conversion and preserve its version when the Project Type is saved.
94
+
95
+ `compatible(outputPort, inputPort)` remains the strict raw-value check: exact
96
+ types and matching required roles, with the existing integer-to-number widening.
97
+ Use `connectionCompatibility(outputPort, inputPort)` to discover a supported
98
+ connection conversion. Pass the complete port objects, including `role`.
99
+ `validateConnectionAdapter(outputPort, inputPort, {permissions, adapter})` also
100
+ checks the receiving Block's `manifest.permissions.project` grants and the saved
101
+ adapter pin. Static compatibility is a possibility, not a promise that any value
102
+ can run: the actual output and authorized context must pass runtime validation.
103
+
104
+ | Conversion | What the host accepts | Receiving Block permissions |
105
+ | --- | --- | --- |
106
+ | integer → number | A valid whole number, preserving its value | None |
107
+ | image / video / audio → asset | A saved media reference of that kind | None |
108
+ | asset → image / video / audio | A media reference whose actual `kind` matches the requested type | None |
109
+ | scene → shot[] | The scene's authorized shots, in its recorded project order | `context.scenes.read`, `context.shots.read` |
110
+ | shot → image | That shot's unambiguous, current, host-selected image, present in authorized project assets | `context.shots.read`, `context.assets.read` |
111
+
112
+ The conversion IDs are `integer-to-number`, `image-to-asset`, `video-to-asset`,
113
+ `audio-to-asset`, `asset-to-image`, `asset-to-video`, `asset-to-audio`,
114
+ `scene-to-shots`, and `shot-to-selected-image`. Each is currently version `1`.
115
+ New cross-type Project Type connections must include the exact pin:
116
+
117
+ ```json
118
+ {
119
+ "from": { "stage": "source", "port": "asset" },
120
+ "to": { "stage": "process", "port": "image" },
121
+ "adapter": { "id": "asset-to-image", "version": 1 }
122
+ }
123
+ ```
124
+
125
+ The builder adds this metadata automatically. Existing direct and
126
+ integer-to-number connections remain valid without an explicit pin. Changing a
127
+ pin changes the workflow identity and invalidates connected-run and automation
128
+ reviews. The host uses `adaptConnectionValue(outputPort, inputPort, value,
129
+ {context, permissions, adapter})` before validating the receiving input; a
130
+ conversion returns copied data and cannot modify the project.
131
+
132
+ Roles are preserved, never invented: a `character_reference` image cannot become
133
+ a `source_image`. Scene and shot conversions use scoped host context rather than
134
+ trusting a Block's embedded shot list or selected-image claim. Missing,
135
+ ambiguous, stale or unauthorized selections stop the run. StillMade does not
136
+ choose the first image or fall back to a historical version. Inline RGBA pixels
137
+ must be saved as a media reference before a media-to-asset conversion. No
138
+ conversion here downloads, decodes, generates, or uploads media. Video-to-audio,
139
+ video-to-frames, model inference and other semantic transformations still require
140
+ an explicit supported capability and its own execution permissions.
141
+
142
+ Additional shared types include `scene`, `shot`, `shot[]`, `mask`, `depth`, `pose`,
143
+ `metadata` and `project-context`. Their current values are versioned JSON documents
144
+ (`schemaVersion: 1`); declaring a context port does not grant project access.
145
+ Scoped context and conditional/batch execution are available for supported SDK
146
+ Blocks. ComfyUI uses the explicit account connection and review described below;
147
+ unattended remote automation and additional media adapters remain separate work.
148
+
149
+ ## Context bindings
150
+ | Field | Exact type |
151
+ | --- | --- |
152
+ | script | script |
153
+ | transcript | transcript |
154
+ | shots | shot[] |
155
+ | shotPlan | shot-plan |
156
+ | scenes | scene[] |
157
+ | characters | character[] |
158
+ | locations | location[] |
159
+ | styles | style[] |
160
+ | assets | asset[] |
161
+ | files | file[] |
162
+ | generations | metadata[] |
163
+ | versions | metadata[] |
164
+ | timeline | timeline |
165
+ | editor | timeline |
166
+ | canvas | pipeline |
167
+ | blueprint | bible |
168
+ | panels | panel-document |
169
+ | board | board-document |
170
+ | animation | scene-document |
171
+ | metadata | metadata |
172
+
173
+ ## Downloadable Block results
174
+ Declare an output with `type: "file-bundle"` (or `file-bundle[]`). The shared Block
175
+ preview automatically offers Download, including when the Block has a custom
176
+ view. A file result is inert data: it grants no filesystem access and never mounts
177
+ HTML, runs code or triggers a download before the user clicks. This output type
178
+ is separate from the file `pack` writes to install the Block itself.
179
+
180
+ ```json
181
+ {
182
+ "schemaVersion": 1,
183
+ "format": "file",
184
+ "name": "notes.txt",
185
+ "files": [{"path": "notes.txt", "text": "My notes"}]
186
+ }
187
+ ```
188
+
189
+ For ZIP output use `format: "zip"`, a `.zip` name, and multiple files. Each member
190
+ contains exactly `{path,text}` or `{path,source}`. A `source` retains the complete
191
+ selected media reference (`kind`, `assetId`, `versionId`, `url`, and its existing
192
+ role/metadata); never invent a reference or substitute a URL. Media entries need
193
+ `asset.read` in `manifest.permissions.project` and an authorized selection from
194
+ the host's existing media inputs or declared project context. Declaration alone
195
+ is not permission. The host checks the full reference identity and current
196
+ account/selection before transferring bytes. Detached history views can download
197
+ text-only results; media ZIPs need the Block's current authorized media context.
198
+
199
+ Source-project ZIPs may also contain bounded UTF-8 HTML, CSS, JavaScript,
200
+ TypeScript, SVG and other common source text files as `{path,text}` members. The
201
+ host treats those members as inert data, checks their paths and total size, and
202
+ offers only the ZIP download after the normal export authorization. A single
203
+ HTML or script file cannot be returned as `format: "file"`. Declare a useful
204
+ semantic such as `web_source_project` so Revolver can connect the complete
205
+ project to a compatible consumer. Binary files are not accepted as text members;
206
+ use authorized media references where appropriate and do not omit required
207
+ project files while claiming a complete export.
208
+ For browser-application Blocks, `file-bundle` members must currently be
209
+ text-only. The browser execution host rejects guest-supplied media references
210
+ even when the manifest requests `asset.read`, because that request does not
211
+ prove the current project selected the exact asset and version. Other Block
212
+ runtimes retain their existing host-authorized media-bundle path.
213
+ Unavailable, unselected or unsupported media aborts the ZIP instead of returning
214
+ an archive with missing members. The host does not install dependencies.
215
+
216
+ File downloads contain exactly one text member whose path equals `name`.
217
+ Supported text suffixes: `.txt`, `.md`, `.json`, `.csv`, `.xml`, `.fcpxml`, `.srt`,
218
+ `.vtt`. ZIP media suffixes: `.png`, `.jpg`, `.jpeg`, `.webp`, `.gif`, `.mp4`,
219
+ `.webm`, `.mov`, `.mp3`, `.wav`, `.ogg`, `.m4a`, `.flac`, `.bin`.
220
+ Use safe relative ASCII paths, at most 180 characters, with no traversal,
221
+ backslashes, empty segments, trailing dots, reserved device names or case
222
+ collisions. Include 1–256 files and at most 3,000,000 UTF-8 text bytes total;
223
+ the existing runtime JSON/memory limits also apply. Media transfers use the
224
+ host limits above. Files are delivered as downloads with a non-executable MIME
225
+ type; no archive member becomes a host filesystem path.
226
+
227
+ `isFileBundle(value)` and the normal `validate`/`test`/`pack` commands enforce this
228
+ contract. Include normal and edge fixtures containing the complete expected
229
+ file data. The [File notes example](https://stillmade.shop/block-sdk/examples/file-notes.stillmade-block)
230
+ is a complete portable package using this output. Import it, change the text,
231
+ run it and click Download. No custom download code is needed in the Block view.
232
+
233
+ ## Original media file admission
234
+ The SDK exports `MEDIA_IMPORT_FORMATS`, `MEDIA_IMPORT_MAX_BYTES` and
235
+ `inspectMediaImportFile({name,size,type?})` for trusted hosts handling files the
236
+ user selected. The inspector returns `{kind,extension}` and rejects unsupported
237
+ extensions, conflicting MIME categories, empty/nonintegral sizes and files above
238
+ 50 MiB. It does not read file bytes, grant filesystem access or authorize an upload.
239
+
240
+ Supported originals are PNG/JPG/JPEG/WebP/GIF images; MP4/MOV/WebM videos; and
241
+ MP3/WAV/M4A/AAC/OGG audio. Each format specifies the canonical upload MIME type.
242
+ An absent MIME type or `application/octet-stream` may use the recognized extension.
243
+ The existing authenticated media upload endpoint uses the same table and limit,
244
+ stores the bytes it is given through its signed PUT, and returns a durable media
245
+ URL. Before that upload, the host may make a working copy of large media when
246
+ the account's media setting is on (its default): images over 2048 px or 4 MiB
247
+ become a 2048 px JPEG (PNG when transparent; GIF and SVG are left alone), audio
248
+ over 25 MiB becomes 128 kbps MP3, and video over 1080p is re-encoded at 1080p
249
+ where the device can. The working copy is then the saved value the Block
250
+ receives, with its own `assetId`, `versionId` and URL; the original stays on the
251
+ person's device, linked only on host records, and is never substituted at run
252
+ time. A Block that needs the original asks the person, who can upload it from
253
+ the input's "Use original" control. With the setting off, originals upload as is.
254
+ With the account's local-first setting on (its default), a project Step keeps the
255
+ file in the browser's own storage instead of uploading it: the value's `url` is a
256
+ durable `sm-media://device/<assetId>/<sha256>` address, the Block reads it on
257
+ that device, and the host uploads a copy once per version only when a hosted
258
+ operation, Chat or sharing needs it.
259
+
260
+ The host's existing Canvas upload adapter accepts optional `signal` and
261
+ `assertCurrent` controls. The callback must throw when the owning session is no
262
+ longer current; checks run before upload and before caching or returning results.
263
+ Isolated previews retain local files without a cloud request. A file selected in
264
+ a generic Block preview is still temporary unless a supported host persistence
265
+ flow explicitly saves it; declaring `asset.create` alone does not upload it.
266
+
267
+ These utilities extend the shared upload boundary. They are not a new guest file
268
+ API or proof that the native Import media workspace is a portable sandbox Block.