stillmade-sdk 0.1.4 → 0.1.6
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/.claude/settings.json +15 -0
- package/.cursor/hooks.json +11 -0
- package/.gitignore +2 -0
- package/.stillmade/sdk-baseline.json +65 -0
- package/AGENTS.md +29 -7
- package/AGENT_CONTROL.md +2 -1
- package/BROWSER_APPLICATIONS.md +128 -3
- package/GITHUB_APPLICATIONS.md +184 -1
- package/NATIVE_APPLICATION_ADAPTATION.md +565 -0
- package/PASTE_TO_LLM.md +29 -10
- package/PORTABLE.md +5 -4
- package/REMIX.md +16 -10
- package/SDK.md +511 -46
- package/UI_AESTHETIC.md +37 -6
- package/api-index.json +90 -0
- package/blocks/connected-app/versions/{1.2.0 → 1.5.0}/task-selection.js +5 -3
- package/blocks/connected-app/versions/{1.4.0 → 1.5.0}/view.js +4 -2
- package/blocks/native/sm.ai-decide/versions/1.0.0/package.js +149 -0
- package/blocks/native/sm.ai-write/versions/1.0.0/package.js +147 -0
- package/blocks/native/sm.connect-app/versions/1.0.0/package.js +55 -0
- package/blocks/native/sm.contact-fields/versions/1.0.0/package.js +197 -0
- package/blocks/native/sm.continue-if/versions/1.0.0/package.js +168 -0
- package/blocks/native/sm.generate-image/versions/2.1.0/package.js +101 -0
- package/blocks/native/sm.meta-creative/versions/1.0.0/package.js +206 -0
- package/blocks/native/sm.new-items/versions/1.0.0/package.js +191 -0
- package/blocks/native/sm.voiceover/versions/2.1.5/package.js +179 -0
- package/blocks/native/sm.voiceover/versions/2.1.6/package.js +179 -0
- package/blocks/native/sm.when/versions/1.0.0/package.js +129 -0
- package/blocks/native/sm.write-summary/versions/1.0.0/package.js +133 -0
- package/blocks/occasion-story/package.js +1 -1
- package/blocks/occasion-story/versions/1.0.2/package.js +1682 -0
- package/blocks/photo-reel-composer/versions/1.0.1/package.js +3026 -0
- package/blocks/release-visuals/package.js +1 -1
- package/blocks/release-visuals/versions/1.0.2/package.js +1500 -0
- package/blocks/short-form-finish/package.js +1 -1
- package/blocks/short-form-finish/versions/1.0.3/package.js +1026 -0
- package/package.json +1 -1
- package/packages/block-cli/cli.js +16 -1
- package/packages/block-cli/format.js +2 -0
- package/packages/block-cli/ready-gate.js +164 -0
- package/packages/block-platform/block-readiness.js +3 -2
- package/packages/block-platform/canvas.js +1 -1
- package/packages/block-platform/catalog.js +6 -4
- package/packages/block-platform/chat-requirements.js +8 -3
- package/packages/block-platform/collaboration.js +5 -5
- package/packages/block-platform/first-revenue-project-types.js +2 -2
- package/packages/block-platform/flow-inspection.js +2 -2
- package/packages/block-platform/native-application-validation-context.js +20 -0
- package/packages/block-platform/plain-descriptions.js +67 -0
- package/packages/block-platform/product-ad-variants-project-type.js +6 -3
- package/packages/block-platform/project-context.js +4 -4
- package/packages/block-platform/project-type-composer.js +21 -12
- package/packages/block-platform/project-type-draft.js +2 -2
- package/packages/block-platform/project-type-recommendations.js +1 -1
- package/packages/block-platform/project-types.js +9 -4
- package/packages/block-platform/revenue-review-project-types.js +6 -5
- package/packages/block-platform/segment-runner.js +35 -11
- package/packages/block-platform/step-groups.js +78 -0
- package/packages/block-platform/steps.js +12 -8
- package/packages/block-platform/type-workspace.js +4 -4
- package/packages/block-platform/workflow-loop.js +4 -0
- package/packages/block-platform/workspace-input-readset.js +18 -4
- package/packages/block-sdk/admission.js +5 -17
- package/packages/block-sdk/agent-inputs.js +2 -0
- package/packages/block-sdk/agent-inspection.js +4 -2
- package/packages/block-sdk/browser-application-artifacts.js +1 -1
- package/packages/block-sdk/browser-application-execution.d.ts +2 -2
- package/packages/block-sdk/browser-application-execution.js +30 -12
- package/packages/block-sdk/browser-application-guest.d.ts +2 -0
- package/packages/block-sdk/browser-application-guest.js +16 -9
- package/packages/block-sdk/browser-application.d.ts +12 -4
- package/packages/block-sdk/browser-application.js +27 -13
- package/packages/block-sdk/builder-contract.js +25 -17
- package/packages/block-sdk/capabilities.js +38 -19
- package/packages/block-sdk/connected-app.js +26 -6
- package/packages/block-sdk/connection-adapters.js +19 -2
- package/packages/block-sdk/contracts-core.js +8 -0
- package/packages/block-sdk/contracts.js +9 -5
- package/packages/block-sdk/document-drafts.js +7 -1
- package/packages/block-sdk/document-store-binding.js +2 -1
- package/packages/block-sdk/file-bundle.js +4 -1
- package/packages/block-sdk/first-party-packages.js +18 -2
- package/packages/block-sdk/generation-catalog.js +3 -2
- package/packages/block-sdk/index.d.ts +20 -1
- package/packages/block-sdk/index.js +1 -0
- package/packages/block-sdk/native-application-package.d.ts +22 -0
- package/packages/block-sdk/native-application-package.js +77 -0
- package/packages/block-sdk/native_adapter.py +76 -0
- package/packages/block-sdk/package.json +1 -0
- package/packages/block-sdk/pipeline-runtime-host.d.ts +2 -0
- package/packages/block-sdk/project-flow-contract.js +2 -0
- package/packages/block-sdk/remix-policy.js +3 -1
- package/packages/block-sdk/resolver-admission.js +17 -0
- package/packages/block-sdk/runtime.js +4 -1
- package/packages/block-sdk/schema-fields.js +34 -2
- package/packages/block-sdk/semantic-relationships.js +14 -0
- package/packages/block-sdk/shared-controls.js +3 -1
- package/packages/block-sdk/shared-view.js +6 -1
- package/packages/block-sdk/source-rights.js +6 -5
- package/packages/block-sdk/testing.js +3 -0
- package/packages/design-system/theme.css +12 -3
package/SDK.md
CHANGED
|
@@ -144,7 +144,7 @@ For an original implementation, retain complete license notices and at least two
|
|
|
144
144
|
```sh
|
|
145
145
|
node packages/block-cli/cli.js pack ./my-block ./my-block.stillmade-block --original
|
|
146
146
|
```
|
|
147
|
-
|
|
147
|
+
Choose the folder that holds that file with **Import folder** for the same source and interface. Packaging adds retained source evidence and reruns applicable checks; it does not rewrite the implementation. Output files are never silently overwritten. Use repository evidence instead of `--original` when reusing third-party code.
|
|
148
148
|
|
|
149
149
|
### Photo-editor folder example
|
|
150
150
|
The extracted SDK contains `examples/original-photo-editor/`, including its actual custom interface, pixel processing and fixtures. Select that folder directly or try [its packaged original](/block-sdk/examples/original-photo-editor.stillmade-block). This bounded example adjusts brightness/color and rotates pixels with transparency. See [the supported original-authoring contract](/docs/build/original-blocks).
|
|
@@ -152,9 +152,33 @@ The extracted SDK contains `examples/original-photo-editor/`, including its actu
|
|
|
152
152
|
### Use and iterate
|
|
153
153
|
Add the Block to a Project Type, configure its inputs, and run it. Keep source changes in checkpoints; publish a new release version when the behavior changes. See [versioning and remixing](/docs/distribute/versioning).
|
|
154
154
|
|
|
155
|
+
## Build a Block with your AI
|
|
156
|
+
|
|
157
|
+
### For you
|
|
158
|
+
Give your coding agent (Claude Code, Cursor, Codex, Gemini CLI or similar) a link to this page and say what the Block should do, for example: “Build a StillMade Block that turns a script into a shot list. Follow https://stillmade.shop/docs/build/with-your-ai.md”. It sets up the SDK, builds the Block and checks it on its own; you only answer questions about what the Block should do. A chat assistant without a terminal cannot download or run anything, so use a coding agent, or connect StillMade's [MCP server](/docs/native-mcp.md). Either way, StillMade refuses to install a Block that fails its readiness check.
|
|
159
|
+
|
|
160
|
+
### For the coding agent
|
|
161
|
+
Do every step yourself. Do not ask the person to download, unzip, open a folder or run a command; only ask about what the Block should do.
|
|
162
|
+
|
|
163
|
+
1. **Get the SDK.** It is `/block-sdk/stillmade-sdk-0.1.0.zip` on the same site as this page: replace this page's path with that one (for example `https://stillmade.shop/block-sdk/stillmade-sdk-0.1.0.zip`, or `http://localhost:3000/block-sdk/stillmade-sdk-0.1.0.zip` when this page came from localhost). If `stillmade-blocks/AGENTS.md` already exists in your working folder, reuse that folder. Otherwise download and extract it into `stillmade-blocks`:
|
|
164
|
+
```sh
|
|
165
|
+
curl -fsSL "<SDK URL>" -o stillmade-sdk.zip && unzip -q stillmade-sdk.zip -d stillmade-blocks && rm stillmade-sdk.zip
|
|
166
|
+
```
|
|
167
|
+
On Windows PowerShell:
|
|
168
|
+
```powershell
|
|
169
|
+
Invoke-WebRequest "<SDK URL>" -OutFile stillmade-sdk.zip; Expand-Archive stillmade-sdk.zip stillmade-blocks; Remove-Item stillmade-sdk.zip
|
|
170
|
+
```
|
|
171
|
+
The SDK needs Node.js 22 or later and nothing else; its runtime is bundled, so never run `npm install` in it.
|
|
172
|
+
2. **Read `stillmade-blocks/AGENTS.md` in full** before writing code. It is the contract StillMade checks every Block against.
|
|
173
|
+
3. **Build inside `stillmade-blocks`.** Scaffold with `node packages/block-cli/cli.js create <name> javascript` (or `image`, `stateful`, `capability`), then iterate with `node packages/block-cli/cli.js validate <name>` and `test <name>`.
|
|
174
|
+
4. **Run the readiness gate before you call anything ready:** `node packages/block-cli/cli.js gate .` from `stillmade-blocks`. Report the exact status it prints. If it fails, fix the listed checks and run it again. If you cannot fix them, tell the person plainly that the Block is not ready and list the failing checks. A browser application reports NEEDS STILLMADE REVIEW: tell the person to import it so StillMade can run its isolated review.
|
|
175
|
+
5. **Hand it over.** Give the person the full path of the `<name>` folder. In StillMade they choose **Import folder** and select that folder.
|
|
176
|
+
|
|
177
|
+
`stillmade-blocks` contains hooks that run the gate automatically when a Claude Code or Cursor session started in that folder finishes a turn. In the session that downloaded the SDK those hooks are not active yet, so run the gate yourself as in step 4.
|
|
178
|
+
|
|
155
179
|
## Block builder contract
|
|
156
180
|
|
|
157
|
-
Contract `stillmade.block-builder@1.
|
|
181
|
+
Contract `stillmade.block-builder@1.3.0`. Humans, coding agents, imported source, GitHub repositories and generated code all adapt to the Block platform; anything that becomes a StillMade Block obeys this contract.
|
|
158
182
|
|
|
159
183
|
### Source of truth
|
|
160
184
|
|
|
@@ -164,13 +188,27 @@ Treat the current SDK (`stillmade.block.json` manifest, `packages/block-sdk` con
|
|
|
164
188
|
|
|
165
189
|
Before building, check what already exists (`find_existing_blocks` over MCP, or the Marketplace and your library) by the inputs, results and operations the goal needs. Use an installed or reviewed Block that already does it; remix a close one so its license, notices and creator credit stay attached; chain existing Blocks and build only the missing step. Never republish another creator's source without remix lineage: public copies are refused. Build a new Block when nothing fits or the person asks for their own version, and say which similar Blocks you considered.
|
|
166
190
|
|
|
191
|
+
### One job per Step
|
|
192
|
+
|
|
193
|
+
A Step is one job: the work between two moments where a person or the outside world must see the result. Start a new Step only at one of three points; everything else is a part of the neighboring Step.
|
|
194
|
+
|
|
195
|
+
1. **A person works with the result**: reads, edits, picks or approves it (a workspace Block such as a script, a Canvas or an Editor, or an approval). That is why Chat, Bible, Canvas and Editor are four Steps.
|
|
196
|
+
2. **Finding new things turns into handling each one**: the trigger (a schedule or an app event), the app read, its filter and "only new" are the first job; what is done with each item is the next job. A trigger is a setting of the first job, never a Step of its own.
|
|
197
|
+
3. **The result leaves StillMade**: it is sent, posted, published, paid or written into another app. Consecutive writes to the same app, with the glue that shapes data for them, are one job.
|
|
198
|
+
|
|
199
|
+
A part that only runs in the desktop app cannot share a Step with cloud parts. Before adding a Step, name which of the three reasons makes it separate; if none applies, make it a part of a neighbor. A Step nobody would ever open must not exist on its own. Prefer an app task's own filter (a Gmail query such as `has:attachment filename:png`) to an AI check, and use AI decide only for judgement.
|
|
200
|
+
|
|
201
|
+
Inside one job, each capability stays its own part: a capability Block performs exactly one hosted operation and a connector one app task, so every part keeps its own permission, approval and credit rules, and StillMade groups the parts of one job into one Step (`groups` in the Project Type). Never invent a combined runtime. When one Block can do the whole job with documented primitives (a JavaScript Block doing several local transforms, a workspace owning its whole document), build it as one Block.
|
|
202
|
+
|
|
203
|
+
Examples: "every new email with an image becomes a generated image" is two Steps, "Gmail · New emails with images" (When, fetch with an image filter, only new) and "Image from email" (AI write, Generate image); listing When, Fetch, Only new, AI decide, Continue only if, AI write and Generate image as seven Steps splits one job into its parts. "A new Meta lead goes to HubSpot" is three Steps: "Meta Ads · New leads", "Qualify lead" and "HubSpot · Add contact".
|
|
204
|
+
|
|
167
205
|
### Define the capability first
|
|
168
206
|
|
|
169
|
-
Translate the request into an explicit capability contract before implementation: what the Block does; each input with its type, meaning and whether it is required (prefer optional settings with safe defaults over extra required questions); each output with its type and meaning; persistent state; project context it reads; permissions; UI; long-running behavior; expected failures; cancellation; determinism; and whether it needs hosted models, media, desktop tools or shared editing. Keep the public interface as small and general as possible and keep implementation details out of it.
|
|
207
|
+
Translate the request into an explicit capability contract before implementation: what the Block does; each input with its type, meaning and whether it is required (prefer optional settings with safe defaults over extra required questions); each output with its type and meaning; persistent state; project context it reads; permissions; UI; long-running behavior; expected failures; cancellation; determinism; and whether it needs hosted models, media, desktop tools or shared editing. Keep the public interface as small and general as possible (few required inputs, one primary output) and keep implementation details out of it; small means a small interface, never a fragment of a job. A Block that generates images, video or speech declares only its prompt and output: every Step that runs it gets the host’s generation settings (model, quality, length and resolution, voice, speed, how many), saved with the Step, changed on its page or by Chat, and shown with their cost before each run.
|
|
170
208
|
|
|
171
209
|
### Blocks compose
|
|
172
210
|
|
|
173
|
-
A Block is not a mini-app. Its outputs become other Blocks' inputs and its inputs come from other Blocks, project context or the user. Use the typed port system: shared StillMade types (`image`, `video`, `audio`, `asset`, `script`, `shot[]`, ...), a `semantic` meaning on every port, `required` and a short `description`. Mark exactly one primary input and one primary output so Project Type Steps connect automatically, and use `kind: "task"`: a `workspace` Block owns a project document and is never connected automatically. Inputs marked `context` read the project and cannot receive a connection from another Step. Output reusable StillMade values: media references (`{kind,assetId,versionId,url}`) and structured production values with `schemaVersion: 1`, preserving provenance, versions and relationships downstream Blocks need. Never make ordinary users wire JSON, copy IDs, understand internal paths or translate one Block's output into another: `createUniversalResolver()` (the same engine as the Project Type composer) resolves inputs from compatible upstream outputs, permitted project context and, for optional non-context inputs, `StillMade.requestFromUser`.
|
|
211
|
+
A Block is one job: not a mini-app of many jobs and not a fragment of one. Its outputs become other Blocks' inputs and its inputs come from other Blocks, project context or the user. Use the typed port system: shared StillMade types (`image`, `video`, `audio`, `asset`, `script`, `shot[]`, ...), a `semantic` meaning on every port, `required` and a short `description`. Mark exactly one primary input and one primary output so Project Type Steps connect automatically, and use `kind: "task"`: a `workspace` Block owns a project document and is never connected automatically. Inputs marked `context` read the project and cannot receive a connection from another Step. Output reusable StillMade values: media references (`{kind,assetId,versionId,url}`) and structured production values with `schemaVersion: 1`, preserving provenance, versions and relationships downstream Blocks need. Never make ordinary users wire JSON, copy IDs, understand internal paths or translate one Block's output into another: `createUniversalResolver()` (the same engine as the Project Type composer) resolves inputs from compatible upstream outputs, permitted project context and, for optional non-context inputs, `StillMade.requestFromUser`.
|
|
174
212
|
|
|
175
213
|
### Use platform primitives
|
|
176
214
|
|
|
@@ -180,9 +218,13 @@ Prefer, in order: an SDK capability; a documented host capability (the hosted op
|
|
|
180
218
|
|
|
181
219
|
Never make a Block look functional through hard-coded local paths, developer-machine dependencies, undocumented environment variables, admin or database access, hidden core modifications, direct database writes, fake or mocked production results, hand-prepared test assets that hide incompatibilities, credentials in code, or assumptions about one user's machine. The finished Block must work through the same interfaces available to any installed Block; `permissions.network`, `permissions.filesystem` and `permissions.secrets` must be empty arrays.
|
|
182
220
|
|
|
221
|
+
### Name it briefly
|
|
222
|
+
|
|
223
|
+
Give the Block a short, plain name of 40 characters or fewer that says what it does ("Captioned Clip", not "Captioned Business Clip Generator With Review"). The name appears in step bars, Project Type cards and pickers, so put the detail in the description instead. New releases with a longer name do not pass readiness.
|
|
224
|
+
|
|
183
225
|
### Interface
|
|
184
226
|
|
|
185
|
-
If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction genuinely needs one. Expose the capability, not the implementation: meaningful controls, sensible defaults, preview, direct manipulation, progress, clear errors and visible outputs. Do not show raw JSON, internal IDs, filesystem details, provider terminology or developer settings unless the Block is itself a developer tool. Follow the host appearance (Light, Dark and White) and the mobile layout contract: one interface for every screen size that fits a 320 CSS-pixel phone without horizontal scrolling.
|
|
227
|
+
If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction genuinely needs one. Expose the capability, not the implementation: meaningful controls, sensible defaults, preview, direct manipulation, progress, clear errors and visible outputs. Do not show raw JSON, internal IDs, filesystem details, provider terminology or developer settings unless the Block is itself a developer tool. When a person chooses among options they need to hear or see (voices, music, sounds, fonts, looks, colors, templates or images), let them preview each option before choosing: a sample to play or a thumbnail, from the Block's own files or the host's free samples, never a paid generation. Leave previews out only when the builder states there is nothing to preview. Choices StillMade owns, such as voices and models in the run review, already show their samples. Follow the host appearance (Light, Dark and White) and the mobile layout contract: one interface for every screen size that fits a 320 CSS-pixel phone without horizontal scrolling.
|
|
186
228
|
|
|
187
229
|
### Shared editing
|
|
188
230
|
|
|
@@ -218,11 +260,11 @@ StillMade runs the readiness check on every Block it admits: manifest and contra
|
|
|
218
260
|
|
|
219
261
|
### Project Types
|
|
220
262
|
|
|
221
|
-
A Project Type is an ordered production workflow. Each Step's primary output must be a compatible input for the next Step, secondary values come from permitted project context, and every member Block obeys this contract. Install Blocks into a realistic Project Type: project chat must understand each Step, inputs must resolve intuitively, outputs and execution state must be visible, failures must be diagnosable, and the user must be able to continue through the workflow.
|
|
263
|
+
A Project Type is an ordered production workflow. Each Step's primary output must be a compatible input for the next Step, secondary values come from permitted project context, and every member Block obeys this contract. Install Blocks into a realistic Project Type: project chat must understand each Step, inputs must resolve intuitively, outputs and execution state must be visible, failures must be diagnosable, and the user must be able to continue through the workflow. Group the parts of one job into one Step instead of listing helper parts as Steps; most automations are two to four Steps.
|
|
222
264
|
|
|
223
265
|
### Readiness report
|
|
224
266
|
|
|
225
|
-
Finish with a Block Readiness Report: capability, contract (inputs, outputs, permissions, dependencies), platform APIs used, tests actually performed and their results, the composition test (upstream, Block, downstream), known limitations, unsupported requirements and any platform gap with its smallest general primitive.
|
|
267
|
+
Finish with a Block Readiness Report: capability, contract (inputs, outputs, permissions, dependencies), platform APIs used, tests actually performed and their results, the composition test (upstream, Block, downstream), known limitations, unsupported requirements and any platform gap with its smallest general primitive. Report exactly one status, the one StillMade's readiness check returned (`ready` in the SDK CLI, `check_block_readiness` over MCP), never one you chose: PRODUCTION READY (every applicable check passed), READY WITH DOCUMENTED LIMITATIONS (works reliably within stated boundaries), BLOCKED BY PLATFORM CAPABILITY (needs a missing generic primitive) or FAILED. Never label a Block production ready to satisfy a request, and never claim a check ran when it did not.
|
|
226
268
|
|
|
227
269
|
### Definition of done
|
|
228
270
|
|
|
@@ -271,6 +313,19 @@ An instance of a Block inside a Project Type. Each Step has its own instance ID,
|
|
|
271
313
|
### Project Type
|
|
272
314
|
An ordered production workflow. Its persisted `stages` array stores Steps for compatibility with existing projects. Users can add, remove, duplicate, configure, disable, or reorder Steps. The protected starting chat belongs to the host and cannot be replaced or remixed.
|
|
273
315
|
|
|
316
|
+
### One job per Step
|
|
317
|
+
A Step is one job: the work between two moments where a person or the outside world must see the result. Start a new Step only at one of three points; everything else is a part of the neighboring Step.
|
|
318
|
+
|
|
319
|
+
1. **A person works with the result**: reads, edits, picks or approves it (a workspace Block such as a script, a Canvas or an Editor, or an approval). That is why Chat, Bible, Canvas and Editor are four Steps.
|
|
320
|
+
2. **Finding new things turns into handling each one**: the trigger (a schedule or an app event), the app read, its filter and "only new" are the first job; what is done with each item is the next job. A trigger is a setting of the first job, never a Step of its own.
|
|
321
|
+
3. **The result leaves StillMade**: it is sent, posted, published, paid or written into another app. Consecutive writes to the same app, with the glue that shapes data for them, are one job.
|
|
322
|
+
|
|
323
|
+
A part that only runs in the desktop app cannot share a Step with cloud parts. Before adding a Step, name which of the three reasons makes it separate; if none applies, make it a part of a neighbor. A Step nobody would ever open must not exist on its own. Prefer an app task's own filter (a Gmail query such as `has:attachment filename:png`) to an AI check, and use AI decide only for judgement.
|
|
324
|
+
|
|
325
|
+
Inside one job, each capability stays its own part: a capability Block performs exactly one hosted operation and a connector one app task, so every part keeps its own permission, approval and credit rules, and StillMade groups the parts of one job into one Step (`groups` in the Project Type). Never invent a combined runtime. When one Block can do the whole job with documented primitives (a JavaScript Block doing several local transforms, a workspace owning its whole document), build it as one Block.
|
|
326
|
+
|
|
327
|
+
Examples: "every new email with an image becomes a generated image" is two Steps, "Gmail · New emails with images" (When, fetch with an image filter, only new) and "Image from email" (AI write, Generate image); listing When, Fetch, Only new, AI decide, Continue only if, AI write and Generate image as seven Steps splits one job into its parts. "A new Meta lead goes to HubSpot" is three Steps: "Meta Ads · New leads", "Qualify lead" and "HubSpot · Add contact".
|
|
328
|
+
|
|
274
329
|
### Typed connections
|
|
275
330
|
An image-producing Block can connect to an image-consuming Block. Primary ports make insertion predictable; semantic roles distinguish a source image from a character reference. Secondary inputs can bind to project context.
|
|
276
331
|
|
|
@@ -1001,7 +1056,20 @@ Its capability declaration is:
|
|
|
1001
1056
|
```
|
|
1002
1057
|
|
|
1003
1058
|
Declare exactly one prompt input (`text`, `script`, or `brief`) and exactly one
|
|
1004
|
-
output (`text`, `script`, or `
|
|
1059
|
+
output (`text`, `script`, `json`, or a structured `object`).
|
|
1060
|
+
|
|
1061
|
+
An optional second `text` input can carry the user's own instructions, such as
|
|
1062
|
+
decision rules or what to write: name it in `"prompt": {"$input": "data",
|
|
1063
|
+
"$instructions": "rules"}`. StillMade sends `Instructions:` then `Input:`.
|
|
1064
|
+
|
|
1065
|
+
For a structured answer, declare one `object` output with a flat `schema` of up
|
|
1066
|
+
to 20 `string`, `number`, `integer` or `boolean` fields, for example
|
|
1067
|
+
`{"yes":"boolean","score":"integer","label":"string","reason":"string"}`.
|
|
1068
|
+
StillMade asks the model for exactly one JSON object with those fields, accepts
|
|
1069
|
+
the common `"85"` and `"true"` string forms, drops undeclared fields and fails the
|
|
1070
|
+
run when a field is missing. Fixtures for an object output use
|
|
1071
|
+
`{"kind":"object"}`; the declared fields are always checked. Later Steps can use
|
|
1072
|
+
the fields directly, for example with "Continue only if". Structured prompt inputs contain
|
|
1005
1073
|
`{"schemaVersion":1,"text":"..."}`. A generated script returns that same
|
|
1006
1074
|
structured shape; a text output returns a string. Typed ports, primary markers,
|
|
1007
1075
|
semantic roles, and scoped project context retain their SDK meaning. A context
|
|
@@ -5536,6 +5604,21 @@ compatible({type: 'image', role: 'source_image'},
|
|
|
5536
5604
|
### Primary ports
|
|
5537
5605
|
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.
|
|
5538
5606
|
|
|
5607
|
+
### How a project flags connection problems
|
|
5608
|
+
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.
|
|
5609
|
+
|
|
5610
|
+
| Glow | Meaning | Causes |
|
|
5611
|
+
| --- | --- | --- |
|
|
5612
|
+
| 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 |
|
|
5613
|
+
| 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 |
|
|
5614
|
+
| None | Normal sequencing | Waiting for an earlier Block, working, paused, skipped by a condition, private, finished, or Flow details unavailable |
|
|
5615
|
+
|
|
5616
|
+
What authors control:
|
|
5617
|
+
- Give every port a `semantic`. A connection whose ports carry no meaning stays yellow until a person reviews it.
|
|
5618
|
+
- Mark settings with safe defaults `required: false`. Each required input without a source keeps the Block yellow until it is answered.
|
|
5619
|
+
- 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.
|
|
5620
|
+
- Return outputs that match their declared type. A mismatched output fails the run, which turns the Block red.
|
|
5621
|
+
|
|
5539
5622
|
### Safe connection conversions
|
|
5540
5623
|
StillMade can insert a versioned, deterministic conversion between compatible
|
|
5541
5624
|
Steps. This is part of the host connection contract; it does not add a visible
|
|
@@ -5645,6 +5728,21 @@ the host's existing media inputs or declared project context. Declaration alone
|
|
|
5645
5728
|
is not permission. The host checks the full reference identity and current
|
|
5646
5729
|
account/selection before transferring bytes. Detached history views can download
|
|
5647
5730
|
text-only results; media ZIPs need the Block's current authorized media context.
|
|
5731
|
+
|
|
5732
|
+
Source-project ZIPs may also contain bounded UTF-8 HTML, CSS, JavaScript,
|
|
5733
|
+
TypeScript, SVG and other common source text files as `{path,text}` members. The
|
|
5734
|
+
host treats those members as inert data, checks their paths and total size, and
|
|
5735
|
+
offers only the ZIP download after the normal export authorization. A single
|
|
5736
|
+
HTML or script file cannot be returned as `format: "file"`. Declare a useful
|
|
5737
|
+
semantic such as `web_source_project` so Revolver can connect the complete
|
|
5738
|
+
project to a compatible consumer. Binary files are not accepted as text members;
|
|
5739
|
+
use authorized media references where appropriate and do not omit required
|
|
5740
|
+
project files while claiming a complete export.
|
|
5741
|
+
For browser-application Blocks, `file-bundle` members must currently be
|
|
5742
|
+
text-only. The browser execution host rejects guest-supplied media references
|
|
5743
|
+
even when the manifest requests `asset.read`, because that request does not
|
|
5744
|
+
prove the current project selected the exact asset and version. Other Block
|
|
5745
|
+
runtimes retain their existing host-authorized media-bundle path.
|
|
5648
5746
|
Unavailable, unselected or unsupported media aborts the ZIP instead of returning
|
|
5649
5747
|
an archive with missing members. The host does not install dependencies.
|
|
5650
5748
|
|
|
@@ -5751,6 +5849,7 @@ export * from './workflow-approvals.js';
|
|
|
5751
5849
|
export * from './package-semantics.js';
|
|
5752
5850
|
export * from './define-block.js';
|
|
5753
5851
|
export * from './adapter-registry.js';
|
|
5852
|
+
export * from './native-application-package.js';
|
|
5754
5853
|
export * from './block-storage.js';
|
|
5755
5854
|
export type {BlockViewDocumentTools,DocumentDraftOperation,DocumentEntry,DocumentPath} from './document-drafts.js';
|
|
5756
5855
|
export type {BlockViewDocumentOptions,BlockViewDocumentConnection} from './document-store-binding.js';
|
|
@@ -5771,7 +5870,7 @@ export interface Manifest {
|
|
|
5771
5870
|
/** Events the Block can run on by itself, once the project owner turns them on. */
|
|
5772
5871
|
triggers?: import('./triggers.js').BlockTrigger[];
|
|
5773
5872
|
semantics?: import('./semantic-contracts.js').SemanticDefinition[];
|
|
5774
|
-
provenance?: { remixSource?: BlockPackage; remixPolicy?: {allowRemixing: boolean; sourceInspection?: "yes"|"no"|"license-controlled"}; remixAncestors?: {id: string; version: string; digest: string}[]; remixedFrom?: { id: string; version: string; digest: string }; [key: string]: unknown };
|
|
5873
|
+
provenance?: { remixSource?: BlockPackage; remixPolicy?: {allowRemixing: boolean; sourceInspection?: "yes"|"no"|"license-controlled"}; remixAncestors?: {id: string; version: string; digest: string}[]; remixedFrom?: { id: string; version: string; digest: string }; githubSource?: {repository: string; commit: string; path: string}; [key: string]: unknown };
|
|
5775
5874
|
summary?: Record<string, unknown>;
|
|
5776
5875
|
license?: string;
|
|
5777
5876
|
category?: string;
|
|
@@ -6416,6 +6515,24 @@ export function gainFor(measuredLufs: number, peak: number, targetLufs?: number)
|
|
|
6416
6515
|
export function wavWriter(channelCount: number, sampleRate: number, frames: number): Readonly<{buffer: ArrayBuffer; write(channels: Float32Array[], from?: number, to?: number, gain?: number): void}>;
|
|
6417
6516
|
export function encodeWav(channels: Float32Array[], sampleRate: number): ArrayBuffer;
|
|
6418
6517
|
export function decodeWav(buffer: ArrayBuffer): {channels: Float32Array[]; sampleRate: number};
|
|
6518
|
+
/** Browser application bundle profiles. They describe a bundle format, not runtime admission.
|
|
6519
|
+
* `desktop-browser-application/2` adds srcdoc frames (features: wasm, srcdocFrames);
|
|
6520
|
+
* `desktop-browser-application/3` also declares local Web Workers (features: wasm, srcdocFrames, localWorkers: true). */
|
|
6521
|
+
export const BROWSER_APPLICATION_EMBEDDED_PROFILE:'desktop-browser-application/2';
|
|
6522
|
+
export const BROWSER_APPLICATION_LOCAL_WORKER_PROFILE:'desktop-browser-application/3';
|
|
6523
|
+
/** Content digests of a validated browser application package: packageDigest covers the whole package, bundleDigest only its application bundle. */
|
|
6524
|
+
export function getBrowserApplicationSourceDigests(value:unknown,options?:{signal?:AbortSignal}):Promise<Readonly<{packageDigest:string;bundleDigest:string}>>;
|
|
6525
|
+
/** Static check that every input and output declares a semantic meaning, whether it is required, a description, and a field schema for json/object outputs, so the Block can take part in typed resolution. runtimeVerified is always false. */
|
|
6526
|
+
export function reviewResolverContract(pkg:unknown):{name:string;runtimeVerified:false;contract:'semantic-resolver/1';passed:boolean;code?:'RESOLVER_CONTRACT';issues?:string[];message:string;manual?:{inputs:Array<{name:string;type:string;semantic:string;required:boolean;sources:string[]}>;outputs:Array<{name:string;type:string;semantic:string}>}};
|
|
6527
|
+
/** Native (desktop-only) application packages: exactly { manifest, nativeApplication }, bound to an exact GitHub source pin.
|
|
6528
|
+
* Ordinary SDK execution and admission refuse them (NATIVE_APPLICATION_RUNTIME_UNAVAILABLE); installation needs host-verified
|
|
6529
|
+
* admission bound to the exact source and runtime plus a managed interactive runtime. See NATIVE_APPLICATION_ADAPTATION.md. */
|
|
6530
|
+
export const NATIVE_APPLICATION_PACKAGE_CONTRACT:'native-application-package/1';
|
|
6531
|
+
export const NATIVE_APPLICATION_PACKAGE_LIMITS:Readonly<{packageBytes:262144;manifestBytes:65536;adapterBytes:64000;adapterFiles:8;ports:16;operations:16;capturedFiles:8}>;
|
|
6532
|
+
export const NATIVE_APPLICATION_RUNTIME_REQUIREMENT:string;
|
|
6533
|
+
/** Validates a native application package's strict source syntax and returns its detached, frozen copy. Throws NATIVE_APPLICATION_PACKAGE errors. Not runtime admission. */
|
|
6534
|
+
export function defineNativeApplicationPackage<T=unknown>(value:T):T;
|
|
6535
|
+
export function validateNativeApplicationPackage(value:unknown):true;
|
|
6419
6536
|
|
|
6420
6537
|
```
|
|
6421
6538
|
|
|
@@ -6567,7 +6684,7 @@ A portable image reference is not decoded pixel data. The host must resolve it b
|
|
|
6567
6684
|
5. Test actual supported media in the host workspace.
|
|
6568
6685
|
|
|
6569
6686
|
### Every SDK error code
|
|
6570
|
-
Generated from the SDK source (
|
|
6687
|
+
Generated from the SDK source (197 codes). The message is one example; the actual message names the exact field or limit.
|
|
6571
6688
|
|
|
6572
6689
|
| Code | Example message | Raised in |
|
|
6573
6690
|
| --- | --- | --- |
|
|
@@ -6593,6 +6710,8 @@ Generated from the SDK source (194 codes). The message is one example; the actua
|
|
|
6593
6710
|
| APPLICATION_GUEST_SIGNAL | Use an AbortSignal when supplied. | `browser-application-guest` |
|
|
6594
6711
|
| APPLICATION_GUEST_STATE | Supply the host state revision. | `browser-application-guest` |
|
|
6595
6712
|
| APPLICATION_INTEGRITY | Application artifact byte count differs from its reference. | `browser-application-artifacts` |
|
|
6713
|
+
| APPLICATION_OUTPUT_CANDIDATE | Use declared browser application outputs. | `browser-application-output-policy` |
|
|
6714
|
+
| APPLICATION_OUTPUT_UNMATERIALIZED | Output … includes media references that the browser application host has not independently verified. | `browser-application-output-policy` |
|
|
6596
6715
|
| APPLICATION_SOURCE_LIMIT | Application source | `browser-application-artifacts` |
|
|
6597
6716
|
| APPLICATION_SOURCE_REFERENCE | Use a browser application manifest. | `browser-application-artifacts` |
|
|
6598
6717
|
| APPLICATION_STATE_LIMIT | Application state artifact | `browser-application-artifacts` |
|
|
@@ -6602,6 +6721,7 @@ Generated from the SDK source (194 codes). The message is one example; the actua
|
|
|
6602
6721
|
| AUDIO_SCORE_HOST | Choose a supported Audio Score operation | `audio-score-host` |
|
|
6603
6722
|
| BEHAVIOR | Output differs from expected fixture. Expected …; received … | `testing` |
|
|
6604
6723
|
| BROWSER_APPLICATION_UNAVAILABLE | No trusted desktop browser application executor is installed. A bundle or mounted interface is not execution. | `browser-application-execution` |
|
|
6724
|
+
| BROWSER_BUILD_DEPENDENCY | Expected one exact registry tarball identity. | `repository-build-dependencies` |
|
|
6605
6725
|
| BUSY | JavaScript runners are busy. Try again shortly. | `sandbox-node` |
|
|
6606
6726
|
| BYOK_PAYMENT_HOST | Choose a supported payment capability | `byok-payment-host` |
|
|
6607
6727
|
| CANCELLED | Conversion stopped. | `adapter-registry`, `browser-application-execution`, `browser-application-guest` and 7 more |
|
|
@@ -6657,6 +6777,7 @@ Generated from the SDK source (194 codes). The message is one example; the actua
|
|
|
6657
6777
|
| 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` |
|
|
6658
6778
|
| DOCUMENT_STORE | Use a bounded named document field | `document-store` |
|
|
6659
6779
|
| FIRST_PARTY_SOURCE | Use the exact published first-party package before creating a remix. | `remix-policy`, `testing` |
|
|
6780
|
+
| GENERATION_SETTINGS | This Step does not generate images, video or speech. | `generation-settings` |
|
|
6660
6781
|
| HOST_SERVICES | Animated assets requires its version 1 generation and dialog host | `animated-assets-host`, `asset-generation-host`, `blueprint-host-services` and 47 more |
|
|
6661
6782
|
| INPUT_SOURCE | … does not allow … information. Choose a permitted source. | `input-source-policy` |
|
|
6662
6783
|
| JOB_EXECUTOR | Use a trusted host executor | `package-jobs` |
|
|
@@ -6669,7 +6790,6 @@ Generated from the SDK source (194 codes). The message is one example; the actua
|
|
|
6669
6790
|
| LICENSE_RESTRICTED | Conflicting file-level SPDX license at … | `portable-github`, `portable` |
|
|
6670
6791
|
| LIMIT | Source exceeds static review complexity | `admission`, `browser-application-execution`, `capabilities` and 14 more |
|
|
6671
6792
|
| LINEAGE | Declare lineage {parents:[{id,version,digest}],changes} | `portable` |
|
|
6672
|
-
| LOCAL_WORKER_REQUIRED | Pair a reviewed local worker for this application. A browser or desktop download alone cannot execute its native source. | `runtime` |
|
|
6673
6793
|
| MANIFEST | Invalid JavaScript manifest | `javascript` |
|
|
6674
6794
|
| MEDIA_DESCRIPTION_HOST | Describe Media requires a supported image reference and optional hint | `media-description-host` |
|
|
6675
6795
|
| MEDIA_RENDER_INPUT | Final render requires a versioned timeline, settings, and Block source. | `portable-media-contracts` |
|
|
@@ -7034,6 +7154,8 @@ Blocks, Project Types, and creators have their own page URLs. Public pages link
|
|
|
7034
7154
|
|
|
7035
7155
|
## Build with an AI coding tool
|
|
7036
7156
|
|
|
7157
|
+
The fastest route is to send your coding agent [Build a Block with your AI](/docs/build/with-your-ai) with your idea: it downloads the SDK, builds the Block and runs the readiness gate without you running anything.
|
|
7158
|
+
|
|
7037
7159
|
### Start with the SDK contract
|
|
7038
7160
|
Use the button below to copy the complete authoring guide, then add a short description such as “Make a Block that converts an image to grayscale while preserving alpha.” The guide includes the package format, supported runtime, typed ports, permissions, fixtures, and a complete example.
|
|
7039
7161
|
|
|
@@ -7048,9 +7170,9 @@ Ask the assistant to return source files or one `.stillmade.json` package. Run t
|
|
|
7048
7170
|
|
|
7049
7171
|
<!-- builder-contract:start (generated by npm run build:sdk; do not edit) -->
|
|
7050
7172
|
|
|
7051
|
-
### Block builder contract (stillmade.block-builder@1.
|
|
7173
|
+
### Block builder contract (stillmade.block-builder@1.3.0)
|
|
7052
7174
|
|
|
7053
|
-
Contract `stillmade.block-builder@1.
|
|
7175
|
+
Contract `stillmade.block-builder@1.3.0`. Humans, coding agents, imported source, GitHub repositories and generated code all adapt to the Block platform; anything that becomes a StillMade Block obeys this contract.
|
|
7054
7176
|
|
|
7055
7177
|
### Source of truth
|
|
7056
7178
|
|
|
@@ -7060,13 +7182,27 @@ Treat the current SDK (`stillmade.block.json` manifest, `packages/block-sdk` con
|
|
|
7060
7182
|
|
|
7061
7183
|
Before building, check what already exists (`find_existing_blocks` over MCP, or the Marketplace and your library) by the inputs, results and operations the goal needs. Use an installed or reviewed Block that already does it; remix a close one so its license, notices and creator credit stay attached; chain existing Blocks and build only the missing step. Never republish another creator's source without remix lineage: public copies are refused. Build a new Block when nothing fits or the person asks for their own version, and say which similar Blocks you considered.
|
|
7062
7184
|
|
|
7185
|
+
### One job per Step
|
|
7186
|
+
|
|
7187
|
+
A Step is one job: the work between two moments where a person or the outside world must see the result. Start a new Step only at one of three points; everything else is a part of the neighboring Step.
|
|
7188
|
+
|
|
7189
|
+
1. **A person works with the result**: reads, edits, picks or approves it (a workspace Block such as a script, a Canvas or an Editor, or an approval). That is why Chat, Bible, Canvas and Editor are four Steps.
|
|
7190
|
+
2. **Finding new things turns into handling each one**: the trigger (a schedule or an app event), the app read, its filter and "only new" are the first job; what is done with each item is the next job. A trigger is a setting of the first job, never a Step of its own.
|
|
7191
|
+
3. **The result leaves StillMade**: it is sent, posted, published, paid or written into another app. Consecutive writes to the same app, with the glue that shapes data for them, are one job.
|
|
7192
|
+
|
|
7193
|
+
A part that only runs in the desktop app cannot share a Step with cloud parts. Before adding a Step, name which of the three reasons makes it separate; if none applies, make it a part of a neighbor. A Step nobody would ever open must not exist on its own. Prefer an app task's own filter (a Gmail query such as `has:attachment filename:png`) to an AI check, and use AI decide only for judgement.
|
|
7194
|
+
|
|
7195
|
+
Inside one job, each capability stays its own part: a capability Block performs exactly one hosted operation and a connector one app task, so every part keeps its own permission, approval and credit rules, and StillMade groups the parts of one job into one Step (`groups` in the Project Type). Never invent a combined runtime. When one Block can do the whole job with documented primitives (a JavaScript Block doing several local transforms, a workspace owning its whole document), build it as one Block.
|
|
7196
|
+
|
|
7197
|
+
Examples: "every new email with an image becomes a generated image" is two Steps, "Gmail · New emails with images" (When, fetch with an image filter, only new) and "Image from email" (AI write, Generate image); listing When, Fetch, Only new, AI decide, Continue only if, AI write and Generate image as seven Steps splits one job into its parts. "A new Meta lead goes to HubSpot" is three Steps: "Meta Ads · New leads", "Qualify lead" and "HubSpot · Add contact".
|
|
7198
|
+
|
|
7063
7199
|
### Define the capability first
|
|
7064
7200
|
|
|
7065
|
-
Translate the request into an explicit capability contract before implementation: what the Block does; each input with its type, meaning and whether it is required (prefer optional settings with safe defaults over extra required questions); each output with its type and meaning; persistent state; project context it reads; permissions; UI; long-running behavior; expected failures; cancellation; determinism; and whether it needs hosted models, media, desktop tools or shared editing. Keep the public interface as small and general as possible and keep implementation details out of it.
|
|
7201
|
+
Translate the request into an explicit capability contract before implementation: what the Block does; each input with its type, meaning and whether it is required (prefer optional settings with safe defaults over extra required questions); each output with its type and meaning; persistent state; project context it reads; permissions; UI; long-running behavior; expected failures; cancellation; determinism; and whether it needs hosted models, media, desktop tools or shared editing. Keep the public interface as small and general as possible (few required inputs, one primary output) and keep implementation details out of it; small means a small interface, never a fragment of a job. A Block that generates images, video or speech declares only its prompt and output: every Step that runs it gets the host’s generation settings (model, quality, length and resolution, voice, speed, how many), saved with the Step, changed on its page or by Chat, and shown with their cost before each run.
|
|
7066
7202
|
|
|
7067
7203
|
### Blocks compose
|
|
7068
7204
|
|
|
7069
|
-
A Block is not a mini-app. Its outputs become other Blocks' inputs and its inputs come from other Blocks, project context or the user. Use the typed port system: shared StillMade types (`image`, `video`, `audio`, `asset`, `script`, `shot[]`, ...), a `semantic` meaning on every port, `required` and a short `description`. Mark exactly one primary input and one primary output so Project Type Steps connect automatically, and use `kind: "task"`: a `workspace` Block owns a project document and is never connected automatically. Inputs marked `context` read the project and cannot receive a connection from another Step. Output reusable StillMade values: media references (`{kind,assetId,versionId,url}`) and structured production values with `schemaVersion: 1`, preserving provenance, versions and relationships downstream Blocks need. Never make ordinary users wire JSON, copy IDs, understand internal paths or translate one Block's output into another: `createUniversalResolver()` (the same engine as the Project Type composer) resolves inputs from compatible upstream outputs, permitted project context and, for optional non-context inputs, `StillMade.requestFromUser`.
|
|
7205
|
+
A Block is one job: not a mini-app of many jobs and not a fragment of one. Its outputs become other Blocks' inputs and its inputs come from other Blocks, project context or the user. Use the typed port system: shared StillMade types (`image`, `video`, `audio`, `asset`, `script`, `shot[]`, ...), a `semantic` meaning on every port, `required` and a short `description`. Mark exactly one primary input and one primary output so Project Type Steps connect automatically, and use `kind: "task"`: a `workspace` Block owns a project document and is never connected automatically. Inputs marked `context` read the project and cannot receive a connection from another Step. Output reusable StillMade values: media references (`{kind,assetId,versionId,url}`) and structured production values with `schemaVersion: 1`, preserving provenance, versions and relationships downstream Blocks need. Never make ordinary users wire JSON, copy IDs, understand internal paths or translate one Block's output into another: `createUniversalResolver()` (the same engine as the Project Type composer) resolves inputs from compatible upstream outputs, permitted project context and, for optional non-context inputs, `StillMade.requestFromUser`.
|
|
7070
7206
|
|
|
7071
7207
|
### Use platform primitives
|
|
7072
7208
|
|
|
@@ -7076,9 +7212,13 @@ Prefer, in order: an SDK capability; a documented host capability (the hosted op
|
|
|
7076
7212
|
|
|
7077
7213
|
Never make a Block look functional through hard-coded local paths, developer-machine dependencies, undocumented environment variables, admin or database access, hidden core modifications, direct database writes, fake or mocked production results, hand-prepared test assets that hide incompatibilities, credentials in code, or assumptions about one user's machine. The finished Block must work through the same interfaces available to any installed Block; `permissions.network`, `permissions.filesystem` and `permissions.secrets` must be empty arrays.
|
|
7078
7214
|
|
|
7215
|
+
### Name it briefly
|
|
7216
|
+
|
|
7217
|
+
Give the Block a short, plain name of 40 characters or fewer that says what it does ("Captioned Clip", not "Captioned Business Clip Generator With Review"). The name appears in step bars, Project Type cards and pickers, so put the detail in the description instead. New releases with a longer name do not pass readiness.
|
|
7218
|
+
|
|
7079
7219
|
### Interface
|
|
7080
7220
|
|
|
7081
|
-
If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction genuinely needs one. Expose the capability, not the implementation: meaningful controls, sensible defaults, preview, direct manipulation, progress, clear errors and visible outputs. Do not show raw JSON, internal IDs, filesystem details, provider terminology or developer settings unless the Block is itself a developer tool. Follow the host appearance (Light, Dark and White) and the mobile layout contract: one interface for every screen size that fits a 320 CSS-pixel phone without horizontal scrolling.
|
|
7221
|
+
If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction genuinely needs one. Expose the capability, not the implementation: meaningful controls, sensible defaults, preview, direct manipulation, progress, clear errors and visible outputs. Do not show raw JSON, internal IDs, filesystem details, provider terminology or developer settings unless the Block is itself a developer tool. When a person chooses among options they need to hear or see (voices, music, sounds, fonts, looks, colors, templates or images), let them preview each option before choosing: a sample to play or a thumbnail, from the Block's own files or the host's free samples, never a paid generation. Leave previews out only when the builder states there is nothing to preview. Choices StillMade owns, such as voices and models in the run review, already show their samples. Follow the host appearance (Light, Dark and White) and the mobile layout contract: one interface for every screen size that fits a 320 CSS-pixel phone without horizontal scrolling.
|
|
7082
7222
|
|
|
7083
7223
|
### Shared editing
|
|
7084
7224
|
|
|
@@ -7114,11 +7254,11 @@ StillMade runs the readiness check on every Block it admits: manifest and contra
|
|
|
7114
7254
|
|
|
7115
7255
|
### Project Types
|
|
7116
7256
|
|
|
7117
|
-
A Project Type is an ordered production workflow. Each Step's primary output must be a compatible input for the next Step, secondary values come from permitted project context, and every member Block obeys this contract. Install Blocks into a realistic Project Type: project chat must understand each Step, inputs must resolve intuitively, outputs and execution state must be visible, failures must be diagnosable, and the user must be able to continue through the workflow.
|
|
7257
|
+
A Project Type is an ordered production workflow. Each Step's primary output must be a compatible input for the next Step, secondary values come from permitted project context, and every member Block obeys this contract. Install Blocks into a realistic Project Type: project chat must understand each Step, inputs must resolve intuitively, outputs and execution state must be visible, failures must be diagnosable, and the user must be able to continue through the workflow. Group the parts of one job into one Step instead of listing helper parts as Steps; most automations are two to four Steps.
|
|
7118
7258
|
|
|
7119
7259
|
### Readiness report
|
|
7120
7260
|
|
|
7121
|
-
Finish with a Block Readiness Report: capability, contract (inputs, outputs, permissions, dependencies), platform APIs used, tests actually performed and their results, the composition test (upstream, Block, downstream), known limitations, unsupported requirements and any platform gap with its smallest general primitive.
|
|
7261
|
+
Finish with a Block Readiness Report: capability, contract (inputs, outputs, permissions, dependencies), platform APIs used, tests actually performed and their results, the composition test (upstream, Block, downstream), known limitations, unsupported requirements and any platform gap with its smallest general primitive. Report exactly one status, the one StillMade's readiness check returned (`ready` in the SDK CLI, `check_block_readiness` over MCP), never one you chose: PRODUCTION READY (every applicable check passed), READY WITH DOCUMENTED LIMITATIONS (works reliably within stated boundaries), BLOCKED BY PLATFORM CAPABILITY (needs a missing generic primitive) or FAILED. Never label a Block production ready to satisfy a request, and never claim a check ran when it did not.
|
|
7122
7262
|
|
|
7123
7263
|
### Definition of done
|
|
7124
7264
|
|
|
@@ -7394,9 +7534,10 @@ of the SDK URL the user supplied, not a guessed production hostname or localhost
|
|
|
7394
7534
|
- Search `/api/public-listings/discover?kind=block&search=<encoded-query>` for
|
|
7395
7535
|
Blocks, or use `kind=type` for Project Types. Follow `nextCursor` with `after`
|
|
7396
7536
|
when more results are relevant; a single page is not the complete catalog.
|
|
7397
|
-
- Use returned listing identities and versions to
|
|
7398
|
-
`/api/public-listings/<kind>/<id>/<version>/
|
|
7399
|
-
|
|
7537
|
+
- Use returned listing identities and versions to read
|
|
7538
|
+
`/api/public-listings/<kind>/<id>/<version>/metadata.json`: its name, description
|
|
7539
|
+
and typed inputs and outputs. A Block's code is private to its creator, so build
|
|
7540
|
+
on what it takes and makes, never on its source.
|
|
7400
7541
|
- In an offline SDK checkout, `packages/block-platform/catalog.js` provides bundled
|
|
7401
7542
|
first-party examples. It is a snapshot, not the complete live Marketplace.
|
|
7402
7543
|
|
|
@@ -9452,8 +9593,98 @@ The in-app full-application inspection pins source and retains an inventory of
|
|
|
9452
9593
|
code, binary assets, dependency manifests, lockfiles, symlinks and submodules.
|
|
9453
9594
|
It returns `not-built`, including unfinished feature and runtime checks. A complete
|
|
9454
9595
|
file inventory is neither a complete dependency checkout nor a successful build.
|
|
9455
|
-
Inspection uses public unauthenticated GitHub APIs; it does not authorize private
|
|
9596
|
+
Inspection first uses public unauthenticated GitHub APIs; it does not authorize private
|
|
9456
9597
|
repository access, install dependencies, execute scripts or charge model credits.
|
|
9598
|
+
An exact commit's complete, verified public tree and Git-blob-checked source
|
|
9599
|
+
bytes may be reused from a 15-minute, 24 MiB process-local cache across the
|
|
9600
|
+
inspection, build and source-recheck phases. Branch/HEAD resolution, partial
|
|
9601
|
+
trees, failed reads and unverified bytes are not cached. Source review reports
|
|
9602
|
+
`pinned-cache` when it uses that evidence instead of claiming a fresh API read.
|
|
9603
|
+
The cache avoids repeated anonymous requests for one pin; a cold repository
|
|
9604
|
+
still depends on GitHub availability and its rate limit, and another server
|
|
9605
|
+
process has its own cache. It is not a substitute for an authenticated or
|
|
9606
|
+
archive-backed source acquisition route at larger scale.
|
|
9607
|
+
When the public REST API is rate-limited, the application import can instead
|
|
9608
|
+
resolve the public branch or tag through bounded Git protocol v2 HTTP and inspect a
|
|
9609
|
+
GitHub codeload archive at the resulting commit. The host checks the archive's
|
|
9610
|
+
commit marker, tar structure and paths, computes Git blob identities from
|
|
9611
|
+
actual bytes, rejects sensitive or oversized selected files, and labels this
|
|
9612
|
+
evidence `pinned-github-archive`. A named ref uses two bounded Git HTTP requests
|
|
9613
|
+
before the archive request; an exact commit needs only the archive request.
|
|
9614
|
+
This fallback is capped at 12 MB compressed and 40 MB expanded, requires no
|
|
9615
|
+
Git executable on the server, and refuses repositories with
|
|
9616
|
+
submodules because the archive omits their Git identities. Larger archives
|
|
9617
|
+
must use the Git tree route or a future bounded acquisition worker. Archive
|
|
9618
|
+
inspection is source evidence only; it does not approve execution or install.
|
|
9619
|
+
The REST and fallback phases use the same caller-owned HTTP transport when one
|
|
9620
|
+
is provided. Reported request use includes both phases. Reported byte use
|
|
9621
|
+
includes REST and archive bodies; the two Git-ref responses have separate
|
|
9622
|
+
64 KiB limits and are not included in that aggregate byte figure.
|
|
9623
|
+
For a complete Git tree containing submodules, inspection reads the pinned
|
|
9624
|
+
`.gitmodules` blob, accepts only canonical or relative GitHub repositories,
|
|
9625
|
+
and follows each exact Gitlink commit (including nested modules) within one
|
|
9626
|
+
48-request, 32 MB metadata and 24-placement bound. It reports each dependency
|
|
9627
|
+
commit separately. This verifies dependency identities and file inventories;
|
|
9628
|
+
the isolated builder must still acquire and hash the actual dependency bytes
|
|
9629
|
+
before running their code. Missing mappings, outside hosts, incomplete trees
|
|
9630
|
+
and exhausted bounds fail with a specific source-graph reason.
|
|
9631
|
+
The larger isolated-build acquisition profile can verify a complete archive
|
|
9632
|
+
against that Git tree, including ordinary files and symlink identities. GitHub
|
|
9633
|
+
codeload can omit files under `export-ignore` or transform exported text; those
|
|
9634
|
+
paths must be restored from exact-commit raw transport and independently
|
|
9635
|
+
rehashed to their pinned Git blobs. The raw route is limited to 64 files and
|
|
9636
|
+
8 MB, denies sensitive paths, uses no credentials or redirects, and cannot
|
|
9637
|
+
grant execution. All archive and recovered bytes are checked before a trusted
|
|
9638
|
+
staging callback receives any file. This profile has not yet been connected
|
|
9639
|
+
to a complete native build or installation workflow.
|
|
9640
|
+
The inspection `readable` flag controls what the LLM can request as source
|
|
9641
|
+
text. It is not a build-file filter. A separately checked `stageable` flag
|
|
9642
|
+
allows oversized but bounded files and inert symlink-target blobs into the
|
|
9643
|
+
private build-source quarantine; sensitive paths remain excluded. Symlink
|
|
9644
|
+
targets are stored as bytes, not followed or created as active filesystem
|
|
9645
|
+
links. A later materializer must validate every link target before use.
|
|
9646
|
+
The isolated-worker source-closure orchestrator groups identical pinned
|
|
9647
|
+
repositories across submodule placements, rechecks each exact commit, and
|
|
9648
|
+
hands verified bytes to a trusted quarantined staging callback under one
|
|
9649
|
+
request, network-byte, file, staged-byte and deadline budget. Its receipt is
|
|
9650
|
+
`execution:not-run` and `installable:false`; a partial stage has no activation
|
|
9651
|
+
authority. The connected private staging writer uses content-addressed inert
|
|
9652
|
+
blobs and rereads each file before sealing it. A complete closure produces a
|
|
9653
|
+
read-only manifest bound to a host-retained digest; reopening the quarantine
|
|
9654
|
+
audits every blob against its Git identity. Partial stages cannot be sealed.
|
|
9655
|
+
The inert tree planner checks file/directory namespace collisions and resolves
|
|
9656
|
+
symlink targets only within the exact staged closure, without expanding source
|
|
9657
|
+
paths on the host filesystem. A bounded transfer format then packs each
|
|
9658
|
+
audited Git blob once and binds its canonical namespace, modes, link targets,
|
|
9659
|
+
source digest and sealed-manifest digest into a SHA-256 bundle. The Linux
|
|
9660
|
+
materializer independently verifies the bundle and Git hashes, creates files
|
|
9661
|
+
through private directory descriptors, creates links only after file writes,
|
|
9662
|
+
and audits the final tree. A synthetic tree with an executable and links ran
|
|
9663
|
+
in the isolated VM; a changed bundle was rejected before staging. Natron's
|
|
9664
|
+
allowed exact closure also materialized there: 6,445 files and 654 directories.
|
|
9665
|
+
This development path is not yet a trusted install or execution admission:
|
|
9666
|
+
the stage owner can still change its read-only modes, and build recipes,
|
|
9667
|
+
dependencies, GUI sessions and result contracts need separate host control.
|
|
9668
|
+
For an npm browser candidate, inspection also reads the pinned `package.json` and
|
|
9669
|
+
`package-lock.json` through the same bounded source verifier. It checks that root
|
|
9670
|
+
dependency declarations agree and distinguishes integrity-pinned npm tarballs,
|
|
9671
|
+
exact-commit GitHub dependencies and unresolved sources. This is a build plan,
|
|
9672
|
+
not dependency acquisition or build admission. The pinned miniPaint case has
|
|
9673
|
+
517 npm tarballs and one exact-commit GitHub dependency; an isolated builder
|
|
9674
|
+
must acquire and verify both kinds before executing its Webpack build.
|
|
9675
|
+
Before rebuilding, the importer checks whether the pinned repository already
|
|
9676
|
+
contains an HTML entry referencing a checked-in local browser bundle. It selects
|
|
9677
|
+
the referenced scripts/styles and bounded local media resources, then verifies
|
|
9678
|
+
every selected byte against the Git tree. This can preserve a real original UI
|
|
9679
|
+
without executing a package script. It is still only a candidate: dynamic
|
|
9680
|
+
resource requests, operations, state and output must pass isolated review.
|
|
9681
|
+
miniPaint's checked-in bundle passed a separate local browser probe with a real
|
|
9682
|
+
brush stroke, changed PNG bytes and exact document restore in a second page.
|
|
9683
|
+
That probe is not an installed Block or a host-enforced multiplayer result.
|
|
9684
|
+
The local acquisition module also re-read miniPaint's exact pinned lockfile and
|
|
9685
|
+
verified all 518 dependencies (about 18.2 MB) against registry SHA-512 or Git
|
|
9686
|
+
blob identities. Those bytes were discarded after the probe. A managed stage,
|
|
9687
|
+
isolated framework rebuild and reviewed execution admission are still missing.
|
|
9457
9688
|
|
|
9458
9689
|
Use the exported `defineRepositoryApplication` contract to record the requested
|
|
9459
9690
|
scope, interface, versioned route and source-backed feature ledger. Use
|
|
@@ -9463,6 +9694,80 @@ verification. The assessor always reports `executionPerformed:false` and
|
|
|
9463
9694
|
`independentlyVerified:false`. A model cannot certify its own integration by
|
|
9464
9695
|
filling in that object.
|
|
9465
9696
|
|
|
9697
|
+
For a generated browser application, put the exact GitHub repository URL,
|
|
9698
|
+
40-character commit and application folder in
|
|
9699
|
+
`manifest.provenance.githubSource`. The SDK checks its shape and the source
|
|
9700
|
+
reviewer independently matches it to the pinned Git tree and every bundled
|
|
9701
|
+
original asset. This field travels with the versioned package; it is source
|
|
9702
|
+
identity, not permission, a license decision or evidence that the adapter ran.
|
|
9703
|
+
Older uninstalled candidates without the embedded pin can still undergo
|
|
9704
|
+
source review, but must not be promoted to production solely from that legacy
|
|
9705
|
+
shape.
|
|
9706
|
+
|
|
9707
|
+
For a framework application built from pinned source, the unreviewed candidate
|
|
9708
|
+
also carries `manifest.provenance.browserBuild`: the verified source-closure
|
|
9709
|
+
digest, build-script digest, output directory and digest of every original
|
|
9710
|
+
compiled file. A model may author the lifecycle adapter, but cannot supply the
|
|
9711
|
+
build result or certify it. A trusted host must independently rederive the
|
|
9712
|
+
Git source closure, verify the exact isolated build and reconstruct the full
|
|
9713
|
+
application bundle before running the ordinary interface, state and output
|
|
9714
|
+
review. The current SDK handoff and internal verifier implement these checks;
|
|
9715
|
+
the production build supervisor and review issuer are not yet connected to the
|
|
9716
|
+
GitHub button. A build or source receipt alone does not make a Block installable.
|
|
9717
|
+
An internal npm job now composes the sealed source bundle, Linux materializer,
|
|
9718
|
+
integrity-pinned registry and exact-commit GitHub package stages, and the
|
|
9719
|
+
network-denied build runner. It checks each identity again between stages and
|
|
9720
|
+
returns compiled bytes with no installation authority. The Linux npm profile
|
|
9721
|
+
now caps selected packages at 768, verified expanded package bytes at 256 MiB,
|
|
9722
|
+
and package files at 18,000. It caps compiled files at 16 MiB total, each
|
|
9723
|
+
file at 8 MiB, and the encoded build report at 24 MiB, with a root `dist`,
|
|
9724
|
+
`build` or `out` entry. It
|
|
9725
|
+
omits a lockfile package only when that package is explicitly optional and
|
|
9726
|
+
incompatible with the worker's OS, CPU or libc; the root launcher rechecks
|
|
9727
|
+
that selection against the pinned lock before execution. It has not run
|
|
9728
|
+
miniPaint's build, and still needs the durable supervisor lease and cleanup
|
|
9729
|
+
needed for a production
|
|
9730
|
+
button. The stage-order tests are offline; no real framework repository has
|
|
9731
|
+
passed this composed job. The worker also exposes a trusted rebuild callback
|
|
9732
|
+
for the compiled-candidate source verifier; the caller must run it under the
|
|
9733
|
+
same host-owned supervisor rather than accepting a browser-supplied report.
|
|
9734
|
+
|
|
9735
|
+
A successful framework build does not prove that all runtime assets are local.
|
|
9736
|
+
For example, CanvasCode compiled from its pinned source but loaded Monaco from
|
|
9737
|
+
a CDN; the isolated network-denied browser showed its preview while the editor
|
|
9738
|
+
remained unavailable. Manually bundling the already pinned Monaco dependency
|
|
9739
|
+
restored the editor and real ZIP export in an offline development VM. The
|
|
9740
|
+
internal compiled-authoring path can now ask a model for complete replacements
|
|
9741
|
+
or unique exact-text edits of inspected source files, each bound to its
|
|
9742
|
+
original Git SHA-256. The host derives full replacement bytes for an edit. A root-owned
|
|
9743
|
+
stage checks and seals replacement bytes separately from the immutable Git
|
|
9744
|
+
source; the network-denied build applies them in scratch space. Patch identity
|
|
9745
|
+
must match in the compiled candidate and an independent rebuild. Package
|
|
9746
|
+
manifests and lockfiles cannot be patched in this profile. The root-owned patch
|
|
9747
|
+
stage, service connection, automatic runtime-failure repair and full behavior
|
|
9748
|
+
review remain unverified. A model-suggested CDN exception is not equivalent to
|
|
9749
|
+
localizing and verifying those assets.
|
|
9750
|
+
CanvasCode also requires a `srcDoc` preview frame and local Monaco language
|
|
9751
|
+
workers. The original browser-application profile declares only single-thread
|
|
9752
|
+
WASM; its CSP and target guard deny frames and workers. A successful ordinary
|
|
9753
|
+
Chromium smoke therefore cannot establish host-runtime compatibility.
|
|
9754
|
+
|
|
9755
|
+
The new browser-application v2 source profile now supports a declared, bounded
|
|
9756
|
+
direct `srcdoc` frame. The compiled authorer can request that feature, and
|
|
9757
|
+
independent source verification reconstructs the exact profile from the pinned
|
|
9758
|
+
build. A local Chromium probe confirmed that the v2 CSP runs an inline preview
|
|
9759
|
+
script, reports the expected direct child frame, and keeps the top-only trusted
|
|
9760
|
+
bootstrap out of the child. The existing v1 CSP and frame guard remain closed.
|
|
9761
|
+
This is development-browser evidence, not a provisioned StillMade worker run.
|
|
9762
|
+
CanvasCode also needs local Monaco language workers. Browser application v3
|
|
9763
|
+
now declares exact bundled dedicated worker scripts, and the trusted target
|
|
9764
|
+
policy admits them only when paused under the original page and context. A
|
|
9765
|
+
local Chrome probe ran a worker through that policy and the hashed asset
|
|
9766
|
+
server, while CSP denied a second loopback origin. The original v1 and v2
|
|
9767
|
+
profiles still deny workers. This is not a provisioned StillMade worker test,
|
|
9768
|
+
CanvasCode's own worker behavior has not passed runtime review, and its full
|
|
9769
|
+
application import remains uninstalled.
|
|
9770
|
+
|
|
9466
9771
|
### Choose an actual runtime
|
|
9467
9772
|
|
|
9468
9773
|
| Source | Current boundary |
|
|
@@ -9480,6 +9785,18 @@ adapter. The exact reviewed Method Draw source has a private desktop install,
|
|
|
9480
9785
|
editing and SVG export path. Other applications require separate source,
|
|
9481
9786
|
runtime and result review; package validation alone is insufficient.
|
|
9482
9787
|
|
|
9788
|
+
The separate Natron ARM64 development build (repository evidence `artifacts/repository-acceptance/natron-native-gui-dev-build-2026-09-29.json`)
|
|
9789
|
+
shows that a Qt5/PySide2 native GUI can compile and open in a local VM after
|
|
9790
|
+
architecture and Python-home adaptation. Its source tree is not yet the
|
|
9791
|
+
complete sealed Git closure, and its OCIO configs and OpenFX plugins are
|
|
9792
|
+
missing. This is runtime feasibility evidence, not approval to install a
|
|
9793
|
+
GitHub-authored Block or a replacement for the full application.
|
|
9794
|
+
The later exact-source-to-GUI check (repository evidence `artifacts/repository-acceptance/natron-exact-tree-to-gui-2026-09-29.json`)
|
|
9795
|
+
replaced that archive input with the verified allowed Git closure and compiled
|
|
9796
|
+
a separate copy carrying only the recorded ARM64 patch. The GUI opened; the
|
|
9797
|
+
same binary also saved and reopened a native `.ntp` project. The missing
|
|
9798
|
+
plugins, color config and host-enforced Block contracts remain.
|
|
9799
|
+
|
|
9483
9800
|
### Keep the original appearance
|
|
9484
9801
|
|
|
9485
9802
|
For an eligible restricted view, place this option in `src/view.json`:
|
|
@@ -9512,6 +9829,13 @@ contract and the complete runtime message limits. Large or referenced media
|
|
|
9512
9829
|
still needs the host's authenticated asset resolution and materialization path;
|
|
9513
9830
|
a guest-local data/blob URL is not a durable shared asset.
|
|
9514
9831
|
|
|
9832
|
+
For browser applications with several export actions, declare which output
|
|
9833
|
+
ports each action produces. An SVG export can map to `svg` and a PNG export to
|
|
9834
|
+
`png`; mark each shared-manifest port `required:false` when another action
|
|
9835
|
+
does not return it. The host checks the exact action-to-port mapping before
|
|
9836
|
+
publishing output or storing media. A generated adapter's declaration alone
|
|
9837
|
+
does not prove either export works.
|
|
9838
|
+
|
|
9515
9839
|
Map existing app behavior to SDK input, shared-document and output interfaces.
|
|
9516
9840
|
Do not recreate the application's logic in the shared host or add a special
|
|
9517
9841
|
Block-ID branch. Persist editable state through declared host services and keep
|
|
@@ -9603,6 +9927,32 @@ automatic permission. Arbitrary development servers, native Node modules,
|
|
|
9603
9927
|
service workers, threaded WASM and full-stack backends need distinct profiles
|
|
9604
9928
|
and verified host capabilities. Existing SDK restrictions are not removed.
|
|
9605
9929
|
|
|
9930
|
+
The separately identified `desktop-browser-application/2` bundle may declare
|
|
9931
|
+
`features: {wasm:false, srcdocFrames:true}`. A trusted stage and runtime use this
|
|
9932
|
+
exact declaration to enable at most eight simultaneous direct `about:srcdoc`
|
|
9933
|
+
frames (32 over the page lifetime), with inline script needed for a preview
|
|
9934
|
+
document. Other frame URLs, nested frames, popups and local web workers remain
|
|
9935
|
+
denied. The trusted controller bootstrap runs only in the top document. This
|
|
9936
|
+
profile does not authorize ambient network requests or installation; exact
|
|
9937
|
+
source review, isolated execution and output review still apply. An authoring
|
|
9938
|
+
model can request it, but it cannot enable it by changing a prompt or manifest.
|
|
9939
|
+
|
|
9940
|
+
`desktop-browser-application/3` adds `localWorkers:true` (and an explicit
|
|
9941
|
+
`srcdocFrames` boolean). It permits only dedicated workers whose script URL
|
|
9942
|
+
exactly names a bundled JavaScript asset on the application asset server. The
|
|
9943
|
+
target policy binds each worker to the exact parent page and browser context,
|
|
9944
|
+
requires a paused attachment, installs recursive target monitoring before
|
|
9945
|
+
resume, limits active and lifetime workers, and fails the session on an unknown
|
|
9946
|
+
target or unconfirmed detach. The host-controlled CSP permits same-origin
|
|
9947
|
+
workers and same-origin connections; the asset server serves only verified
|
|
9948
|
+
bundled files. The isolated job's private network namespace remains required.
|
|
9949
|
+
Chrome does not expose `Fetch.enable` on worker CDP sessions, so worker egress
|
|
9950
|
+
is enforced by the host CSP, exact local asset server and private network
|
|
9951
|
+
boundary, not by a worker-session Fetch interceptor. Blob, remote, shared and
|
|
9952
|
+
service workers remain denied. A local Chromium probe exercises the target
|
|
9953
|
+
policy and asset server, including a denied second loopback origin. A
|
|
9954
|
+
provisioned StillMade worker run and application-level review remain required.
|
|
9955
|
+
|
|
9606
9956
|
Inspect compiled dependencies as well as asset extensions. For example, a
|
|
9607
9957
|
checked-in editor bundle may contain base64 WebAssembly or dynamically create
|
|
9608
9958
|
workers without shipping any `.wasm` file. The current asset/declaration check
|
|
@@ -9610,7 +9960,8 @@ does not prove those paths are absent. Admission must record which paths are
|
|
|
9610
9960
|
needed, and the selected runtime must enforce its CSP, target and resource
|
|
9611
9961
|
policy when code executes. A dead or explicitly unavailable feature is different
|
|
9612
9962
|
from a verified fallback. The current development Linux worker rejects declared
|
|
9613
|
-
WASM
|
|
9963
|
+
WASM; the new worker profile has not been provisioned or admitted for an
|
|
9964
|
+
installed Block.
|
|
9614
9965
|
|
|
9615
9966
|
### Adapter lifecycle and completion
|
|
9616
9967
|
|
|
@@ -9620,6 +9971,47 @@ original application APIs and controls. Keep autosave separate from explicit
|
|
|
9620
9971
|
completion; mounting a UI or retaining the original input is not evidence of
|
|
9621
9972
|
the requested transformation.
|
|
9622
9973
|
|
|
9974
|
+
For compiled applications, inspect where the original UI owns its live state.
|
|
9975
|
+
If that state is private to a bundled module, a bounded source edit may expose
|
|
9976
|
+
a data-only bridge for the Block-owned adapter. The edit must target an exact
|
|
9977
|
+
inspected pinned file and be rebuilt under the sealed source identity. The
|
|
9978
|
+
adapter should seed inputs and restore checkpoints through the original state
|
|
9979
|
+
path, then export the state changed by real UI actions. A global store bridge
|
|
9980
|
+
is not itself host storage or permission authority. Include binary project
|
|
9981
|
+
files or fail explicitly; silently dropping them makes saved state and export
|
|
9982
|
+
incomplete. Declare structured output meaning and schema so Revolver can
|
|
9983
|
+
distinguish a website-source project from arbitrary JSON. Browser-downloaded
|
|
9984
|
+
ZIP bytes are not a connected artifact until a trusted host materializer owns
|
|
9985
|
+
and validates them; a JSON/base64 field must not be presented as a ZIP.
|
|
9986
|
+
|
|
9987
|
+
The candidate reviewer can perturb a primary `plain_text` input, or insert a
|
|
9988
|
+
valid HTML comment into a primary `html_document` input, in a fresh isolated
|
|
9989
|
+
session. It compares only declared text or schema-bearing structured output
|
|
9990
|
+
ports for the same export operation. A fixed JSON project now fails this check
|
|
9991
|
+
even when its original UI and save/reopen path appear to work. An arbitrary
|
|
9992
|
+
custom text format does not receive a guessed mutation. This diagnostic checks
|
|
9993
|
+
that output responds to changed input; it does not establish that the result
|
|
9994
|
+
has the correct application-specific meaning.
|
|
9995
|
+
|
|
9996
|
+
When a Block receives an upstream value and also stores user edits, checkpoint
|
|
9997
|
+
both the editable document and the upstream value that seeded it. Reopen edits
|
|
9998
|
+
only when the mounted upstream value still matches; otherwise apply the new
|
|
9999
|
+
upstream value and rerun the original application's render path. A model must
|
|
10000
|
+
not treat the application's `localStorage` as the host's project or placement
|
|
10001
|
+
state. If rendering is debounced or asynchronous, `mount` must wait for the
|
|
10002
|
+
new result (or a real error) before acknowledging success, and `execute` must
|
|
10003
|
+
read the completed original result rather than an old preview. Runtime review
|
|
10004
|
+
should vary the input after a saved edit to catch stale-result replay.
|
|
10005
|
+
|
|
10006
|
+
Exercise original export buttons under the exact runtime CSP as well as the
|
|
10007
|
+
declared adapter operations. Displaying SVG is weaker evidence than exporting
|
|
10008
|
+
PNG: embedded XHTML `foreignObject` labels can taint the canvas when that SVG
|
|
10009
|
+
is rasterized. An adapter may repair the original action with a bounded,
|
|
10010
|
+
reviewed conversion, but must compare the visible result and downloaded bytes.
|
|
10011
|
+
An operation that succeeds while the corresponding original control fails does
|
|
10012
|
+
not establish a preserved application interface. Clipboard actions require a
|
|
10013
|
+
separate approved capability and behavioral review.
|
|
10014
|
+
|
|
9623
10015
|
`prepareBrowserApplicationMount` binds a mount request to the exact package,
|
|
9624
10016
|
bundle, input and state revision. A mount acknowledgement carries no outputs and
|
|
9625
10017
|
cannot pass execution validation.
|
|
@@ -9632,21 +10024,70 @@ current permission/state checks. `validateBrowserApplicationExecutionResult`
|
|
|
9632
10024
|
and the saved-record validator check those bindings; their result explicitly
|
|
9633
10025
|
keeps `independentlyVerified:false`. Arbitrary callers can fabricate JSON, so
|
|
9634
10026
|
these pure helpers do not authenticate evidence or authorize adoption.
|
|
10027
|
+
An application package must declare at least one typed output, and each
|
|
10028
|
+
completed operation must actually return at least one declared output even if
|
|
10029
|
+
the port is optional. A nonempty value can still be semantically wrong; review
|
|
10030
|
+
must compare representative saved and exported results with the original app.
|
|
9635
10031
|
|
|
9636
10032
|
`runBrowserApplication` requires an explicitly supplied trusted executor. It
|
|
9637
10033
|
never falls back to evaluating source in the host or treating a mounted page as
|
|
9638
10034
|
success. Cancellation and timeout signal the executor; actual process/resource
|
|
9639
10035
|
termination is the executor's responsibility and needs independent verification.
|
|
9640
10036
|
|
|
10037
|
+
### Media output candidates
|
|
10038
|
+
|
|
10039
|
+
An adapter exporting an `image` port returns actual PNG bytes as
|
|
10040
|
+
`{encoding:"base64",mimeType:"image/png",data:"..."}`. It must never return an
|
|
10041
|
+
`assetId`, `versionId`, URL or receipt of its own. The worker checks the shape
|
|
10042
|
+
and keeps the result an **untrusted candidate**. The host-side
|
|
10043
|
+
`materializeBrowserApplicationOutputs` boundary decodes and checks the image,
|
|
10044
|
+
writes it through trusted storage, reads back the exact bytes, checks the current
|
|
10045
|
+
execution revision again, and only then creates the typed image reference that
|
|
10046
|
+
Revolver can carry. Other media types still require materializers. The local
|
|
10047
|
+
worker, browser-control pipe and guest output envelope now each accept a
|
|
10048
|
+
bounded 4 MiB PNG after base64 encoding inside an 8 MiB frame; the session
|
|
10049
|
+
traffic cap is 32 MiB. Inputs and saved state retain their smaller limits.
|
|
10050
|
+
Large candidate transport was checked offline across those layers, while
|
|
10051
|
+
miniPaint's real PNG was separately decoded and materialized. A durable S3
|
|
10052
|
+
output adapter exists but is not wired into installed production execution.
|
|
10053
|
+
Installed image executions now reserve an 8 MiB aggregate maximum in the
|
|
10054
|
+
server-owned ledger before dispatch, under the account-wide lock. The
|
|
10055
|
+
reservation is compared with the account's storage-plan allotment and remains
|
|
10056
|
+
charged if dispatch becomes uncertain. A reservation proven never dispatched
|
|
10057
|
+
can be closed without consuming capacity. A completed run records verified
|
|
10058
|
+
stored bytes. This ledger measures application outputs separately from other
|
|
10059
|
+
project media; output deletion and plan-wide reconciliation still need the
|
|
10060
|
+
production lifecycle before enabling installed image exports.
|
|
10061
|
+
The desktop session now accepts a host-only `store.materializeOutputs` callback
|
|
10062
|
+
between isolated execution and completion. It rejects guest-minted image asset
|
|
10063
|
+
IDs before that callback, supplies the exact request and current authority
|
|
10064
|
+
binding, rechecks access afterward, and accepts only a valid typed result.
|
|
10065
|
+
The manager forwards this callback from trusted main-process composition; a
|
|
10066
|
+
real PNG was tested through decode, write, readback and receipt validation,
|
|
10067
|
+
including revocation after storage read. The installed HTTP host does not yet
|
|
10068
|
+
supply a media store, so this is a supported host boundary, not a production
|
|
10069
|
+
image export claim. Candidate review also lacks that store today.
|
|
10070
|
+
|
|
9641
10071
|
### Guest registration
|
|
9642
10072
|
|
|
9643
|
-
`installBrowserApplicationGuest({target,operations,messageBytes})` is the
|
|
10073
|
+
`installBrowserApplicationGuest({target,operations,messageBytes,outputBytes})` is the
|
|
9644
10074
|
framework-neutral lifecycle dispatcher for a trusted bootstrap. It installs only
|
|
9645
10075
|
`target.stillmadeApplication.register(adapter)` and returns a separate controller
|
|
9646
|
-
to that bootstrap.
|
|
10076
|
+
to that bootstrap. The host may select a larger output-only envelope up to
|
|
10077
|
+
8 MiB; the ordinary message limit still applies to inputs and saved state.
|
|
10078
|
+
It does not install a runtime or grant host access.
|
|
9647
10079
|
|
|
9648
10080
|
The Block-owned adapter registers exactly these four methods once:
|
|
9649
10081
|
|
|
10082
|
+
For a new application with several export choices, each bundle operation maps
|
|
10083
|
+
to the output ports it actually produces, for example
|
|
10084
|
+
`{id:"png.export",kind:"export",outputs:["png"]}`. Ports absent from some
|
|
10085
|
+
operations must declare `required:false` in the shared manifest. The host
|
|
10086
|
+
requires every mapped operation to return exactly its listed ports before
|
|
10087
|
+
materializing media or committing a completion. Older bundles with only
|
|
10088
|
+
`{id,kind}` retain their original contract; the new mapping is additive and
|
|
10089
|
+
does not change published package bytes.
|
|
10090
|
+
|
|
9650
10091
|
| Method | Adapter result |
|
|
9651
10092
|
| --- | --- |
|
|
9652
10093
|
| `mount({inputs,state,signal})` | Restore the original UI and return exactly `{mounted:true}`. |
|
|
@@ -9690,6 +10131,14 @@ Method Draw is being used to study the first complete static editor route.
|
|
|
9690
10131
|
Its remote fonts, global localStorage and SVG import behavior require explicit
|
|
9691
10132
|
adaptation; an original-page baseline is not a completed Block integration.
|
|
9692
10133
|
|
|
10134
|
+
The worker now has a separate **candidate-review** stage identity for an
|
|
10135
|
+
unlisted, digest-verified browser package. Its driver and unit entry are selected
|
|
10136
|
+
by trusted code, while the installed supervisor and runner retain the exact
|
|
10137
|
+
reviewed-source registry. This is the source boundary needed to test generated
|
|
10138
|
+
adapters without editing a per-repository allowlist. A root-owned review
|
|
10139
|
+
supervisor, complete behavior gate, and admission-to-install handoff are still
|
|
10140
|
+
missing; staging a candidate does not run or install it.
|
|
10141
|
+
|
|
9693
10142
|
### Reproduce the reviewed package outside the repository
|
|
9694
10143
|
|
|
9695
10144
|
The downloadable SDK zip includes `packages/block-sdk/browser-application.js`
|
|
@@ -10387,7 +10836,9 @@ copyright holders, repository commits or permission. Unresolved rights produce a
|
|
|
10387
10836
|
blocked result. Never silently license someone else's source.
|
|
10388
10837
|
|
|
10389
10838
|
Remixing is enabled by default. An explicit `remixPolicy` must permit remixing
|
|
10390
|
-
and must not set `sourceInspection: "no"`.
|
|
10839
|
+
and must not set `sourceInspection: "no"`. A Block's code is private to its creator: no one else views or downloads it,
|
|
10840
|
+
and others change it only by describing changes to StillMade's AI builder.
|
|
10841
|
+
Omit optional settings when defaults
|
|
10391
10842
|
are sufficient. The host creates the new identity, preserves the parent digest,
|
|
10392
10843
|
source and notices, and presents the ordinary builder. Creators need no extra
|
|
10393
10844
|
StillMade instructions. Project Edit retains compatible inputs and saved state;
|
|
@@ -10409,8 +10860,9 @@ remixable merely by adding metadata: they need an independent SDK implementation
|
|
|
10409
10860
|
### In StillMade
|
|
10410
10861
|
|
|
10411
10862
|
Choose **Remix Block** on an exact public Block version, or **Remix this version**
|
|
10412
|
-
in Marketplace. Sign in, review its
|
|
10413
|
-
|
|
10863
|
+
in Marketplace. Sign in, review its license and declared permissions, then
|
|
10864
|
+
confirm **Remix Block**. The code is never shown or downloadable; describe the
|
|
10865
|
+
change you want and StillMade's AI builder makes it. StillMade saves an account draft and opens Create.
|
|
10414
10866
|
Nothing is installed, published, executed or charged by creating the draft.
|
|
10415
10867
|
AI refinement edits the implementation, controls and fixtures while the host
|
|
10416
10868
|
retains and restores immutable source evidence and ancestry. Evidence is not
|
|
@@ -10418,7 +10870,10 @@ charged against the editable-source prompt limit; the package size limit still
|
|
|
10418
10870
|
applies. The resulting local Block receives the same admission checks as a
|
|
10419
10871
|
portable artifact.
|
|
10420
10872
|
The Versions tab shows ancestry and retained notices. Publishing the edited
|
|
10421
|
-
Block requires the normal validation
|
|
10873
|
+
Block requires the normal validation and rights confirmation. A remix of someone
|
|
10874
|
+
else's Block is released as a Block owned by the original creator, who keeps its
|
|
10875
|
+
code and earns from it; the remixer is credited and can use it right away. A
|
|
10876
|
+
remix is always available by link, never private.
|
|
10422
10877
|
Public Block pages link to paginated newest and top remixes of that exact version.
|
|
10423
10878
|
Top uses qualified production account counts for a 30-day window, hidden below
|
|
10424
10879
|
ten accounts and rounded down to tens. Both views fall back to newest when
|
|
@@ -10537,13 +10992,13 @@ host-coupled workspaces retain their existing restrictions.
|
|
|
10537
10992
|
- No payments, ancestor revenue allocation or provider dispatch during remix.
|
|
10538
10993
|
|
|
10539
10994
|
|
|
10540
|
-
###
|
|
10995
|
+
### Code stays private
|
|
10541
10996
|
|
|
10542
|
-
|
|
10543
|
-
|
|
10544
|
-
|
|
10545
|
-
and team visibility still determine who may
|
|
10546
|
-
|
|
10997
|
+
A Block's code is private to its creator. Nobody else can view or download it:
|
|
10998
|
+
public pages, Marketplace and remixes never show it, and the source download
|
|
10999
|
+
works only for its creator and StillMade admins. An older `sourceInspection: "no"`
|
|
11000
|
+
still keeps that Block's releases private and its remix action off. Account and team visibility still determine who may use a
|
|
11001
|
+
private package.
|
|
10547
11002
|
|
|
10548
11003
|
A source-access choice cannot replace legal evidence or revoke upstream rights.
|
|
10549
11004
|
Existing immutable releases keep their established pins and access. Newly finished
|
|
@@ -10552,7 +11007,7 @@ versions must pass the required remix, license and normal admission checks.
|
|
|
10552
11007
|
|
|
10553
11008
|
## Portable packages and repository adaptation
|
|
10554
11009
|
|
|
10555
|
-
Every finished Block must support automatic remixing through the standard SDK contract. Include complete editable runtime source/configuration, typed inputs/outputs, UI controls, fixtures, and a supported permissive manifest.license with its complete real copyright/license notice in manifest.provenance.notice (or verified portable evidence). Do not disable remixing
|
|
11010
|
+
Every finished Block must support automatic remixing through the standard SDK contract. Include complete editable runtime source/configuration, typed inputs/outputs, UI controls, fixtures, and a supported permissive manifest.license with its complete real copyright/license notice in manifest.provenance.notice (or verified portable evidence). Do not disable remixing. The code stays private to its creator; others remix only through StillMade’s AI builder. No custom remix endpoint or host callback is needed. Preserve inherited source, notices and lineage. Never invent ownership, copyright holders or permission, or apply a new license to unresolved third-party source; return unsupported with a clear licensing reason instead. The shared SDK admission validator enforces this requirement.
|
|
10556
11011
|
### Understand StillMade and its Block ecosystem
|
|
10557
11012
|
|
|
10558
11013
|
StillMade AI is an AI-assisted platform where people make things by using and
|
|
@@ -10770,9 +11225,10 @@ of the SDK URL the user supplied, not a guessed production hostname or localhost
|
|
|
10770
11225
|
- Search `/api/public-listings/discover?kind=block&search=<encoded-query>` for
|
|
10771
11226
|
Blocks, or use `kind=type` for Project Types. Follow `nextCursor` with `after`
|
|
10772
11227
|
when more results are relevant; a single page is not the complete catalog.
|
|
10773
|
-
- Use returned listing identities and versions to
|
|
10774
|
-
`/api/public-listings/<kind>/<id>/<version>/
|
|
10775
|
-
|
|
11228
|
+
- Use returned listing identities and versions to read
|
|
11229
|
+
`/api/public-listings/<kind>/<id>/<version>/metadata.json`: its name, description
|
|
11230
|
+
and typed inputs and outputs. A Block's code is private to its creator, so build
|
|
11231
|
+
on what it takes and makes, never on its source.
|
|
10776
11232
|
- In an offline SDK checkout, `packages/block-platform/catalog.js` provides bundled
|
|
10777
11233
|
first-party examples. It is a snapshot, not the complete live Marketplace.
|
|
10778
11234
|
|
|
@@ -11268,7 +11724,7 @@ Capability Blocks (`image.generate`, `video.generate`, `audio.music`, `audio.sfx
|
|
|
11268
11724
|
| `seedance-2.0-fast` | Seedance 2.0 Fast | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | 480p, 720p | auto, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | yes | yes | yes |
|
|
11269
11725
|
| `seedance-2.0-mini` | Seedance 2.0 Mini | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | 480p, 720p | auto, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | yes | yes | yes |
|
|
11270
11726
|
| `kling-v3-turbo` | Kling 3.0 Turbo | 5, 10 | model default | 16:9, 9:16, 1:1 | yes | no | no |
|
|
11271
|
-
| `wan-2.6-flash` | Wan 2.6 Flash | 3, 4, 5 | model default | 16:9, 9:16, 1:1 |
|
|
11727
|
+
| `wan-2.6-flash` | Wan 2.6 Flash | 3, 4, 5 | model default | 16:9, 9:16, 1:1 | required | no | no |
|
|
11272
11728
|
| `veo-3.1-lite` | Veo 3.1 Lite | 4, 6, 8 | 720p, 1080p | 16:9, 9:16 | yes | yes | yes |
|
|
11273
11729
|
| `vidu-q3-turbo` | Vidu Q3 Turbo | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 | model default | model default | yes | yes | yes |
|
|
11274
11730
|
| `wan-2.7` | Wan 2.7 | 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | 720p, 1080p | model default | required | yes | no |
|
|
@@ -11410,6 +11866,8 @@ The latest version of each Block bundled with the SDK, generated from the packag
|
|
|
11410
11866
|
|
|
11411
11867
|
| Block | Name | Kind | Inputs | Outputs |
|
|
11412
11868
|
| --- | --- | --- | --- | --- |
|
|
11869
|
+
| `sm.ai-decide` 1.0.0 | AI decide | task | `data` text (external_data) · primary; `rules` text (decision_rules) | `decision` object (ai_decision) · primary |
|
|
11870
|
+
| `sm.ai-write` 1.0.0 | AI write | task | `data` text (external_data) · primary; `instructions` text (writing_instructions) | `text` text (written_message) · primary |
|
|
11413
11871
|
| `sm.animated-scene` 2.3.8 | Animated Scene | workspace | `animation` scene-document (animated_scene_document) · project context only · primary; `shotPlan` shot-plan (production_shot_plan) · project context only; `updatedAnimation` scene-document (animated_scene_document); `commit` boolean (apply_changes); `generatedImage` image (image); `targetShotId` text (target_shot); `targetLayerId` text (target_layer); `attachGeneratedImage` boolean (attach_image); `action` text (animated_scene_action); `versions` metadata[] (revision_history) · project context only; `presence` metadata[] (collaborator_presence); `assets` asset[] (project_media) · project context only | `animation` scene-document (animated_scene_document) · primary; `edit` workspace-edit (workspace_edit); `qualityAction` approval (portable_media_action); `renderAction` approval (portable_media_action); `qualityReport` metadata (quality_report); `editorTimeline` timeline (editor_handoff); `revision` metadata (revision_event) |
|
|
11414
11872
|
| `sm.animated-scene-assistant` 1.0.0 | Plan Animated Scene | task | `animation` scene-document · project context only; `request` text · primary | `edit` workspace-edit · primary |
|
|
11415
11873
|
| `sm.blueprint` 2.1.9 | Blueprint | workspace | `blueprint` bible (production_blueprint) · project context only · primary; `updatedBlueprint` bible (production_blueprint); `commit` boolean (apply_changes); `assistantEdit` workspace-edit (workspace_edit); `versions` metadata[] (revision_history) · project context only; `presence` metadata[] (collaborator_presence); `assets` asset[] (project_media) · project context only | `blueprint` bible (production_blueprint) · primary; `edit` workspace-edit (workspace_edit); `shotPlan` shot-plan (shot_plan_handoff); `revision` metadata (revision_event) |
|
|
@@ -11419,6 +11877,9 @@ The latest version of each Block bundled with the SDK, generated from the packag
|
|
|
11419
11877
|
| `sm.character` 2.0.1 | Character reference | workspace | `input` text (character_description) · primary; `name` text (character_name); `role` text (character_role); `appearance` text (character_appearance); `personality` text (character_personality) | `output` character (character_reference) · primary |
|
|
11420
11878
|
| `sm.chat` 2.0.3 | Production chat | workspace | `brief` brief (production_brief) · primary | `script` script (narration_script) · primary |
|
|
11421
11879
|
| `sm.compare` 2.0.2 | Compare assets | workspace | `imageA` image (comparison_image_a) · primary; `imageB` image (comparison_image_b); `selection` text (comparison_selected_image); `position` integer (comparison_split_position) | `output` image (selected_comparison_image) · primary |
|
|
11880
|
+
| `sm.connect-app` 1.0.0 | Connect an app | task | `app` text (connected_app) · primary | `result` object (external_data) · primary |
|
|
11881
|
+
| `sm.contact-fields` 1.0.0 | Contact fields | task | `record` object (external_data) · primary | `email` text (contact_email) · primary; `first_name` text (contact_first_name); `last_name` text (contact_last_name); `full_name` text (contact_full_name); `phone` text (contact_phone); `company` text (contact_company); `city` text (contact_city); `other_answers` text (contact_other_answers) |
|
|
11882
|
+
| `sm.continue-if` 1.0.0 | Continue only if | task | `decision` object (ai_decision) · primary; `item` object (external_data); `minimum_score` integer (minimum_score) | `item` object (external_data) · primary |
|
|
11422
11883
|
| `sm.describe-media` 2.0.1 | Describe media | task | `image` image (source_image) · primary | `description` text (visual_description) · primary |
|
|
11423
11884
|
| `sm.edit-assistant` 2.0.2 | Edit Assistant | task | `timeline` timeline (timeline) · project context only · primary; `selection` timeline-range (timeline_range); `request` text (edit_request) | `edit` timeline-edit (timeline_edit_proposal) · primary |
|
|
11424
11885
|
| `sm.editor` 2.2.12 | Editor | workspace | `editor` timeline (editor_timeline) · project context only · primary; `assets` asset[] (legacy.asset-list.assets) · project context only; `updatedEditor` timeline (legacy.timeline.updatededitor); `commit` boolean (legacy.boolean.commit); `action` text (legacy.text.action); `renderFps` integer (legacy.integer.renderfps); `renderResolution` integer (legacy.integer.renderresolution); `renderQuality` text (legacy.text.renderquality) | `editor` timeline (editor_timeline) · primary; `edit` workspace-edit (legacy.workspace-edit.edit); `mediaAction` approval (portable_media_action) |
|
|
@@ -11426,13 +11887,15 @@ The latest version of each Block bundled with the SDK, generated from the packag
|
|
|
11426
11887
|
| `sm.export-timeline` 2.0.0 | Export timeline | editor-extension | `timeline` timeline · project context only · primary; `assets` asset[] · project context only; `blueprint` bible · project context only; `shotPlan` shot-plan · project context only; `metadata` metadata · project context only; `title` text; `format` text | `download` file-bundle · primary |
|
|
11427
11888
|
| `sm.export-video` 2.0.0 | Export video | task | `input` timeline (timeline) · primary; `renderFps` text (render_fps); `renderResolution` text (render_resolution); `renderQuality` text (render_quality); `projectTimeline` timeline (timeline) · project context only | `mediaAction` approval (portable_media_action); `output` video (rendered_video) |
|
|
11428
11889
|
| `sm.final-edit` 2.0.2 | AI Final Edit | task | `timeline` timeline (timeline) · project context only · primary; `direction` text (edit_direction) | `edit` timeline-edit (timeline_edit_proposal) · primary |
|
|
11429
|
-
| `sm.generate-image` 2.
|
|
11890
|
+
| `sm.generate-image` 2.1.0 | Generate image | task | `input` text · primary; `photos` image[] (reference_image) | `output` image · primary |
|
|
11430
11891
|
| `sm.generate-video` 2.0.1 | Generate video | task | `prompt` brief (video_generation_brief) · primary | `video` video (generated_video) · primary |
|
|
11431
11892
|
| `sm.grade` 2.0.2 | Color grade | editor-extension | `timeline` timeline (editor_timeline) · project context only · primary; `clipIds` text[] (timeline_clip_ids); `look` text (color_grade_look); `adjustments` json (color_grade_adjustments) | `edit` timeline-edit (timeline_edit) · primary |
|
|
11432
11893
|
| `sm.image-editor` 2.0.1 | Image editor | workspace | `input` image (source_image) · primary; `brightness` number (brightness_adjustment); `contrast` number (contrast_adjustment) | `output` image (processed_image) · primary |
|
|
11433
11894
|
| `sm.import-media` 2.0.2 | Import media | task | `files` asset[] (legacy.asset-list.files) · primary; `include` text (legacy.text.include); `duplicates` text (legacy.text.duplicates) | `assets` asset[] (legacy.asset-list.assets) · primary |
|
|
11434
11895
|
| `sm.location` 2.0.1 | Location reference | workspace | `input` text (location_description) · primary; `name` text (location_name); `visualDetails` text (location_visual_details); `timeOfDay` text (location_time); `atmosphere` text (location_atmosphere) | `output` location (location_reference) · primary |
|
|
11896
|
+
| `sm.meta-creative` 1.0.0 | Meta ad creative | task | `upload` object (external_data) · primary; `message` text (ad_primary_text); `website_url` text (ad_destination_url); `page_id` text (facebook_page_id); `call_to_action` text (ad_call_to_action) | `creative` object (meta_ad_creative) · primary |
|
|
11435
11897
|
| `sm.motion-graphics` 2.0.0 | Motion graphics | editor-extension | `timeline` timeline (timeline) · primary; `projectTimeline` timeline (timeline) · project context only; `plan` json (motion_graphics_plan) | `timeline` timeline (timeline) · primary; `edit` workspace-edit (editor_workspace_edit) |
|
|
11898
|
+
| `sm.new-items` 1.0.0 | Only new items | task | `items` object (external_data) · primary; `id_field` text (item_id_field) | `item` object (external_data) · primary; `waiting` integer (pending_item_count) |
|
|
11436
11899
|
| `sm.panel-strip` 2.3.7 | Image Panels | workspace | `panels` panel-document (image_panel_document) · project context only · primary; `transcript` transcript (timed_transcript) · project context only; `script` script (narration_script) · project context only; `blueprint` bible (production_blueprint) · project context only; `updatedPanels` panel-document (image_panel_document); `commit` boolean (apply_changes); `generatedImage` image (image); `targetPanelId` text (panel_id); `attachGeneratedImage` boolean (boolean); `action` text (host_action); `stockQuery` text (stock_query); `generatedImages` image[] (image_list) | `panels` panel-document (image_panel_document) · primary; `edit` workspace-edit (workspace_edit); `stockAction` approval (portable_media_action); `qualityAction` approval (portable_media_action); `renderAction` approval (portable_media_action); `stockAsset` asset (licensed_asset); `stockImage` image (licensed_stock_image); `qualityReport` metadata (quality_report); `generationPlan` metadata (generation_plan); `generateAction` approval (portable_media_action); `generatedImage` image (generated_image); `batchGenerateAction` approval (portable_media_action); `generatedImages` image[] (generated_image_list) |
|
|
11437
11900
|
| `sm.pipeline` 2.2.5 | Canvas | workspace | `canvas` pipeline (canvas_document) · project context only · primary; `assets` asset[] (project_assets) · project context only; `versions` metadata[] (asset_versions) · project context only; `updatedCanvas` pipeline (canvas_document); `commit` boolean (canvas_commit_intent); `generatedImage` image (generated_image_version); `addGeneratedImage` boolean (attach_generated_image); `generatedImageTitle` text (generated_image_title); `generatedVideo` video (generated_video_version); `addGeneratedVideo` boolean (attach_generated_video); `generatedVideoTitle` text (generated_video_title); `generatedAudio` audio (generated_audio_version); `addGeneratedAudio` boolean (attach_generated_audio); `generatedAudioTitle` text (generated_audio_title); `connectionProposal` json (context_connection_proposal); `applyContextConnections` boolean (context_connection_intent) | `canvas` pipeline (canvas_document) · primary; `edit` workspace-edit (canvas_edit_proposal) |
|
|
11438
11901
|
| `sm.quality-audit` 1.0.2 | Quality review plan | task | `assets` asset[] (saved_asset_versions) · project context only · primary | `plan` metadata (visual_quality_review_plan) · primary |
|
|
@@ -11448,14 +11911,16 @@ The latest version of each Block bundled with the SDK, generated from the packag
|
|
|
11448
11911
|
| `sm.transcribe` 2.0.1 | Transcription | task | `audio` audio (source_audio) · primary; `language` text (transcription_language) | `transcript` transcript (transcript_text) · primary |
|
|
11449
11912
|
| `sm.transition` 2.0.2 | Transition | editor-extension | `timeline` timeline (editor_timeline) · project context only · primary; `clipIds` text[] (timeline_clip_ids); `transition` text (timeline_transition_type); `duration` number (timeline_transition_duration); `soundOn` boolean (timeline_transition_sound_enabled); `soundId` text (timeline_transition_sound_id) | `edit` timeline-edit (timeline_edit) · primary |
|
|
11450
11913
|
| `sm.video-assets` 2.1.4 | Video Assets | workspace | `assets` asset[] (media_collection) · project context only · primary; `versions` metadata[] (media_version_history) · project context only; `incoming` asset[] (media_collection); `kind` text (media_filter); `selectedIds` text (media_selection); `selectedVersions` text (media_version_selection) | `output` asset[] (production_media) · primary |
|
|
11451
|
-
| `sm.voiceover` 2.1.
|
|
11914
|
+
| `sm.voiceover` 2.1.6 | Voiceover | workspace | `input` script (narration_script) · primary; `take` audio (narration_audio); `library` asset[] (project_media) · project context only; `timing` transcript (timed_transcript) · project context only | `output` audio (narration_audio) · primary |
|
|
11915
|
+
| `sm.when` 1.0.0 | When | task | `event` object (workflow_event) | `trigger` object (automation_trigger) · primary |
|
|
11452
11916
|
| `sm.whiteboard-assistant` 1.0.0 | Build Whiteboard | task | `board` board-document · project context only; `request` text · primary | `edit` workspace-edit · primary |
|
|
11917
|
+
| `sm.write-summary` 1.0.0 | Write summary | task | `data` text (external_data) · primary | `summary` text (summary_report) · primary |
|
|
11453
11918
|
| `sm.youtube` 2.0.0 | YouTube publication | task | `video` video (finished_video) · primary; `title` text; `description` text; `tags` text; `visibility` text; `publishAt` text; `madeForKids` boolean; `aiGenerated` boolean | `uploadAction` approval (portable_media_action); `publication` json (youtube_publication) |
|
|
11454
|
-
| `stillmade.occasion-story` 1.0.
|
|
11455
|
-
| `stillmade.photo-reel-composer` 1.0.
|
|
11919
|
+
| `stillmade.occasion-story` 1.0.2 | Occasion Story | task | `assets` asset[] (legacy.asset-list.assets) · primary; `occasion` text (stillmade.occasion_story.occasion); `title` text (stillmade.occasion_story.title); `ending` text (stillmade.occasion_story.ending); `notes` text (stillmade.occasion_story.notes); `selections` text (stillmade.occasion_story.selections); `music` audio[] (stillmade.occasion_story.music); `musicVolume` number (stillmade.occasion_story.musicvolume); `muteVideoAudio` boolean (stillmade.occasion_story.mutevideoaudio); `aspect` text (stillmade.occasion_story.aspect); `disclosure` text (stillmade.occasion_story.disclosure) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.occasion_story.review) |
|
|
11920
|
+
| `stillmade.photo-reel-composer` 1.0.1 | Photo Reel Composer | task | `assets` asset[] (legacy.asset-list.assets) · primary; `purpose` text (stillmade.photo_reel.purpose); `title` text (stillmade.photo_reel.title); `captions` text (stillmade.photo_reel.captions); `cta` text (stillmade.photo_reel.cta); `contact` text (stillmade.photo_reel.contact); `demoDisclosure` text (stillmade.photo_reel.demodisclosure); `duration` number (stillmade.photo_reel.duration); `aspect` text (stillmade.photo_reel.aspect); `logo` asset[] (stillmade.photo_reel.logo); `music` asset[] (stillmade.photo_reel.music) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.photo_reel.review); `provenance` json (stillmade.photo_reel.provenance) |
|
|
11456
11921
|
| `stillmade.product-ad-variants` 1.0.0 | Product Ad Variants | task | `timeline` timeline (legacy.timeline.updatededitor) · primary; `hookA` text (stillmade.product_ad_variants.hooka); `hookB` text (stillmade.product_ad_variants.hookb); `hookC` text (stillmade.product_ad_variants.hookc); `openingA` number (stillmade.product_ad_variants.openinga); `openingB` number (stillmade.product_ad_variants.openingb); `openingC` number (stillmade.product_ad_variants.openingc); `openingDuration` number (stillmade.product_ad_variants.openingduration); `copyApproved` boolean (stillmade.product_ad_variants.copyapproved) | `variantA` timeline (legacy.timeline.updatededitor) · primary; `variantB` timeline (legacy.timeline.updatededitor); `variantC` timeline (legacy.timeline.updatededitor); `review` json (stillmade.product_ad_variants.review) |
|
|
11457
|
-
| `stillmade.release-visuals` 1.0.
|
|
11458
|
-
| `stillmade.short-form-finish` 1.0.
|
|
11922
|
+
| `stillmade.release-visuals` 1.0.2 | Release Visuals | task | `assets` asset[] (legacy.asset-list.assets) · primary; `purpose` text (stillmade.release_visuals.purpose); `title` text (stillmade.release_visuals.title); `artist` text (stillmade.release_visuals.artist); `cta` text (stillmade.release_visuals.cta); `duration` number (stillmade.release_visuals.duration); `songVolume` number (stillmade.release_visuals.songvolume); `offset` number (stillmade.release_visuals.offset); `lyrics` text (stillmade.release_visuals.lyrics); `aspect` text (stillmade.release_visuals.aspect); `disclosure` text (stillmade.release_visuals.disclosure) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.release_visuals.review) |
|
|
11923
|
+
| `stillmade.short-form-finish` 1.0.3 | Short-form Finish | task | `assets` video[] (legacy.asset-list.assets) · primary; `music` audio[] (legacy.asset-list.assets); `audioMode` text (stillmade.short_form.audiomode); `speechVolume` number (stillmade.short_form.speechvolume); `purpose` text (stillmade.short_form.purpose); `cuts` text (stillmade.short_form.cuts); `subtitles` text (stillmade.short_form.subtitles); `title` text (stillmade.short_form.title); `byline` text (stillmade.short_form.byline); `cta` text (stillmade.short_form.cta); `disclosure` text (stillmade.short_form.disclosure); `captionStyle` text (stillmade.short_form.captionstyle); `aspect` text (stillmade.short_form.aspect); `fit` text (stillmade.short_form.fit); `cropX` number (stillmade.short_form.cropx) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.short_form.review) |
|
|
11459
11924
|
|
|
11460
11925
|
## Custom view rules
|
|
11461
11926
|
|