@mevdragon/vidfarm-devcli 0.2.13 → 0.3.0

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 (200) hide show
  1. package/README.md +11 -4
  2. package/SKILL.director.md +97 -0
  3. package/SKILL.platform.md +66 -6
  4. package/dist/src/cli.js +137 -1524
  5. package/dist/src/dev-serve.js +169 -0
  6. package/package.json +5 -24
  7. package/.env.example +0 -60
  8. package/auto-create-hyperframe-templates/AUTO_CREATE_HYPERFRAME_TEMPLATES.md +0 -275
  9. package/auto-create-hyperframe-templates/extractor-system-prompt.md +0 -128
  10. package/auto-create-hyperframe-templates/input-manifest.schema.json +0 -56
  11. package/auto-create-hyperframe-templates/lambda-memory-estimator.md +0 -118
  12. package/auto-create-hyperframe-templates/production-graph.schema.json +0 -314
  13. package/auto-create-hyperframe-templates/runbook.md +0 -198
  14. package/auto-create-hyperframe-templates/scripts/create-hyperframe-template.mjs +0 -368
  15. package/auto-create-hyperframe-templates/template-plan.schema.json +0 -311
  16. package/auto-create-hyperframe-templates/template-planner-prompt.md +0 -144
  17. package/auto-create-templates/AUTO_CREATE_TEMPLATES.md +0 -599
  18. package/auto-create-templates/extractor-system-prompt.md +0 -119
  19. package/auto-create-templates/production-graph.schema.json +0 -276
  20. package/auto-create-templates/runbook.md +0 -140
  21. package/auto-create-templates/template-plan.schema.json +0 -301
  22. package/auto-create-templates/template-planner-prompt.md +0 -137
  23. package/dist/src/account-pages-legacy.js +0 -9336
  24. package/dist/src/account-pages-legacy.js.map +0 -1
  25. package/dist/src/account-pages.js +0 -61
  26. package/dist/src/account-pages.js.map +0 -1
  27. package/dist/src/app.js +0 -14023
  28. package/dist/src/app.js.map +0 -1
  29. package/dist/src/cli.js.map +0 -1
  30. package/dist/src/composition-runtime.js +0 -581
  31. package/dist/src/composition-runtime.js.map +0 -1
  32. package/dist/src/config.js +0 -140
  33. package/dist/src/config.js.map +0 -1
  34. package/dist/src/context.js +0 -492
  35. package/dist/src/context.js.map +0 -1
  36. package/dist/src/dev-app-legacy.js +0 -694
  37. package/dist/src/dev-app-legacy.js.map +0 -1
  38. package/dist/src/dev-app.js +0 -6
  39. package/dist/src/dev-app.js.map +0 -1
  40. package/dist/src/domain.js +0 -2
  41. package/dist/src/domain.js.map +0 -1
  42. package/dist/src/editor-chat-history.js +0 -82
  43. package/dist/src/editor-chat-history.js.map +0 -1
  44. package/dist/src/editor-chat.js +0 -311
  45. package/dist/src/editor-chat.js.map +0 -1
  46. package/dist/src/frontend/flockposter-cache-store.js +0 -124
  47. package/dist/src/frontend/flockposter-cache-store.js.map +0 -1
  48. package/dist/src/frontend/homepage-client.js +0 -117
  49. package/dist/src/frontend/homepage-client.js.map +0 -1
  50. package/dist/src/frontend/homepage-shared.js +0 -4
  51. package/dist/src/frontend/homepage-shared.js.map +0 -1
  52. package/dist/src/frontend/homepage-store.js +0 -28
  53. package/dist/src/frontend/homepage-store.js.map +0 -1
  54. package/dist/src/frontend/homepage-view.js +0 -260
  55. package/dist/src/frontend/homepage-view.js.map +0 -1
  56. package/dist/src/frontend/page-runtime-client.js +0 -103
  57. package/dist/src/frontend/page-runtime-client.js.map +0 -1
  58. package/dist/src/frontend/page-runtime-store.js +0 -9
  59. package/dist/src/frontend/page-runtime-store.js.map +0 -1
  60. package/dist/src/frontend/sentry.js +0 -42
  61. package/dist/src/frontend/sentry.js.map +0 -1
  62. package/dist/src/frontend/template-editor-chat.js +0 -3767
  63. package/dist/src/frontend/template-editor-chat.js.map +0 -1
  64. package/dist/src/help-page.js +0 -333
  65. package/dist/src/help-page.js.map +0 -1
  66. package/dist/src/homepage.js +0 -919
  67. package/dist/src/homepage.js.map +0 -1
  68. package/dist/src/hyperframes/composition.js +0 -180
  69. package/dist/src/hyperframes/composition.js.map +0 -1
  70. package/dist/src/index.js +0 -16
  71. package/dist/src/index.js.map +0 -1
  72. package/dist/src/instrument.js +0 -30
  73. package/dist/src/instrument.js.map +0 -1
  74. package/dist/src/lib/crypto.js +0 -45
  75. package/dist/src/lib/crypto.js.map +0 -1
  76. package/dist/src/lib/dev-log.js +0 -54
  77. package/dist/src/lib/dev-log.js.map +0 -1
  78. package/dist/src/lib/display-name.js +0 -11
  79. package/dist/src/lib/display-name.js.map +0 -1
  80. package/dist/src/lib/ids.js +0 -24
  81. package/dist/src/lib/ids.js.map +0 -1
  82. package/dist/src/lib/images.js +0 -19
  83. package/dist/src/lib/images.js.map +0 -1
  84. package/dist/src/lib/json.js +0 -15
  85. package/dist/src/lib/json.js.map +0 -1
  86. package/dist/src/lib/template-dna.js +0 -543
  87. package/dist/src/lib/template-dna.js.map +0 -1
  88. package/dist/src/lib/template-paths.js +0 -28
  89. package/dist/src/lib/template-paths.js.map +0 -1
  90. package/dist/src/lib/template-style-options.js +0 -203
  91. package/dist/src/lib/template-style-options.js.map +0 -1
  92. package/dist/src/lib/time.js +0 -7
  93. package/dist/src/lib/time.js.map +0 -1
  94. package/dist/src/lib/video-quality-harness.js +0 -60
  95. package/dist/src/lib/video-quality-harness.js.map +0 -1
  96. package/dist/src/page-runtime.js +0 -2
  97. package/dist/src/page-runtime.js.map +0 -1
  98. package/dist/src/page-shell.js +0 -2393
  99. package/dist/src/page-shell.js.map +0 -1
  100. package/dist/src/primitive-context.js +0 -299
  101. package/dist/src/primitive-context.js.map +0 -1
  102. package/dist/src/primitive-registry.js +0 -2181
  103. package/dist/src/primitive-registry.js.map +0 -1
  104. package/dist/src/primitive-sdk.js +0 -4
  105. package/dist/src/primitive-sdk.js.map +0 -1
  106. package/dist/src/primitives/remotion/html-image.js +0 -30
  107. package/dist/src/primitives/remotion/html-image.js.map +0 -1
  108. package/dist/src/primitives/remotion/media-slideshow.js +0 -60
  109. package/dist/src/primitives/remotion/media-slideshow.js.map +0 -1
  110. package/dist/src/react-page-shell.js +0 -35
  111. package/dist/src/react-page-shell.js.map +0 -1
  112. package/dist/src/ready-post-schedule-component.js +0 -1515
  113. package/dist/src/ready-post-schedule-component.js.map +0 -1
  114. package/dist/src/registry.js +0 -296
  115. package/dist/src/registry.js.map +0 -1
  116. package/dist/src/runtime.js +0 -31
  117. package/dist/src/runtime.js.map +0 -1
  118. package/dist/src/services/api-call-history.js +0 -249
  119. package/dist/src/services/api-call-history.js.map +0 -1
  120. package/dist/src/services/auth.js +0 -152
  121. package/dist/src/services/auth.js.map +0 -1
  122. package/dist/src/services/billing.js +0 -231
  123. package/dist/src/services/billing.js.map +0 -1
  124. package/dist/src/services/chat-threads.js +0 -92
  125. package/dist/src/services/chat-threads.js.map +0 -1
  126. package/dist/src/services/fork-access.js +0 -94
  127. package/dist/src/services/fork-access.js.map +0 -1
  128. package/dist/src/services/ghostcut.js +0 -132
  129. package/dist/src/services/ghostcut.js.map +0 -1
  130. package/dist/src/services/hyperframes.js +0 -1014
  131. package/dist/src/services/hyperframes.js.map +0 -1
  132. package/dist/src/services/job-capacity.js +0 -14
  133. package/dist/src/services/job-capacity.js.map +0 -1
  134. package/dist/src/services/job-logs.js +0 -197
  135. package/dist/src/services/job-logs.js.map +0 -1
  136. package/dist/src/services/jobs.js +0 -136
  137. package/dist/src/services/jobs.js.map +0 -1
  138. package/dist/src/services/media-processing.js +0 -743
  139. package/dist/src/services/media-processing.js.map +0 -1
  140. package/dist/src/services/primitive-media-lambda.js +0 -280
  141. package/dist/src/services/primitive-media-lambda.js.map +0 -1
  142. package/dist/src/services/providers.js +0 -2870
  143. package/dist/src/services/providers.js.map +0 -1
  144. package/dist/src/services/rate-limits.js +0 -237
  145. package/dist/src/services/rate-limits.js.map +0 -1
  146. package/dist/src/services/remotion.js +0 -688
  147. package/dist/src/services/remotion.js.map +0 -1
  148. package/dist/src/services/serverless-auth.js +0 -374
  149. package/dist/src/services/serverless-auth.js.map +0 -1
  150. package/dist/src/services/serverless-jobs.js +0 -1074
  151. package/dist/src/services/serverless-jobs.js.map +0 -1
  152. package/dist/src/services/serverless-provider-keys.js +0 -401
  153. package/dist/src/services/serverless-provider-keys.js.map +0 -1
  154. package/dist/src/services/serverless-records.js +0 -1086
  155. package/dist/src/services/serverless-records.js.map +0 -1
  156. package/dist/src/services/serverless-template-configs.js +0 -67
  157. package/dist/src/services/serverless-template-configs.js.map +0 -1
  158. package/dist/src/services/storage.js +0 -382
  159. package/dist/src/services/storage.js.map +0 -1
  160. package/dist/src/services/template-certification.js +0 -475
  161. package/dist/src/services/template-certification.js.map +0 -1
  162. package/dist/src/services/template-loader.js +0 -99
  163. package/dist/src/services/template-loader.js.map +0 -1
  164. package/dist/src/services/template-runtime-bundles.js +0 -217
  165. package/dist/src/services/template-runtime-bundles.js.map +0 -1
  166. package/dist/src/services/template-sources.js +0 -1017
  167. package/dist/src/services/template-sources.js.map +0 -1
  168. package/dist/src/services/video-normalization.js +0 -2
  169. package/dist/src/services/video-normalization.js.map +0 -1
  170. package/dist/src/services/webhooks.js +0 -62
  171. package/dist/src/services/webhooks.js.map +0 -1
  172. package/dist/src/template-editor-pages.js +0 -6624
  173. package/dist/src/template-editor-pages.js.map +0 -1
  174. package/dist/src/template-editor-shell.js +0 -2713
  175. package/dist/src/template-editor-shell.js.map +0 -1
  176. package/dist/src/template-sdk.js +0 -4
  177. package/dist/src/template-sdk.js.map +0 -1
  178. package/dist/src/worker.js +0 -17
  179. package/dist/src/worker.js.map +0 -1
  180. package/public/assets/homepage-app.js +0 -54
  181. package/public/assets/homepage-client-app.js +0 -80
  182. package/public/assets/page-runtime-client-app.js +0 -94
  183. package/readme.secret.md +0 -89
  184. package/templates/vidfarm_template_0000/README.md +0 -106
  185. package/templates/vidfarm_template_0000/SKILL.md +0 -266
  186. package/templates/vidfarm_template_0000/assets/Abel-Regular.ttf +0 -0
  187. package/templates/vidfarm_template_0000/assets/DMSerifDisplay-Regular.ttf +0 -0
  188. package/templates/vidfarm_template_0000/assets/Montserrat[wght].ttf +0 -0
  189. package/templates/vidfarm_template_0000/assets/SourceCodePro[wght].ttf +0 -0
  190. package/templates/vidfarm_template_0000/assets/TikTokSans-SemiBold.ttf +0 -0
  191. package/templates/vidfarm_template_0000/assets/Yesteryear-Regular.ttf +0 -0
  192. package/templates/vidfarm_template_0000/composition.json +0 -11
  193. package/templates/vidfarm_template_0000/src/lib/images.js +0 -221
  194. package/templates/vidfarm_template_0000/src/remotion/Root.js +0 -33
  195. package/templates/vidfarm_template_0000/src/remotion/index.js +0 -3
  196. package/templates/vidfarm_template_0000/src/sdk.js +0 -3
  197. package/templates/vidfarm_template_0000/src/style-options.js +0 -200
  198. package/templates/vidfarm_template_0000/src/template-dna.js +0 -9
  199. package/templates/vidfarm_template_0000/src/template.js +0 -1566
  200. package/templates/vidfarm_template_0000/template.config.json +0 -21
@@ -1,475 +0,0 @@
1
- import { existsSync, readFileSync, readdirSync } from "node:fs";
2
- import path from "node:path";
3
- const APPROVED_TEMPLATE_MODEL_IDS = new Set([
4
- "gpt-5.4",
5
- "gemini-3.1-flash-lite",
6
- "gemini-3.1-flash-lite-preview",
7
- "gemini-2.5-flash-lite",
8
- "qwen/qwen3.6-plus",
9
- "sonar",
10
- "gpt-image-1",
11
- "gpt-image-2",
12
- "gemini-3.1-flash-image-preview",
13
- "gemini-2.5-flash-image",
14
- "gemini-3-pro-image-preview",
15
- "google/gemini-3.1-flash-image-preview",
16
- "google/gemini-2.5-flash-image-preview",
17
- "bytedance/seedance-2.0",
18
- "bytedance-seed/seedream-4.5",
19
- "google/gemini-3.1-flash-tts-preview",
20
- "gemini-3.1-flash-tts-preview",
21
- "gemini-2.5-flash-preview-tts",
22
- "gpt-4o-mini-tts-2025-12-15",
23
- "openai/gpt-4o-mini-transcribe",
24
- "gpt-4o-mini-transcribe-2025-12-15",
25
- "sora-2",
26
- "veo-3.0-generate-001"
27
- ]);
28
- const TEMPLATE_DIRECT_PROVIDER_ACCESS_PATTERNS = [
29
- /process\.env\.(OPENAI_API_KEY|GEMINI_API_KEY|OPENROUTER_API_KEY|PERPLEXITY_API_KEY)/,
30
- /https?:\/\/api\.openai\.com/,
31
- /https?:\/\/generativelanguage\.googleapis\.com/,
32
- /https?:\/\/openrouter\.ai/,
33
- /https?:\/\/api\.perplexity\.ai/,
34
- /\bAuthorization\s*:/,
35
- /\bapiKey\s*:/,
36
- /\bapi_key\s*:/
37
- ];
38
- const TEMPLATE_OPERATION_PROVIDER_DEFAULT_PATTERN = /(?:^|[\s,{])(?:provider|text_provider|image_provider|tts_provider|speech_provider|transcription_provider)\s*:\s*z\.enum\([^;\n]+\.default\(/;
39
- const TEMPLATE_GEMINI_PROVIDER_FALLBACK_PATTERN = /(?:default(?:Text|Image)?Provider|textProvider|imageProvider|ttsProvider|voiceProvider|transcriptionProvider)\s*:\s*z\.enum\([^;\n]+\.default\(["']gemini["']\)|return\s+["']gemini["'];/g;
40
- const TEMPLATE_MODEL_LITERAL_PATTERN = /["'`](dall-e-3|dall-e|gpt-[^"'`]+|gemini-[^"'`]+|google\/gemini-[^"'`]+|openai\/gpt-[^"'`]+|qwen\/qwen[^"'`]+|bytedance\/[^"'`]+|bytedance-seed\/[^"'`]+|sora-[^"'`]+|veo-[^"'`]+|sonar(?:-[^"'`]+)?)["'`]/g;
41
- const TEMPLATE_UNSAFE_MODEL_PASSTHROUGH_PATTERN = /String\(ctx\.templateConfig\.[A-Za-z_]*Model|ctx\.templateConfig\.[A-Za-z_]*Model\s*\?\?|payload\.[A-Za-z_]*model\s*\?\?|sanitizeConfiguredModel\([^;\n]*(?:textModel|imageModel|layoutModel|ttsModel|transcriptionModel|speechModel|payload\.model|payload\.tts_model|payload\.transcription_model|payload\.speech_model)/g;
42
- export class TemplateCertificationService {
43
- async certify(input) {
44
- const checks = [];
45
- const { template, skillPath } = input;
46
- checks.push(this.check("template.metadata", Boolean(template.id &&
47
- template.slugId &&
48
- template.version &&
49
- template.about &&
50
- typeof template.about.title === "string" &&
51
- typeof template.about.description === "string" &&
52
- ["easy", "medium", "hard", "expert"].includes(template.about.difficulty) &&
53
- typeof template.about.viral_dna === "string" &&
54
- typeof template.about.visual_dna === "string" &&
55
- Array.isArray(template.about.preview_media) &&
56
- template.about.preview_media.every((entry) => typeof entry === "string") &&
57
- typeof template.about.link_to_original === "string" &&
58
- Array.isArray(template.about.links_to_inspiration) &&
59
- template.about.links_to_inspiration.every((entry) => typeof entry === "string") &&
60
- template.about.sound &&
61
- typeof template.about.sound.sound_title === "string" &&
62
- typeof template.about.sound.sound_url === "string" &&
63
- typeof template.about.proposal_generator === "string" &&
64
- typeof template.about.skeleton_prompt === "string" &&
65
- template.about.skeleton_prompt.length > 0 &&
66
- Array.isArray(template.about.sample_prompts) &&
67
- template.about.sample_prompts.every((entry) => typeof entry === "string") &&
68
- template.about.sample_prompts.length > 0 &&
69
- Array.isArray(template.examples) &&
70
- template.examples.every((example) => Array.isArray(example) && example.every((entry) => (entry &&
71
- typeof entry.media_url === "string" &&
72
- typeof entry.note === "string")))), "Template must define id, slugId, version, examples, and complete about metadata, including difficulty, links_to_inspiration, sound, proposal_generator, skeleton_prompt, and sample prompts.", {
73
- templateId: template.id,
74
- slugId: template.slugId,
75
- version: template.version,
76
- difficulty: template.about?.difficulty ?? null,
77
- inspirationLinkCount: template.about?.links_to_inspiration?.length ?? 0,
78
- hasSound: Boolean(template.about?.sound),
79
- exampleCount: template.examples?.length ?? 0,
80
- previewMediaCount: template.about?.preview_media?.length ?? 0,
81
- hasProposalGenerator: typeof template.about?.proposal_generator === "string" && template.about.proposal_generator.length > 0,
82
- hasSkeletonPrompt: typeof template.about?.skeleton_prompt === "string" && template.about.skeleton_prompt.length > 0,
83
- samplePromptCount: template.about?.sample_prompts?.length ?? 0
84
- }));
85
- checks.push(this.check("template.operations", Object.keys(template.operations).length > 0, "Template must define at least one operation."));
86
- checks.push(this.checkSkill(skillPath));
87
- checks.push(this.checkRemotionConfig({ modulePath: input.modulePath }));
88
- checks.push(...this.checkProviderPolicy({ modulePath: input.modulePath }));
89
- for (const [operationName, operation] of Object.entries(template.operations)) {
90
- checks.push(this.check(`operation.${operationName}.workflow`, typeof template.jobs[operation.workflow] === "function", `Operation ${operationName} must reference an existing workflow.`, { workflow: operation.workflow }));
91
- checks.push(this.check(`operation.${operationName}.smoke_payload`, Boolean(operation.smokeTestPayload), `Operation ${operationName} must define smokeTestPayload for certification.`));
92
- if (!operation.smokeTestPayload) {
93
- continue;
94
- }
95
- try {
96
- const payload = operation.inputSchema.parse(operation.smokeTestPayload);
97
- const workflow = template.jobs[operation.workflow];
98
- const smoke = createSmokeContext(template.id);
99
- const result = await workflow(smoke.ctx, payload);
100
- checks.push(this.check(`operation.${operationName}.smoke_run`, Boolean(result && (result.output || result.progress !== undefined)), `Operation ${operationName} smoke run completed.`, {
101
- logCount: smoke.logCount,
102
- storageWrites: smoke.storageWrites,
103
- billingCalls: smoke.billingCalls,
104
- providerCalls: smoke.providerCalls,
105
- remotionCalls: smoke.remotionCalls
106
- }));
107
- checks.push(this.check(`operation.${operationName}.logs`, smoke.logCount > 0, `Operation ${operationName} must emit at least one log/progress event during smoke run.`));
108
- }
109
- catch (error) {
110
- checks.push(this.check(`operation.${operationName}.smoke_run`, false, error instanceof Error ? error.message : "Smoke run failed."));
111
- }
112
- }
113
- return {
114
- passed: checks.every((check) => check.ok),
115
- checks
116
- };
117
- }
118
- check(code, ok, message, details) {
119
- return { code, ok, message, details };
120
- }
121
- checkSkill(skillPath) {
122
- try {
123
- const contents = readFileSync(skillPath, "utf8").trim();
124
- return this.check("template.skill", contents.length >= 40, "Template must include a non-trivial SKILL.md for customer agents.", { skillPath });
125
- }
126
- catch (error) {
127
- return this.check("template.skill", false, error instanceof Error ? error.message : "Unable to read SKILL.md.", { skillPath });
128
- }
129
- }
130
- checkRemotionConfig(input) {
131
- if (!input.modulePath) {
132
- return this.check("template.remotion_config", true, "Template module path was not provided; skipped Remotion config validation.");
133
- }
134
- const moduleContents = readFileSync(input.modulePath, "utf8");
135
- const remotionExpected = /ctx\.remotion\.render|remotion\.render/.test(moduleContents);
136
- if (!remotionExpected) {
137
- return this.check("template.remotion_config", true, "Template does not call Remotion render; skipped Remotion config validation.");
138
- }
139
- const templateRoot = findTemplateRoot(input.modulePath);
140
- if (!templateRoot) {
141
- return this.check("template.remotion_config", false, "Could not locate template.config.json for Remotion config validation.");
142
- }
143
- const configPath = path.join(templateRoot, "template.config.json");
144
- if (!existsSync(configPath)) {
145
- return this.check("template.remotion_config", false, "Template config must include template.config.json when the template uses Remotion.", { configPath });
146
- }
147
- let parsed;
148
- try {
149
- parsed = JSON.parse(readFileSync(configPath, "utf8"));
150
- }
151
- catch (error) {
152
- return this.check("template.remotion_config", false, error instanceof Error ? error.message : "Unable to parse template.config.json.", { configPath });
153
- }
154
- const compositionId = nonBlankString(parsed.remotion?.composition_id);
155
- const siteName = nonBlankString(parsed.remotion?.site_name);
156
- const serveUrl = nonBlankString(parsed.remotion?.serve_url);
157
- const offthreadVideoUsages = collectTemplateSourceFiles(templateRoot)
158
- .flatMap((filePath) => {
159
- const contents = readFileSync(filePath, "utf8");
160
- return collectPatternMatches(contents, /\bOffthreadVideo\b/g).map((match) => ({
161
- filePath,
162
- line: lineNumberForOffset(contents, match.index),
163
- text: match.text.slice(0, 140)
164
- }));
165
- });
166
- const ok = Boolean(compositionId &&
167
- siteName &&
168
- siteName === compositionId &&
169
- !serveUrl &&
170
- offthreadVideoUsages.length === 0 &&
171
- !compositionId.includes("_") &&
172
- !siteName.includes("_"));
173
- return this.check("template.remotion_config", ok, "Remotion templates must use one stable kebab-case value for remotion.composition_id and remotion.site_name, must leave remotion.serve_url blank, and must not use OffthreadVideo in template source files.", {
174
- configPath,
175
- compositionId,
176
- siteName,
177
- hasServeUrl: Boolean(serveUrl),
178
- offthreadVideoUsages
179
- });
180
- }
181
- checkProviderPolicy(input) {
182
- if (!input.modulePath) {
183
- return [
184
- this.check("template.provider_policy.source", true, "Template module path was not provided; skipped provider policy source validation.")
185
- ];
186
- }
187
- const moduleContents = readFileSync(input.modulePath, "utf8");
188
- const directProviderAccess = TEMPLATE_DIRECT_PROVIDER_ACCESS_PATTERNS
189
- .flatMap((pattern) => collectPatternMatches(moduleContents, pattern))
190
- .map((match) => ({
191
- line: lineNumberForOffset(moduleContents, match.index),
192
- text: match.text.slice(0, 140)
193
- }));
194
- const providerDefaults = collectPatternMatches(moduleContents, TEMPLATE_OPERATION_PROVIDER_DEFAULT_PATTERN)
195
- .map((match) => ({
196
- line: lineNumberForOffset(moduleContents, match.index),
197
- text: match.text.slice(0, 140)
198
- }));
199
- const geminiFallbacks = collectPatternMatches(moduleContents, TEMPLATE_GEMINI_PROVIDER_FALLBACK_PATTERN)
200
- .map((match) => ({
201
- line: lineNumberForOffset(moduleContents, match.index),
202
- text: match.text.slice(0, 140)
203
- }));
204
- const unsupportedModels = collectUnsupportedModelLiterals(moduleContents);
205
- const unsafeModelPassthrough = collectPatternMatches(moduleContents, TEMPLATE_UNSAFE_MODEL_PASSTHROUGH_PATTERN)
206
- .filter((match) => !isInsideSafeProviderModelResolver(moduleContents, match.index))
207
- .map((match) => ({
208
- line: lineNumberForOffset(moduleContents, match.index),
209
- text: match.text.slice(0, 140)
210
- }));
211
- return [
212
- this.check("template.provider_policy.keys", directProviderAccess.length === 0, "Templates must use ctx.providers so AI calls lease the customer's saved provider keys; direct provider env/API usage is not allowed.", directProviderAccess.length > 0 ? { modulePath: input.modulePath, matches: directProviderAccess.slice(0, 10) } : { modulePath: input.modulePath }),
213
- this.check("template.provider_policy.operation_defaults", providerDefaults.length === 0, "Operation payload provider fields must be optional explicit overrides; provider defaults belong in saved template config.", providerDefaults.length > 0 ? { modulePath: input.modulePath, matches: providerDefaults.slice(0, 10) } : { modulePath: input.modulePath }),
214
- this.check("template.provider_policy.provider_fallbacks", geminiFallbacks.length === 0, "Templates must not hide Gemini provider defaults or parser fallbacks. AI calls must use ctx.providers so platform resolution can choose from the customer's saved active keys first.", geminiFallbacks.length > 0 ? { modulePath: input.modulePath, matches: geminiFallbacks.slice(0, 10) } : { modulePath: input.modulePath }),
215
- this.check("template.provider_policy.models", unsupportedModels.length === 0, "Templates may only reference model IDs from the approved Vidfarm provider allowlist.", unsupportedModels.length > 0 ? { modulePath: input.modulePath, models: unsupportedModels.slice(0, 20) } : { modulePath: input.modulePath }),
216
- this.check("template.provider_policy.model_resolution", unsafeModelPassthrough.length === 0, "Template model config and payload overrides must be validated against the selected provider/model allowlist before calling ctx.providers.", unsafeModelPassthrough.length > 0 ? { modulePath: input.modulePath, matches: unsafeModelPassthrough.slice(0, 10) } : { modulePath: input.modulePath })
217
- ];
218
- }
219
- }
220
- const MOCK_PNG_BYTES = Uint8Array.from(Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACXBIWXMAAAPoAAAD6AG1e1JrAAAADUlEQVR4nGP4////fwAJ+wP9KobjigAAAABJRU5ErkJggg==", "base64"));
221
- function createSmokeContext(templateId) {
222
- let logCount = 0;
223
- let storageWrites = 0;
224
- let billingCalls = 0;
225
- let providerCalls = 0;
226
- let remotionCalls = 0;
227
- const prefix = `templates/${templateId}/users/certification-user/jobs/certification-job`;
228
- const ctx = {
229
- env: "development",
230
- customer: {
231
- id: "certification-user",
232
- email: "certification@vidfarm.local",
233
- name: "Certification",
234
- defaultWebhookUrl: null,
235
- isDeveloper: true,
236
- isAgency: false,
237
- isPaidPlan: true,
238
- planTier: "standalone",
239
- about: null,
240
- groupchatUrl: null,
241
- flockposterApiKey: null,
242
- createdAt: new Date(0).toISOString(),
243
- updatedAt: new Date(0).toISOString()
244
- },
245
- template: {
246
- id: templateId,
247
- slugId: "certification-template",
248
- previewMediaUrls: [],
249
- previewMediaPolicy: "auto"
250
- },
251
- templateConfig: {},
252
- logger: {
253
- debug() { logCount += 1; },
254
- info() { logCount += 1; },
255
- warn() { logCount += 1; },
256
- error() { logCount += 1; },
257
- progress() { logCount += 1; }
258
- },
259
- jobs: {
260
- async enqueueChild() {
261
- return { jobId: "child-certification-job" };
262
- }
263
- },
264
- storage: {
265
- async putJson(key) {
266
- storageWrites += 1;
267
- return { key: `${prefix}/${key}`, url: `https://certification.local/${encodeURIComponent(key)}` };
268
- },
269
- async putText(key) {
270
- storageWrites += 1;
271
- return { key: `${prefix}/${key}`, url: `https://certification.local/${encodeURIComponent(key)}` };
272
- },
273
- async putBuffer(key) {
274
- storageWrites += 1;
275
- return { key: `${prefix}/${key}`, url: `https://certification.local/${encodeURIComponent(key)}` };
276
- },
277
- getPublicUrl(key) {
278
- return `https://certification.local/${encodeURIComponent(`${prefix}/${key}`)}`;
279
- }
280
- },
281
- billing: {
282
- async record() {
283
- billingCalls += 1;
284
- }
285
- },
286
- providers: {
287
- listAvailableProviders() {
288
- return ["openai", "gemini", "openrouter", "perplexity"];
289
- },
290
- async generateText() {
291
- providerCalls += 1;
292
- return { text: "certification text", usage: { inputTokens: 1, outputTokens: 1, costUsd: 0 } };
293
- },
294
- async generateSpeech() {
295
- providerCalls += 1;
296
- return { bytes: Uint8Array.from([0, 1, 2, 3]), contentType: "audio/mpeg", usage: { inputTokens: 1, outputTokens: 1, costUsd: 0 } };
297
- },
298
- async generateImage() {
299
- providerCalls += 1;
300
- return { bytes: MOCK_PNG_BYTES, contentType: "image/png", revisedPrompt: null };
301
- },
302
- async analyzeImageLayout() {
303
- providerCalls += 1;
304
- return {
305
- zone: "bottom",
306
- align: "center",
307
- maxWidthPercent: 80,
308
- justification: "Certification mock layout."
309
- };
310
- },
311
- async transcribeSpeech() {
312
- providerCalls += 1;
313
- return { text: "certification transcript", usage: { inputTokens: 1, outputTokens: 1, costUsd: 0 } };
314
- }
315
- },
316
- remotion: {
317
- async render() {
318
- remotionCalls += 1;
319
- return {
320
- renderId: "render-certification",
321
- outputUrl: "https://certification.local/render.mp4",
322
- metadata: { mode: "certification-mock" }
323
- };
324
- }
325
- },
326
- hyperframes: {
327
- async render() {
328
- remotionCalls += 1;
329
- return {
330
- renderId: "hyperframes-render-certification",
331
- outputUrl: "https://certification.local/hyperframes-render.mp4",
332
- outputS3Uri: null,
333
- metadata: { mode: "certification-mock", architecture: "timeline_layers" }
334
- };
335
- }
336
- },
337
- media: {
338
- async normalizeVideo(input) {
339
- storageWrites += 1;
340
- return {
341
- key: `${prefix}/${input.outputKey}`,
342
- url: `https://certification.local/${encodeURIComponent(input.outputKey)}`,
343
- contentType: "video/mp4",
344
- normalization: {
345
- source: {
346
- durationSeconds: 5,
347
- width: 1080,
348
- height: 1920,
349
- videoCodec: "h264",
350
- audioCodec: "aac",
351
- videoBitrateKbps: 2000,
352
- audioBitrateKbps: 128,
353
- formatBitrateKbps: 2200,
354
- hasAudio: true,
355
- hasVideo: true,
356
- sampleRateHz: 48_000,
357
- channels: 2,
358
- frameRate: 30,
359
- formatName: "mp4",
360
- bytes: 1_000_000,
361
- url: input.sourceUrl
362
- },
363
- normalized: {
364
- durationSeconds: 5,
365
- width: 1080,
366
- height: 1920,
367
- videoCodec: "h264",
368
- audioCodec: "aac",
369
- videoBitrateKbps: 1500,
370
- audioBitrateKbps: 128,
371
- formatBitrateKbps: 1650,
372
- hasAudio: true,
373
- hasVideo: true,
374
- sampleRateHz: 48_000,
375
- channels: 2,
376
- frameRate: 30,
377
- formatName: "mp4",
378
- bytes: 750_000
379
- },
380
- compressionRatio: 0.75
381
- }
382
- };
383
- }
384
- }
385
- };
386
- return {
387
- ctx,
388
- get logCount() { return logCount; },
389
- get storageWrites() { return storageWrites; },
390
- get billingCalls() { return billingCalls; },
391
- get providerCalls() { return providerCalls; },
392
- get remotionCalls() { return remotionCalls; }
393
- };
394
- }
395
- function findTemplateRoot(modulePath) {
396
- let current = path.dirname(modulePath);
397
- for (let index = 0; index < 10; index += 1) {
398
- if (existsSync(path.join(current, "template.config.json"))) {
399
- return current;
400
- }
401
- const parent = path.dirname(current);
402
- if (parent === current) {
403
- break;
404
- }
405
- current = parent;
406
- }
407
- return null;
408
- }
409
- function nonBlankString(value) {
410
- if (typeof value !== "string") {
411
- return null;
412
- }
413
- const trimmed = value.trim();
414
- return trimmed ? trimmed : null;
415
- }
416
- function collectTemplateSourceFiles(templateRoot) {
417
- const files = [];
418
- const stack = [templateRoot];
419
- while (stack.length > 0) {
420
- const current = stack.pop();
421
- if (!current) {
422
- continue;
423
- }
424
- for (const entry of readdirSync(current, { withFileTypes: true })) {
425
- if (entry.name === "node_modules" || entry.name === "build" || entry.name === "dist" || entry.name.startsWith(".")) {
426
- continue;
427
- }
428
- const fullPath = path.join(current, entry.name);
429
- if (entry.isDirectory()) {
430
- stack.push(fullPath);
431
- continue;
432
- }
433
- if (/\.(?:[cm]?[jt]sx?)$/i.test(entry.name)) {
434
- files.push(fullPath);
435
- }
436
- }
437
- }
438
- return files;
439
- }
440
- function collectPatternMatches(contents, pattern) {
441
- const source = pattern.global ? pattern : new RegExp(pattern.source, pattern.flags.includes("g") ? pattern.flags : `${pattern.flags}g`);
442
- const matches = [];
443
- for (const match of contents.matchAll(source)) {
444
- matches.push({ index: match.index ?? 0, text: match[0] });
445
- }
446
- return matches;
447
- }
448
- function collectUnsupportedModelLiterals(contents) {
449
- const seen = new Map();
450
- for (const match of contents.matchAll(TEMPLATE_MODEL_LITERAL_PATTERN)) {
451
- const model = match[1]?.trim();
452
- if (!model || APPROVED_TEMPLATE_MODEL_IDS.has(model) || seen.has(model)) {
453
- continue;
454
- }
455
- seen.set(model, {
456
- model,
457
- line: lineNumberForOffset(contents, match.index ?? 0)
458
- });
459
- }
460
- return [...seen.values()];
461
- }
462
- function lineNumberForOffset(contents, offset) {
463
- let line = 1;
464
- for (let index = 0; index < offset; index += 1) {
465
- if (contents.charCodeAt(index) === 10) {
466
- line += 1;
467
- }
468
- }
469
- return line;
470
- }
471
- function isInsideSafeProviderModelResolver(contents, offset) {
472
- const prefix = contents.slice(Math.max(0, offset - 80), offset);
473
- return prefix.includes("sanitizeProviderModel(");
474
- }
475
- //# sourceMappingURL=template-certification.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-certification.js","sourceRoot":"","sources":["../../../src/services/template-certification.ts"],"names":[],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- import { pathToFileURL } from "node:url";
2
- export async function loadTemplateFromModule(modulePath) {
3
- const loaded = await import(pathToFileURL(modulePath).href);
4
- const candidates = Object.values(loaded);
5
- for (const candidate of candidates) {
6
- if (isTemplateDefinition(candidate)) {
7
- return normalizeTemplateDefinition(candidate);
8
- }
9
- }
10
- throw new Error(`No template definition export found in ${modulePath}`);
11
- }
12
- function normalizeTemplateDefinition(template) {
13
- return {
14
- ...template,
15
- about: {
16
- ...template.about,
17
- // Older runtime template releases may predate prompt metadata fields.
18
- difficulty: template.about.difficulty ?? "easy",
19
- links_to_inspiration: normalizeTemplateInspirationLinks(template.about.links_to_inspiration, template.about.link_to_original),
20
- sound: normalizeTemplateSound(template.about.sound),
21
- proposal_generator: template.about.proposal_generator ?? "",
22
- skeleton_prompt: template.about.skeleton_prompt ?? "",
23
- sample_prompts: template.about.sample_prompts ?? []
24
- },
25
- examples: template.examples ?? []
26
- };
27
- }
28
- function isTemplateDefinition(value) {
29
- if (!value || typeof value !== "object") {
30
- return false;
31
- }
32
- const candidate = value;
33
- const about = typeof candidate.about === "object" && candidate.about !== null
34
- ? candidate.about
35
- : null;
36
- const previewMedia = about && Array.isArray(about.preview_media)
37
- ? about.preview_media
38
- : null;
39
- const samplePrompts = about && Array.isArray(about.sample_prompts)
40
- ? about.sample_prompts
41
- : null;
42
- const sound = about && typeof about.sound === "object" && about.sound !== null
43
- ? about.sound
44
- : null;
45
- const linksToInspiration = about && Array.isArray(about.links_to_inspiration)
46
- ? about.links_to_inspiration
47
- : null;
48
- const examples = Array.isArray(candidate.examples)
49
- ? candidate.examples
50
- : null;
51
- return (typeof candidate.id === "string" &&
52
- typeof candidate.slugId === "string" &&
53
- typeof candidate.version === "string" &&
54
- about !== null &&
55
- typeof about.title === "string" &&
56
- typeof about.description === "string" &&
57
- (["easy", "medium", "hard", "expert"].includes(String(about.difficulty)) || typeof about.difficulty === "undefined") &&
58
- typeof about.viral_dna === "string" &&
59
- typeof about.visual_dna === "string" &&
60
- Array.isArray(previewMedia) &&
61
- previewMedia.every((entry) => typeof entry === "string") &&
62
- typeof about.link_to_original === "string" &&
63
- (linksToInspiration === null || linksToInspiration.every((entry) => typeof entry === "string")) &&
64
- (sound === null || (typeof sound.sound_title === "string" &&
65
- typeof sound.sound_url === "string")) &&
66
- (typeof about.proposal_generator === "string" || typeof about.proposal_generator === "undefined") &&
67
- (typeof about.skeleton_prompt === "string" || typeof about.skeleton_prompt === "undefined") &&
68
- (samplePrompts === null || samplePrompts.every((entry) => typeof entry === "string")) &&
69
- (examples === null || examples.every((example) => Array.isArray(example) && example.every((entry) => {
70
- if (!entry || typeof entry !== "object") {
71
- return false;
72
- }
73
- const media = entry;
74
- return typeof media.media_url === "string" && typeof media.note === "string";
75
- }))) &&
76
- typeof candidate.configSchema === "object" &&
77
- typeof candidate.operations === "object" &&
78
- typeof candidate.jobs === "object");
79
- }
80
- function normalizeTemplateSound(value) {
81
- if (!value || typeof value !== "object") {
82
- return {
83
- sound_title: "",
84
- sound_url: ""
85
- };
86
- }
87
- const sound = value;
88
- return {
89
- sound_title: typeof sound.sound_title === "string" ? sound.sound_title : "",
90
- sound_url: typeof sound.sound_url === "string" ? sound.sound_url : ""
91
- };
92
- }
93
- function normalizeTemplateInspirationLinks(value, linkToOriginal) {
94
- if (Array.isArray(value)) {
95
- return value.filter((entry) => typeof entry === "string");
96
- }
97
- return linkToOriginal ? [linkToOriginal] : [];
98
- }
99
- //# sourceMappingURL=template-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-loader.js","sourceRoot":"","sources":["../../../src/services/template-loader.ts"],"names":[],"mappings":"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"}