@mevdragon/vidfarm-devcli 0.2.14 → 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 (204) 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 +135 -1527
  5. package/package.json +5 -24
  6. package/.env.example +0 -60
  7. package/auto-create-hyperframe-templates/AUTO_CREATE_HYPERFRAME_TEMPLATES.md +0 -275
  8. package/auto-create-hyperframe-templates/extractor-system-prompt.md +0 -128
  9. package/auto-create-hyperframe-templates/input-manifest.schema.json +0 -56
  10. package/auto-create-hyperframe-templates/lambda-memory-estimator.md +0 -118
  11. package/auto-create-hyperframe-templates/production-graph.schema.json +0 -314
  12. package/auto-create-hyperframe-templates/runbook.md +0 -198
  13. package/auto-create-hyperframe-templates/scripts/create-hyperframe-template.mjs +0 -368
  14. package/auto-create-hyperframe-templates/template-plan.schema.json +0 -311
  15. package/auto-create-hyperframe-templates/template-planner-prompt.md +0 -144
  16. package/auto-create-templates/AUTO_CREATE_TEMPLATES.md +0 -599
  17. package/auto-create-templates/extractor-system-prompt.md +0 -119
  18. package/auto-create-templates/production-graph.schema.json +0 -276
  19. package/auto-create-templates/runbook.md +0 -140
  20. package/auto-create-templates/template-plan.schema.json +0 -301
  21. package/auto-create-templates/template-planner-prompt.md +0 -137
  22. package/dist/src/account-pages-legacy.js +0 -9338
  23. package/dist/src/account-pages-legacy.js.map +0 -1
  24. package/dist/src/account-pages.js +0 -52
  25. package/dist/src/account-pages.js.map +0 -1
  26. package/dist/src/app.js +0 -13711
  27. package/dist/src/app.js.map +0 -1
  28. package/dist/src/cli.js.map +0 -1
  29. package/dist/src/composition-runtime.js +0 -581
  30. package/dist/src/composition-runtime.js.map +0 -1
  31. package/dist/src/config.js +0 -140
  32. package/dist/src/config.js.map +0 -1
  33. package/dist/src/context.js +0 -492
  34. package/dist/src/context.js.map +0 -1
  35. package/dist/src/dev-app-legacy.js +0 -694
  36. package/dist/src/dev-app-legacy.js.map +0 -1
  37. package/dist/src/dev-app.js +0 -6
  38. package/dist/src/dev-app.js.map +0 -1
  39. package/dist/src/dev-serve.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 -312
  45. package/dist/src/editor-chat.js.map +0 -1
  46. package/dist/src/editor-dark-theme.js +0 -1128
  47. package/dist/src/editor-dark-theme.js.map +0 -1
  48. package/dist/src/frontend/flockposter-cache-store.js +0 -124
  49. package/dist/src/frontend/flockposter-cache-store.js.map +0 -1
  50. package/dist/src/frontend/homepage-client.js +0 -117
  51. package/dist/src/frontend/homepage-client.js.map +0 -1
  52. package/dist/src/frontend/homepage-shared.js +0 -4
  53. package/dist/src/frontend/homepage-shared.js.map +0 -1
  54. package/dist/src/frontend/homepage-store.js +0 -28
  55. package/dist/src/frontend/homepage-store.js.map +0 -1
  56. package/dist/src/frontend/homepage-view.js +0 -260
  57. package/dist/src/frontend/homepage-view.js.map +0 -1
  58. package/dist/src/frontend/page-runtime-client.js +0 -124
  59. package/dist/src/frontend/page-runtime-client.js.map +0 -1
  60. package/dist/src/frontend/page-runtime-store.js +0 -9
  61. package/dist/src/frontend/page-runtime-store.js.map +0 -1
  62. package/dist/src/frontend/sentry.js +0 -42
  63. package/dist/src/frontend/sentry.js.map +0 -1
  64. package/dist/src/frontend/template-editor-chat.js +0 -3760
  65. package/dist/src/frontend/template-editor-chat.js.map +0 -1
  66. package/dist/src/help-page.js +0 -333
  67. package/dist/src/help-page.js.map +0 -1
  68. package/dist/src/homepage.js +0 -919
  69. package/dist/src/homepage.js.map +0 -1
  70. package/dist/src/hyperframes/composition.js +0 -180
  71. package/dist/src/hyperframes/composition.js.map +0 -1
  72. package/dist/src/index.js +0 -16
  73. package/dist/src/index.js.map +0 -1
  74. package/dist/src/instrument.js +0 -30
  75. package/dist/src/instrument.js.map +0 -1
  76. package/dist/src/lib/crypto.js +0 -45
  77. package/dist/src/lib/crypto.js.map +0 -1
  78. package/dist/src/lib/dev-log.js +0 -54
  79. package/dist/src/lib/dev-log.js.map +0 -1
  80. package/dist/src/lib/display-name.js +0 -11
  81. package/dist/src/lib/display-name.js.map +0 -1
  82. package/dist/src/lib/ids.js +0 -24
  83. package/dist/src/lib/ids.js.map +0 -1
  84. package/dist/src/lib/images.js +0 -19
  85. package/dist/src/lib/images.js.map +0 -1
  86. package/dist/src/lib/json.js +0 -15
  87. package/dist/src/lib/json.js.map +0 -1
  88. package/dist/src/lib/template-dna.js +0 -543
  89. package/dist/src/lib/template-dna.js.map +0 -1
  90. package/dist/src/lib/template-paths.js +0 -28
  91. package/dist/src/lib/template-paths.js.map +0 -1
  92. package/dist/src/lib/template-style-options.js +0 -203
  93. package/dist/src/lib/template-style-options.js.map +0 -1
  94. package/dist/src/lib/time.js +0 -7
  95. package/dist/src/lib/time.js.map +0 -1
  96. package/dist/src/lib/video-quality-harness.js +0 -60
  97. package/dist/src/lib/video-quality-harness.js.map +0 -1
  98. package/dist/src/page-runtime.js +0 -2
  99. package/dist/src/page-runtime.js.map +0 -1
  100. package/dist/src/page-shell.js +0 -1315
  101. package/dist/src/page-shell.js.map +0 -1
  102. package/dist/src/primitive-context.js +0 -299
  103. package/dist/src/primitive-context.js.map +0 -1
  104. package/dist/src/primitive-registry.js +0 -2181
  105. package/dist/src/primitive-registry.js.map +0 -1
  106. package/dist/src/primitive-sdk.js +0 -4
  107. package/dist/src/primitive-sdk.js.map +0 -1
  108. package/dist/src/primitives/remotion/html-image.js +0 -30
  109. package/dist/src/primitives/remotion/html-image.js.map +0 -1
  110. package/dist/src/primitives/remotion/media-slideshow.js +0 -60
  111. package/dist/src/primitives/remotion/media-slideshow.js.map +0 -1
  112. package/dist/src/react-page-shell.js +0 -35
  113. package/dist/src/react-page-shell.js.map +0 -1
  114. package/dist/src/ready-post-schedule-component.js +0 -1515
  115. package/dist/src/ready-post-schedule-component.js.map +0 -1
  116. package/dist/src/registry.js +0 -296
  117. package/dist/src/registry.js.map +0 -1
  118. package/dist/src/runtime.js +0 -31
  119. package/dist/src/runtime.js.map +0 -1
  120. package/dist/src/services/api-call-history.js +0 -249
  121. package/dist/src/services/api-call-history.js.map +0 -1
  122. package/dist/src/services/auth.js +0 -152
  123. package/dist/src/services/auth.js.map +0 -1
  124. package/dist/src/services/billing.js +0 -231
  125. package/dist/src/services/billing.js.map +0 -1
  126. package/dist/src/services/chat-threads.js +0 -92
  127. package/dist/src/services/chat-threads.js.map +0 -1
  128. package/dist/src/services/fork-access.js +0 -93
  129. package/dist/src/services/fork-access.js.map +0 -1
  130. package/dist/src/services/fork-manifest.js +0 -43
  131. package/dist/src/services/fork-manifest.js.map +0 -1
  132. package/dist/src/services/ghostcut.js +0 -132
  133. package/dist/src/services/ghostcut.js.map +0 -1
  134. package/dist/src/services/hyperframes.js +0 -1014
  135. package/dist/src/services/hyperframes.js.map +0 -1
  136. package/dist/src/services/job-capacity.js +0 -14
  137. package/dist/src/services/job-capacity.js.map +0 -1
  138. package/dist/src/services/job-logs.js +0 -197
  139. package/dist/src/services/job-logs.js.map +0 -1
  140. package/dist/src/services/jobs.js +0 -136
  141. package/dist/src/services/jobs.js.map +0 -1
  142. package/dist/src/services/media-processing.js +0 -743
  143. package/dist/src/services/media-processing.js.map +0 -1
  144. package/dist/src/services/primitive-media-lambda.js +0 -280
  145. package/dist/src/services/primitive-media-lambda.js.map +0 -1
  146. package/dist/src/services/providers.js +0 -2870
  147. package/dist/src/services/providers.js.map +0 -1
  148. package/dist/src/services/rate-limits.js +0 -237
  149. package/dist/src/services/rate-limits.js.map +0 -1
  150. package/dist/src/services/remotion.js +0 -688
  151. package/dist/src/services/remotion.js.map +0 -1
  152. package/dist/src/services/serverless-auth.js +0 -374
  153. package/dist/src/services/serverless-auth.js.map +0 -1
  154. package/dist/src/services/serverless-jobs.js +0 -1074
  155. package/dist/src/services/serverless-jobs.js.map +0 -1
  156. package/dist/src/services/serverless-provider-keys.js +0 -401
  157. package/dist/src/services/serverless-provider-keys.js.map +0 -1
  158. package/dist/src/services/serverless-records.js +0 -1088
  159. package/dist/src/services/serverless-records.js.map +0 -1
  160. package/dist/src/services/serverless-template-configs.js +0 -67
  161. package/dist/src/services/serverless-template-configs.js.map +0 -1
  162. package/dist/src/services/storage.js +0 -383
  163. package/dist/src/services/storage.js.map +0 -1
  164. package/dist/src/services/template-certification.js +0 -475
  165. package/dist/src/services/template-certification.js.map +0 -1
  166. package/dist/src/services/template-loader.js +0 -99
  167. package/dist/src/services/template-loader.js.map +0 -1
  168. package/dist/src/services/template-runtime-bundles.js +0 -217
  169. package/dist/src/services/template-runtime-bundles.js.map +0 -1
  170. package/dist/src/services/template-sources.js +0 -1017
  171. package/dist/src/services/template-sources.js.map +0 -1
  172. package/dist/src/services/video-normalization.js +0 -2
  173. package/dist/src/services/video-normalization.js.map +0 -1
  174. package/dist/src/services/webhooks.js +0 -62
  175. package/dist/src/services/webhooks.js.map +0 -1
  176. package/dist/src/template-editor-pages.js +0 -2491
  177. package/dist/src/template-editor-pages.js.map +0 -1
  178. package/dist/src/template-editor-shell.js +0 -2702
  179. package/dist/src/template-editor-shell.js.map +0 -1
  180. package/dist/src/template-sdk.js +0 -4
  181. package/dist/src/template-sdk.js.map +0 -1
  182. package/dist/src/worker.js +0 -17
  183. package/dist/src/worker.js.map +0 -1
  184. package/public/assets/homepage-app.js +0 -54
  185. package/public/assets/homepage-client-app.js +0 -80
  186. package/public/assets/page-runtime-client-app.js +0 -94
  187. package/readme.secret.md +0 -89
  188. package/templates/vidfarm_template_0000/README.md +0 -106
  189. package/templates/vidfarm_template_0000/SKILL.md +0 -266
  190. package/templates/vidfarm_template_0000/assets/Abel-Regular.ttf +0 -0
  191. package/templates/vidfarm_template_0000/assets/DMSerifDisplay-Regular.ttf +0 -0
  192. package/templates/vidfarm_template_0000/assets/Montserrat[wght].ttf +0 -0
  193. package/templates/vidfarm_template_0000/assets/SourceCodePro[wght].ttf +0 -0
  194. package/templates/vidfarm_template_0000/assets/TikTokSans-SemiBold.ttf +0 -0
  195. package/templates/vidfarm_template_0000/assets/Yesteryear-Regular.ttf +0 -0
  196. package/templates/vidfarm_template_0000/composition.json +0 -11
  197. package/templates/vidfarm_template_0000/src/lib/images.js +0 -221
  198. package/templates/vidfarm_template_0000/src/remotion/Root.js +0 -33
  199. package/templates/vidfarm_template_0000/src/remotion/index.js +0 -3
  200. package/templates/vidfarm_template_0000/src/sdk.js +0 -3
  201. package/templates/vidfarm_template_0000/src/style-options.js +0 -200
  202. package/templates/vidfarm_template_0000/src/template-dna.js +0 -9
  203. package/templates/vidfarm_template_0000/src/template.js +0 -1566
  204. 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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"}