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.
- package/.stillmade/sdk-baseline.json +6 -8
- package/AGENTS.md +15 -10
- package/FRAME_VIEWS.md +113 -0
- package/INTERFACE_DESIGN.md +62 -22
- package/MOBILE_UI.md +4 -2
- package/MODULES.md +152 -6
- package/PASTE_TO_LLM.md +35 -25
- package/README.md +3 -2
- package/SDK.md +994 -550
- package/UI_AESTHETIC.md +22 -2
- 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 +4 -1
- package/examples/generate-video.stillmade.json +6 -2
- package/examples/research-topic.stillmade.json +5 -1
- package/examples/text-workflow.stillmade.json +3 -32
- package/examples/timeline-polish.stillmade.json +11 -3
- package/examples/transcribe-audio.stillmade.json +11 -3
- package/package.json +1 -1
- package/packages/block-cli/cli.js +13 -6
- package/packages/block-cli/dev-host/assets/host.js +76 -38
- package/packages/block-cli/dev-host/assets/index.css +1 -1
- package/packages/block-cli/format.js +1 -1
- package/packages/block-cli/templates.js +31 -13
- package/packages/block-cli/type-packages.js +119 -0
- package/packages/block-platform/block-readiness.js +5 -0
- 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/block-tier.js +1 -1
- package/packages/block-sdk/builder-contract.js +10 -8
- package/packages/block-sdk/capabilities.js +1 -1
- package/packages/block-sdk/contracts.js +6 -2
- 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/index.d.ts +2 -1
- package/packages/block-sdk/media-analysis-example.js +1 -1
- package/packages/block-sdk/mock-host.js +7 -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/timeline-proposal-example.js +1 -1
- package/packages/block-sdk/transcription-example.js +1 -1
- 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 +17 -14
- package/packages/block-sdk/web-example.js +1 -1
- package/packages/design-system/block-kit.css +48 -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,172 @@
|
|
|
1
|
+
# Desktop capabilities
|
|
2
|
+
|
|
3
|
+
# Desktop capabilities for Blocks
|
|
4
|
+
|
|
5
|
+
Recording and folders run on both platforms: in a browser the trusted web host records with the browser's own screen, camera or microphone picker and keeps the finished file on the device (a `sm-media://device/...` reference), and shares folders through the browser's folder picker (Chrome and Edge); in StillMade Desktop the native host does both. Every other scope below needs StillMade Desktop.
|
|
6
|
+
|
|
7
|
+
**Consent is the person's own action.** A Block reaches only what it declares, and StillMade refuses everything else, so people are never asked to judge a Block. Picking a folder or files in the system dialog, or pressing StillMade's Start button for a recording or live feed, is the consent: there is no second "Allow?" question. Notifications and keeping the computer awake need no question. StillMade asks once only about what happens without such an action: reading the clipboard or the cursor, replacing the clipboard, and running a desktop program. An OS prompt may follow the first use of the camera or microphone. Importing a Block, installing StillMade or opening a preview asks nothing. Imported UI receives neither native IPC nor grant tokens.
|
|
8
|
+
|
|
9
|
+
**What a person allows is remembered for the exact Block where it is used**: their account, the project Step, and the exact package (its digest). Picked folders and answered questions carry over to the next session and the next launch, in StillMade Desktop and in the browser. Any other package starts with nothing, including a new version of the Block, another Block in the same Step, or a Block from another author that reuses the same id. Remembered access ends when:
|
|
10
|
+
- the Step's Block changes: an update, or another Block put in its place (it picks or answers again, once);
|
|
11
|
+
- StillMade quarantines the Block;
|
|
12
|
+
- the person forgets it: **Stop sharing** under the Block, or **Forget** in Desktop access.
|
|
13
|
+
|
|
14
|
+
Under every Block that uses device features, **What this Block did** lists the folders it uses and what it read, wrote, copied or ran on this device. The Block cannot read or hide it.
|
|
15
|
+
|
|
16
|
+
Declare the exact required scopes in `manifest.permissions.desktop`. Other permission families remain unchanged. Pure recipe/JavaScript execution stays sandboxed; the **Block UI bridge** requests desktop operations through the trusted host.
|
|
17
|
+
|
|
18
|
+
| Scope | UI operation | Behavior |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| `screen.capture` | `record.start`, `{kind:"screen"}` | Choose a screen or window, then record it. Browser and desktop. |
|
|
21
|
+
| `cursor.track` | `cursor.track`, or `{cursor:true}` on `record.start` | Global cursor coordinates and display geometry; recordings sample at 10 Hz. Does not monitor clicks or keyboard input. |
|
|
22
|
+
| `camera.capture` | `record.start`, `{kind:"camera"}`; `live.start`, `{camera:true}` | Camera recording, or the live camera feed, after device/OS approval. Browser and desktop. |
|
|
23
|
+
| `microphone.capture` | `record.start`, `{kind:"microphone"}`, or `{kind:"screen", microphone:true}`; `live.start`, `{microphone:true}` | Microphone recording after device/OS approval, the microphone mixed into a screen recording, or the live microphone feed. Browser and desktop. |
|
|
24
|
+
| `clipboard.read` | `clipboard.read` | Returns `{text}`; bounded to 100,000 characters. |
|
|
25
|
+
| `clipboard.write` | `clipboard.write`, `{text}` | Explicit permission to replace clipboard text. |
|
|
26
|
+
| `media.pick` | `media.pick` | Native picker returns `{assets}` for up to 20 selected media files; no arbitrary path access. |
|
|
27
|
+
| `notifications.show` | `notifications.show`, `{body}` | StillMade/Block-branded desktop notification; maximum one every ten seconds. |
|
|
28
|
+
| `power.keep-awake` | `power.keep-awake`, `{enabled:true}` | Prevent app suspension until disabled, revoked, closed, or expired. |
|
|
29
|
+
| `native.tools` | `tool.status` and declared `tool.*` operations | Use one exact versioned adapter for an approved installed desktop application. |
|
|
30
|
+
| `folder.read` | `folder.pick`, `folder.shared`, `folder.list`, `folder.read`, `folder.forget` | List and read files in a folder the person picks. The Block gets an opaque folder id and names files by relative paths. Desktop, and Chrome and Edge. |
|
|
31
|
+
| `folder.write` | `folder.pick`, `{write:true}`; `folder.write` | Create and replace files in a folder the person shared for changing. Declare `folder.read` too. Desktop, and Chrome and Edge. |
|
|
32
|
+
|
|
33
|
+
The host always checks declarations. Declaring a scope does not grant it. For anything but recording, a browser receives a clear desktop-required error; there is no silent paid/cloud fallback. A Block whose only desktop scopes are recording scopes is not marked as requiring StillMade Desktop.
|
|
34
|
+
|
|
35
|
+
## Approved native desktop tools
|
|
36
|
+
|
|
37
|
+
Native applications use a separate allowlisted adapter contract. The Block stays an ordinary sandboxed SDK package and must declare both `permissions.desktop:["native.tools"]` and a desktop-only platform matrix. `manifest.desktopTools` pins the exact adapter version and actions. A Block cannot supply an executable, command, path, environment variable, installer, or additional argument.
|
|
38
|
+
|
|
39
|
+
Natron adapter version 1 currently exposes `launch`, `project.import`, `project.open`, and `project.render`. Project import copies one user-selected `.ntp` file into that Block version's workspace and returns an opaque project ID. Open accepts only that opaque ID or `latest`. Render accepts a locally authorized StillMade video, bounded Reader/Writer node names, and a frame range of at most 10,001 frames. The trusted host invokes `NatronRenderer` with only the pinned project, `-i`, `-w`, host-resolved input/output paths, and the bounded range. It never accepts Natron's Python/interpreter flags or a Block-supplied path. The completed render is imported into the StillMade media library and returned as a typed video asset.
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"platforms":{"phone":{"supported":false,"reason":"Requires Natron and StillMade Desktop."},"browser":{"supported":false,"reason":"Requires Natron and StillMade Desktop."},"desktop":{"supported":true}},
|
|
44
|
+
"permissions":{"project":[],"network":[],"filesystem":[],"secrets":[],"desktop":["native.tools","media.pick"]},
|
|
45
|
+
"desktopTools":[{"id":"org.natron.Natron","adapterVersion":1,"actions":["launch","project.import","project.open","project.render"]}]
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The mapped Natron Block uses `video` as both its primary typed input and output, with semantic `video`. This allows an explicit Project Type chain such as video producer → Natron → review/export Block. Its custom interface submits the connected original input and render settings to `StillMade.run`; the approved desktop executor invokes the renderer and returns the newly registered artifact with a bound native receipt. Source fixtures and JavaScript passthrough do not prove native execution. See [Native desktop execution](DESKTOP_EXECUTION.md) for `src/desktop.json`, offline admission, host callbacks and retained-result requirements.
|
|
50
|
+
|
|
51
|
+
## Folders you choose
|
|
52
|
+
|
|
53
|
+
A Block that works on a person's files (a photo culler, a subtitle batch, a project exporter) asks for one folder at a time. The person picks it in the system folder dialog (StillMade Desktop) or the browser's folder picker (Chrome and Edge); the Block never sees a path and reaches nothing outside that folder. The folder is remembered for the Block where it is used, so start with the folders it already has:
|
|
54
|
+
|
|
55
|
+
```js
|
|
56
|
+
let [folder] = (await StillMade.desktop('folder.shared')).folders;
|
|
57
|
+
if (!folder) ({folder} = await StillMade.desktop('folder.pick', {write: true}));
|
|
58
|
+
const {entries} = await StillMade.desktop('folder.list', {folder: folder.id, path: 'raw'});
|
|
59
|
+
const {text} = await StillMade.desktop('folder.read', {folder: folder.id, path: 'notes.txt'});
|
|
60
|
+
const {asset} = await StillMade.desktop('folder.read', {folder: folder.id, path: 'raw/a.png', as: 'media'});
|
|
61
|
+
await StillMade.desktop('folder.write', {folder: folder.id, path: 'edits/notes.txt', text: 'Take two'});
|
|
62
|
+
await StillMade.desktop('folder.write', {folder: folder.id, path: 'cover.png', asset, replace: true});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- `folder.pick` returns `{folder: {id, name, write}}`. `{write:true}` asks to share it for changing, and needs `folder.write`; the picker says which. Picking a folder already shared keeps its id. In a browser, call it from a click in the Block: Chrome opens its picker only after one, and otherwise StillMade shows its own Choose folder button first.
|
|
66
|
+
- `folder.shared` returns `{folders: [{id, name, write}]}`: the folders this Block already has here, kept from earlier sessions. `folder.forget` with `{folder}` stops using one.
|
|
67
|
+
- `folder.list` returns `{entries: [{name, kind, size, modified}], truncated}`, folders first, at most 1,000 entries. Links are left out.
|
|
68
|
+
- `folder.read` returns `{text, size}` for a text file up to 1 MB, or `{asset, size}` with `as: "media"` for an image, video or audio file: on Desktop the file becomes a saved desktop asset; in a browser it stays on the device, linked where it sits (`sm-media://device/...`). Either way the Block can show it, pass it to `StillMade.run` or return it.
|
|
69
|
+
- `folder.write` takes `text` (up to 1 MB) or `asset`, a media value this Block saved, read or received in this session. Missing folders on the path are created. An existing file is replaced only with `replace: true`. The file is written beside its destination first and moved into place, so a failed write leaves no partial file.
|
|
70
|
+
- Paths are relative, separated by `/`, at most 32 levels and 1,024 characters. `..`, `.`, absolute paths, drive letters, backslashes, names with leading or trailing spaces or a trailing dot, reserved Windows names (`CON`, `NUL`) and Windows short names (`GIT~1`) are refused. On Desktop, hidden-file checks also run on the resolved path, a symbolic link anywhere on the path is refused rather than followed, and every resolved path is checked to be inside the folder. A browser does not show links or the folders above the picked one; Chrome itself refuses system folders and the home folder.
|
|
71
|
+
- Hidden files and folders (names starting with `.`, such as `.git`, `.env`, `.vscode` or a shell profile) are left out of lists and cannot be read or written.
|
|
72
|
+
- `folder.write` creates and replaces only media, subtitle, plain-text and table files: images (`png`, `jpg`, `webp`, `tiff`, `exr`, `psd` and similar), video (`mp4`, `mov`, `webm`, `mkv`, `mxf` and similar), audio (`mp3`, `wav`, `m4a`, `flac` and similar), `txt`, `srt`, `vtt`, `ass`, `csv`, `tsv`, `edl`, `otio`, `cube` and `pdf`. Structured data goes in a file named `<name>.stillmade.json`. Other `.json` and `.md` files are not written, because tools and coding agents read names like `package.json` or `CLAUDE.md` as settings or instructions; nor are programs, scripts, shortcuts, disk images, macro documents, build files such as `CMakeLists.txt`, or anything inside a macOS bundle such as `Name.app`. This is an allowlist: a type it does not name, including a lookalike written with other characters, is refused. Written files are never executable.
|
|
73
|
+
- The person cannot pick a whole drive, their home folder or a folder above it. A folder shared for changing also cannot be hidden, inside application settings (`AppData`, `Library`) or inside a code repository (a folder with `.git` at or above it on Desktop, inside it in a browser); those can still be shared for reading. Every write checks again, so a repository created inside the folder later stops writes into it.
|
|
74
|
+
- A Block holds at most four folders. They are remembered for the exact Block where it is used until the person stops sharing them (under the Block, or in Desktop access), the Step's Block changes, or StillMade quarantines it. On Desktop each remembered folder is checked again before use: one that was moved, replaced by a link or turned into a repository is dropped. In a browser, Chrome may ask once to allow a remembered folder again after it restarts, or keep it for good with "Allow on every visit".
|
|
75
|
+
- Nothing deletes or renames files. In a read-only workspace a folder can be picked for reading, listed and read; picking one for changing and `folder.write` need edit access.
|
|
76
|
+
|
|
77
|
+
## Live camera and microphone
|
|
78
|
+
|
|
79
|
+
A view can use the camera, the microphone or both as they happen instead of a
|
|
80
|
+
finished recording: a live filter, a tuner, a level meter, a pose or gesture
|
|
81
|
+
check, live captions. It declares the same scopes as recording and uses
|
|
82
|
+
`StillMade.live` (standard and frame views, browsers and StillMade Desktop):
|
|
83
|
+
|
|
84
|
+
```js
|
|
85
|
+
const canvas = document.getElementById('picture'), context = canvas.getContext('2d');
|
|
86
|
+
StillMade.live.onFrame((frame, info) => { // an ImageBitmap, info.width x info.height
|
|
87
|
+
canvas.width = info.width; canvas.height = info.height;
|
|
88
|
+
context.drawImage(frame, 0, 0); // draw or copy it now: it is closed afterwards
|
|
89
|
+
});
|
|
90
|
+
StillMade.live.onAudio((samples, info) => { // mono Float32Array, info.sampleRate
|
|
91
|
+
meter.value = Math.max(...samples.map(Math.abs));
|
|
92
|
+
});
|
|
93
|
+
StillMade.live.onEnd(event => { status.textContent = 'Camera off'; }); // event.reason
|
|
94
|
+
document.getElementById('start').addEventListener('click', () =>
|
|
95
|
+
StillMade.live.start({ camera: true, microphone: true, fps: 15, width: 640, sampleRate: 16000 }));
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
- `live.start` resolves with `{live, camera, microphone, fps, width, height, sampleRate}`
|
|
99
|
+
once the person presses Start in StillMade, in a browser and in StillMade
|
|
100
|
+
Desktop. `fps` is 1 to 30 (default 15), `width` 160 to 1280
|
|
101
|
+
pixels (default 640, never wider than the camera), `sampleRate` 8000 to 48000
|
|
102
|
+
(default 16000; a browser that cannot resample reports its own rate in each chunk).
|
|
103
|
+
- The view never holds the camera or microphone. StillMade keeps the stream,
|
|
104
|
+
shows that the device is on with a Turn off button, and posts transferred
|
|
105
|
+
copies: one `ImageBitmap` per frame and one 4,096-sample `Float32Array` per
|
|
106
|
+
audio chunk. At most two frames are unanswered at a time, so a slow view
|
|
107
|
+
receives fewer frames, never a backlog.
|
|
108
|
+
- `live.stop()` (or Turn off, closing the Block, or revoking access)
|
|
109
|
+
ends the feed; `onEnd` receives the reason (`stopped`, `person`, `closed`,
|
|
110
|
+
`ended` when the device stops, `time`). Nothing is recorded or saved.
|
|
111
|
+
- A recording and a live feed do not run at the same time. `live.stop` and
|
|
112
|
+
`live.status` work in a read-only workspace; `live.start` needs edit access.
|
|
113
|
+
- For heavy processing of frames (a WebAssembly model), copy what you need
|
|
114
|
+
(`getImageData`, `createImageBitmap(frame)`) and hand it to a Worker in a frame view,
|
|
115
|
+
or to the Block's runtime with `StillMade.run`.
|
|
116
|
+
|
|
117
|
+
## Ready-to-import recording Blocks
|
|
118
|
+
|
|
119
|
+
Download the complete [Screen recorder](https://stillmade.shop/block-sdk/examples/screen-recorder.stillmade.json), [Camera recorder](https://stillmade.shop/block-sdk/examples/camera-recorder.stillmade.json), or [Microphone recorder](https://stillmade.shop/block-sdk/examples/microphone-recorder.stillmade.json). These packages also ship in the SDK archive. Import one through StillMade’s normal review flow, then use it in a browser or in the desktop app. Each includes a themed interface and pure runtime fixtures that preserve the media reference. The fixtures use synthetic references; they do not exercise your device.
|
|
120
|
+
|
|
121
|
+
The interface saves recording media before sending it through the runtime. If that handoff fails, Retry uses the saved recording without recording again.
|
|
122
|
+
|
|
123
|
+
## Recording example
|
|
124
|
+
|
|
125
|
+
Manifest fragment:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{"permissions":{"project":[],"network":[],"filesystem":[],"secrets":[],"desktop":["screen.capture","cursor.track"]}}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`record.start` takes `{kind, microphone, systemAudio, resolution, frameRate, cursor}`: `kind` is `screen` (default), `camera` or `microphone`; `microphone:true` mixes the microphone into a screen recording (declare `microphone.capture` too); `systemAudio:true` asks for the shared audio (Windows loopback on desktop, the browser's own share-audio option in a browser; when audio is refused the capture continues without it); `resolution` is `1080p` (default) or `source`; `frameRate` defaults to 30; `cursor:true` needs StillMade Desktop. It resolves to `{recording, kind, microphone, mimeType, width, height, limits}`. `record.status` answers at any time with `{active, platform, kind, elapsed, bytes, ended, stoppedBy, message, limits}` so a view can show a timer and what is left.
|
|
132
|
+
|
|
133
|
+
Inside your validated `view.javascript`, attach explicit start/stop controls:
|
|
134
|
+
|
|
135
|
+
```js
|
|
136
|
+
const start = document.getElementById('start');
|
|
137
|
+
const stop = document.getElementById('stop');
|
|
138
|
+
const status = document.getElementById('status');
|
|
139
|
+
start.addEventListener('click', async () => {
|
|
140
|
+
try {
|
|
141
|
+
await StillMade.desktop('record.start', {kind:'screen', cursor:true});
|
|
142
|
+
status.textContent = 'Recording. Press Stop when finished.';
|
|
143
|
+
} catch (error) { status.textContent = error.message; }
|
|
144
|
+
});
|
|
145
|
+
stop.addEventListener('click', async () => {
|
|
146
|
+
try {
|
|
147
|
+
const result = await StillMade.desktop('record.stop');
|
|
148
|
+
// Declare matching video and metadata inputs in the Block manifest.
|
|
149
|
+
// Your sandboxed runtime can pass these through as typed outputs.
|
|
150
|
+
await StillMade.run({video:result.asset, cursor:{samples:result.cursor, displays:result.displays}});
|
|
151
|
+
status.textContent = 'Recording saved to your local media library.';
|
|
152
|
+
} catch (error) { status.textContent = error.message; }
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Every recording, in a browser and in StillMade Desktop, begins from StillMade's own Start button outside the Block interface (labelled for the screen, camera or microphone): pressing it is the consent. A view never reaches a device by itself, and the site's standing camera or microphone permission is not consent for a Block.
|
|
157
|
+
|
|
158
|
+
`record.stop` returns `{asset, duration, width, height, bytes, mimeType, stoppedBy, message, cursor, displays, coordinates}`. `asset` is a canonical media reference with `assetId`, `versionId`, `kind` and a device-local `sm-media:` URL (`sm-media://asset/...` from the desktop media library, `sm-media://device/...` for a file a browser keeps on the device, which `previewMedia`, module `files.read` and the next Step read without uploading). `duration` is seconds measured by the host and written into the WebM header, so the recording seeks and cuts correctly. `stoppedBy` is present when the host ended the recording before `record.stop`: `size`, `time` or `sharing` (the person ended the share); the recording up to that point is kept and `message` says so. Cursor samples contain `{x,y,time}`: global device-independent screen coordinates and milliseconds relative to recording start. Multiple monitors can have negative coordinates. These are not automatically converted into cropped-window video coordinates. Share/upload media through the existing host media flow before teammates on other devices can use it. By default that flow uploads a 1080p working copy of large video (the account's media setting); the original stays in the desktop media library.
|
|
159
|
+
|
|
160
|
+
`record.cut` turns the kept ranges of a recording into a new file on the device: `StillMade.desktop('record.cut', {source, keep:[{start, end}]})`, where `source` is a video this Block recorded in this session or received as an input and `keep` lists ordered, non-overlapping ranges in seconds (up to 500). The host re-encodes the kept parts with no export decision (no watermark; the Editor's export applies the account's policy later): through StillMade's renderer (WebCodecs H.264 into MP4, 1080p or 720p) where the browser encodes H.264, otherwise by playing the kept parts through a canvas into MediaRecorder (WebM, at the recording's own speed), which works wherever recording works. The result is kept beside the original and the call resolves to `{asset, duration, width, height, bytes, mimeType, keep}`. While it runs, `record.status` reports `cutting: {progress}`. The first-party Screen Recorder Block (`stillmade.screen-recorder`) is the reference: record, cut in its editor, then `StillMade.run` with the result.
|
|
161
|
+
|
|
162
|
+
`device.info` (read-only, no consent needed, for a Block that declares a recording scope) tells a Block what fits here before anything is recorded: `{platform, streams, recorder, cut, budget:{seconds, bytes, bitsPerSecond}, limits}`. The browser's storage totals stay in the host; only the budget they leave is reported, to the megabyte. `recorder` says whether this browser can record at all, `cut` is `renderer` (WebCodecs), `playback` (real time) or `none`, `budget.seconds` is how long a 1080p recording fits (the storage quota in a browser, the time cap on desktop), and `streams` says whether desktop recordings go to disk as they are captured. Use it to say what fits and to point at StillMade Desktop when it does not; the Screen Recorder Block does.
|
|
163
|
+
|
|
164
|
+
`record.cancel` discards an active capture. `session.close` revokes all access and cancels capture. StillMade also renders a host-owned cancel/revoke control outside the Block iframe. Screen source selection happens for every recording. No preview can bypass consent or access the native bridge directly.
|
|
165
|
+
|
|
166
|
+
Current limits: one recording per Block workspace. In StillMade Desktop the recording streams to disk as it is captured (each chunk crosses to the desktop process as it arrives; the header is completed with the measured duration at the end), so the caps are 4 hours and free disk space; a desktop app without streamed recordings keeps 30 minutes and 128 MiB. In a browser the caps are 30 minutes, 2 GB and the browser's storage quota (`device.info` says how many minutes fit). Hitting a limit, the disk running low, or the person ending the share stops the recording and keeps what was captured; `record.stop` then saves it and reports `stoppedBy` (`size`, `time`, `disk` or `sharing`). `record.status` reports `limits` with `bytes: null` where only disk space applies. Output is WebM where the browser records it (H.264 or VP9 inside WebM in Chromium) and MP4 where only that is available (Safari). Camera recording is video-only; microphone recording is audio-only. Optional `{systemAudio:true}` is implemented through Windows loopback; other platforms reject it explicitly. Microphone mixing, global click/keyboard hooks, remote-control automation, arbitrary subprocesses, and folder watching are not provided by these scopes (folder access is `folder.read` and `folder.write`, above).
|
|
167
|
+
|
|
168
|
+
## Testing and installation
|
|
169
|
+
|
|
170
|
+
Test the pure typed-input/output runtime with synthetic media references and the regular SDK fixture tests. Then test the actual desktop operation interactively: allow, deny, stop, cancel, close, expired access, missing devices, source selection, and OS revocation. Passing a synthetic fixture or an Electron renderer test does **not** verify real OS permissions.
|
|
171
|
+
|
|
172
|
+
No extra native dependency, installer prompt, or blanket OS permission is introduced. macOS may require the user to enable StillMade in Screen Recording settings and restart it; StillMade cannot bypass that OS decision. Windows privacy settings may also block camera/microphone access. The grant dialog appears only when the Block requests the relevant operation.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Native desktop execution
|
|
2
|
+
|
|
3
|
+
# Native desktop execution
|
|
4
|
+
|
|
5
|
+
A Block declaring `manifest.desktopTools`, `permissions.desktop: ["native.tools"]`, or a package-level `desktop` mapping requires a trusted desktop executor. Its JavaScript or recipe cannot establish that a native application ran. The generic JavaScript worker and synchronous recipe runner reject these packages with `DESKTOP_EXECUTION_REQUIRED`.
|
|
6
|
+
|
|
7
|
+
This guard applies conservatively to existing native packages too. Their immutable source, release identity and installed pins are unchanged. A legacy package without the mapping below can retain its reviewed interactive tool controls, but generic connected execution requires a new mapped release. Do not rewrite old package bytes or treat `return {video: input.video}` as a render.
|
|
8
|
+
|
|
9
|
+
## Declarative input and output mapping
|
|
10
|
+
|
|
11
|
+
The package's optional `desktop` object is stored as `src/desktop.json` in an editable SDK folder. The package must remain a stateless JavaScript or recipe package with its original sandbox rules, an approved `native.tools` declaration and desktop-only platforms. Version 1 currently supports only Natron adapter 1's `project.render` action:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"schemaVersion": 1,
|
|
16
|
+
"tool": "org.natron.Natron",
|
|
17
|
+
"action": "project.render",
|
|
18
|
+
"arguments": {
|
|
19
|
+
"projectId": {"input": "projectId"},
|
|
20
|
+
"input": {"input": "video"},
|
|
21
|
+
"reader": {"input": "reader"},
|
|
22
|
+
"writer": {"input": "writer"},
|
|
23
|
+
"firstFrame": {"input": "firstFrame"},
|
|
24
|
+
"lastFrame": {"input": "lastFrame"}
|
|
25
|
+
},
|
|
26
|
+
"outputs": {"video": "asset"}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Each mapped port must be declared in the manifest. `projectId`, `reader`, and `writer` are text; `video` is a video reference; frame ports are integers. All six values must be present after declared defaults and input resolution. Map every declared output to a compatible approved result field; Natron's `asset` is a video. Constants, extra arguments, commands, executable paths, environment variables and scripts are not supported. New native actions require a reviewed host adapter and a corresponding SDK argument/result contract.
|
|
31
|
+
|
|
32
|
+
The same mapping survives JSON packages, portable archives, editable source downloads, folder/ZIP imports, CLI packaging and verified GitHub SDK-folder import. A mapping alone grants no permission and does not install or launch the application.
|
|
33
|
+
|
|
34
|
+
## Trusted host execution
|
|
35
|
+
|
|
36
|
+
The custom interface calls `StillMade.run` with the connected input and render settings. The host supplies the executor to `runPackageAsync`; package code cannot install this callback:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
await runPackageAsync(pkg, inputs, {
|
|
40
|
+
signal,
|
|
41
|
+
desktop: async (pinnedPackage, validatedInput, {signal, request}) => {
|
|
42
|
+
const invocation = desktopInvocation(pinnedPackage, validatedInput);
|
|
43
|
+
// Host-owned integration: check exact-source consent, project and media
|
|
44
|
+
// ownership, saved settings, approved operation, completion and artifact.
|
|
45
|
+
const completed = await authorizedNativeHostRun(invocation, {signal});
|
|
46
|
+
const outputs = desktopOutputs(pinnedPackage, completed.result);
|
|
47
|
+
return {
|
|
48
|
+
outputs,
|
|
49
|
+
desktopReceipt: {
|
|
50
|
+
schemaVersion: 1,
|
|
51
|
+
requestId: request.requestId,
|
|
52
|
+
packageDigest: request.packageDigest,
|
|
53
|
+
inputDigest: request.inputDigest,
|
|
54
|
+
outputDigest: await digest(outputs),
|
|
55
|
+
tool: pinnedPackage.desktop.tool,
|
|
56
|
+
adapterVersion: 1,
|
|
57
|
+
action: pinnedPackage.desktop.action,
|
|
58
|
+
executionId: completed.executionId
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`authorizedNativeHostRun` is illustrative host code, not an SDK API. It must perform the real approved native invocation, enforce cancellation and revocation, verify the output artifact and register its media identity before returning. It must not accept a receipt, output URL or claimed process success from Block code as authority. The Block cannot choose the executable, arbitrary path, credentials or permission scope.
|
|
66
|
+
|
|
67
|
+
`desktopInvocation(pkg, inputs)` returns the declared `tool`, `operation` (`tool.project.render`), bounded argument mapping and output mapping. `desktopOutputs(pkg, nativeResult)` extracts and type-checks the declared results. The SDK pins copied package bytes and validated inputs before calling the host, creates a fresh cryptographic UUID request identity, and checks receipt source/input/action/output bindings and cancellation before returning. `RunPackageResult.desktopReceipt` must be retained with outputs.
|
|
68
|
+
|
|
69
|
+
Receipt validation proves the envelope's bindings. It is not a cryptographic attestation of Natron, an independent check of stored media bytes, or permission to access another project's output. The trusted host still owns those checks. Host fixture mocks must never be described as native render proof.
|
|
70
|
+
|
|
71
|
+
## Connected execution, reuse and admission
|
|
72
|
+
|
|
73
|
+
Native Steps require an interactive connected plan and executor. They form a runtime-approval boundary in ordinary local, independent or background plans. A connected native result without its receipt is rejected even when a caller-supplied generic executor returns correctly typed passthrough output. Retained successful results must keep the receipt bound to the exact package, actual validated inputs and output. `validateDesktopExecutionRecord` checks those bindings during resume/adoption without running the application; host ownership checks remain required. Changes to input, source or output invalidate reuse.
|
|
74
|
+
|
|
75
|
+
A reviewed condition or failure policy can still skip a Step. Such a record has `skipped: true` and no native receipt: it establishes a skip or fallback, not completed native work.
|
|
76
|
+
|
|
77
|
+
Offline `validate`, `test`, `pack`, `admitLocalPackage` and `admitPackage` without a desktop executor perform source and fixture-contract checks only. Reports carry `execution: "not-run"`, `tests: 0`, `fixtureContracts`, `liveVerified: false` and `reviewRequired: true`. CLI `preview` and `testPackage` require the real executor to run; an unavailable executor never counts as a passing render. A supplied desktop executor can exercise contract fixtures, but SDK reports still do not claim independent live verification. Execute a representative authorized source through the real application, inspect the exported artifact, and verify downstream receipt and media identity before reporting integration complete.
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Errors and troubleshooting
|
|
2
|
+
|
|
3
|
+
## Failure codes
|
|
4
|
+
| Code | Action |
|
|
5
|
+
| --- | --- |
|
|
6
|
+
| MANIFEST / SCHEMA / PACKAGE | Correct the reported field or envelope |
|
|
7
|
+
| TYPE | Match the declared type, bounds, and exact output keys |
|
|
8
|
+
| REFERENCE | Use an existing input or completed earlier recipe output |
|
|
9
|
+
| RUNTIME_UNAVAILABLE | Select an implemented runtime or operation |
|
|
10
|
+
| PERMISSION / CONTEXT | Declare the matching context read scope and supply the correct snapshot |
|
|
11
|
+
| CONDITION | Use a compatible single-output pass-through contract |
|
|
12
|
+
| LIMIT / TIMEOUT | Reduce source, sample size, memory use, or computation |
|
|
13
|
+
| CANCELLED | The run was stopped; preserve original inputs |
|
|
14
|
+
| TESTS_REQUIRED / BEHAVIOR | Add meaningful fixtures or fix the mismatch |
|
|
15
|
+
| WORKER_REQUIRED | Run browser JavaScript through a disposable worker |
|
|
16
|
+
| CONFLICT / STALE_TESTS | Reload or retest the exact current source |
|
|
17
|
+
| IMMUTABLE_RELEASE | Choose a new version for changed content |
|
|
18
|
+
| SETUP_REQUIRED | Account operations need the configured host services |
|
|
19
|
+
|
|
20
|
+
## Common issues
|
|
21
|
+
A portable image reference is not decoded pixel data. The host must resolve it before a pixel-processing function runs. Missing secondary context values cannot be invented by offline tests; provide concrete fixture values. Returning extra output keys fails even if other output values are correct.
|
|
22
|
+
|
|
23
|
+
## Diagnose in order
|
|
24
|
+
1. Validate the manifest and package.
|
|
25
|
+
2. Run each fixture through the real sandbox.
|
|
26
|
+
3. Inspect sample outputs and their declared roles.
|
|
27
|
+
4. Rehearse the connected Project Type.
|
|
28
|
+
5. Test actual supported media in the host workspace.
|
|
29
|
+
|
|
30
|
+
## Every SDK error code
|
|
31
|
+
Generated from the SDK source (199 codes). The message is one example; the actual message names the exact field or limit.
|
|
32
|
+
|
|
33
|
+
| Code | Example message | Raised in |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| ADAPTER | Declare the conversion’s type and meaning. | `adapter-registry`, `universal-resolver` |
|
|
36
|
+
| ADAPTER_CONTEXT | The … needs a persistent project identity | `connection-adapters` |
|
|
37
|
+
| ADAPTER_LIMIT | Convert at most 100 items at a time. | `connection-adapters` |
|
|
38
|
+
| ADAPTER_PERMISSION | Declare context.….read to use this connection | `connection-adapters` |
|
|
39
|
+
| ADAPTER_PIN | This connection adapter changed. Review the connection before running it | `connection-adapters` |
|
|
40
|
+
| ADAPTER_TYPE | The connected output must be … | `connection-adapters`, `csv-table` |
|
|
41
|
+
| AGENT_CONTRACT | Declare an independently versioned control adapter | `native-agent-contract` |
|
|
42
|
+
| APPEARANCE | Use plain theme rules; CSS escapes, nesting, filters and color blending need adaptation. | `appearance` |
|
|
43
|
+
| APPLICATION_ARTIFACT_HOST | Supply host-owned authorization and bounded byte-fetch callbacks. | `browser-application-artifacts` |
|
|
44
|
+
| APPLICATION_GUEST_ARGUMENT | Use the declared lifecycle arguments only. | `browser-application-guest` |
|
|
45
|
+
| APPLICATION_GUEST_BUSY | Wait for the active application operation. | `browser-application-guest` |
|
|
46
|
+
| APPLICATION_GUEST_DATA | Application messages need plain JSON fields, without accessors. | `browser-application-guest` |
|
|
47
|
+
| APPLICATION_GUEST_INPUT | Operation inputs must match the mounted inputs. | `browser-application-guest` |
|
|
48
|
+
| APPLICATION_GUEST_INSTALLED | Application registration is already installed or the target is invalid. | `browser-application-guest` |
|
|
49
|
+
| APPLICATION_GUEST_LIMIT | Application messages must be bounded by at most 4 MiB. | `browser-application-guest` |
|
|
50
|
+
| APPLICATION_GUEST_MOUNT | Application mount must acknowledge mounting only. | `browser-application-guest` |
|
|
51
|
+
| APPLICATION_GUEST_OPERATION | Declare 1–32 application operations. | `browser-application-guest` |
|
|
52
|
+
| APPLICATION_GUEST_REGISTRATION | Register one application adapter before mounting. | `browser-application-guest` |
|
|
53
|
+
| APPLICATION_GUEST_RESULT | Adapters return output values only, never host receipt or verification fields. | `browser-application-guest` |
|
|
54
|
+
| APPLICATION_GUEST_SIGNAL | Use an AbortSignal when supplied. | `browser-application-guest` |
|
|
55
|
+
| APPLICATION_GUEST_STATE | Supply the host state revision. | `browser-application-guest` |
|
|
56
|
+
| APPLICATION_INTEGRITY | Application artifact byte count differs from its reference. | `browser-application-artifacts` |
|
|
57
|
+
| APPLICATION_OUTPUT_CANDIDATE | Use declared browser application outputs. | `browser-application-output-policy` |
|
|
58
|
+
| APPLICATION_OUTPUT_UNMATERIALIZED | Output … includes media references that the browser application host has not independently verified. | `browser-application-output-policy` |
|
|
59
|
+
| APPLICATION_SOURCE_LIMIT | Application source | `browser-application-artifacts` |
|
|
60
|
+
| APPLICATION_SOURCE_REFERENCE | Use a browser application manifest. | `browser-application-artifacts` |
|
|
61
|
+
| APPLICATION_STATE_LIMIT | Application state artifact | `browser-application-artifacts` |
|
|
62
|
+
| APPLICATION_STATE_REFERENCE | Application scope | `browser-application-artifacts` |
|
|
63
|
+
| ARCHIVE | Expected a complete single ZIP archive | `portable-archive` |
|
|
64
|
+
| ARCHIVE_PATH | Use safe relative regular-file paths | `portable` |
|
|
65
|
+
| AUDIO_SCORE_HOST | Choose a supported Audio Score operation | `audio-score-host` |
|
|
66
|
+
| BROWSER_APPLICATION_UNAVAILABLE | No trusted desktop browser application executor is installed. A bundle or mounted interface is not execution. | `browser-application-execution` |
|
|
67
|
+
| BROWSER_BUILD_DEPENDENCY | Expected one exact registry tarball identity. | `repository-build-dependencies` |
|
|
68
|
+
| BUSY | JavaScript runners are busy. Try again shortly. | `sandbox-node` |
|
|
69
|
+
| BYOK_PAYMENT_HOST | Choose a supported payment capability | `byok-payment-host` |
|
|
70
|
+
| CANCELLED | Conversion stopped. | `adapter-registry`, `browser-application-execution`, `browser-application-guest` and 8 more |
|
|
71
|
+
| CANVAS_GENERATION_HOST | Canvas media Blocks require version … of their trusted generation host | `canvas-generation-host` |
|
|
72
|
+
| CANVAS_NODE_HOST | Invalid versioned Canvas node registration | `canvas-node-host` |
|
|
73
|
+
| CANVAS_WORKSPACE | Canvas needs its scoped snapshot and navigation binding | `canvas-workspace-host` |
|
|
74
|
+
| CAPABILITY_BINDING | Transcription audio must reference the exact declared audio or video port (a video's sound is transcribed) | `capabilities` |
|
|
75
|
+
| CAPABILITY_EXPECTATION | Include expectations for the exact declared output | `capabilities` |
|
|
76
|
+
| CAPABILITY_INPUT | … must be a saved image (asset, version and URL) | `capabilities` |
|
|
77
|
+
| CAPABILITY_LIMIT | negativePrompt must be at most 2,000 characters | `capabilities` |
|
|
78
|
+
| CAPABILITY_MANIFEST | Expected a host-mediated capability manifest | `capabilities` |
|
|
79
|
+
| CAPABILITY_OUTPUT | A generated script contains schemaVersion and text only | `capabilities`, `json-schema` |
|
|
80
|
+
| CAPABILITY_SCHEMA | Capability values must be finite | `capabilities`, `json-schema` |
|
|
81
|
+
| CAPABILITY_SETTINGS | … does not accept a last frame | `capabilities`, `generation-catalog` |
|
|
82
|
+
| CAPABILITY_TYPE | Transcription takes one persistent audio or video input and one language input | `capabilities` |
|
|
83
|
+
| CODE | JavaScript must contain 1–262144 bytes | `javascript` |
|
|
84
|
+
| COMFY_BACKEND | Expected ComfyUI object_info | `comfyui` |
|
|
85
|
+
| COMFY_BINDING | Choose named Block inputs and outputs before creating the package | `comfyui-import`, `comfyui` |
|
|
86
|
+
| COMFY_CYCLE | ComfyUI workflows cannot contain cycles | `comfyui` |
|
|
87
|
+
| COMFY_EXPECTATION | Every declared output needs a typed expectation | `comfyui` |
|
|
88
|
+
| COMFY_FILE | Use a host-generated PNG basename without paths, URLs or annotations | `comfyui` |
|
|
89
|
+
| COMFY_IMPORT | ComfyUI import accepts finite JSON values only | `comfyui-import` |
|
|
90
|
+
| COMFY_JSON | Choose a ComfyUI API-format JSON workflow | `comfyui-import` |
|
|
91
|
+
| COMFY_MANIFEST | Provide an explicit ComfyUI Block manifest | `comfyui-import`, `comfyui` |
|
|
92
|
+
| COMFY_MODEL | Use an installed safetensors checkpoint basename; paths, URLs and other model formats are unsupported | `comfyui` |
|
|
93
|
+
| COMFY_NODE | Node … (…) has unexpected or missing inputs. Connection settings, credentials, code and dependencies cannot be embedded. | `comfyui-import`, `comfyui` |
|
|
94
|
+
| COMFY_OUTPUT | Decoded image metadata is required | `comfyui` |
|
|
95
|
+
| COMFY_REFERENCE | Image inputs require an exact existing node and output index | `comfyui` |
|
|
96
|
+
| COMFY_SCHEMA | ComfyUI values must be finite | `comfyui` |
|
|
97
|
+
| COMFY_SDK_PACKAGE | This is already a StillMade SDK package. Import it directly without converting its workflow. | `comfyui-import` |
|
|
98
|
+
| COMFY_TYPE | ComfyUI accepts images, text and bounded numeric controls | `comfyui` |
|
|
99
|
+
| COMFY_UI_WORKFLOW | This is a ComfyUI visual workflow export. In ComfyUI, use Export (API) or Save (API Format), then import that JSON. Visual node positions and widget values cannot be safely converted without the exact node definitions. | `comfyui-import` |
|
|
100
|
+
| CONFLICT | Collection removed | `document-operations`, `document-store`, `shared-view` |
|
|
101
|
+
| CONNECTION_BINDING | Bind every declared input to a real schema property. | `connected-app` |
|
|
102
|
+
| CONNECTION_CLIENT | Provide the existing authenticated host request service. | `connection-client` |
|
|
103
|
+
| CONNECTION_CONFIGURATION | Configure the exact original connected task. | `configured-connection` |
|
|
104
|
+
| CONNECTION_CONTRACT | Declare the exact connected-app contract, schemas and typed bindings. | `connected-app` |
|
|
105
|
+
| CONNECTION_EXPECTATION | Use one bounded result expectation. | `connected-app` |
|
|
106
|
+
| CONNECTION_OUTPUT | Declare one typed result for this operation. | `connected-app` |
|
|
107
|
+
| CONNECTION_PIN | An exact backend task/version/schema pin is required. | `connected-app` |
|
|
108
|
+
| CONNECTION_SCHEMA | This task needs a compatible object input schema. | `connected-app` |
|
|
109
|
+
| CONNECTION_SOURCE | Use the exact private catalog-issued Python source. | `connected-app` |
|
|
110
|
+
| CONNECTION_TASK | Choose a declared task operation. | `connected-app-view` |
|
|
111
|
+
| CONNECTION_VERSION | Use the catalog-issued immutable definition hash. | `connected-app` |
|
|
112
|
+
| CONTEXT | Provide valid project shots | `context` |
|
|
113
|
+
| DEPENDENCY_RESTRICTED | Bundle adapted dependency code into src/run.js and record each dependency as a licensed source; runtime installation is unavailable | `portable` |
|
|
114
|
+
| DESKTOP_EXECUTION | A desktop execution mapping requires a stateless JavaScript or recipe package with declared desktop tools. | `desktop-execution` |
|
|
115
|
+
| DESKTOP_EXECUTION_REQUIRED | This Block requires its approved desktop executor. Running its JavaScript or recipe alone does not execute the native tool. | `desktop-execution`, `runtime` |
|
|
116
|
+
| DESKTOP_RECEIPT | Invalid native execution request. | `desktop-execution`, `package-jobs` |
|
|
117
|
+
| DESKTOP_TOOL | Declare one to eight approved desktop tools | `desktop-tools` |
|
|
118
|
+
| DOCUMENT_DRAFT | Use a JSON object document | `document-drafts` |
|
|
119
|
+
| DOCUMENT_IDENTITY | Use a JSON object document | `document-identity` |
|
|
120
|
+
| DOCUMENT_SOURCE_CONFLICT | Project source changed underneath the shared draft. Review and explicitly reset the shared draft for everyone, or supply a compatible source. | `document-store` |
|
|
121
|
+
| DOCUMENT_STORE | Use a bounded named document field | `document-store` |
|
|
122
|
+
| FIRST_PARTY_SOURCE | Use the exact published first-party package before creating a remix. | `remix-policy`, `testing` |
|
|
123
|
+
| GENERATION_SETTINGS | This Step does not generate images, video or speech. | `generation-settings` |
|
|
124
|
+
| HOST_SERVICES | Animated assets requires its version 1 generation and dialog host | `animated-assets-host`, `asset-generation-host`, `blueprint-host-services` and 47 more |
|
|
125
|
+
| INPUT_SOURCE | … does not allow … information. Choose a permitted source. | `input-source-policy` |
|
|
126
|
+
| JOB_EXECUTOR | Use a trusted host executor | `package-jobs` |
|
|
127
|
+
| JOB_LIMIT | Return final outputs within 32 cooperative turns | `javascript` |
|
|
128
|
+
| JOB_PROGRESS | Use explicit complete/total units or omit progress | `javascript` |
|
|
129
|
+
| JOB_RESULT | Return final Block outputs, not a guest pending-job envelope | `package-jobs` |
|
|
130
|
+
| JOB_SUBSCRIBER | Use a progress listener | `package-jobs` |
|
|
131
|
+
| JOB_TIMEOUT | Use an execution deadline between 1 ms and 15 minutes | `package-jobs` |
|
|
132
|
+
| LICENSE_BLOCKED | Missing applicable upstream LICENSE, COPYING or NOTICE; preserve every ancestor notice and scoped license | `portable-github`, `portable`, `remix-policy` |
|
|
133
|
+
| LICENSE_RESTRICTED | Conflicting file-level SPDX license at … | `portable-github`, `portable` |
|
|
134
|
+
| LIMIT | Source exceeds static review complexity | `admission`, `browser-application-execution`, `capabilities` and 14 more |
|
|
135
|
+
| LINEAGE | Declare lineage {parents:[{id,version,digest}],changes} | `portable` |
|
|
136
|
+
| MANIFEST | Invalid JavaScript manifest | `javascript` |
|
|
137
|
+
| MEDIA_DESCRIPTION_HOST | Describe Media requires a supported image reference and optional hint | `media-description-host` |
|
|
138
|
+
| MEDIA_RENDER_INPUT | Final render requires a versioned timeline, settings, and Block source. | `portable-media-contracts` |
|
|
139
|
+
| MEDIA_RENDER_LIMIT | Final render exceeds the approved timeline limits. | `portable-media-contracts` |
|
|
140
|
+
| MEDIA_RENDER_RECEIPT | The final render receipt is invalid. | `portable-media-contracts` |
|
|
141
|
+
| MEDIA_UPLOAD_HOST | Import Media requires its version 1 host interface | `media-upload-host` |
|
|
142
|
+
| MOCK_HOST | The stand-in host needs the Block manifest. | `mock-host`, `mocks` |
|
|
143
|
+
| MODULE_BUNDLE | Only module Blocks and frame views with assets are bundled this way | `module-bundle` |
|
|
144
|
+
| MODULE_ERROR | The module stopped without returning: it waits on something that never finishes. | `module-quickjs` |
|
|
145
|
+
| MODULE_FILE | … is missing from the local files | `module-node`, `module-quickjs`, `module-runtime` |
|
|
146
|
+
| MODULE_FILE_READ | The {base64} file for … must be plain base64 of at most 256 KB. | `mock-host` |
|
|
147
|
+
| MODULE_HOST_UNAVAILABLE | Local files need a file reader. | `mock-host` |
|
|
148
|
+
| MODULE_HOSTED | A module Block identity is required | `module-hosted` |
|
|
149
|
+
| MODULE_PERMISSION | This Block did not declare … in permissions.capabilities | `module-hosted` |
|
|
150
|
+
| MODULE_RESULT | The module host returned an unexpected result | `runtime` |
|
|
151
|
+
| MODULE_TIMEOUT | The module's tests ran past … ms of its own time. | `module-quickjs` |
|
|
152
|
+
| NATIVE_APPLICATION_AUTHORITY | Use the scoped project execution checkpoint. | `runtime` |
|
|
153
|
+
| NATIVE_APPLICATION_UNAVAILABLE | No trusted native application executor is installed. A bundle or mounted interface is not execution. | `native-application-execution` |
|
|
154
|
+
| NATIVE_BINDING | Declare scoped trusted bindings | `native-workspace-contract` |
|
|
155
|
+
| NATIVE_CALLBACK | Workspace callback is unavailable | `native-workspace-contract` |
|
|
156
|
+
| NATIVE_CONTRACT | Unsupported native … schema | `native-workspace-contract` |
|
|
157
|
+
| NATIVE_DEPENDENCY | Native host dependency …@… is unavailable | `native-workspace-contract` |
|
|
158
|
+
| NATIVE_HOST | Invalid installed host provider declarations | `native-host-providers` |
|
|
159
|
+
| NATIVE_MODULE | Choose an explicitly versioned native module | `native-workspace-contract` |
|
|
160
|
+
| NATIVE_REGISTRATION | Declare registration and ownership-scoped cleanup | `native-workspace-contract` |
|
|
161
|
+
| NATIVE_REGISTRY | Declare an exact dependency alias to another workspace | `native-workspace-contract` |
|
|
162
|
+
| NATIVE_SERVICE | Host service …@… is unavailable | `native-workspace-contract` |
|
|
163
|
+
| NATIVE_UPDATE | The atomic state host is unavailable | `native-workspace-contract` |
|
|
164
|
+
| PACKAGE | Declare a Block package and its manifest. | `define-block`, `javascript`, `testing` |
|
|
165
|
+
| PATCH | Invalid operation path | `document-operations` |
|
|
166
|
+
| PERMISSION | This conversion needs permission. | `adapter-registry`, `context`, `contracts` and 2 more |
|
|
167
|
+
| PIPELINE_ASSET_HOST | Canvas requires its version 1 asset persistence host | `pipeline-asset-host` |
|
|
168
|
+
| PIPELINE_NODE_GENERATION_HOST | Pipeline generation nodes require version 1 of their trusted generation host | `pipeline-node-generation-host` |
|
|
169
|
+
| PIPELINE_RUNTIME_HOST | Pipeline requires version 1 of its runtime host | `pipeline-runtime-host` |
|
|
170
|
+
| PORTABLE_ACTION | media.generate needs 1–50 items. | `portable-media-actions` |
|
|
171
|
+
| PORTABLE_ACTION_RESULT | The host action result does not match its declared Block output. | `portable-action-results` |
|
|
172
|
+
| PORTABLE_ENTRY | Runtime entry must match the canonical source file | `portable` |
|
|
173
|
+
| PORTABLE_FILES | Include bounded UTF-8 source and legal evidence files | `portable` |
|
|
174
|
+
| PORTABLE_FORMAT | Portable attribution requires retained portable evidence | `portable` |
|
|
175
|
+
| PORTABLE_UI | Declare manifest.ui (generated controls; [] is valid for context-only input) | `portable` |
|
|
176
|
+
| PRESENTER_INPUT | Presenter placement requires a version 1 Whiteboard and finite placement. | `portable-media-contracts` |
|
|
177
|
+
| PRESENTER_RECEIPT | Presenter pose assets require exact source, sheet, slice, and version receipts. | `portable-media-contracts` |
|
|
178
|
+
| PREVIEW_MODULE | A preview requires an exact Block identity and version | `native-preview-contract` |
|
|
179
|
+
| PROJECT_FLOW_SNAPSHOT | Supply a project Flow snapshot. | `project-flow-contract` |
|
|
180
|
+
| PROJECT_FLOW_TARGET | Supply a structured project Flow target. | `project-flow-contract` |
|
|
181
|
+
| PROVENANCE | The job must retain exactly its reviewed user answers. | `package-jobs`, `sandbox-node`, `universal-resolver` |
|
|
182
|
+
| PYTHON_CONTRACT | Choose supported annotated scalar inputs and result. | `python-connection` |
|
|
183
|
+
| QUALITY_INPUT | Quality analysis accepts 1–16 exact asset versions. | `portable-media-contracts` |
|
|
184
|
+
| QUALITY_RECEIPT | Every planned asset requires one retained analysis receipt. | `portable-media-contracts` |
|
|
185
|
+
| RECIPE | Expected recipe schema 1, at most 64 steps, and output bindings | `recipe` |
|
|
186
|
+
| REFERENCE | Invalid reference | `recipe` |
|
|
187
|
+
| REFERENCE_SELECTION | Choose a bounded field browser. | `reference-source` |
|
|
188
|
+
| REFERENCE_SOURCE | Use an exact snapshot identity. | `reference-source` |
|
|
189
|
+
| REQUIREMENT | Choose a declared input requirement. | `interactive-requirements`, `package-jobs`, `sandbox-node` and 1 more |
|
|
190
|
+
| RESOLVER | Choose an exact asset version for scoped resolution. | `universal-resolver` |
|
|
191
|
+
| RUNTIME | Sandbox memory configuration was not applied | `javascript` |
|
|
192
|
+
| RUNTIME_RESTRICTED | Portable Blocks support recipe, isolated JavaScript, declarative host capabilities and reviewed ComfyUI workflows. Arbitrary Python and native code are restricted; do not package a substitute that pretends to provide them. | `portable` |
|
|
193
|
+
| RUNTIME_UNAVAILABLE | This host does not provide interactive Block questions. Supply this input before running. | `javascript`, `recipe`, `runtime` |
|
|
194
|
+
| SCHEMA | Numbers must be finite | `contracts`, `semantic-contracts` |
|
|
195
|
+
| SEMANTIC | Resolve meanings from at most 200 pinned Block manifests. | `package-semantics`, `semantic-contracts` |
|
|
196
|
+
| SHARED_TEXT_CLOSED | Shared text session is closed | `shared-text` |
|
|
197
|
+
| SHARED_TEXT_INPUT | Shared text must be a string | `shared-text` |
|
|
198
|
+
| SHARED_TEXT_LIMIT | Shared text exceeds its character limit | `shared-text` |
|
|
199
|
+
| SHARED_TEXT_STATE | Shared text data contains trailing bytes | `shared-text` |
|
|
200
|
+
| SHARED_WORK_CONTRACT | Declare a bounded, versioned shared-work schema. | `shared-work` |
|
|
201
|
+
| SHARED_WORK_INPUT | Shared-work requests require bounded JSON arguments. | `shared-work` |
|
|
202
|
+
| SHARED_WORK_OPERATION | Choose a declared shared-work operation. | `shared-work` |
|
|
203
|
+
| SOURCE_DECLARATION | Original sources must retain an implementation snapshot alongside legal evidence | `portable` |
|
|
204
|
+
| SOURCE_MISMATCH | GitHub returned a different tree from the pinned commit | `portable-github` |
|
|
205
|
+
| SOURCE_PIN | GitHub must confirm the exact source commit and its tree | `portable-github`, `portable` |
|
|
206
|
+
| SOURCE_RESTRICTED | Complete repository tree is required for license verification | `portable-github` |
|
|
207
|
+
| SOURCE_UNAVAILABLE | Pinned GitHub evidence unavailable (…); installation is blocked until it can be verified | `portable-github` |
|
|
208
|
+
| STALE | The conversion source expired or is no longer current. Refresh it before trying again. | `adapter-registry`, `universal-resolver` |
|
|
209
|
+
| STATE_BEHAVIOR | State differs from expected fixture | `testing` |
|
|
210
|
+
| STATE_LIMIT | Block state exceeds 64 KiB | `state` |
|
|
211
|
+
| STATE_MIGRATION | All migration declarations together must fit within 64 KiB | `state-migrations` |
|
|
212
|
+
| STATE_REQUIRED | Declare a valid scoped state contract | `state` |
|
|
213
|
+
| STATE_TEST | Fixture state requires a declared stateful Block | `testing` |
|
|
214
|
+
| STATE_UNDECLARED | This Block does not declare persistent state | `javascript`, `package-jobs` |
|
|
215
|
+
| STATE_VERSION | State does not match this Block’s declared state schema | `state` |
|
|
216
|
+
| STOCK_PROVENANCE | The stock source has no approved license policy. | `portable-media-contracts` |
|
|
217
|
+
| STOCK_RECEIPT | The stock acquisition receipt is invalid. | `portable-media-contracts` |
|
|
218
|
+
| TEST | Desktop fixtures need a name and typed input/output contracts. | `testing` |
|
|
219
|
+
| TESTS_REQUIRED | Add a sample image and typed output expectations before reviewing the import. Samples have not run yet. | `comfyui-import`, `portable`, `testing` |
|
|
220
|
+
| TIMEOUT | JavaScript exceeded its cumulative 500 ms execution limit | `javascript`, `local-admission`, `package-jobs` and 2 more |
|
|
221
|
+
| TYPE | … values must be an object | `contracts`, `javascript`, `recipe` |
|
|
222
|
+
| VIDEO_ASSETS_HOST | Prompt recommendations require an image URL and text prompts | `video-assets-host` |
|
|
223
|
+
| VIEW | View JavaScript exceeds review complexity | `view` |
|
|
224
|
+
| VIEW_STATE | Shared edit exceeds 800,000 bytes | `shared-view` |
|
|
225
|
+
| WORKER_REQUIRED | Run JavaScript blocks through a worker | `runtime` |
|
|
226
|
+
| WORKFLOW_APPROVAL | Workflow approval must be a required direct-user decision with no saved default or context source. | `semantic-contracts`, `workflow-approvals` |
|
|
227
|
+
| WORKFLOW_EVENT | Use a named event with a bounded identity. | `workflow-events` |
|
|
228
|
+
| WORKSPACE_APPLICATION | Invalid workspace application adapter | `workspace-application` |
|
|
229
|
+
| WORKSPACE_NAVIGATION | Invalid Block navigation declaration | `workspace-navigation` |
|
|
230
|
+
| WORKSPACE_PRESENCE | Presence must be an object | `workspace-sync` |
|
|
231
|
+
| WORKSPACE_ROUTE | Invalid standalone workspace declaration | `workspace-application` |
|
|
232
|
+
| WORKSPACE_SYNC | Invalid workspace change | `workspace-sync` |
|
|
233
|
+
| YOUTUBE_HOST | YouTube host version 1 is required | `youtube-host` |
|