stillmade-sdk 0.1.42 → 0.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/.stillmade/sdk-baseline.json +6 -8
  2. package/AGENTS.md +15 -10
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +62 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +35 -25
  8. package/README.md +3 -2
  9. package/SDK.md +994 -550
  10. package/UI_AESTHETIC.md +22 -2
  11. package/blocks/generate/package.js +1 -0
  12. package/blocks/generate/versions/1.0.0/package.js +463 -0
  13. package/docs/build/audio-to-editor.md +36 -0
  14. package/docs/build/block-builder-contract.md +150 -0
  15. package/docs/build/comfyui.md +227 -0
  16. package/docs/build/concepts.md +40 -0
  17. package/docs/build/context.md +159 -0
  18. package/docs/build/cookbook.md +57 -0
  19. package/docs/build/custom-interface.md +617 -0
  20. package/docs/build/data-types.md +83 -0
  21. package/docs/build/frame-views.md +259 -0
  22. package/docs/build/generate-media.md +59 -0
  23. package/docs/build/github-applications.md +314 -0
  24. package/docs/build/hosted-images.md +214 -0
  25. package/docs/build/hosted-music.md +39 -0
  26. package/docs/build/hosted-speech.md +157 -0
  27. package/docs/build/hosted-text.md +246 -0
  28. package/docs/build/image-description.md +49 -0
  29. package/docs/build/interface-design.md +343 -0
  30. package/docs/build/javascript.md +63 -0
  31. package/docs/build/local-preview.md +61 -0
  32. package/docs/build/media-analysis.md +27 -0
  33. package/docs/build/media.md +400 -0
  34. package/docs/build/mobile-ui.md +106 -0
  35. package/docs/build/modules.md +487 -0
  36. package/docs/build/original-blocks.md +70 -0
  37. package/docs/build/outside-apis.md +128 -0
  38. package/docs/build/production-context-templates.md +12 -0
  39. package/docs/build/project-storage.md +94 -0
  40. package/docs/build/quickstart.md +48 -0
  41. package/docs/build/recipes.md +103 -0
  42. package/docs/build/script-handoff.md +45 -0
  43. package/docs/build/script-writer.md +34 -0
  44. package/docs/build/state.md +223 -0
  45. package/docs/build/testing.md +112 -0
  46. package/docs/build/timeline-edits.md +116 -0
  47. package/docs/build/timeline-proposals.md +76 -0
  48. package/docs/build/transcription.md +59 -0
  49. package/docs/build/triggers.md +59 -0
  50. package/docs/build/tutorial.md +52 -0
  51. package/docs/build/typescript.md +34 -0
  52. package/docs/build/video-generation.md +61 -0
  53. package/docs/build/web-reading.md +37 -0
  54. package/docs/build/with-your-ai.md +27 -0
  55. package/docs/changelog.md +9 -0
  56. package/docs/creators.md +21 -0
  57. package/docs/distribute/discovery.md +43 -0
  58. package/docs/distribute/imports.md +58 -0
  59. package/docs/distribute/publishing.md +29 -0
  60. package/docs/distribute/sdk-versions.md +36 -0
  61. package/docs/distribute/selling.md +14 -0
  62. package/docs/distribute/teams.md +60 -0
  63. package/docs/distribute/versioning.md +28 -0
  64. package/docs/examples.md +23 -0
  65. package/docs/gallery.md +26 -0
  66. package/docs/index.md +50 -0
  67. package/docs/native-mcp.md +307 -0
  68. package/docs/project-types/automation.md +43 -0
  69. package/docs/project-types/batches.md +50 -0
  70. package/docs/project-types/build.md +42 -0
  71. package/docs/project-types/completion.md +15 -0
  72. package/docs/project-types/conditions.md +21 -0
  73. package/docs/project-types/hosted-review.md +115 -0
  74. package/docs/project-types/onboarding.md +75 -0
  75. package/docs/project-types/running.md +309 -0
  76. package/docs/project-types/testing.md +72 -0
  77. package/docs/reference/application-artifacts.md +87 -0
  78. package/docs/reference/authoring-guide.md +134 -0
  79. package/docs/reference/browser-applications.md +267 -0
  80. package/docs/reference/capabilities.md +45 -0
  81. package/docs/reference/cli.md +71 -0
  82. package/docs/reference/connection-api.md +59 -0
  83. package/docs/reference/cooperative-jobs.md +13 -0
  84. package/docs/reference/desktop-capabilities.md +172 -0
  85. package/docs/reference/desktop-execution.md +77 -0
  86. package/docs/reference/errors.md +233 -0
  87. package/docs/reference/execution.md +800 -0
  88. package/docs/reference/first-party-blocks.md +40 -0
  89. package/docs/reference/generation-models.md +59 -0
  90. package/docs/reference/limits.md +306 -0
  91. package/docs/reference/manifest-kinds-controls.md +36 -0
  92. package/docs/reference/manifest.md +181 -0
  93. package/docs/reference/operations.md +36 -0
  94. package/docs/reference/package-jobs.md +35 -0
  95. package/docs/reference/parity.md +55 -0
  96. package/docs/reference/permissions.md +86 -0
  97. package/docs/reference/ports.md +26 -0
  98. package/docs/reference/types.md +268 -0
  99. package/docs/reference/universal-resolver.md +303 -0
  100. package/docs/reference/view-bridge.md +60 -0
  101. package/docs/reference/view-rules.md +15 -0
  102. package/docs/reference/workspace-sync.md +25 -0
  103. package/docs/sdk.md +34 -0
  104. package/docs/tools/block-remix.md +211 -0
  105. package/docs/tools/llm.md +2213 -0
  106. package/docs/tools/repository-adaptation.md +613 -0
  107. package/examples/check-clip.stillmade.json +4 -1
  108. package/examples/generate-video.stillmade.json +6 -2
  109. package/examples/research-topic.stillmade.json +5 -1
  110. package/examples/text-workflow.stillmade.json +3 -32
  111. package/examples/timeline-polish.stillmade.json +11 -3
  112. package/examples/transcribe-audio.stillmade.json +11 -3
  113. package/package.json +1 -1
  114. package/packages/block-cli/cli.js +13 -6
  115. package/packages/block-cli/dev-host/assets/host.js +76 -38
  116. package/packages/block-cli/dev-host/assets/index.css +1 -1
  117. package/packages/block-cli/format.js +1 -1
  118. package/packages/block-cli/templates.js +31 -13
  119. package/packages/block-cli/type-packages.js +119 -0
  120. package/packages/block-platform/block-readiness.js +5 -0
  121. package/packages/block-platform/canvas.js +2 -1
  122. package/packages/block-platform/catalog.js +27 -48
  123. package/packages/block-platform/native-host-inventory.js +0 -226
  124. package/packages/block-platform/plain-descriptions.js +1 -25
  125. package/packages/block-platform/project-type-starters.js +13 -53
  126. package/packages/block-platform/script-handoff.js +2 -4
  127. package/packages/block-platform/type-workspace.js +2 -0
  128. package/packages/block-sdk/appearance.js +3 -1
  129. package/packages/block-sdk/block-tier.js +1 -1
  130. package/packages/block-sdk/builder-contract.js +10 -8
  131. package/packages/block-sdk/capabilities.js +1 -1
  132. package/packages/block-sdk/contracts.js +6 -2
  133. package/packages/block-sdk/first-party-identities.js +1 -84
  134. package/packages/block-sdk/first-party-packages.js +3 -85
  135. package/packages/block-sdk/generation-catalog.js +15 -3
  136. package/packages/block-sdk/index.d.ts +2 -1
  137. package/packages/block-sdk/media-analysis-example.js +1 -1
  138. package/packages/block-sdk/mock-host.js +7 -1
  139. package/packages/block-sdk/module-host-calls.js +35 -10
  140. package/packages/block-sdk/module-hosted.js +15 -2
  141. package/packages/block-sdk/module-media-access.js +71 -0
  142. package/packages/block-sdk/module-node.js +1 -1
  143. package/packages/block-sdk/portable-media-actions.js +1 -1
  144. package/packages/block-sdk/runtime.js +1 -1
  145. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  146. package/packages/block-sdk/transcription-example.js +1 -1
  147. package/packages/block-sdk/video-generation-example.js +1 -1
  148. package/packages/block-sdk/view-bridge.js +4 -1
  149. package/packages/block-sdk/view-design.js +17 -14
  150. package/packages/block-sdk/web-example.js +1 -1
  151. package/packages/design-system/block-kit.css +48 -12
  152. package/packages/design-system/block-kit.html +3 -2
  153. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  154. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  155. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  156. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  157. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  158. package/blocks/narration/package.js +0 -1
  159. package/blocks/narration/versions/1.0.0/package.js +0 -221
  160. package/blocks/narration/versions/1.0.1/package.js +0 -221
  161. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  162. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  163. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  164. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  165. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  166. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  167. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  168. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  169. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  170. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  171. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  172. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  173. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  174. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  175. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  176. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  177. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  178. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  179. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  180. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  181. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  182. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  183. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  184. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  185. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  186. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  187. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  188. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  189. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  190. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  191. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  192. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  193. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  194. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  195. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  196. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  197. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  198. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  199. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  200. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  201. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  202. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  203. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  204. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  205. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  206. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  207. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  208. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  209. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  210. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  211. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  212. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  213. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  214. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  215. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  216. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  217. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  218. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  219. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  220. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  221. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  222. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  223. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  224. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  225. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  226. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  227. package/blocks/occasion-story/package.js +0 -1
  228. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  229. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  230. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  231. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  232. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  233. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  234. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  235. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  236. package/blocks/release-visuals/package.js +0 -1
  237. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  238. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  239. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  240. package/blocks/screen-recorder/package.js +0 -1
  241. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  242. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  243. package/blocks/short-form-finish/package.js +0 -1
  244. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  245. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  246. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  247. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  248. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  249. package/examples/saas-product-launch.stillmade.json +0 -304
  250. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  251. package/packages/block-platform/first-revenue-project-types.js +0 -46
  252. package/packages/block-platform/fixture-starters.js +0 -13
  253. package/packages/block-platform/launch-project-source.js +0 -10
  254. package/packages/block-platform/launch-project.js +0 -30
  255. package/packages/block-platform/motion-project-types.js +0 -55
  256. package/packages/block-platform/motion-starters.js +0 -14
  257. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  258. package/packages/block-platform/product-launch-updated.js +0 -90
  259. package/packages/block-platform/revenue-review-project-types.js +0 -36
  260. package/packages/block-platform/revenue-review-starters.js +0 -13
  261. package/packages/block-platform/script-writer.js +0 -29
  262. package/packages/block-platform/website-source-block.js +0 -14
@@ -0,0 +1,314 @@
1
+ # GitHub application imports
2
+
3
+ # Import an application from GitHub
4
+
5
+ This guide describes the current SDK boundaries and the integration procedure.
6
+ It does **not** claim that every repository can already run inside StillMade.
7
+ The source contract, import inspector, restricted UI and reviewed native adapter
8
+ are implemented. An isolated application build worker and bundled React/Vue/Svelte
9
+ runtime are still required for arbitrary web applications.
10
+
11
+ ## Preserve the requested scope
12
+
13
+ The default GitHub import intent is the complete application with its existing
14
+ interface. Record the immutable commit, application root and important actions
15
+ before adapting code. The importer must not replace that intent with one utility.
16
+ The separate **Extract one capability** mode explicitly authorizes narrower scope.
17
+
18
+ The in-app full-application inspection pins source and retains an inventory of
19
+ code, binary assets, dependency manifests, lockfiles, symlinks and submodules.
20
+ It returns `not-built`, including unfinished feature and runtime checks. A complete
21
+ file inventory is neither a complete dependency checkout nor a successful build.
22
+ Inspection first uses public unauthenticated GitHub APIs; it does not authorize private
23
+ repository access, install dependencies, execute scripts or charge model credits.
24
+ An exact commit's complete, verified public tree and Git-blob-checked source
25
+ bytes may be reused from a 15-minute, 24 MiB process-local cache across the
26
+ inspection, build and source-recheck phases. Branch/HEAD resolution, partial
27
+ trees, failed reads and unverified bytes are not cached. Source review reports
28
+ `pinned-cache` when it uses that evidence instead of claiming a fresh API read.
29
+ The cache avoids repeated anonymous requests for one pin; a cold repository
30
+ still depends on GitHub availability and its rate limit, and another server
31
+ process has its own cache. It is not a substitute for an authenticated or
32
+ archive-backed source acquisition route at larger scale.
33
+ When the public REST API is rate-limited, the application import can instead
34
+ resolve the public branch or tag through bounded Git protocol v2 HTTP and inspect a
35
+ GitHub codeload archive at the resulting commit. The host checks the archive's
36
+ commit marker, tar structure and paths, computes Git blob identities from
37
+ actual bytes, rejects sensitive or oversized selected files, and labels this
38
+ evidence `pinned-github-archive`. A named ref uses two bounded Git HTTP requests
39
+ before the archive request; an exact commit needs only the archive request.
40
+ This fallback is capped at 12 MB compressed and 40 MB expanded, requires no
41
+ Git executable on the server, and refuses repositories with
42
+ submodules because the archive omits their Git identities. Larger archives
43
+ must use the Git tree route or a future bounded acquisition worker. Archive
44
+ inspection is source evidence only; it does not approve execution or install.
45
+ The REST and fallback phases use the same caller-owned HTTP transport when one
46
+ is provided. Reported request use includes both phases. Reported byte use
47
+ includes REST and archive bodies; the two Git-ref responses have separate
48
+ 64 KiB limits and are not included in that aggregate byte figure.
49
+ For a complete Git tree containing submodules, inspection reads the pinned
50
+ `.gitmodules` blob, accepts only canonical or relative GitHub repositories,
51
+ and follows each exact Gitlink commit (including nested modules) within one
52
+ 48-request, 32 MB metadata and 24-placement bound. It reports each dependency
53
+ commit separately. This verifies dependency identities and file inventories;
54
+ the isolated builder must still acquire and hash the actual dependency bytes
55
+ before running their code. Missing mappings, outside hosts, incomplete trees
56
+ and exhausted bounds fail with a specific source-graph reason.
57
+ The larger isolated-build acquisition profile can verify a complete archive
58
+ against that Git tree, including ordinary files and symlink identities. GitHub
59
+ codeload can omit files under `export-ignore` or transform exported text; those
60
+ paths must be restored from exact-commit raw transport and independently
61
+ rehashed to their pinned Git blobs. The raw route is limited to 64 files and
62
+ 8 MB, denies sensitive paths, uses no credentials or redirects, and cannot
63
+ grant execution. All archive and recovered bytes are checked before a trusted
64
+ staging callback receives any file. This profile has not yet been connected
65
+ to a complete native build or installation workflow.
66
+ The inspection `readable` flag controls what the LLM can request as source
67
+ text. It is not a build-file filter. A separately checked `stageable` flag
68
+ allows oversized but bounded files and inert symlink-target blobs into the
69
+ private build-source quarantine; sensitive paths remain excluded. Symlink
70
+ targets are stored as bytes, not followed or created as active filesystem
71
+ links. A later materializer must validate every link target before use.
72
+ The isolated-worker source-closure orchestrator groups identical pinned
73
+ repositories across submodule placements, rechecks each exact commit, and
74
+ hands verified bytes to a trusted quarantined staging callback under one
75
+ request, network-byte, file, staged-byte and deadline budget. Its receipt is
76
+ `execution:not-run` and `installable:false`; a partial stage has no activation
77
+ authority. The connected private staging writer uses content-addressed inert
78
+ blobs and rereads each file before sealing it. A complete closure produces a
79
+ read-only manifest bound to a host-retained digest; reopening the quarantine
80
+ audits every blob against its Git identity. Partial stages cannot be sealed.
81
+ The inert tree planner checks file/directory namespace collisions and resolves
82
+ symlink targets only within the exact staged closure, without expanding source
83
+ paths on the host filesystem. A bounded transfer format then packs each
84
+ audited Git blob once and binds its canonical namespace, modes, link targets,
85
+ source digest and sealed-manifest digest into a SHA-256 bundle. The Linux
86
+ materializer independently verifies the bundle and Git hashes, creates files
87
+ through private directory descriptors, creates links only after file writes,
88
+ and audits the final tree. A synthetic tree with an executable and links ran
89
+ in the isolated VM; a changed bundle was rejected before staging. Natron's
90
+ allowed exact closure also materialized there: 6,445 files and 654 directories.
91
+ This development path is not yet a trusted install or execution admission:
92
+ the stage owner can still change its read-only modes, and build recipes,
93
+ dependencies, GUI sessions and result contracts need separate host control.
94
+ For an npm browser candidate, inspection also reads the pinned `package.json` and
95
+ `package-lock.json` through the same bounded source verifier. It checks that root
96
+ dependency declarations agree and distinguishes integrity-pinned npm tarballs,
97
+ exact-commit GitHub dependencies and unresolved sources. This is a build plan,
98
+ not dependency acquisition or build admission. The pinned miniPaint case has
99
+ 517 npm tarballs and one exact-commit GitHub dependency; an isolated builder
100
+ must acquire and verify both kinds before executing its Webpack build.
101
+ Before rebuilding, the importer checks whether the pinned repository already
102
+ contains an HTML entry referencing a checked-in local browser bundle. It selects
103
+ the referenced scripts/styles and bounded local media resources, then verifies
104
+ every selected byte against the Git tree. This can preserve a real original UI
105
+ without executing a package script. It is still only a candidate: dynamic
106
+ resource requests, operations, state and output must pass isolated review.
107
+ miniPaint's checked-in bundle passed a separate local browser probe with a real
108
+ brush stroke, changed PNG bytes and exact document restore in a second page.
109
+ That probe is not an installed Block or a host-enforced multiplayer result.
110
+ The local acquisition module also re-read miniPaint's exact pinned lockfile and
111
+ verified all 518 dependencies (about 18.2 MB) against registry SHA-512 or Git
112
+ blob identities. Those bytes were discarded after the probe. A managed stage,
113
+ isolated framework rebuild and reviewed execution admission are still missing.
114
+
115
+ Use the exported `defineRepositoryApplication` contract to record the requested
116
+ scope, interface, versioned route and source-backed feature ledger. Use
117
+ `assessRepositoryApplication` to identify missing evidence. Its highest status is
118
+ `evidence-complete`: supplied receipt declarations are not independent execution
119
+ verification. The assessor always reports `executionPerformed:false` and
120
+ `independentlyVerified:false`. A model cannot certify its own integration by
121
+ filling in that object.
122
+
123
+ For a generated browser application, put the exact GitHub repository URL,
124
+ 40-character commit and application folder in
125
+ `manifest.provenance.githubSource`. The SDK checks its shape and the source
126
+ reviewer independently matches it to the pinned Git tree and every bundled
127
+ original asset. This field travels with the versioned package; it is source
128
+ identity, not permission, a license decision or evidence that the adapter ran.
129
+ Older uninstalled candidates without the embedded pin can still undergo
130
+ source review, but must not be promoted to production solely from that legacy
131
+ shape.
132
+
133
+ For a framework application built from pinned source, the unreviewed candidate
134
+ also carries `manifest.provenance.browserBuild`: the verified source-closure
135
+ digest, build-script digest, output directory and digest of every original
136
+ compiled file. A model may author the lifecycle adapter, but cannot supply the
137
+ build result or certify it. A trusted host must independently rederive the
138
+ Git source closure, verify the exact isolated build and reconstruct the full
139
+ application bundle before running the ordinary interface, state and output
140
+ review. The current SDK handoff and internal verifier implement these checks;
141
+ the production build supervisor and review issuer are not yet connected to the
142
+ GitHub button. A build or source receipt alone does not make a Block installable.
143
+ An internal npm job now composes the sealed source bundle, Linux materializer,
144
+ integrity-pinned registry and exact-commit GitHub package stages, and the
145
+ network-denied build runner. It checks each identity again between stages and
146
+ returns compiled bytes with no installation authority. The Linux npm profile
147
+ now caps selected packages at 768, verified expanded package bytes at 256 MiB,
148
+ and package files at 18,000. It caps compiled files at 16 MiB total, each
149
+ file at 8 MiB, and the encoded build report at 24 MiB, with a root `dist`,
150
+ `build` or `out` entry. It
151
+ omits a lockfile package only when that package is explicitly optional and
152
+ incompatible with the worker's OS, CPU or libc; the root launcher rechecks
153
+ that selection against the pinned lock before execution. It has not run
154
+ miniPaint's build, and still needs the durable supervisor lease and cleanup
155
+ needed for a production
156
+ button. The stage-order tests are offline; no real framework repository has
157
+ passed this composed job. The worker also exposes a trusted rebuild callback
158
+ for the compiled-candidate source verifier; the caller must run it under the
159
+ same host-owned supervisor rather than accepting a browser-supplied report.
160
+
161
+ A successful framework build does not prove that all runtime assets are local.
162
+ For example, CanvasCode compiled from its pinned source but loaded Monaco from
163
+ a CDN; the isolated network-denied browser showed its preview while the editor
164
+ remained unavailable. Manually bundling the already pinned Monaco dependency
165
+ restored the editor and real ZIP export in an offline development VM. The
166
+ internal compiled-authoring path can now ask a model for complete replacements
167
+ or unique exact-text edits of inspected source files, each bound to its
168
+ original Git SHA-256. The host derives full replacement bytes for an edit. A root-owned
169
+ stage checks and seals replacement bytes separately from the immutable Git
170
+ source; the network-denied build applies them in scratch space. Patch identity
171
+ must match in the compiled candidate and an independent rebuild. Package
172
+ manifests and lockfiles cannot be patched in this profile. The root-owned patch
173
+ stage, service connection, automatic runtime-failure repair and full behavior
174
+ review remain unverified. A model-suggested CDN exception is not equivalent to
175
+ localizing and verifying those assets.
176
+ CanvasCode also requires a `srcDoc` preview frame and local Monaco language
177
+ workers. The original browser-application profile declares only single-thread
178
+ WASM; its CSP and target guard deny frames and workers. A successful ordinary
179
+ Chromium smoke therefore cannot establish host-runtime compatibility.
180
+
181
+ The new browser-application v2 source profile now supports a declared, bounded
182
+ direct `srcdoc` frame. The compiled authorer can request that feature, and
183
+ independent source verification reconstructs the exact profile from the pinned
184
+ build. A local Chromium probe confirmed that the v2 CSP runs an inline preview
185
+ script, reports the expected direct child frame, and keeps the top-only trusted
186
+ bootstrap out of the child. The existing v1 CSP and frame guard remain closed.
187
+ This is development-browser evidence, not a provisioned StillMade worker run.
188
+ CanvasCode also needs local Monaco language workers. Browser application v3
189
+ now declares exact bundled dedicated worker scripts, and the trusted target
190
+ policy admits them only when paused under the original page and context. A
191
+ local Chrome probe ran a worker through that policy and the hashed asset
192
+ server, while CSP denied a second loopback origin. The original v1 and v2
193
+ profiles still deny workers. This is not a provisioned StillMade worker test,
194
+ CanvasCode's own worker behavior has not passed runtime review, and its full
195
+ application import remains uninstalled.
196
+
197
+ ## Choose an actual runtime
198
+
199
+ | Source | Current boundary |
200
+ | --- | --- |
201
+ | Existing SDK source folder/package | Import its pinned source and run normal admission. |
202
+ | Bounded JS or recipe capability | Adapt the real computation to the existing sandbox and provide typed contracts. This is capability scope. |
203
+ | Restricted HTML/JS custom view | Supported within the documented DOM and bridge restrictions. Original styling may be preserved. |
204
+ | React, Vue, Svelte, workers, arbitrary WASM or full frontend bundle | No general application runtime yet. Do not paste a bundle into `view.javascript`, remove security checks, or claim a static mount as acceptance. |
205
+ | Natron native application | An approved desktop adapter retains the original application in a separate native window and performs bounded rendering. It is not embedded web UI or a source build. See [Desktop execution](DESKTOP_EXECUTION.md). |
206
+ | Arbitrary native executable, Python/Node backend or full stack service | Requires an implemented, reviewed isolated runtime and capability contract. A README, wrapper or external command is insufficient. |
207
+
208
+ The separate experimental [browser application contract](BROWSER_APPLICATIONS.md)
209
+ preserves compiled assets and original UI code with a Block-owned lifecycle
210
+ adapter. The exact reviewed Method Draw source has a private desktop install,
211
+ editing and SVG export path. Other applications require separate source,
212
+ runtime and result review; package validation alone is insufficient.
213
+
214
+ The separate Natron ARM64 development build (repository evidence `artifacts/repository-acceptance/natron-native-gui-dev-build-2026-09-29.json`)
215
+ shows that a Qt5/PySide2 native GUI can compile and open in a local VM after
216
+ architecture and Python-home adaptation. Its source tree is not yet the
217
+ complete sealed Git closure, and its OCIO configs and OpenFX plugins are
218
+ missing. This is runtime feasibility evidence, not approval to install a
219
+ GitHub-authored Block or a replacement for the full application.
220
+ The later exact-source-to-GUI check (repository evidence `artifacts/repository-acceptance/natron-exact-tree-to-gui-2026-09-29.json`)
221
+ replaced that archive input with the verified allowed Git closure and compiled
222
+ a separate copy carrying only the recorded ARM64 patch. The GUI opened; the
223
+ same binary also saved and reopened a native `.ntp` project. The missing
224
+ plugins, color config and host-enforced Block contracts remain.
225
+
226
+ ## Keep the original appearance
227
+
228
+ For an eligible restricted view, place this option in `src/view.json`:
229
+
230
+ ```json
231
+ {"appearance":"original"}
232
+ ```
233
+
234
+ Keep the application's permitted CSS in `src/view.css`. StillMade still supplies
235
+ the outer workspace, focus and permission controls. Original appearance does not
236
+ grant extra scripting, networking, storage or navigation permissions.
237
+
238
+ To offer optional StillMade styling, include `src/view.themed.css` using the
239
+ documented theme tokens. The themed preview is offered only when that stylesheet
240
+ passes appearance checks. Omitted appearance preserves the existing package
241
+ behavior; published packages are not rewritten to change this preference.
242
+
243
+ ## Connect meaningful inputs and outputs
244
+
245
+ Every required input needs a physical type, a precise semantic meaning, allowed
246
+ sources, and an explicit way to supply missing data. Do the same for output
247
+ meaning and representation. A video output is the actual new saved video, with
248
+ its own exact asset/version identity; returning the source video is not evidence
249
+ that an editor transformed it.
250
+
251
+ The existing `image` type also accepts bounded inline RGBA pixels as
252
+ `{width, height, data}`. A small editor can import those pixels and return its
253
+ actual composited pixels without inventing an asset ID. Respect both the image
254
+ contract and the complete runtime message limits. Large or referenced media
255
+ still needs the host's authenticated asset resolution and materialization path;
256
+ a guest-local data/blob URL is not a durable shared asset.
257
+
258
+ For browser applications with several export actions, declare which output
259
+ ports each action produces. An SVG export can map to `svg` and a PNG export to
260
+ `png`; mark each shared-manifest port `required:false` when another action
261
+ does not return it. The host checks the exact action-to-port mapping before
262
+ publishing output or storing media. A generated adapter's declaration alone
263
+ does not prove either export works.
264
+
265
+ Map existing app behavior to SDK input, shared-document and output interfaces.
266
+ Do not recreate the application's logic in the shared host or add a special
267
+ Block-ID branch. Persist editable state through declared host services and keep
268
+ two placements separate. Input changes, revoked permission, cancellation and
269
+ closed workspaces must reject late completion.
270
+
271
+ Native output-producing actions use `src/desktop.json`: declarative mappings from
272
+ typed input ports into an approved adapter and from its actual result into output
273
+ ports. The trusted host produces a receipt bound to the package, invocation,
274
+ inputs and outputs. Neither a Block's view nor its JavaScript can supply the host
275
+ executor or mint accepted native evidence. Legacy native packages without this
276
+ mapping cannot pass a generic workflow by returning their input unchanged.
277
+
278
+ ## Prove the integration
279
+
280
+ 1. Establish an upstream baseline with a representative input and inspect the
281
+ exported bytes. Retain the original app's important behavior and interface.
282
+ 2. Build only in a disposable isolated worker without application credentials,
283
+ customer mounts or unrestricted network access. Preserve licenses and exact
284
+ dependency/asset identities. If no suitable worker exists, report that gap.
285
+ 3. Execute a real producer → imported application → consumer through the
286
+ production resolver. Fixtures, screenshots, schemas and successful process
287
+ exit codes alone cannot prove transformed output.
288
+ 4. Decode exports; compare with the baseline; verify the consumer receives those
289
+ exact bytes. Check real playback separately from codec decoding.
290
+ 5. Save/reopen, edit while running, cancel, revoke access, retry failures, use two
291
+ placements and verify stale output behavior. Exercise permission and resource
292
+ limits with hostile inputs.
293
+ 6. Retain the tested package digest, source commit, runtime version, commands,
294
+ bounded logs, artifacts and pass/fail evidence. Install the exact artifact
295
+ tested. Edits require new checks and published contract changes need a new
296
+ version.
297
+
298
+ Keep inspection, source admission, runtime tests and production verification as
299
+ separate states. Native bindings validate host-issued evidence; they are not a
300
+ cryptographic attestation from an arbitrary caller. The trusted host is responsible
301
+ for process isolation and actual artifact verification.
302
+
303
+ The first local Natron acceptance rendered 24 frames of an inverted synthetic
304
+ video, passed the real result through a three-Step workflow, matched its decoded
305
+ pixels exactly to an independent native baseline, and reopened saved workflow and
306
+ media. The same H.264/YUV420 output also played all 24 frames in a sandboxed
307
+ Electron video element. ProRes decoded successfully in the native probe but did
308
+ not play in Chromium; choose a browser-compatible Writer codec or explicitly
309
+ produce a separate playback proxy. This establishes that specific macOS
310
+ software-rendering path. It does not
311
+ establish all Natron features, third-party plugins, original GUI containment,
312
+ product UI media routing, other operating systems, source build reproducibility,
313
+ or arbitrary-repository support. The repository acceptance harness and evidence
314
+ remain distinct from the SDK's offline tests.
@@ -0,0 +1,214 @@
1
+ # Hosted image generation
2
+
3
+ Use `runtime: "capability"` with `operation: "image.generate"` for one visual
4
+ prompt (and optional reference images) to one generated PNG. Every image model
5
+ the app's own Canvas and Image Panels use is available: Nano Banana 2, 2 Lite and
6
+ Pro, GPT Image 2 and 1.5, Kling Image V3 and Seedream 4.5, with their aspect
7
+ ratios, resolutions and qualities (see
8
+ [generation models](../reference/generation-models.md)). Users pay with their
9
+ StillMade credits at StillMade's own price, or with their OpenAI key for the
10
+ direct GPT Image 2 option. The host shows model, settings and the exact price
11
+ before any provider call. Imported packages never receive API keys or choose an
12
+ endpoint or a price.
13
+
14
+ ### Complete package
15
+
16
+ The downloaded SDK includes `examples/generate-image.stillmade.json` and
17
+ `packages/block-sdk/image-generation-example.js` (export `imageGenerate`).
18
+
19
+ ```json
20
+ {
21
+ "manifest": {
22
+ "schemaVersion": 1,
23
+ "sdkVersion": "0.1.0",
24
+ "id": "example.generate-image",
25
+ "version": "1.0.0",
26
+ "name": "Generate an image",
27
+ "description": "Generate a square PNG from a short visual prompt using an approved host request.",
28
+ "kind": "task",
29
+ "runtime": "capability",
30
+ "entry": "src/capability.json",
31
+ "license": "MIT",
32
+ "inputs": {
33
+ "prompt": {
34
+ "type": "text",
35
+ "primary": true
36
+ }
37
+ },
38
+ "outputs": {
39
+ "image": {
40
+ "type": "image",
41
+ "primary": true
42
+ }
43
+ },
44
+ "permissions": {
45
+ "project": [],
46
+ "capabilities": [
47
+ "image.generate"
48
+ ],
49
+ "network": [],
50
+ "filesystem": [],
51
+ "secrets": []
52
+ },
53
+ "ui": [
54
+ {
55
+ "control": "text",
56
+ "port": "prompt"
57
+ }
58
+ ]
59
+ },
60
+ "capability": {
61
+ "schemaVersion": 1,
62
+ "operation": "image.generate",
63
+ "prompt": {
64
+ "$input": "prompt"
65
+ },
66
+ "output": "image"
67
+ },
68
+ "tests": [
69
+ {
70
+ "name": "A simple forest illustration",
71
+ "input": {
72
+ "prompt": "A simple illustration of a quiet forest with clear dark outlines and soft green colors."
73
+ },
74
+ "expectations": {
75
+ "image": {
76
+ "kind": "image",
77
+ "format": "png",
78
+ "width": 1024,
79
+ "height": 1024,
80
+ "minBytes": 67,
81
+ "maxBytes": 12000000
82
+ }
83
+ }
84
+ }
85
+ ]
86
+ }
87
+ ```
88
+
89
+ ### Inputs and controls
90
+
91
+ Declare exactly one primary input of type `text`, `script`, or `brief`, optionally
92
+ one `image` or `image[]` input of reference images, and one primary output of
93
+ type `image`. Script and brief values contain `schemaVersion:1`
94
+ and `text`; text ports receive a string. The resolved prompt must contain
95
+ 1–32,000 characters and cannot be blank. Existing declared project context read
96
+ scopes can supply that input through the normal host resolver.
97
+
98
+ The descriptor contains `schemaVersion`, `operation`, `prompt` and `output`, and
99
+ optionally:
100
+
101
+ - `settings`: the Block's default `{model, aspectRatio, resolution, quality}`.
102
+ Each value must be one the model accepts; axes a model has no knob for are
103
+ `"default"`.
104
+ - `references`: `{"$input":"refs"}`, binding the declared `image`/`image[]`
105
+ input. Up to 8 saved images; the model must edit from references (the Nano
106
+ Banana family and GPT Image 2).
107
+ - `negativePrompt` (up to 2,000 characters) and `seed` (0–2147483647).
108
+
109
+ Declare exactly `capabilities:["image.generate"]`; network, filesystem and
110
+ secrets permissions stay empty. Payment, credentials and price are never
111
+ descriptor fields.
112
+
113
+ ```json
114
+ "capability": {
115
+ "schemaVersion": 1, "operation": "image.generate",
116
+ "prompt": {"$input": "prompt"}, "references": {"$input": "refs"},
117
+ "settings": {"model": "nano-banana-pro", "aspectRatio": "16:9", "resolution": "2K"},
118
+ "negativePrompt": "text, watermark", "output": "image"
119
+ }
120
+ ```
121
+
122
+ In StillMade, the run dialog preselects the Block's default model and settings;
123
+ the user can change them before running and sees the exact credit price. Every
124
+ review fixture and the separate sample is included in the displayed total. The
125
+ direct OpenAI option (fixed 1024 × 1024, your own key) takes text prompts only.
126
+ Reference images must be saved in the user's own library; anything else is
127
+ refused before any credit is spent.
128
+
129
+ ### Output and tests
130
+
131
+ The output is an exact reference to a retained PNG:
132
+
133
+ ```js
134
+ {
135
+ kind: "image", assetId, versionId, url,
136
+ mimeType: "image/png", width, height, bytes
137
+ }
138
+ ```
139
+
140
+ The host bounds the provider response, decodes the actual PNG, JPEG or WebP,
141
+ stores one sRGB PNG under an immutable hash and measures its `width`, `height`
142
+ (up to 8192 a side and 40 megapixels) and `bytes` (up to 64 MiB); package code
143
+ cannot assert those measurements on its own. `assetId` identifies the execution's
144
+ image, `versionId` is its saved SHA-256, and `url` is a StillMade media URL.
145
+
146
+ Each fixture requires `expectations` for the declared output: `kind:"image"`,
147
+ `format:"png"`, `minWidth`, `maxWidth`, `minHeight`, `maxHeight`, `minBytes` and
148
+ `maxBytes` (ordered integers within the limits). Older fixtures that name the
149
+ fixed `width:1024, height:1024` square remain valid.
150
+ These checks verify a usable image contract. They cannot prove the picture
151
+ matches the meaning of the prompt; inspect the actual image before acceptance.
152
+
153
+ ### Review, preview and project use
154
+
155
+ Upload the package to run schema, dependency, permissions and static checks.
156
+ Offline CLI validation and packaging can pass those checks but report that live
157
+ review is required; offline test/preview cannot call the provider or produce a
158
+ placeholder. In StillMade, review the cost, confirm generation, inspect every
159
+ fixture and sample, finish the review, then **Confirm Import**.
160
+
161
+ A project run has its own current prompt and quote. **Use this image** accepts
162
+ its reviewed output. Compatible image inputs can consume that result through
163
+ the host's existing image resolver; sandboxed pixel processing receives actual
164
+ decoded pixels rather than a guessed URL. Accepted current project results also
165
+ appear in the Editor's visual media inventory. Earlier placed images keep their
166
+ original source when the generating Block runs again.
167
+
168
+ A custom interface can use the existing `StillMade.run` flow. Host image
169
+ previews remain outside the isolated iframe, and guest code cannot supply
170
+ execution receipts or access the provider. No `generateImage`, provider-key or
171
+ arbitrary fetch API is added to the guest interface.
172
+
173
+ ### Host integration and recovery
174
+
175
+ `prepareCapabilityInvocation` returns `{operation:"image.generate",prompt}` plus
176
+ `references`, `negativePrompt` and `seed` when declared. A credit selection is
177
+ `{payment:"credits",provider:"stillmade",model,aspectRatio,resolution,quality}`;
178
+ the direct key option stays `{provider:"openai",model:"gpt-image-2",size:"1024x1024",quality,payment}`.
179
+ `capabilityOutputs(package, imageReference)` maps the generated reference to the
180
+ named output. `validateGeneratedImageReference` and
181
+ `defaultCapabilityExpectations` enforce the declared shape and bounds.
182
+
183
+ A trusted executor may return `{outputs, metadata, mediaReceipts}`. The receipt
184
+ map is keyed by the output port; each receipt contains its `schemaVersion` (3 for catalog images), all
185
+ canonical image fields, plus `ownerId`, `runId`, `index`, `storageKey` and
186
+ `sha256`. SDK validation checks shape and equality to the output. The
187
+ authenticated host additionally binds owner/run/index and reads the saved bytes
188
+ again during review acceptance and completed-result recovery. The receipt is
189
+ host evidence, not a credential or a guest-authored permission grant.
190
+
191
+ Execution uses one exact provider request per invocation, without automatic
192
+ provider, payment or model fallback. An uncertain submission is not retried
193
+ automatically. Cancelling stops further work and acceptance; it cannot promise
194
+ that a remote provider stopped or that already-generated output was free.
195
+ Received output that fails storage or contract checks remains a charged request;
196
+ a definite provider rejection follows the existing refund path.
197
+
198
+ Automated checks use local image fixtures and mocked providers. They do not
199
+ claim a successful live provider image test. Each account must complete its
200
+ actual hosted review before importing a generated-image Block.
201
+
202
+ ### Connected production runs with hosted Blocks
203
+
204
+ Inside a project, **Run connected steps** passes the actual previous result to
205
+ each next Block. Hosted text, speech and image Blocks use StillMade's existing
206
+ model and payment dialog for each call. Confirm its cost before execution; a
207
+ Block cannot choose approval or payment. Waiting for this choice does not consume
208
+ the local sandbox timeout. Cancelling stops downstream work and preserves already
209
+ completed results. Use **Use completed results** to adopt them into the project.
210
+
211
+ Saved hosted results are rechecked against the signed-in account's server run,
212
+ including the exact project, source, input, selection, quote and retained media.
213
+ This verification does not generate again. Standalone import reviews are not
214
+ production outputs. Unattended hosted automation is not enabled by this control.
@@ -0,0 +1,39 @@
1
+ # Hosted music and sound effects
2
+
3
+ Use `runtime: "capability"` with `operation: "audio.music"` or
4
+ `operation: "audio.sfx"` to create music or a sound effect with the app's own
5
+ generators: ACE-Step music and StillMade sound effects, the same ones the
6
+ Editor uses. The person running the Block pays with StillMade credits at the
7
+ app's prices (music by the minute, one flat price per sound effect). Block code
8
+ never sees keys, endpoints or payment.
9
+
10
+ The manifest declares one `text`, `script` or `brief` input, one `audio`
11
+ output, and `permissions.capabilities: ["audio.music"]` (or `["audio.sfx"]`):
12
+
13
+ ```json
14
+ {"schemaVersion":1,"operation":"audio.music","prompt":{"$input":"brief"},"output":"music","settings":{"durationSec":30}}
15
+ ```
16
+
17
+ `settings.durationSec` is optional and only suggests a length. Music runs 5 to
18
+ 240 whole seconds; sound effects run 0.5 to 22 seconds in tenths. The person
19
+ running the Block can change the length in the dialog, and the quote shows the
20
+ price for that length before anything is generated.
21
+
22
+ The output is a measured MP3 or WAV reference:
23
+
24
+ ```json
25
+ {"kind":"audio","assetId":"audio:run:0","versionId":"<sha256>","url":"/api/media/owner/capaud3-....mp3","mimeType":"audio/mpeg","duration":30.02,"bytes":481254,"sampleRate":44100,"channels":2}
26
+ ```
27
+
28
+ Fixture expectations use `format` `any`, `mp3` or `wav` with duration and byte
29
+ bounds (up to 1,800 seconds and 128 MiB):
30
+
31
+ ```json
32
+ {"music":{"kind":"audio","format":"any","minDuration":1,"maxDuration":241,"minBytes":45,"maxBytes":134217728}}
33
+ ```
34
+
35
+ The offline SDK includes `packages/block-sdk/audio-generation-example.js`,
36
+ exporting `audioMusic` and `audioSfx`. Review, listening and acceptance follow
37
+ the same flow as [hosted speech](hosted-speech.md#review-listen-and-accept): **Review cost**
38
+ never generates, each fixture and the sample is quoted and charged once, and a
39
+ provider refusal before generation is refunded.