stillmade-sdk 0.1.41 → 0.1.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.stillmade/sdk-baseline.json +19 -21
- package/AGENTS.md +17 -12
- package/FRAME_VIEWS.md +113 -0
- package/INTERFACE_DESIGN.md +67 -22
- package/MOBILE_UI.md +4 -2
- package/MODULES.md +152 -6
- package/PASTE_TO_LLM.md +42 -32
- package/README.md +3 -2
- package/SDK.md +1028 -563
- package/UI_AESTHETIC.md +30 -3
- package/blocks/generate/package.js +1 -0
- package/blocks/generate/versions/1.0.0/package.js +463 -0
- package/docs/build/audio-to-editor.md +36 -0
- package/docs/build/block-builder-contract.md +150 -0
- package/docs/build/comfyui.md +227 -0
- package/docs/build/concepts.md +40 -0
- package/docs/build/context.md +159 -0
- package/docs/build/cookbook.md +57 -0
- package/docs/build/custom-interface.md +617 -0
- package/docs/build/data-types.md +83 -0
- package/docs/build/frame-views.md +259 -0
- package/docs/build/generate-media.md +59 -0
- package/docs/build/github-applications.md +314 -0
- package/docs/build/hosted-images.md +214 -0
- package/docs/build/hosted-music.md +39 -0
- package/docs/build/hosted-speech.md +157 -0
- package/docs/build/hosted-text.md +246 -0
- package/docs/build/image-description.md +49 -0
- package/docs/build/interface-design.md +343 -0
- package/docs/build/javascript.md +63 -0
- package/docs/build/local-preview.md +61 -0
- package/docs/build/media-analysis.md +27 -0
- package/docs/build/media.md +400 -0
- package/docs/build/mobile-ui.md +106 -0
- package/docs/build/modules.md +487 -0
- package/docs/build/original-blocks.md +70 -0
- package/docs/build/outside-apis.md +128 -0
- package/docs/build/production-context-templates.md +12 -0
- package/docs/build/project-storage.md +94 -0
- package/docs/build/quickstart.md +48 -0
- package/docs/build/recipes.md +103 -0
- package/docs/build/script-handoff.md +45 -0
- package/docs/build/script-writer.md +34 -0
- package/docs/build/state.md +223 -0
- package/docs/build/testing.md +112 -0
- package/docs/build/timeline-edits.md +116 -0
- package/docs/build/timeline-proposals.md +76 -0
- package/docs/build/transcription.md +59 -0
- package/docs/build/triggers.md +59 -0
- package/docs/build/tutorial.md +52 -0
- package/docs/build/typescript.md +34 -0
- package/docs/build/video-generation.md +61 -0
- package/docs/build/web-reading.md +37 -0
- package/docs/build/with-your-ai.md +27 -0
- package/docs/changelog.md +9 -0
- package/docs/creators.md +21 -0
- package/docs/distribute/discovery.md +43 -0
- package/docs/distribute/imports.md +58 -0
- package/docs/distribute/publishing.md +29 -0
- package/docs/distribute/sdk-versions.md +36 -0
- package/docs/distribute/selling.md +14 -0
- package/docs/distribute/teams.md +60 -0
- package/docs/distribute/versioning.md +28 -0
- package/docs/examples.md +23 -0
- package/docs/gallery.md +26 -0
- package/docs/index.md +50 -0
- package/docs/native-mcp.md +307 -0
- package/docs/project-types/automation.md +43 -0
- package/docs/project-types/batches.md +50 -0
- package/docs/project-types/build.md +42 -0
- package/docs/project-types/completion.md +15 -0
- package/docs/project-types/conditions.md +21 -0
- package/docs/project-types/hosted-review.md +115 -0
- package/docs/project-types/onboarding.md +75 -0
- package/docs/project-types/running.md +309 -0
- package/docs/project-types/testing.md +72 -0
- package/docs/reference/application-artifacts.md +87 -0
- package/docs/reference/authoring-guide.md +134 -0
- package/docs/reference/browser-applications.md +267 -0
- package/docs/reference/capabilities.md +45 -0
- package/docs/reference/cli.md +71 -0
- package/docs/reference/connection-api.md +59 -0
- package/docs/reference/cooperative-jobs.md +13 -0
- package/docs/reference/desktop-capabilities.md +172 -0
- package/docs/reference/desktop-execution.md +77 -0
- package/docs/reference/errors.md +233 -0
- package/docs/reference/execution.md +800 -0
- package/docs/reference/first-party-blocks.md +40 -0
- package/docs/reference/generation-models.md +59 -0
- package/docs/reference/limits.md +306 -0
- package/docs/reference/manifest-kinds-controls.md +36 -0
- package/docs/reference/manifest.md +181 -0
- package/docs/reference/operations.md +36 -0
- package/docs/reference/package-jobs.md +35 -0
- package/docs/reference/parity.md +55 -0
- package/docs/reference/permissions.md +86 -0
- package/docs/reference/ports.md +26 -0
- package/docs/reference/types.md +268 -0
- package/docs/reference/universal-resolver.md +303 -0
- package/docs/reference/view-bridge.md +60 -0
- package/docs/reference/view-rules.md +15 -0
- package/docs/reference/workspace-sync.md +25 -0
- package/docs/sdk.md +34 -0
- package/docs/tools/block-remix.md +211 -0
- package/docs/tools/llm.md +2213 -0
- package/docs/tools/repository-adaptation.md +613 -0
- package/examples/check-clip.stillmade.json +8 -1
- package/examples/clean-text.stillmade.json +4 -0
- package/examples/custom-interface.stillmade.json +4 -0
- package/examples/describe-image.stillmade.json +4 -0
- package/examples/foley-cue.stillmade.json +4 -0
- package/examples/generate-image.stillmade.json +4 -0
- package/examples/generate-video.stillmade.json +10 -2
- package/examples/module-word-stats/stillmade.block.json +4 -0
- package/examples/narrate-script.stillmade.json +4 -0
- package/examples/numbered-takes.stillmade.json +4 -0
- package/examples/research-topic.stillmade.json +9 -1
- package/examples/score-a-scene.stillmade.json +4 -0
- package/examples/script-draft.stillmade.json +4 -0
- package/examples/summarize-page.stillmade.json +4 -0
- package/examples/text-workflow.stillmade.json +7 -32
- package/examples/thicken-lines.stillmade.json +4 -0
- package/examples/timeline-polish.stillmade.json +15 -3
- package/examples/transcribe-audio.stillmade.json +15 -3
- package/examples/word-count.stillmade.json +4 -0
- package/package.json +1 -1
- package/packages/block-cli/cli.js +13 -6
- package/packages/block-cli/dev-host/assets/host.js +81 -38
- package/packages/block-cli/dev-host/assets/index.css +1 -1
- package/packages/block-cli/format.js +1 -1
- package/packages/block-cli/ready-gate.js +4 -0
- package/packages/block-cli/templates.js +37 -19
- package/packages/block-cli/type-packages.js +119 -0
- package/packages/block-platform/block-readiness.js +8 -1
- package/packages/block-platform/canvas.js +2 -1
- package/packages/block-platform/catalog.js +27 -48
- package/packages/block-platform/native-host-inventory.js +0 -226
- package/packages/block-platform/plain-descriptions.js +1 -25
- package/packages/block-platform/project-type-starters.js +13 -53
- package/packages/block-platform/script-handoff.js +2 -4
- package/packages/block-platform/type-workspace.js +2 -0
- package/packages/block-sdk/appearance.js +3 -1
- package/packages/block-sdk/audio-generation-example.js +2 -2
- package/packages/block-sdk/block-tier.js +1 -1
- package/packages/block-sdk/builder-contract.js +13 -11
- package/packages/block-sdk/capabilities.js +1 -1
- package/packages/block-sdk/capability-example.js +1 -1
- package/packages/block-sdk/contracts.js +6 -2
- package/packages/block-sdk/examples.js +3 -3
- package/packages/block-sdk/first-party-identities.js +1 -84
- package/packages/block-sdk/first-party-packages.js +3 -85
- package/packages/block-sdk/generation-catalog.js +15 -3
- package/packages/block-sdk/image-description-example.js +1 -1
- package/packages/block-sdk/image-generation-example.js +1 -1
- package/packages/block-sdk/index.d.ts +2 -1
- package/packages/block-sdk/media-analysis-example.js +2 -2
- package/packages/block-sdk/mock-host.js +7 -1
- package/packages/block-sdk/module-example.js +1 -1
- package/packages/block-sdk/module-host-calls.js +35 -10
- package/packages/block-sdk/module-hosted.js +15 -2
- package/packages/block-sdk/module-media-access.js +71 -0
- package/packages/block-sdk/module-node.js +1 -1
- package/packages/block-sdk/portable-media-actions.js +1 -1
- package/packages/block-sdk/runtime.js +1 -1
- package/packages/block-sdk/speech-example.js +1 -1
- package/packages/block-sdk/state-example.js +1 -1
- package/packages/block-sdk/timeline-proposal-example.js +1 -1
- package/packages/block-sdk/transcription-example.js +1 -1
- package/packages/block-sdk/trigger-examples.js +2 -2
- package/packages/block-sdk/video-generation-example.js +1 -1
- package/packages/block-sdk/view-bridge.js +4 -1
- package/packages/block-sdk/view-design.js +44 -15
- package/packages/block-sdk/web-example.js +2 -2
- package/packages/design-system/block-kit.css +53 -12
- package/packages/design-system/block-kit.html +3 -2
- package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
- package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
- package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
- package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
- package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
- package/blocks/narration/package.js +0 -1
- package/blocks/narration/versions/1.0.0/package.js +0 -221
- package/blocks/narration/versions/1.0.1/package.js +0 -221
- package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
- package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
- package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
- package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
- package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
- package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
- package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
- package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
- package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
- package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
- package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
- package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
- package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
- package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
- package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
- package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
- package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
- package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
- package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
- package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
- package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
- package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
- package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
- package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
- package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
- package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
- package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
- package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
- package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
- package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
- package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
- package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
- package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
- package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
- package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
- package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
- package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
- package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
- package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
- package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
- package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
- package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
- package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
- package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
- package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
- package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
- package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
- package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
- package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
- package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
- package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
- package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
- package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
- package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
- package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
- package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
- package/blocks/occasion-story/package.js +0 -1
- package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
- package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
- package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
- package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
- package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
- package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
- package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
- package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
- package/blocks/release-visuals/package.js +0 -1
- package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
- package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
- package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
- package/blocks/screen-recorder/package.js +0 -1
- package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
- package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
- package/blocks/short-form-finish/package.js +0 -1
- package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
- package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
- package/examples/saas-product-launch.stillmade.json +0 -304
- package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
- package/packages/block-platform/first-revenue-project-types.js +0 -46
- package/packages/block-platform/fixture-starters.js +0 -13
- package/packages/block-platform/launch-project-source.js +0 -10
- package/packages/block-platform/launch-project.js +0 -30
- package/packages/block-platform/motion-project-types.js +0 -55
- package/packages/block-platform/motion-starters.js +0 -14
- package/packages/block-platform/product-ad-variants-project-type.js +0 -30
- package/packages/block-platform/product-launch-updated.js +0 -90
- package/packages/block-platform/revenue-review-project-types.js +0 -36
- package/packages/block-platform/revenue-review-starters.js +0 -13
- package/packages/block-platform/script-writer.js +0 -29
- 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.
|