stillmade-sdk 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/.claude/settings.json +15 -0
  2. package/.cursor/hooks.json +11 -0
  3. package/.gitignore +2 -0
  4. package/.stillmade/sdk-baseline.json +65 -0
  5. package/AGENTS.md +29 -7
  6. package/AGENT_CONTROL.md +2 -1
  7. package/BROWSER_APPLICATIONS.md +128 -3
  8. package/GITHUB_APPLICATIONS.md +184 -1
  9. package/NATIVE_APPLICATION_ADAPTATION.md +565 -0
  10. package/PASTE_TO_LLM.md +29 -10
  11. package/PORTABLE.md +5 -4
  12. package/REMIX.md +16 -10
  13. package/SDK.md +511 -46
  14. package/UI_AESTHETIC.md +37 -6
  15. package/api-index.json +90 -0
  16. package/blocks/connected-app/versions/{1.2.0 → 1.5.0}/task-selection.js +5 -3
  17. package/blocks/connected-app/versions/{1.4.0 → 1.5.0}/view.js +4 -2
  18. package/blocks/native/sm.ai-decide/versions/1.0.0/package.js +149 -0
  19. package/blocks/native/sm.ai-write/versions/1.0.0/package.js +147 -0
  20. package/blocks/native/sm.connect-app/versions/1.0.0/package.js +55 -0
  21. package/blocks/native/sm.contact-fields/versions/1.0.0/package.js +197 -0
  22. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +168 -0
  23. package/blocks/native/sm.generate-image/versions/2.1.0/package.js +101 -0
  24. package/blocks/native/sm.meta-creative/versions/1.0.0/package.js +206 -0
  25. package/blocks/native/sm.new-items/versions/1.0.0/package.js +191 -0
  26. package/blocks/native/sm.voiceover/versions/2.1.5/package.js +179 -0
  27. package/blocks/native/sm.voiceover/versions/2.1.6/package.js +179 -0
  28. package/blocks/native/sm.when/versions/1.0.0/package.js +129 -0
  29. package/blocks/native/sm.write-summary/versions/1.0.0/package.js +133 -0
  30. package/blocks/occasion-story/package.js +1 -1
  31. package/blocks/occasion-story/versions/1.0.2/package.js +1682 -0
  32. package/blocks/photo-reel-composer/versions/1.0.1/package.js +3026 -0
  33. package/blocks/release-visuals/package.js +1 -1
  34. package/blocks/release-visuals/versions/1.0.2/package.js +1500 -0
  35. package/blocks/short-form-finish/package.js +1 -1
  36. package/blocks/short-form-finish/versions/1.0.3/package.js +1026 -0
  37. package/package.json +1 -1
  38. package/packages/block-cli/cli.js +16 -1
  39. package/packages/block-cli/format.js +2 -0
  40. package/packages/block-cli/ready-gate.js +164 -0
  41. package/packages/block-platform/block-readiness.js +3 -2
  42. package/packages/block-platform/canvas.js +1 -1
  43. package/packages/block-platform/catalog.js +6 -4
  44. package/packages/block-platform/chat-requirements.js +8 -3
  45. package/packages/block-platform/collaboration.js +5 -5
  46. package/packages/block-platform/first-revenue-project-types.js +2 -2
  47. package/packages/block-platform/flow-inspection.js +2 -2
  48. package/packages/block-platform/native-application-validation-context.js +20 -0
  49. package/packages/block-platform/plain-descriptions.js +67 -0
  50. package/packages/block-platform/product-ad-variants-project-type.js +6 -3
  51. package/packages/block-platform/project-context.js +4 -4
  52. package/packages/block-platform/project-type-composer.js +21 -12
  53. package/packages/block-platform/project-type-draft.js +2 -2
  54. package/packages/block-platform/project-type-recommendations.js +1 -1
  55. package/packages/block-platform/project-types.js +9 -4
  56. package/packages/block-platform/revenue-review-project-types.js +6 -5
  57. package/packages/block-platform/segment-runner.js +35 -11
  58. package/packages/block-platform/step-groups.js +78 -0
  59. package/packages/block-platform/steps.js +12 -8
  60. package/packages/block-platform/type-workspace.js +4 -4
  61. package/packages/block-platform/workflow-loop.js +4 -0
  62. package/packages/block-platform/workspace-input-readset.js +18 -4
  63. package/packages/block-sdk/admission.js +5 -17
  64. package/packages/block-sdk/agent-inputs.js +2 -0
  65. package/packages/block-sdk/agent-inspection.js +4 -2
  66. package/packages/block-sdk/browser-application-artifacts.js +1 -1
  67. package/packages/block-sdk/browser-application-execution.d.ts +2 -2
  68. package/packages/block-sdk/browser-application-execution.js +30 -12
  69. package/packages/block-sdk/browser-application-guest.d.ts +2 -0
  70. package/packages/block-sdk/browser-application-guest.js +16 -9
  71. package/packages/block-sdk/browser-application.d.ts +12 -4
  72. package/packages/block-sdk/browser-application.js +27 -13
  73. package/packages/block-sdk/builder-contract.js +25 -17
  74. package/packages/block-sdk/capabilities.js +38 -19
  75. package/packages/block-sdk/connected-app.js +26 -6
  76. package/packages/block-sdk/connection-adapters.js +19 -2
  77. package/packages/block-sdk/contracts-core.js +8 -0
  78. package/packages/block-sdk/contracts.js +9 -5
  79. package/packages/block-sdk/document-drafts.js +7 -1
  80. package/packages/block-sdk/document-store-binding.js +2 -1
  81. package/packages/block-sdk/file-bundle.js +4 -1
  82. package/packages/block-sdk/first-party-packages.js +18 -2
  83. package/packages/block-sdk/generation-catalog.js +3 -2
  84. package/packages/block-sdk/index.d.ts +20 -1
  85. package/packages/block-sdk/index.js +1 -0
  86. package/packages/block-sdk/native-application-package.d.ts +22 -0
  87. package/packages/block-sdk/native-application-package.js +77 -0
  88. package/packages/block-sdk/native_adapter.py +76 -0
  89. package/packages/block-sdk/package.json +1 -0
  90. package/packages/block-sdk/pipeline-runtime-host.d.ts +2 -0
  91. package/packages/block-sdk/project-flow-contract.js +2 -0
  92. package/packages/block-sdk/remix-policy.js +3 -1
  93. package/packages/block-sdk/resolver-admission.js +17 -0
  94. package/packages/block-sdk/runtime.js +4 -1
  95. package/packages/block-sdk/schema-fields.js +34 -2
  96. package/packages/block-sdk/semantic-relationships.js +14 -0
  97. package/packages/block-sdk/shared-controls.js +3 -1
  98. package/packages/block-sdk/shared-view.js +6 -1
  99. package/packages/block-sdk/source-rights.js +6 -5
  100. package/packages/block-sdk/testing.js +3 -0
  101. package/packages/design-system/theme.css +12 -3
@@ -0,0 +1,197 @@
1
+ // Generated by scripts/build-owned-blocks.mjs. Edit the owned source files.
2
+ export default {
3
+ "manifest": {
4
+ "schemaVersion": 1,
5
+ "sdkVersion": "0.1.0",
6
+ "id": "sm.contact-fields",
7
+ "version": "1.0.0",
8
+ "name": "Contact fields",
9
+ "description": "Pull the usual contact details out of a lead or record from any app (Meta lead forms, Shopify customers, form tools) as separate fields you can connect to a CRM, email or call step: email, names, phone, company, city and the other answers.",
10
+ "kind": "task",
11
+ "runtime": "javascript",
12
+ "license": "MIT",
13
+ "provenance": {
14
+ "notice": "Original source (authorship declared by the packager)\nLicense: MIT\nChanges: Original implementation declared by the packager; no reused repository or dependency code.\nFiles: LICENSE, src/run.js\n\nMIT License\n\nCopyright (c) 2026 StillMade contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
15
+ "portableSources": [
16
+ {
17
+ "kind": "original",
18
+ "license": "MIT",
19
+ "paths": [
20
+ "LICENSE",
21
+ "src/run.js"
22
+ ],
23
+ "evidence": [
24
+ "upstream/0/LICENSE",
25
+ "upstream/0/src/run.js"
26
+ ],
27
+ "changes": "Original implementation declared by the packager; no reused repository or dependency code."
28
+ }
29
+ ]
30
+ },
31
+ "inputs": {
32
+ "record": {
33
+ "type": "object",
34
+ "primary": true,
35
+ "semantic": "external_data",
36
+ "required": true,
37
+ "description": "A lead, customer or form response from an app.",
38
+ "schema": "object"
39
+ }
40
+ },
41
+ "outputs": {
42
+ "email": {
43
+ "type": "text",
44
+ "primary": true,
45
+ "semantic": "contact_email",
46
+ "description": "Email address, or empty."
47
+ },
48
+ "first_name": {
49
+ "type": "text",
50
+ "primary": false,
51
+ "semantic": "contact_first_name",
52
+ "description": "First name, or empty."
53
+ },
54
+ "last_name": {
55
+ "type": "text",
56
+ "primary": false,
57
+ "semantic": "contact_last_name",
58
+ "description": "Last name, or empty."
59
+ },
60
+ "full_name": {
61
+ "type": "text",
62
+ "primary": false,
63
+ "semantic": "contact_full_name",
64
+ "description": "Full name, or empty."
65
+ },
66
+ "phone": {
67
+ "type": "text",
68
+ "primary": false,
69
+ "semantic": "contact_phone",
70
+ "description": "Phone number, or empty."
71
+ },
72
+ "company": {
73
+ "type": "text",
74
+ "primary": false,
75
+ "semantic": "contact_company",
76
+ "description": "Company name, or empty."
77
+ },
78
+ "city": {
79
+ "type": "text",
80
+ "primary": false,
81
+ "semantic": "contact_city",
82
+ "description": "City, or empty."
83
+ },
84
+ "other_answers": {
85
+ "type": "text",
86
+ "primary": false,
87
+ "semantic": "contact_other_answers",
88
+ "description": "Every other field as name: value lines, for notes."
89
+ }
90
+ },
91
+ "permissions": {
92
+ "project": []
93
+ },
94
+ "ui": [
95
+ {
96
+ "port": "record",
97
+ "control": "text"
98
+ }
99
+ ]
100
+ },
101
+ "code": "const flat = {};\nconst add = (name, value) => {\n if (value === null || value === undefined) return;\n const text = Array.isArray(value) ? value.filter(v => v !== null && typeof v !== 'object').join(', ') : typeof value === 'object' ? '' : String(value);\n if (text.trim() && !flat[name]) flat[name] = text.trim();\n};\nconst record = input.record || {};\n// Meta lead forms put answers in field_data: [{name, values}].\nfor (const entry of Array.isArray(record.field_data) ? record.field_data : []) if (entry && entry.name) add(String(entry.name).toLowerCase(), entry.values);\nfor (const key of Object.keys(record)) if (key !== 'field_data') add(key.toLowerCase(), record[key]);\nconst pick = names => { for (const name of names) if (flat[name]) return flat[name]; return ''; };\nconst email = pick(['email', 'work_email', 'e-mail', 'email_address']);\nlet first = pick(['first_name', 'firstname', 'given_name']), last = pick(['last_name', 'lastname', 'surname', 'family_name']);\nconst full = pick(['full_name', 'name', 'fullname']) || [first, last].filter(Boolean).join(' ');\nif (!first && !last && full) { const parts = full.split(/\\s+/); first = parts[0]; last = parts.slice(1).join(' '); }\nconst used = new Set(['email', 'work_email', 'e-mail', 'email_address', 'first_name', 'firstname', 'given_name', 'last_name', 'lastname', 'surname', 'family_name', 'full_name', 'name', 'fullname', 'phone_number', 'phone', 'mobile', 'company_name', 'company', 'city', 'id', 'created_time']);\nconst other = Object.keys(flat).filter(key => !used.has(key)).map(key => key + ': ' + flat[key]).join('\\n');\nreturn { email, first_name: first, last_name: last, full_name: full, phone: pick(['phone_number', 'phone', 'mobile']), company: pick(['company_name', 'company']), city: pick(['city']), other_answers: other };\n",
102
+ "tests": [
103
+ {
104
+ "name": "Meta lead form answers",
105
+ "input": {
106
+ "record": {
107
+ "id": "1",
108
+ "created_time": "2026-10-06T10:00:00+0000",
109
+ "field_data": [
110
+ {
111
+ "name": "full_name",
112
+ "values": [
113
+ "Ana Ruiz"
114
+ ]
115
+ },
116
+ {
117
+ "name": "email",
118
+ "values": [
119
+ "ana@example.com"
120
+ ]
121
+ },
122
+ {
123
+ "name": "phone_number",
124
+ "values": [
125
+ "+15550100"
126
+ ]
127
+ },
128
+ {
129
+ "name": "budget",
130
+ "values": [
131
+ "$5,000"
132
+ ]
133
+ }
134
+ ]
135
+ }
136
+ },
137
+ "expected": {
138
+ "email": "ana@example.com",
139
+ "first_name": "Ana",
140
+ "last_name": "Ruiz",
141
+ "full_name": "Ana Ruiz",
142
+ "phone": "+15550100",
143
+ "company": "",
144
+ "city": "",
145
+ "other_answers": "budget: $5,000"
146
+ }
147
+ },
148
+ {
149
+ "name": "Flat customer record",
150
+ "input": {
151
+ "record": {
152
+ "first_name": "Ben",
153
+ "last_name": "Ode",
154
+ "email": "ben@example.com",
155
+ "company": "Ode Co"
156
+ }
157
+ },
158
+ "expected": {
159
+ "email": "ben@example.com",
160
+ "first_name": "Ben",
161
+ "last_name": "Ode",
162
+ "full_name": "Ben Ode",
163
+ "phone": "",
164
+ "company": "Ode Co",
165
+ "city": "",
166
+ "other_answers": ""
167
+ }
168
+ }
169
+ ],
170
+ "portable": {
171
+ "format": "stillmade-block/1",
172
+ "dependencies": [],
173
+ "sources": [
174
+ {
175
+ "kind": "original",
176
+ "license": "MIT",
177
+ "paths": [
178
+ "LICENSE",
179
+ "src/run.js"
180
+ ],
181
+ "evidence": [
182
+ "upstream/0/LICENSE",
183
+ "upstream/0/src/run.js"
184
+ ],
185
+ "changes": "Original implementation declared by the packager; no reused repository or dependency code."
186
+ }
187
+ ],
188
+ "files": {
189
+ "upstream/0/LICENSE": "MIT License\n\nCopyright (c) 2026 StillMade contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
190
+ "upstream/0/src/run.js": "const flat = {};\nconst add = (name, value) => {\n if (value === null || value === undefined) return;\n const text = Array.isArray(value) ? value.filter(v => v !== null && typeof v !== 'object').join(', ') : typeof value === 'object' ? '' : String(value);\n if (text.trim() && !flat[name]) flat[name] = text.trim();\n};\nconst record = input.record || {};\n// Meta lead forms put answers in field_data: [{name, values}].\nfor (const entry of Array.isArray(record.field_data) ? record.field_data : []) if (entry && entry.name) add(String(entry.name).toLowerCase(), entry.values);\nfor (const key of Object.keys(record)) if (key !== 'field_data') add(key.toLowerCase(), record[key]);\nconst pick = names => { for (const name of names) if (flat[name]) return flat[name]; return ''; };\nconst email = pick(['email', 'work_email', 'e-mail', 'email_address']);\nlet first = pick(['first_name', 'firstname', 'given_name']), last = pick(['last_name', 'lastname', 'surname', 'family_name']);\nconst full = pick(['full_name', 'name', 'fullname']) || [first, last].filter(Boolean).join(' ');\nif (!first && !last && full) { const parts = full.split(/\\s+/); first = parts[0]; last = parts.slice(1).join(' '); }\nconst used = new Set(['email', 'work_email', 'e-mail', 'email_address', 'first_name', 'firstname', 'given_name', 'last_name', 'lastname', 'surname', 'family_name', 'full_name', 'name', 'fullname', 'phone_number', 'phone', 'mobile', 'company_name', 'company', 'city', 'id', 'created_time']);\nconst other = Object.keys(flat).filter(key => !used.has(key)).map(key => key + ': ' + flat[key]).join('\\n');\nreturn { email, first_name: first, last_name: last, full_name: full, phone: pick(['phone_number', 'phone', 'mobile']), company: pick(['company_name', 'company']), city: pick(['city']), other_answers: other };\n"
191
+ },
192
+ "lineage": {
193
+ "parents": [],
194
+ "changes": "Packaged original Block source for StillMade."
195
+ }
196
+ }
197
+ };
@@ -0,0 +1,168 @@
1
+ // Generated by scripts/build-owned-blocks.mjs. Edit the owned source files.
2
+ export default {
3
+ "manifest": {
4
+ "schemaVersion": 1,
5
+ "sdkVersion": "0.1.0",
6
+ "id": "sm.continue-if",
7
+ "version": "1.0.0",
8
+ "name": "Continue only if",
9
+ "description": "Let an item continue to the next steps only when a decision says so, for example only qualified leads go to your CRM. Otherwise the run stops here without doing anything else.",
10
+ "kind": "task",
11
+ "runtime": "javascript",
12
+ "license": "MIT",
13
+ "provenance": {
14
+ "notice": "Original source (authorship declared by the packager)\nLicense: MIT\nChanges: Original implementation declared by the packager; no reused repository or dependency code.\nFiles: LICENSE, src/run.js\n\nMIT License\n\nCopyright (c) 2026 StillMade contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
15
+ "portableSources": [
16
+ {
17
+ "kind": "original",
18
+ "license": "MIT",
19
+ "paths": [
20
+ "LICENSE",
21
+ "src/run.js"
22
+ ],
23
+ "evidence": [
24
+ "upstream/0/LICENSE",
25
+ "upstream/0/src/run.js"
26
+ ],
27
+ "changes": "Original implementation declared by the packager; no reused repository or dependency code."
28
+ }
29
+ ]
30
+ },
31
+ "inputs": {
32
+ "decision": {
33
+ "type": "object",
34
+ "primary": true,
35
+ "semantic": "ai_decision",
36
+ "required": true,
37
+ "description": "A decision from AI decide.",
38
+ "schema": {
39
+ "yes": "boolean",
40
+ "score": "integer",
41
+ "label": "string",
42
+ "reason": "string"
43
+ }
44
+ },
45
+ "item": {
46
+ "type": "object",
47
+ "semantic": "external_data",
48
+ "required": true,
49
+ "description": "The item that continues when the decision allows it.",
50
+ "schema": "object"
51
+ },
52
+ "minimum_score": {
53
+ "type": "integer",
54
+ "default": 0,
55
+ "required": false,
56
+ "description": "Also require at least this score (0 to 100). Leave 0 to use yes or no only.",
57
+ "semantic": "minimum_score"
58
+ }
59
+ },
60
+ "outputs": {
61
+ "item": {
62
+ "type": "object",
63
+ "primary": true,
64
+ "semantic": "external_data",
65
+ "required": false,
66
+ "description": "The same item, only when it may continue.",
67
+ "schema": "object"
68
+ }
69
+ },
70
+ "permissions": {
71
+ "project": []
72
+ },
73
+ "ui": [
74
+ {
75
+ "port": "decision",
76
+ "control": "text"
77
+ },
78
+ {
79
+ "port": "item",
80
+ "control": "text"
81
+ },
82
+ {
83
+ "port": "minimum_score",
84
+ "control": "number"
85
+ }
86
+ ]
87
+ },
88
+ "code": "const d = input.decision || {};\nconst minimum = Number(input.minimum_score || 0);\nif (d.yes !== true || Number(d.score || 0) < minimum) return {};\nreturn { item: input.item };\n",
89
+ "tests": [
90
+ {
91
+ "name": "Continues when yes",
92
+ "input": {
93
+ "decision": {
94
+ "yes": true,
95
+ "score": 82,
96
+ "label": "Qualified lead",
97
+ "reason": "Budget is $5,000."
98
+ },
99
+ "item": {
100
+ "id": "7"
101
+ }
102
+ },
103
+ "expected": {
104
+ "item": {
105
+ "id": "7"
106
+ }
107
+ }
108
+ },
109
+ {
110
+ "name": "Stops when no",
111
+ "input": {
112
+ "decision": {
113
+ "yes": false,
114
+ "score": 20,
115
+ "label": "Not a fit",
116
+ "reason": "No budget."
117
+ },
118
+ "item": {
119
+ "id": "8"
120
+ }
121
+ },
122
+ "expected": {}
123
+ },
124
+ {
125
+ "name": "Stops below the minimum score",
126
+ "input": {
127
+ "decision": {
128
+ "yes": true,
129
+ "score": 55,
130
+ "label": "Maybe",
131
+ "reason": "Unclear timeline."
132
+ },
133
+ "item": {
134
+ "id": "9"
135
+ },
136
+ "minimum_score": 70
137
+ },
138
+ "expected": {}
139
+ }
140
+ ],
141
+ "portable": {
142
+ "format": "stillmade-block/1",
143
+ "dependencies": [],
144
+ "sources": [
145
+ {
146
+ "kind": "original",
147
+ "license": "MIT",
148
+ "paths": [
149
+ "LICENSE",
150
+ "src/run.js"
151
+ ],
152
+ "evidence": [
153
+ "upstream/0/LICENSE",
154
+ "upstream/0/src/run.js"
155
+ ],
156
+ "changes": "Original implementation declared by the packager; no reused repository or dependency code."
157
+ }
158
+ ],
159
+ "files": {
160
+ "upstream/0/LICENSE": "MIT License\n\nCopyright (c) 2026 StillMade contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
161
+ "upstream/0/src/run.js": "const d = input.decision || {};\nconst minimum = Number(input.minimum_score || 0);\nif (d.yes !== true || Number(d.score || 0) < minimum) return {};\nreturn { item: input.item };\n"
162
+ },
163
+ "lineage": {
164
+ "parents": [],
165
+ "changes": "Packaged original Block source for StillMade."
166
+ }
167
+ }
168
+ };
@@ -0,0 +1,101 @@
1
+ // Generated by scripts/build-owned-blocks.mjs. Edit the owned source files.
2
+ export default {
3
+ "manifest": {
4
+ "schemaVersion": 1,
5
+ "sdkVersion": "0.1.0",
6
+ "id": "sm.generate-image",
7
+ "version": "2.1.0",
8
+ "name": "Generate image",
9
+ "description": "Create an image from a prompt. Add your own photos, such as a product, a person or a place, and the new image keeps them.",
10
+ "kind": "task",
11
+ "runtime": "capability",
12
+ "entry": "src/capability.json",
13
+ "license": "MIT",
14
+ "provenance": {
15
+ "notice": "MIT License\n\nCopyright (c) 2026 StillMade contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
16
+ },
17
+ "inputs": {
18
+ "input": {
19
+ "type": "text",
20
+ "primary": true,
21
+ "description": "Describe the image to create."
22
+ },
23
+ "photos": {
24
+ "type": "image[]",
25
+ "required": false,
26
+ "semantic": "reference_image",
27
+ "description": "Your own photos to build the image from, such as the product to show. Leave empty to create from the prompt alone."
28
+ }
29
+ },
30
+ "outputs": {
31
+ "output": {
32
+ "type": "image",
33
+ "primary": true
34
+ }
35
+ },
36
+ "permissions": {
37
+ "project": [],
38
+ "capabilities": [
39
+ "image.generate"
40
+ ],
41
+ "network": [],
42
+ "filesystem": [],
43
+ "secrets": []
44
+ },
45
+ "ui": [
46
+ {
47
+ "port": "input",
48
+ "control": "text"
49
+ },
50
+ {
51
+ "port": "photos",
52
+ "control": "asset"
53
+ }
54
+ ]
55
+ },
56
+ "capability": {
57
+ "schemaVersion": 1,
58
+ "operation": "image.generate",
59
+ "prompt": {
60
+ "$input": "input"
61
+ },
62
+ "output": "output",
63
+ "references": {
64
+ "$input": "photos"
65
+ }
66
+ },
67
+ "tests": [
68
+ {
69
+ "name": "Storyboard establishing shot",
70
+ "input": {
71
+ "input": "Wide cinematic establishing shot of a quiet coastal town at sunrise, clear silhouettes, storyboard composition."
72
+ },
73
+ "expectations": {
74
+ "output": {
75
+ "kind": "image",
76
+ "format": "png",
77
+ "width": 1024,
78
+ "height": 1024,
79
+ "minBytes": 67,
80
+ "maxBytes": 12000000
81
+ }
82
+ }
83
+ },
84
+ {
85
+ "name": "Short visual prompt",
86
+ "input": {
87
+ "input": "A red paper boat on still water."
88
+ },
89
+ "expectations": {
90
+ "output": {
91
+ "kind": "image",
92
+ "format": "png",
93
+ "width": 1024,
94
+ "height": 1024,
95
+ "minBytes": 67,
96
+ "maxBytes": 12000000
97
+ }
98
+ }
99
+ }
100
+ ]
101
+ };