stillmade-sdk 0.1.41 → 0.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/.stillmade/sdk-baseline.json +19 -21
  2. package/AGENTS.md +17 -12
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +67 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +42 -32
  8. package/README.md +3 -2
  9. package/SDK.md +1028 -563
  10. package/UI_AESTHETIC.md +30 -3
  11. package/blocks/generate/package.js +1 -0
  12. package/blocks/generate/versions/1.0.0/package.js +463 -0
  13. package/docs/build/audio-to-editor.md +36 -0
  14. package/docs/build/block-builder-contract.md +150 -0
  15. package/docs/build/comfyui.md +227 -0
  16. package/docs/build/concepts.md +40 -0
  17. package/docs/build/context.md +159 -0
  18. package/docs/build/cookbook.md +57 -0
  19. package/docs/build/custom-interface.md +617 -0
  20. package/docs/build/data-types.md +83 -0
  21. package/docs/build/frame-views.md +259 -0
  22. package/docs/build/generate-media.md +59 -0
  23. package/docs/build/github-applications.md +314 -0
  24. package/docs/build/hosted-images.md +214 -0
  25. package/docs/build/hosted-music.md +39 -0
  26. package/docs/build/hosted-speech.md +157 -0
  27. package/docs/build/hosted-text.md +246 -0
  28. package/docs/build/image-description.md +49 -0
  29. package/docs/build/interface-design.md +343 -0
  30. package/docs/build/javascript.md +63 -0
  31. package/docs/build/local-preview.md +61 -0
  32. package/docs/build/media-analysis.md +27 -0
  33. package/docs/build/media.md +400 -0
  34. package/docs/build/mobile-ui.md +106 -0
  35. package/docs/build/modules.md +487 -0
  36. package/docs/build/original-blocks.md +70 -0
  37. package/docs/build/outside-apis.md +128 -0
  38. package/docs/build/production-context-templates.md +12 -0
  39. package/docs/build/project-storage.md +94 -0
  40. package/docs/build/quickstart.md +48 -0
  41. package/docs/build/recipes.md +103 -0
  42. package/docs/build/script-handoff.md +45 -0
  43. package/docs/build/script-writer.md +34 -0
  44. package/docs/build/state.md +223 -0
  45. package/docs/build/testing.md +112 -0
  46. package/docs/build/timeline-edits.md +116 -0
  47. package/docs/build/timeline-proposals.md +76 -0
  48. package/docs/build/transcription.md +59 -0
  49. package/docs/build/triggers.md +59 -0
  50. package/docs/build/tutorial.md +52 -0
  51. package/docs/build/typescript.md +34 -0
  52. package/docs/build/video-generation.md +61 -0
  53. package/docs/build/web-reading.md +37 -0
  54. package/docs/build/with-your-ai.md +27 -0
  55. package/docs/changelog.md +9 -0
  56. package/docs/creators.md +21 -0
  57. package/docs/distribute/discovery.md +43 -0
  58. package/docs/distribute/imports.md +58 -0
  59. package/docs/distribute/publishing.md +29 -0
  60. package/docs/distribute/sdk-versions.md +36 -0
  61. package/docs/distribute/selling.md +14 -0
  62. package/docs/distribute/teams.md +60 -0
  63. package/docs/distribute/versioning.md +28 -0
  64. package/docs/examples.md +23 -0
  65. package/docs/gallery.md +26 -0
  66. package/docs/index.md +50 -0
  67. package/docs/native-mcp.md +307 -0
  68. package/docs/project-types/automation.md +43 -0
  69. package/docs/project-types/batches.md +50 -0
  70. package/docs/project-types/build.md +42 -0
  71. package/docs/project-types/completion.md +15 -0
  72. package/docs/project-types/conditions.md +21 -0
  73. package/docs/project-types/hosted-review.md +115 -0
  74. package/docs/project-types/onboarding.md +75 -0
  75. package/docs/project-types/running.md +309 -0
  76. package/docs/project-types/testing.md +72 -0
  77. package/docs/reference/application-artifacts.md +87 -0
  78. package/docs/reference/authoring-guide.md +134 -0
  79. package/docs/reference/browser-applications.md +267 -0
  80. package/docs/reference/capabilities.md +45 -0
  81. package/docs/reference/cli.md +71 -0
  82. package/docs/reference/connection-api.md +59 -0
  83. package/docs/reference/cooperative-jobs.md +13 -0
  84. package/docs/reference/desktop-capabilities.md +172 -0
  85. package/docs/reference/desktop-execution.md +77 -0
  86. package/docs/reference/errors.md +233 -0
  87. package/docs/reference/execution.md +800 -0
  88. package/docs/reference/first-party-blocks.md +40 -0
  89. package/docs/reference/generation-models.md +59 -0
  90. package/docs/reference/limits.md +306 -0
  91. package/docs/reference/manifest-kinds-controls.md +36 -0
  92. package/docs/reference/manifest.md +181 -0
  93. package/docs/reference/operations.md +36 -0
  94. package/docs/reference/package-jobs.md +35 -0
  95. package/docs/reference/parity.md +55 -0
  96. package/docs/reference/permissions.md +86 -0
  97. package/docs/reference/ports.md +26 -0
  98. package/docs/reference/types.md +268 -0
  99. package/docs/reference/universal-resolver.md +303 -0
  100. package/docs/reference/view-bridge.md +60 -0
  101. package/docs/reference/view-rules.md +15 -0
  102. package/docs/reference/workspace-sync.md +25 -0
  103. package/docs/sdk.md +34 -0
  104. package/docs/tools/block-remix.md +211 -0
  105. package/docs/tools/llm.md +2213 -0
  106. package/docs/tools/repository-adaptation.md +613 -0
  107. package/examples/check-clip.stillmade.json +8 -1
  108. package/examples/clean-text.stillmade.json +4 -0
  109. package/examples/custom-interface.stillmade.json +4 -0
  110. package/examples/describe-image.stillmade.json +4 -0
  111. package/examples/foley-cue.stillmade.json +4 -0
  112. package/examples/generate-image.stillmade.json +4 -0
  113. package/examples/generate-video.stillmade.json +10 -2
  114. package/examples/module-word-stats/stillmade.block.json +4 -0
  115. package/examples/narrate-script.stillmade.json +4 -0
  116. package/examples/numbered-takes.stillmade.json +4 -0
  117. package/examples/research-topic.stillmade.json +9 -1
  118. package/examples/score-a-scene.stillmade.json +4 -0
  119. package/examples/script-draft.stillmade.json +4 -0
  120. package/examples/summarize-page.stillmade.json +4 -0
  121. package/examples/text-workflow.stillmade.json +7 -32
  122. package/examples/thicken-lines.stillmade.json +4 -0
  123. package/examples/timeline-polish.stillmade.json +15 -3
  124. package/examples/transcribe-audio.stillmade.json +15 -3
  125. package/examples/word-count.stillmade.json +4 -0
  126. package/package.json +1 -1
  127. package/packages/block-cli/cli.js +13 -6
  128. package/packages/block-cli/dev-host/assets/host.js +81 -38
  129. package/packages/block-cli/dev-host/assets/index.css +1 -1
  130. package/packages/block-cli/format.js +1 -1
  131. package/packages/block-cli/ready-gate.js +4 -0
  132. package/packages/block-cli/templates.js +37 -19
  133. package/packages/block-cli/type-packages.js +119 -0
  134. package/packages/block-platform/block-readiness.js +8 -1
  135. package/packages/block-platform/canvas.js +2 -1
  136. package/packages/block-platform/catalog.js +27 -48
  137. package/packages/block-platform/native-host-inventory.js +0 -226
  138. package/packages/block-platform/plain-descriptions.js +1 -25
  139. package/packages/block-platform/project-type-starters.js +13 -53
  140. package/packages/block-platform/script-handoff.js +2 -4
  141. package/packages/block-platform/type-workspace.js +2 -0
  142. package/packages/block-sdk/appearance.js +3 -1
  143. package/packages/block-sdk/audio-generation-example.js +2 -2
  144. package/packages/block-sdk/block-tier.js +1 -1
  145. package/packages/block-sdk/builder-contract.js +13 -11
  146. package/packages/block-sdk/capabilities.js +1 -1
  147. package/packages/block-sdk/capability-example.js +1 -1
  148. package/packages/block-sdk/contracts.js +6 -2
  149. package/packages/block-sdk/examples.js +3 -3
  150. package/packages/block-sdk/first-party-identities.js +1 -84
  151. package/packages/block-sdk/first-party-packages.js +3 -85
  152. package/packages/block-sdk/generation-catalog.js +15 -3
  153. package/packages/block-sdk/image-description-example.js +1 -1
  154. package/packages/block-sdk/image-generation-example.js +1 -1
  155. package/packages/block-sdk/index.d.ts +2 -1
  156. package/packages/block-sdk/media-analysis-example.js +2 -2
  157. package/packages/block-sdk/mock-host.js +7 -1
  158. package/packages/block-sdk/module-example.js +1 -1
  159. package/packages/block-sdk/module-host-calls.js +35 -10
  160. package/packages/block-sdk/module-hosted.js +15 -2
  161. package/packages/block-sdk/module-media-access.js +71 -0
  162. package/packages/block-sdk/module-node.js +1 -1
  163. package/packages/block-sdk/portable-media-actions.js +1 -1
  164. package/packages/block-sdk/runtime.js +1 -1
  165. package/packages/block-sdk/speech-example.js +1 -1
  166. package/packages/block-sdk/state-example.js +1 -1
  167. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  168. package/packages/block-sdk/transcription-example.js +1 -1
  169. package/packages/block-sdk/trigger-examples.js +2 -2
  170. package/packages/block-sdk/video-generation-example.js +1 -1
  171. package/packages/block-sdk/view-bridge.js +4 -1
  172. package/packages/block-sdk/view-design.js +44 -15
  173. package/packages/block-sdk/web-example.js +2 -2
  174. package/packages/design-system/block-kit.css +53 -12
  175. package/packages/design-system/block-kit.html +3 -2
  176. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  177. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  178. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  179. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  180. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  181. package/blocks/narration/package.js +0 -1
  182. package/blocks/narration/versions/1.0.0/package.js +0 -221
  183. package/blocks/narration/versions/1.0.1/package.js +0 -221
  184. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  185. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  186. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  187. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  188. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  189. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  190. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  191. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  192. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  193. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  194. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  195. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  196. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  197. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  198. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  199. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  200. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  201. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  202. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  203. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  204. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  205. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  206. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  207. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  208. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  209. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  210. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  211. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  212. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  213. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  214. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  215. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  216. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  217. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  218. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  219. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  220. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  221. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  222. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  223. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  224. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  225. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  226. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  227. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  228. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  229. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  230. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  231. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  232. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  233. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  234. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  235. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  236. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  237. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  238. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  239. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  240. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  241. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  242. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  243. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  244. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  245. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  246. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  247. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  248. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  249. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  250. package/blocks/occasion-story/package.js +0 -1
  251. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  252. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  253. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  254. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  255. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  256. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  257. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  258. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  259. package/blocks/release-visuals/package.js +0 -1
  260. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  261. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  262. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  263. package/blocks/screen-recorder/package.js +0 -1
  264. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  265. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  266. package/blocks/short-form-finish/package.js +0 -1
  267. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  268. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  269. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  270. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  271. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  272. package/examples/saas-product-launch.stillmade.json +0 -304
  273. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  274. package/packages/block-platform/first-revenue-project-types.js +0 -46
  275. package/packages/block-platform/fixture-starters.js +0 -13
  276. package/packages/block-platform/launch-project-source.js +0 -10
  277. package/packages/block-platform/launch-project.js +0 -30
  278. package/packages/block-platform/motion-project-types.js +0 -55
  279. package/packages/block-platform/motion-starters.js +0 -14
  280. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  281. package/packages/block-platform/product-launch-updated.js +0 -90
  282. package/packages/block-platform/revenue-review-project-types.js +0 -36
  283. package/packages/block-platform/revenue-review-starters.js +0 -13
  284. package/packages/block-platform/script-writer.js +0 -29
  285. package/packages/block-platform/website-source-block.js +0 -14
@@ -0,0 +1,157 @@
1
+ # Hosted speech generation
2
+
3
+ Use `runtime: "capability"` and `operation: "audio.speech"` to turn up to 3,800
4
+ characters of supplied text into one speech recording. This operation speaks
5
+ the supplied text; it does not draft a script or run another generation first.
6
+ The package contains no provider, payment method, endpoint, credentials, or
7
+ execution receipts. It may suggest a voice and speed; StillMade selects and
8
+ confirms the final choice outside the package and its optional sandboxed
9
+ interface.
10
+
11
+ ### Package and declaration
12
+
13
+ Download [the complete Narrate a script package](https://stillmade.shop/block-sdk/examples/narrate-script.stillmade.json).
14
+ The offline SDK also includes `packages/block-sdk/speech-example.js`, exporting
15
+ `audioSpeech`. Copy the example, choose your own namespace, and edit its fixtures:
16
+
17
+ ```sh
18
+ node packages/block-cli/cli.js validate examples/narrate-script.stillmade.json
19
+ node packages/block-cli/cli.js pack examples/narrate-script.stillmade.json narrate-script.stillmade.json
20
+ ```
21
+
22
+ The package has `manifest`, `capability`, `tests`, and optional `view`. Its
23
+ manifest declares exactly one primary input of type `text` or `script`, exactly
24
+ one primary output of type `audio`, and:
25
+
26
+ ```json
27
+ {"project":[],"capabilities":["audio.speech"],"network":[],"filesystem":[],"secrets":[]}
28
+ ```
29
+
30
+ The capability object has these four fields; the input and output names
31
+ must match its declared ports:
32
+
33
+ ```json
34
+ {"schemaVersion":1,"operation":"audio.speech","text":{"$input":"script"},"output":"audio"}
35
+ ```
36
+
37
+ It may add `settings` with a suggested StillMade catalog voice and speed. The
38
+ dialog preselects them when that voice is available, and the person running the
39
+ Block can still change both:
40
+
41
+ ```json
42
+ {"schemaVersion":1,"operation":"audio.speech","text":{"$input":"script"},"output":"audio","settings":{"voice":"asteria","speed":1.1}}
43
+ ```
44
+
45
+ `voice` is a catalog voice id (lowercase letters, digits, `-` or `_`) and
46
+ `speed` is 0.25 to 4. See [Generation models](../reference/generation-models.md)
47
+ for the voice list.
48
+
49
+ A text input is a string. A script input contains
50
+ `{"schemaVersion":1,"text":"Words to speak."}`. Only its `text` is forwarded;
51
+ extra structured script fields cannot select a voice or add provider settings.
52
+ Text must be nonblank and at most 3,800 characters. Oversized text is rejected,
53
+ not silently truncated. A default is permitted; scoped script context still
54
+ requires `context.script.read`. Declare generic primary ports unless a matching
55
+ semantic role is needed by a particular downstream contract.
56
+
57
+ ### Audio output and fixture expectations
58
+
59
+ StillMade catalog voices return the provider's measured MP3 or WAV, stored
60
+ byte for byte (schema 3 receipts, any sample rate, mono or stereo). The OpenAI
61
+ TTS-1 path normalizes and stores 16-bit PCM WAV at 24,000 Hz, mono. Either way
62
+ the output is a reference with exactly these fields, using host-created
63
+ identities and a saved HTTPS or host media URL:
64
+
65
+ ```json
66
+ {
67
+ "kind":"audio","assetId":"speech-run-one","versionId":"v1",
68
+ "url":"/api/media/owner/speech-one.wav","mimeType":"audio/wav",
69
+ "duration":1,"bytes":48044,"sampleRate":24000,"channels":1
70
+ }
71
+ ```
72
+
73
+ This reference is illustrative; it is not a generated file or execution receipt.
74
+ `duration` is measured from the actual PCM sample count; `bytes` includes the
75
+ canonical WAV header. Audio must be nonempty, at most 64 MiB (67,108,864 bytes),
76
+ and at most 1,400 seconds. The SDK validates finite bounds and the exact shape;
77
+ metadata alone cannot establish that bytes exist, are WAV, or belong to a user.
78
+ The host performs byte checks and stores a separate bound media receipt.
79
+
80
+ Include 1–3 fixtures using expectations, never an exact output or a fabricated
81
+ audio reference. Each expectation requires exactly `kind`, `format`,
82
+ `minDuration`, `maxDuration`, `minBytes`, and `maxBytes`:
83
+
84
+ ```json
85
+ {
86
+ "name":"Read a short welcome",
87
+ "input":{"script":{"schemaVersion":1,"text":"Welcome to the quiet forest."}},
88
+ "expectations":{"audio":{"kind":"audio","format":"wav","minDuration":0.1,"maxDuration":30,"minBytes":46,"maxBytes":1500000}}
89
+ }
90
+ ```
91
+
92
+ Duration bounds are finite seconds with `0 <= minDuration <= maxDuration <= 1400`
93
+ and a positive maximum. Byte bounds are integers with
94
+ `46 <= minBytes <= maxBytes <= 67108864`. Bounds are inclusive. These checks do
95
+ not transcribe the output, assess pronunciation, or verify a speaker's identity.
96
+
97
+ ### Review, listen, and accept
98
+
99
+ Importing source and requesting **Review cost** do not generate audio. The host
100
+ dialog offers **StillMade voices**, the same catalog the app's Voiceover uses
101
+ (Deepgram, ElevenLabs, OpenAI and Kokoro voices configured on the server), paid
102
+ with StillMade credits at the Voiceover price for the text's length. It also
103
+ offers OpenAI TTS-1 with credits or your own key, and a speed from 0.25× to 4×.
104
+ Keys remain in the host's encrypted account vault. BYOK uses the account's
105
+ OpenAI key; missing keys never switch to credits.
106
+ Changing text, source, model, voice, speed, or price requires a new quote.
107
+
108
+ Review the displayed input, voice, speed, cost for every fixture and the separate
109
+ sample, and the total before choosing **Run tests and sample**. Each approved
110
+ invocation produces its own recording and receipt. Listen to the AI-generated
111
+ audio before choosing **Finish review**, then **Confirm Import** to install the
112
+ Block. A project run has its own **Run in project** confirmation and **Use this
113
+ audio** acceptance. The shared ledger binds source, inputs, account, project,
114
+ voice, speed, payment, quote, and retained outputs. Uncertain submissions are
115
+ not automatically repeated; recovering status does not itself generate audio.
116
+
117
+ The result is a typed audio output and a playable Block result. After accepting
118
+ a confirmed project speech run, open **Media** in the Editor and find **Audio
119
+ from Blocks** to listen and explicitly **Add at playhead**. See [Add speech to the Editor](audio-to-editor.md).
120
+ Generic audio outputs can also connect to compatible SDK audio inputs.
121
+
122
+ Adding audio to the Editor does not create or select a native Voiceover take,
123
+ replace its master recording or narration, or create word timings or a
124
+ transcript. Voiceover's primary input remains `script`; the Editor action does
125
+ not introduce an audio-to-Voiceover connection. A sandboxed view may request
126
+ `StillMade.run`, which opens the host approval flow; there is no guest
127
+ `previewAudio`, timeline mutation, or provider API.
128
+
129
+ ### Validation status and host integration
130
+
131
+ No live provider speech test has been completed for this implementation.
132
+ Schema, fixture-contract, and host-boundary tests use synthetic inputs and
133
+ explicit mocks. They do not claim successful provider speech generation. Every
134
+ installation still requires the actual host fixtures, sample, playback review,
135
+ and import confirmation for the selected account and settings.
136
+
137
+ Offline `validate` and `pack` work without a key. `pack` reports `tests: 0`,
138
+ `reviewRequired: true`, and `liveVerified: false`. Offline `test` and `preview`
139
+ return `RUNTIME_UNAVAILABLE`; they do not fetch speech or return placeholders.
140
+
141
+ `prepareCapabilityInvocation(pkg, input)` returns exactly
142
+ `{operation:"audio.speech",text}`. The trusted host executes the separately
143
+ approved request and calls `capabilityOutputs(pkg, canonicalAudioReference)`.
144
+ `capabilityOperation(manifest)` distinguishes text, speech and image contracts;
145
+ `defaultCapabilityExpectations(manifest)` supplies their bounded default checks.
146
+ The existing `validateCapabilityExpectations`, `testCapabilityOutputs`, and
147
+ `validateCapabilityResult` dispatch through the declared operation.
148
+
149
+ A trusted speech executor may return `{outputs, metadata, mediaReceipts}`.
150
+ `mediaReceipts` is keyed by the exact audio output name. Its receipt has exactly
151
+ `schemaVersion:1`, `kind:"audio"`, `ownerId`, `runId`, `index`, `storageKey`,
152
+ `sha256`, and the canonical reference's `assetId`, `versionId`, `url`,
153
+ `mimeType`, `duration`, `bytes`, `sampleRate`, and `channels`. The SDK validates
154
+ shape, index 0–3, hash syntax, and equality to the output, and preserves a copy.
155
+ The authenticated host client must additionally verify account/run identity;
156
+ package code and custom interfaces cannot submit receipts as execution evidence.
157
+ Optional metadata remains bounded to 8 KiB and is not proof of generation.
@@ -0,0 +1,246 @@
1
+ # Hosted text generation
2
+
3
+ Use `runtime: "capability"` to implement a portable Block that asks StillMade to
4
+ generate text. The package declares the prompt, instructions, output contract,
5
+ and fixtures. StillMade owns account authentication, model choice, provider
6
+ keys, cost confirmation, and execution. This is a separate declarative runtime;
7
+ `fetch`, `ctx.capabilities`, and arbitrary host calls remain unavailable inside
8
+ JavaScript Blocks.
9
+
10
+ ### Create and package
11
+
12
+ ```sh
13
+ node packages/block-cli/cli.js create ./script-draft capability
14
+ node packages/block-cli/cli.js validate ./script-draft
15
+ node packages/block-cli/cli.js pack ./script-draft script-draft.stillmade.json
16
+ ```
17
+
18
+ The folder contains `stillmade.block.json`, `src/capability.json`, and
19
+ `tests/fixtures.json`. A packed JSON contains `{manifest, capability, tests}`
20
+ and may include a sandboxed `view`. No provider key, endpoint, model, billing
21
+ selection, or receipt belongs in the package. Those fields are rejected.
22
+
23
+ Download [the complete script-draft example](https://stillmade.shop/block-sdk/examples/script-draft.stillmade.json).
24
+ Its manifest uses `entry: "src/capability.json"`, one primary `prompt` input of
25
+ type `text`, one primary `script` output of type `script`, and:
26
+
27
+ ```json
28
+ {"project":[],"capabilities":["text.generate"],"network":[],"filesystem":[],"secrets":[]}
29
+ ```
30
+
31
+ Its capability declaration is:
32
+
33
+ ```json
34
+ {
35
+ "schemaVersion": 1,
36
+ "operation": "text.generate",
37
+ "prompt": {"$input": "prompt"},
38
+ "system": "Write a concise narration script. Return only the script text.",
39
+ "maxTokens": 1200,
40
+ "output": "script"
41
+ }
42
+ ```
43
+
44
+ Declare exactly one prompt input (`text`, `script`, or `brief`) and exactly one
45
+ output (`text`, `script`, `json`, or a structured `object`).
46
+
47
+ An optional second `text` input can carry the user's own instructions, such as
48
+ decision rules or what to write: name it in `"prompt": {"$input": "data",
49
+ "$instructions": "rules"}`. StillMade sends `Instructions:` then `Input:`.
50
+
51
+ For a structured answer, declare one `object` output with a flat `schema` of up
52
+ to 20 `string`, `number`, `integer` or `boolean` fields, for example
53
+ `{"yes":"boolean","score":"integer","label":"string","reason":"string"}`.
54
+ StillMade asks the model for exactly one JSON object with those fields, accepts
55
+ the common `"85"` and `"true"` string forms, drops undeclared fields and fails the
56
+ run when a field is missing. Fixtures for an object output use
57
+ `{"kind":"object"}`; the declared fields are always checked. Later Steps can use
58
+ the fields directly, for example with "Continue only if". Structured prompt inputs contain
59
+ `{"schemaVersion":1,"text":"..."}`. A generated script returns that same
60
+ structured shape; a text output returns a string. Typed ports, primary markers,
61
+ semantic roles, and scoped project context retain their SDK meaning. A context
62
+ prompt needs its declared read permission and fresh authorized project snapshot.
63
+ Do not infer scene or character structure from an unstructured generated script.
64
+
65
+ Up to three other read-only inputs (for example the saved project script) can
66
+ also reach the model: list them in the descriptor as `"context": ["script"]`.
67
+ StillMade appends their current values after the prompt as delimited data the
68
+ model is told never to treat as instructions, and the review covers that exact
69
+ text. An input that is not listed (one a custom view only displays) is never
70
+ sent.
71
+
72
+ Generated `text` and `script` outputs state only what the run was given. Before
73
+ the result reaches a Step, the host removes each sentence that names a phone
74
+ number, web address or email, an inspection, certification, warranty or
75
+ vehicle-history claim, a price or a mileage figure that the run's input does not
76
+ contain (contact details written in the Block's own instructions count as given;
77
+ claim words there do not). A removed call to action becomes "Contact us today to
78
+ learn more." Line breaks are kept, and `object` and `json` outputs are not
79
+ changed. To keep such a sentence, supply the fact in an input.
80
+
81
+ #### Conversations
82
+
83
+ To continue a conversation, declare one optional `json` input for the earlier
84
+ turns and bind it as `history`:
85
+
86
+ ```json
87
+ {"schemaVersion":1,"operation":"text.generate","prompt":{"$input":"message"},
88
+ "history":{"$input":"history"},"system":"You are a friendly script coach.",
89
+ "maxTokens":800,"output":"reply"}
90
+ ```
91
+
92
+ The history value is up to 20 turns of `{"role":"user"|"assistant","content":"..."}`
93
+ (each at most 8,000 characters, 24,000 in total); StillMade sends them between
94
+ the system instructions and the prompt, and the review covers the exact turns.
95
+ Other fields and other roles are rejected. A missing history starts a fresh
96
+ conversation. A custom view or a JavaScript Step can keep the turns and pass
97
+ them back on the next run.
98
+
99
+ #### Structured replies (JSON schema)
100
+
101
+ For data instead of prose, declare a `json` output and add `schema`, the JSON
102
+ Schema the reply must match:
103
+
104
+ ```json
105
+ {"schemaVersion":1,"operation":"text.generate","prompt":{"$input":"topic"},
106
+ "system":"You plan short podcast intros.","maxTokens":800,"output":"plan",
107
+ "schema":{"type":"object","additionalProperties":false,"required":["title","script"],
108
+ "properties":{"title":{"type":"string","maxLength":80},
109
+ "script":{"type":"string","maxLength":1200},
110
+ "beats":{"type":"array","items":{"type":"string"},"minItems":3,"maxItems":6}}}}
111
+ ```
112
+
113
+ StillMade tells the model to reply with JSON matching the schema, parses the
114
+ reply (one surrounding code fence is tolerated) and checks it against the
115
+ schema before any Step receives it. A reply that does not match fails the run
116
+ with the first mismatch, for example `$.beats: needs at least 3 items`. The
117
+ output port then carries the parsed value, so a JavaScript Block downstream
118
+ reads `input.plan.title` directly.
119
+
120
+ The supported subset is `type` (one or a list of `object`, `array`, `string`,
121
+ `number`, `integer`, `boolean`, `null`), `description`, `title`, `enum`,
122
+ `properties`, `required`, `additionalProperties`, `items`, `minItems`,
123
+ `maxItems`, `minLength`, `maxLength`, `pattern`, `format` (`date`,
124
+ `date-time`, `email`, `uri`), `minimum` and `maximum`; up to 8 levels deep and
125
+ 8,192 characters. The system instructions plus the schema instruction must fit
126
+ in 8,000 characters. Fixture expectations for a json output are
127
+ `{"kind":"json"}` with optional `includes` literal phrases.
128
+
129
+ Limits: package 256 KiB; prompt 32,000 characters; system instructions 8,000
130
+ characters; generated text 32,768 characters; `maxTokens` integer 1–4096.
131
+ The operation is one text generation call. Image, audio, video, tool calling,
132
+ streaming, multi-call agent loops, and arbitrary API requests are not supported
133
+ by this declaration.
134
+
135
+ ### Fixtures and real review
136
+
137
+ Generated text varies, so fixtures use bounded expectations instead of an exact
138
+ `expected` string:
139
+
140
+ ```json
141
+ [{
142
+ "name": "A short opening narration",
143
+ "input": {"prompt":"Write two narration sentences about a quiet forest at sunrise."},
144
+ "expectations": {"script":{"kind":"script","minLength":20,"maxLength":6000}}
145
+ }]
146
+ ```
147
+
148
+ Include 1–3 fixtures. Every output has its matching `kind`, positive `minLength`,
149
+ and `maxLength` no larger than the output limit. Optional `includes` contains at
150
+ most eight required literal strings of at most 256 characters each; regular
151
+ expressions are not supported. Expectations check the declared interface and
152
+ bounded behavior, not factual correctness. Review the actual generated result.
153
+
154
+ Offline `validate` and `pack` check source only. `pack` reports `tests: 0`,
155
+ `reviewRequired: true`, and `liveVerified: false`. Offline `test` and `preview`
156
+ fail with `RUNTIME_UNAVAILABLE`; they do not invent a generation result.
157
+
158
+ Import the JSON or ZIP into StillMade. Test and preview loads available models
159
+ and payment methods. **Review cost** obtains a non-billable quote. Only the
160
+ separate **Run tests and sample** action submits one call per fixture and one
161
+ additional sample call. The host displays the complete call count and credit
162
+ cost first. BYOK uses your encrypted account OpenRouter key; provider usage is
163
+ billed by that provider and does not consume StillMade generation credits.
164
+ A missing BYOK key never silently switches to credits.
165
+
166
+ The server binds the report to your account, exact source digest, inputs,
167
+ resolved model/payment selection, quote, and execution policy. Every fixture,
168
+ the separate sample, typed outputs, and expectations must pass. Inspect the
169
+ sample and source rights, then **Confirm Import** to install. A client-supplied
170
+ `passed` flag or an LLM-written report cannot authorize import or release.
171
+ AI authoring generates and statically validates a draft; it stops for this
172
+ hosted review and does not silently run the drafted capability.
173
+
174
+ ### Run in a project and recover
175
+
176
+ Add the reviewed Block to a Project Type to make a Step. Its controls and
177
+ optional custom interface use the same host execution dialog. Guest UI cannot
178
+ choose a model, reveal keys, or confirm a quote. Existing matching review
179
+ results can be reused for project execution, but the current project input
180
+ always gets its own quote and explicit run confirmation. An expired import
181
+ review can be reused for a project only after the server revalidates its source,
182
+ selection, policy, and current project edit access.
183
+
184
+ Each confirmed request has an account-scoped UUID and durable execution record.
185
+ The host advances one invocation at a time, retains results, and makes duplicate
186
+ requests idempotent. An unknown provider outcome is not automatically submitted
187
+ again. If the creation response is lost, the host finds the original request by
188
+ its UUID without generating. Continuing an unfinished recovered review requires
189
+ another explicit Continue generation action; it advances the already confirmed
190
+ plan, not a new request. Cancellation cannot guarantee that a provider stops already submitted
191
+ work; completed results are retained, while a cancelled or stale project run
192
+ cannot be automatically accepted into the project. Failed StillMade-credit
193
+ charges use the existing idempotent refund ledger. BYOK provider charges follow
194
+ the provider account and cannot be refunded by StillMade.
195
+
196
+ A Project Type can be imported after every embedded hosted package receives its
197
+ own current account review; see [review hosted Project Types](../project-types/hosted-review.md).
198
+ This is package admission, not proof that the connected flow ran. Connected
199
+ automatic runs and unattended future-media jobs stop at the hosted capability
200
+ boundary; they do not grant advance permission for paid calls.
201
+
202
+ ### Publish a verified listing sample
203
+
204
+ After releasing the Block publicly, choose **Publish verified sample** in its
205
+ listing editor. Confirm the public display of that sample's input and output.
206
+ StillMade reuses the exact retained sample from the release review; it does not
207
+ call the provider or charge again. The source, account ownership, current runtime
208
+ policy, quarantine state, complete fixture evidence, and sample contract are
209
+ checked again. An expired import receipt or a removed API key does not invalidate
210
+ historical output. Project-run receipts cannot publish a private project sample
211
+ through this action. The stored preview records the original model and generation
212
+ time, so it is not represented as a new execution.
213
+
214
+ ### Host integration API
215
+
216
+ ```js
217
+ import {runPackageAsync, prepareCapabilityInvocation, capabilityOutputs}
218
+ from './packages/block-sdk/index.js';
219
+
220
+ const result = await runPackageAsync(pkg, input, {
221
+ capability: async (reviewedPackage, values, {signal}) => {
222
+ const request = prepareCapabilityInvocation(reviewedPackage, values);
223
+ // Trusted host: authenticate, review cost and approval, execute once,
224
+ // retain the result, then return typed outputs. Never implement this in
225
+ // package code or treat this SDK callback as proof of import review.
226
+ const text = await approvedHostTextRun(request, {signal});
227
+ return {outputs: capabilityOutputs(reviewedPackage, text)};
228
+ }
229
+ });
230
+ ```
231
+
232
+ `approvedHostTextRun` is a host integration placeholder, not an SDK function.
233
+ The SDK validates declaration and output types; StillMade's server supplies the
234
+ account receipt and billing guarantees. Optional returned metadata is bounded
235
+ to 8 KiB and is not an authorization receipt. Without a trusted executor,
236
+ `runPackageAsync` fails closed. `validateCapability`,
237
+ `prepareCapabilityInvocation`, `capabilityOutputs`,
238
+ `validateCapabilityExpectations`, and `testCapabilityOutputs` are the portable
239
+ validation helpers. They never access a provider.
240
+
241
+ StillMade's authenticated `/api/block-capabilities` routes provide options,
242
+ quotes, review creation/lookup, run creation/status/poll/cancel, and read-only
243
+ `GET /requests/:requestId` recovery. Status GETs never execute calls or reconcile
244
+ refunds; POST polling/cancellation handles those mutations. They use StillMade's
245
+ credit ledger and encrypted BYOK vault or platform model key; Block authors
246
+ configure nothing.
@@ -0,0 +1,49 @@
1
+ # Describe an image
2
+
3
+ Use `runtime: "capability"` with `operation: "image.describe"` when a Block must inspect one image and return plain text. This is the portable boundary for visual analysis: the Block declares its image input, analysis instructions, output, tests, and license; StillMade owns image loading, provider credentials, model/payment selection, approval, accounting, and the retained execution record.
4
+
5
+ **StillMade credits do not pay for `image.describe`** (since September 13, 2026). A Block that calls it runs only for people who added their own OpenRouter key in Settings → API keys, and stops for everyone else. For a Block anyone can run on StillMade credits, use `media.analyze` instead (`stillmade-block create my-block analyze-media`): it takes one image or one to four images, answers one question about each, and is priced per image. The built-in Describe media 2.1.0 and Photo notes 1.1.0 moved to it; their earlier releases stay for projects pinned to them.
6
+
7
+ The downloaded SDK includes `examples/describe-image.stillmade.json` and `packages/block-sdk/image-description-example.js`.
8
+
9
+ ```json
10
+ {
11
+ "manifest": {
12
+ "schemaVersion": 1,
13
+ "sdkVersion": "0.1.0",
14
+ "id": "example.describe-image",
15
+ "version": "1.0.0",
16
+ "name": "Describe an image",
17
+ "description": "Turn one owned image into concise production-ready visual notes.",
18
+ "kind": "task",
19
+ "runtime": "capability",
20
+ "entry": "src/capability.json",
21
+ "license": "MIT",
22
+ "inputs": {"image": {"type": "image", "primary": true}},
23
+ "outputs": {"description": {"type": "text", "primary": true, "role": "visual_description"}},
24
+ "permissions": {"project": [], "capabilities": ["image.describe"], "network": [], "filesystem": [], "secrets": []},
25
+ "ui": [{"control": "asset", "port": "image"}]
26
+ },
27
+ "capability": {
28
+ "schemaVersion": 1,
29
+ "operation": "image.describe",
30
+ "image": {"$input": "image"},
31
+ "instruction": "Describe only visibly supported subject matter, composition, lighting, color, texture, camera feel and visual style. Return concise production-ready plain text.",
32
+ "maxTokens": 700,
33
+ "output": "description"
34
+ },
35
+ "tests": [{
36
+ "name": "Blue image",
37
+ "input": {"image": {"width": 1, "height": 1, "data": [20, 80, 200, 255]}},
38
+ "expectations": {"description": {"kind": "text", "minLength": 20, "maxLength": 32768, "includes": ["blue"]}}
39
+ }]
40
+ }
41
+ ```
42
+
43
+ Declare exactly one `image` input (or one `image[]` input to describe or compare one to four images together, in order) and one `text` output. The descriptor contains exactly `schemaVersion`, `operation`, `image`, `instruction`, `maxTokens`, and `output`. `image.$input` names the declared image port. Instructions must contain 1–8,000 characters and `maxTokens` must be 1–4,096. Provider names, endpoints, keys, payment settings, arbitrary URLs, and executable code do not belong in the descriptor.
44
+
45
+ Fixture inputs may use bounded RGBA pixels for offline contract validation. Real runs use a persistent image reference selected through StillMade. The trusted host requires the referenced media to belong to the signed-in account, reads and bounds the stored bytes, canonicalizes the image to PNG, and sends that image through the exact approved provider request. Block code never receives credentials or storage access.
46
+
47
+ Tests describe nondeterministic text expectations: `kind:"text"`, ordered `minLength` and `maxLength`, and up to eight literal `includes` phrases. They do not contain fabricated descriptions presented as provider evidence. Offline validation and packaging inspect the contract and report that live review remains required. In StillMade, the creator runs every fixture and a separate sample, reviews the output, and confirms the import.
48
+
49
+ `prepareCapabilityInvocation` returns `{operation:"image.describe",image,instruction,maxTokens}`. The host returns the named text output through the same capability result, quote, review, project execution, cancellation, failure, and receipt flow used by other hosted Blocks. A completed text record proves the exact package, input, selection, and output passed validation; it does not prove that every sentence is factually correct, so the user reviews the description before using it downstream.