@mevdragon/vidfarm-devcli 0.2.1 → 0.2.3

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 (40) hide show
  1. package/.env.example +6 -39
  2. package/GETTING_STARTED.developers.md +87 -0
  3. package/README.md +94 -238
  4. package/SKILL.developer.md +430 -104
  5. package/dist/src/account-pages.js +1 -1
  6. package/dist/src/app.js +93 -5
  7. package/dist/src/cli.js +456 -8
  8. package/dist/src/config.js +3 -2
  9. package/dist/src/context.js +30 -11
  10. package/dist/src/db.js +2 -57
  11. package/dist/src/dev-app.js +0 -1
  12. package/dist/src/index.js +4 -2
  13. package/dist/src/lib/template-paths.js +21 -0
  14. package/dist/src/runtime.js +3 -1
  15. package/dist/src/services/auth.js +4 -4
  16. package/dist/src/services/job-logs.js +186 -0
  17. package/dist/src/services/jobs.js +3 -2
  18. package/dist/src/services/providers.js +14 -6
  19. package/dist/src/services/storage.js +85 -2
  20. package/dist/src/services/template-sources.js +29 -3
  21. package/dist/templates/template_0000/src/lib/images.js +46 -86
  22. package/dist/templates/template_0000/src/template.js +277 -53
  23. package/package.json +5 -6
  24. package/templates/template_0000/README.md +8 -52
  25. package/templates/template_0000/SKILL.md +35 -3
  26. package/templates/template_0000/package.json +3 -6
  27. package/templates/template_0000/src/lib/images.js +46 -86
  28. package/templates/template_0000/src/lib/images.ts +55 -98
  29. package/templates/template_0000/src/template-dna.js +9 -0
  30. package/templates/template_0000/src/template.js +523 -199
  31. package/templates/template_0000/src/template.ts +356 -61
  32. package/templates/template_0000/template.config.json +7 -12
  33. package/AWS_REMOTION_HANDOFF.md +0 -311
  34. package/PLATFORM_SPEC.md +0 -1039
  35. package/SKILL.director.md +0 -599
  36. package/dist/infra/cdk/bin/vidfarm-prod.js +0 -59
  37. package/dist/infra/cdk/lib/vidfarm-prod-stack.js +0 -212
  38. package/templates/template_0000/package-lock.json +0 -5505
  39. package/templates/template_0000/scripts/create-site.mjs +0 -27
  40. package/templates/template_0000/scripts/render-cloud.mjs +0 -72
package/SKILL.director.md DELETED
@@ -1,599 +0,0 @@
1
- ---
2
- name: vidfarm-director
3
- description: Use Vidfarm as a director-facing agent-first video production platform. Use this whenever the user wants to log in with OTP, store their own AI provider keys, discover templates, read a template's published skill, submit template jobs, poll job status, inspect logs, or operate a multi-stage media production workflow through the Vidfarm REST API.
4
- ---
5
-
6
- # Vidfarm Director
7
-
8
- Vidfarm is an agent-first media production platform.
9
-
10
- Use this skill when the user wants to operate Vidfarm as a director, not when they want to build templates or modify the platform.
11
-
12
- The user of this skill is a director or template operator:
13
-
14
- - they sign in to Vidfarm
15
- - they bring their own AI API keys
16
- - they discover available templates
17
- - they read each template's published skill and metadata
18
- - they submit async jobs to template operations
19
- - they poll jobs, read logs, and chain stages together
20
-
21
- Do not explain template developer internals unless the user explicitly asks for them.
22
-
23
- ## Core Mental Model
24
-
25
- Treat Vidfarm as a shared control plane for many production templates.
26
-
27
- Each template is a production format with a common platform wrapper:
28
-
29
- - auth
30
- - API keys
31
- - async jobs
32
- - logs
33
- - webhooks
34
- - artifacts
35
-
36
- Each template then adds its own production logic through its operations.
37
-
38
- The platform is intentionally async-first:
39
-
40
- - every meaningful production action becomes a job
41
- - jobs immediately return `job_id`
42
- - the caller polls for status or receives a webhook
43
-
44
- This is important because video production is inherently multi-stage and often slow:
45
-
46
- - concept generation
47
- - research
48
- - script or storyboard scaffolding
49
- - image or scene generation
50
- - human review or revision
51
- - final render
52
-
53
- You should frame Vidfarm as a production pipeline system, not as a single prompt-response tool.
54
-
55
- ## Agent-First Operating Style
56
-
57
- Vidfarm is designed for users who work through AI agents.
58
-
59
- Your role is usually to operate the API on the user's behalf:
60
-
61
- 1. log the user in
62
- 2. store their provider keys
63
- 3. list templates
64
- 4. inspect the selected template
65
- 5. read the template's published skill
66
- 6. choose the right operation
67
- 7. submit the job
68
- 8. monitor progress
69
- 9. use outputs from one stage as inputs to the next stage
70
-
71
- Prefer doing this operational work for the user instead of only describing the docs.
72
-
73
- When helping a user choose what to do next, think in terms of pipeline stages. Ask what stage they are in:
74
-
75
- - idea
76
- - storyboard
77
- - asset generation
78
- - refinement
79
- - rendering
80
- - delivery
81
-
82
- ## Bring Your Own AI Keys
83
-
84
- Vidfarm expects customers to bring their own AI provider credentials.
85
-
86
- Today the user-facing provider key API supports:
87
-
88
- - `openai`
89
- - `gemini`
90
- - `openrouter`
91
- - `perplexity`
92
-
93
- Before running most AI-backed template operations, the user should save at least one provider key that matches the template's expected provider flow.
94
-
95
- Do not imply that Vidfarm supplies the AI credits itself. The customer is expected to supply their own upstream AI access.
96
-
97
- ## Base URL And Auth
98
-
99
- Production is intended to run under:
100
-
101
- ```txt
102
- https://vidfarm.cloud.zoomgtm.com
103
- ```
104
-
105
- The REST API base path is:
106
-
107
- ```txt
108
- /api/v1
109
- ```
110
-
111
- Authenticated API calls use these headers:
112
-
113
- ```txt
114
- vidfarm-user-id: <customer id>
115
- vidfarm-api-key: <api key>
116
- ```
117
-
118
- The API key is issued after OTP verification.
119
-
120
- ## Login Flow
121
-
122
- Use this sequence for API login:
123
-
124
- 1. `POST /api/v1/user/request-otp`
125
- 2. `POST /api/v1/user/verify-otp`
126
-
127
- Request OTP:
128
-
129
- ```bash
130
- curl -X POST "https://vidfarm.cloud.zoomgtm.com/api/v1/user/request-otp" \
131
- -H "content-type: application/json" \
132
- -d '{
133
- "email": "user@example.com"
134
- }'
135
- ```
136
-
137
- Verify OTP:
138
-
139
- ```bash
140
- curl -X POST "https://vidfarm.cloud.zoomgtm.com/api/v1/user/verify-otp" \
141
- -H "content-type: application/json" \
142
- -d '{
143
- "email": "user@example.com",
144
- "code": "123456",
145
- "name": "Example User"
146
- }'
147
- ```
148
-
149
- Expected response shape:
150
-
151
- ```json
152
- {
153
- "customer": {
154
- "id": "cus_...",
155
- "email": "user@example.com",
156
- "name": "Example User",
157
- "defaultWebhookUrl": null,
158
- "isDeveloper": false,
159
- "isPaidPlan": true
160
- },
161
- "apiKey": "vf_key_..."
162
- }
163
- ```
164
-
165
- Persist these values for later API calls:
166
-
167
- - `customer.id`
168
- - `apiKey`
169
-
170
- Useful shell variables:
171
-
172
- ```bash
173
- BASE_URL="https://vidfarm.cloud.zoomgtm.com/api/v1"
174
- VIDFARM_USER_ID="cus_replace_me"
175
- VIDFARM_API_KEY="vf_replace_me"
176
- AUTH_HEADERS=(
177
- -H "vidfarm-user-id: ${VIDFARM_USER_ID}"
178
- -H "vidfarm-api-key: ${VIDFARM_API_KEY}"
179
- )
180
- JSON_HEADERS=(
181
- "${AUTH_HEADERS[@]}"
182
- -H "content-type: application/json"
183
- )
184
- ```
185
-
186
- ## Save Provider Keys
187
-
188
- Store the user's own AI key before starting template work:
189
-
190
- ```bash
191
- curl -X POST "${BASE_URL}/user/me/provider-keys" \
192
- "${JSON_HEADERS[@]}" \
193
- -d '{
194
- "provider": "openrouter",
195
- "label": "primary",
196
- "secret": "sk-or-v1-...",
197
- "weight": 1
198
- }'
199
- ```
200
-
201
- List saved provider keys:
202
-
203
- ```bash
204
- curl "${BASE_URL}/user/me/provider-keys" \
205
- "${AUTH_HEADERS[@]}"
206
- ```
207
-
208
- Use `GET /api/v1/user/me` to inspect the current authenticated customer profile:
209
-
210
- ```bash
211
- curl "${BASE_URL}/user/me" \
212
- "${AUTH_HEADERS[@]}"
213
- ```
214
-
215
- ## Template Standard
216
-
217
- Every customer-usable template follows the same platform shape:
218
-
219
- - `GET /api/v1/templates`
220
- - `GET /api/v1/templates/:templateId`
221
- - `GET /api/v1/templates/:templateId/skill`
222
- - `GET /api/v1/templates/:templateId/about/*`
223
- - `POST /api/v1/templates/:templateId/config`
224
- - `POST /api/v1/templates/:templateId/operations/:operationName`
225
- - `GET /api/v1/templates/:templateId/jobs`
226
- - `GET /api/v1/templates/:templateId/jobs/:jobId`
227
- - `GET /api/v1/templates/:templateId/jobs/:jobId/logs`
228
- - `POST /api/v1/templates/:templateId/jobs/:jobId/cancel`
229
-
230
- This common wrapper is the most important concept for users.
231
-
232
- No matter which template is chosen, the operating pattern stays the same:
233
-
234
- 1. discover
235
- 2. inspect
236
- 3. configure
237
- 4. submit operation
238
- 5. monitor job
239
- 6. feed outputs into the next stage
240
-
241
- ## Discover Templates
242
-
243
- List all templates:
244
-
245
- ```bash
246
- curl "${BASE_URL}/templates" \
247
- "${AUTH_HEADERS[@]}"
248
- ```
249
-
250
- The response includes each template's:
251
-
252
- - `id`
253
- - `slug_id`
254
- - `version`
255
- - `title`
256
- - `description`
257
- - `skill_url`
258
- - `operations`
259
-
260
- Read one template's about metadata:
261
-
262
- ```bash
263
- curl "${BASE_URL}/templates/template_0000" \
264
- "${AUTH_HEADERS[@]}"
265
- ```
266
-
267
- Expected about fields include:
268
-
269
- - `id`
270
- - `slug_id`
271
- - `version`
272
- - `title`
273
- - `description`
274
- - `viral_dna`
275
- - `preview_media`
276
- - `link_to_original`
277
- - `skill_url`
278
- - `operations`
279
-
280
- Important detail:
281
-
282
- - `templateId` may be either the UUID-like template id or the human-readable `slug_id`
283
- - in practice, users will usually prefer the `slug_id`
284
-
285
- ## Read The Template's Own Skill
286
-
287
- After identifying a template, read its published skill:
288
-
289
- ```bash
290
- curl "${BASE_URL}/templates/template_0000/skill" \
291
- "${AUTH_HEADERS[@]}"
292
- ```
293
-
294
- This is how you discover the template's unique operating details.
295
-
296
- The template skill is the customer-facing contract for things like:
297
-
298
- - which operations exist
299
- - what each operation does
300
- - the expected payload shape
301
- - which output artifacts come back
302
- - any template-specific stage sequence
303
- - any style or formatting constraints
304
-
305
- When a user asks how to use a specific template, always inspect both:
306
-
307
- 1. `GET /templates/:templateId`
308
- 2. `GET /templates/:templateId/skill`
309
-
310
- Use the metadata endpoint for the standard wrapper and the skill endpoint for the template-specific behavior.
311
-
312
- ## Template Configuration
313
-
314
- Some templates support saved per-user configuration.
315
-
316
- Write config with:
317
-
318
- ```bash
319
- curl -X POST "${BASE_URL}/templates/template_0000/config" \
320
- "${JSON_HEADERS[@]}" \
321
- -d '{
322
- "config": {
323
- "defaultProvider": "gemini"
324
- }
325
- }'
326
- ```
327
-
328
- Treat config as stable preferences for that template, such as:
329
-
330
- - default provider
331
- - default models
332
- - style settings
333
- - rendering defaults
334
-
335
- Always check the template skill for the config fields that the specific template expects.
336
-
337
- ## Submit Template Operations
338
-
339
- Template work is submitted through operation routes:
340
-
341
- ```txt
342
- POST /api/v1/templates/:templateId/operations/:operationName
343
- ```
344
-
345
- Request shape:
346
-
347
- ```json
348
- {
349
- "tracer": "client-generated-reference",
350
- "payload": {},
351
- "webhook_url": "https://example.com/webhooks/vidfarm"
352
- }
353
- ```
354
-
355
- `webhook_url` is optional.
356
-
357
- The standard response shape is:
358
-
359
- ```json
360
- {
361
- "job_id": "job_...",
362
- "tracer": "client-generated-reference",
363
- "status": "queued"
364
- }
365
- ```
366
-
367
- Example, using the sample template's first stage:
368
-
369
- ```bash
370
- curl -X POST "${BASE_URL}/templates/template_0000/operations/create_slideshow" \
371
- "${JSON_HEADERS[@]}" \
372
- -d '{
373
- "tracer": "launch-story-001",
374
- "payload": {
375
- "slides": [
376
- ["late night founder at laptop", "launching after hours", 2200],
377
- {
378
- "image_prompt": "skincare serum bottle on a clean bathroom counter near a window",
379
- "caption": "the routine was simpler than i thought",
380
- "duration_ms": 2800
381
- }
382
- ],
383
- "meta_details_prompt": "Write native TikTok metadata for a US audience. Keep it curiosity-driven and casual."
384
- }
385
- }'
386
- ```
387
-
388
- ## Monitor Jobs
389
-
390
- List jobs for one template:
391
-
392
- ```bash
393
- curl "${BASE_URL}/templates/template_0000/jobs" \
394
- "${AUTH_HEADERS[@]}"
395
- ```
396
-
397
- Filter by tracer or time window:
398
-
399
- ```bash
400
- curl "${BASE_URL}/templates/template_0000/jobs?tracer=launch-story-001&start_time=2026-05-17T00:00:00.000Z&end_time=2026-05-18T00:00:00.000Z&limit=20" \
401
- "${AUTH_HEADERS[@]}"
402
- ```
403
-
404
- Get one job:
405
-
406
- ```bash
407
- JOB_ID="job_replace_me"
408
-
409
- curl "${BASE_URL}/templates/template_0000/jobs/${JOB_ID}" \
410
- "${AUTH_HEADERS[@]}"
411
- ```
412
-
413
- Job responses commonly include:
414
-
415
- - `job_id`
416
- - `template_id`
417
- - `operation_name`
418
- - `workflow_name`
419
- - `tracer`
420
- - `status`
421
- - `progress`
422
- - `result`
423
- - `error`
424
- - `created_at`
425
- - `updated_at`
426
- - `started_at`
427
- - `completed_at`
428
-
429
- Current job statuses are:
430
-
431
- - `queued`
432
- - `running`
433
- - `waiting_for_child`
434
- - `waiting_for_human`
435
- - `succeeded`
436
- - `failed`
437
- - `cancelled`
438
-
439
- ## Read Structured Logs
440
-
441
- Every job can expose a structured timeline:
442
-
443
- ```bash
444
- curl "${BASE_URL}/templates/template_0000/jobs/${JOB_ID}/logs?start_time=2026-05-17T00:00:00.000Z&end_time=2026-05-18T00:00:00.000Z&limit=200" \
445
- "${AUTH_HEADERS[@]}"
446
- ```
447
-
448
- Treat logs as the best source for:
449
-
450
- - progress checkpoints
451
- - stage-level diagnostics
452
- - artifact references
453
- - machine-readable metadata emitted during production
454
-
455
- When a job fails or stalls, inspect logs before retrying blindly.
456
-
457
- ## Cancel Jobs
458
-
459
- Cancel a job with:
460
-
461
- ```bash
462
- curl -X POST "${BASE_URL}/templates/template_0000/jobs/${JOB_ID}/cancel" \
463
- "${AUTH_HEADERS[@]}"
464
- ```
465
-
466
- ## Cross-Template Job Listing
467
-
468
- To see the current user's jobs across templates:
469
-
470
- ```bash
471
- curl "${BASE_URL}/user/me/jobs" \
472
- "${AUTH_HEADERS[@]}"
473
- ```
474
-
475
- This endpoint also supports filters such as:
476
-
477
- - `template_id`
478
- - `tracer`
479
- - `start_time`
480
- - `end_time`
481
- - `limit`
482
-
483
- ## Webhooks
484
-
485
- Vidfarm supports optional job webhooks on operation submission.
486
-
487
- Use them when the user wants asynchronous completion handling instead of polling.
488
-
489
- Webhook events can include:
490
-
491
- - `job.queued`
492
- - `job.running`
493
- - `job.succeeded`
494
- - `job.failed`
495
- - `job.cancelled`
496
-
497
- Webhook requests include:
498
-
499
- - `x-vidfarm-event`
500
- - `x-vidfarm-signature`
501
-
502
- The JSON body shape is:
503
-
504
- ```json
505
- {
506
- "type": "job.succeeded",
507
- "emitted_at": "2026-05-17T12:00:00.000Z",
508
- "job": {
509
- "job_id": "job_...",
510
- "tracer": "launch-story-001",
511
- "status": "succeeded",
512
- "template_id": "template_0000",
513
- "operation_name": "create_slideshow",
514
- "progress": 1,
515
- "result": {},
516
- "error": null
517
- }
518
- }
519
- ```
520
-
521
- ## Multi-Stage Production Guidance
522
-
523
- The right way to think about Vidfarm is as a chain of production states.
524
-
525
- One operation often prepares the next one.
526
-
527
- Typical pattern:
528
-
529
- 1. generate or scaffold assets
530
- 2. inspect the result payload and artifacts
531
- 3. optionally revise inputs
532
- 4. submit the next operation
533
- 5. repeat until final render or export
534
-
535
- For example, the current sample template behaves like this:
536
-
537
- 1. `create_slideshow` generates finished slide frames plus manifest data
538
- 2. the returned `renderVideoInput` becomes the clean handoff into `render_video`
539
- 3. `render_video` turns those frames into a final vertical video
540
-
541
- When helping users, always look for explicit handoff fields in the previous stage's `result`.
542
-
543
- ## How To Understand A Template's Unique API
544
-
545
- Vidfarm templates share the same outer API, but each template has unique operations and payloads.
546
-
547
- Use this exact sequence:
548
-
549
- 1. call `GET /api/v1/templates`
550
- 2. pick a template id or `slug_id`
551
- 3. call `GET /api/v1/templates/:templateId`
552
- 4. inspect `operations`
553
- 5. call `GET /api/v1/templates/:templateId/skill`
554
- 6. extract operation names, payload examples, and stage order from the skill
555
- 7. submit the chosen operation under `/operations/:operationName`
556
-
557
- Do not invent undocumented subroutes.
558
-
559
- For customers, the unique template surface is primarily:
560
-
561
- - the operation names
562
- - the config schema
563
- - the payload contract
564
- - the returned artifacts and result structure
565
-
566
- The template skill is the authoritative human-readable guide for those differences.
567
-
568
- ## Alpha Posture
569
-
570
- Vidfarm is in alpha.
571
-
572
- Prefer teaching users the flows that exist now and avoid dwelling on features that may arrive later.
573
-
574
- Focus on what lets a user become operational immediately:
575
-
576
- - OTP login
577
- - API key issuance
578
- - provider key upload
579
- - template discovery
580
- - template skill inspection
581
- - async job submission
582
- - job polling
583
- - logs
584
- - webhooks
585
-
586
- ## Default Assistance Pattern
587
-
588
- When a user asks for help using Vidfarm, default to this style:
589
-
590
- 1. get or confirm their auth state
591
- 2. confirm they have brought their own AI key
592
- 3. list templates
593
- 4. inspect the chosen template
594
- 5. read the template skill
595
- 6. identify the current production stage
596
- 7. submit the smallest sensible next operation
597
- 8. monitor the job and interpret the outputs
598
-
599
- This keeps the interaction agentic, operational, and immediately useful.
@@ -1,59 +0,0 @@
1
- #!/usr/bin/env node
2
- import { App } from "aws-cdk-lib";
3
- import { VidfarmProdStack } from "../lib/vidfarm-prod-stack.js";
4
- function required(name) {
5
- const value = process.env[name]?.trim();
6
- if (!value) {
7
- throw new Error(`Missing required environment variable: ${name}`);
8
- }
9
- return value;
10
- }
11
- function optional(name) {
12
- const value = process.env[name]?.trim();
13
- return value ? value : undefined;
14
- }
15
- const account = optional("CDK_DEFAULT_ACCOUNT") ?? optional("AWS_ACCOUNT_ID");
16
- const region = optional("CDK_DEFAULT_REGION") ?? optional("AWS_REGION") ?? "us-east-1";
17
- if (!account) {
18
- throw new Error("Set CDK_DEFAULT_ACCOUNT or AWS_ACCOUNT_ID before running CDK.");
19
- }
20
- const env = { account, region };
21
- const app = new App();
22
- new VidfarmProdStack(app, "VidfarmProdStack", {
23
- env,
24
- zoneName: optional("VIDFARM_ZONE_NAME") ?? "cloud.zoomgtm.com",
25
- zoneId: required("VIDFARM_ZONE_ID"),
26
- recordName: optional("VIDFARM_RECORD_NAME") ?? "vidfarm",
27
- publicBaseUrl: optional("VIDFARM_PUBLIC_BASE_URL") ?? "https://vidfarm.cloud.zoomgtm.com",
28
- adminEmails: required("VIDFARM_ADMIN_EMAILS"),
29
- developerEmails: optional("VIDFARM_DEVELOPER_EMAILS") ?? "",
30
- encryptionSecret: required("VIDFARM_ENCRYPTION_SECRET"),
31
- apiKeySalt: required("VIDFARM_API_KEY_SALT"),
32
- webhookSecret: required("VIDFARM_WEBHOOK_SECRET"),
33
- resendApiKey: optional("VIDFARM_RESEND_API_KEY"),
34
- resendFromEmail: optional("VIDFARM_RESEND_FROM_EMAIL") ?? "noreply@zoomgtm.com",
35
- superagencyKey: optional("SUPERAGENCY_KEY"),
36
- openAiApiKey: optional("VIDFARM_OPENAI_API_KEY"),
37
- openRouterApiKey: optional("VIDFARM_OPENROUTER_API_KEY"),
38
- geminiApiKey: optional("VIDFARM_GEMINI_API_KEY"),
39
- perplexityApiKey: optional("VIDFARM_PERPLEXITY_API_KEY"),
40
- remotionMode: optional("VIDFARM_REMOTION_MODE") ?? "auto",
41
- remotionRegion: optional("VIDFARM_REMOTION_REGION") ?? "us-east-1",
42
- remotionBucketName: optional("VIDFARM_REMOTION_BUCKET_NAME"),
43
- remotionSiteName: optional("VIDFARM_REMOTION_SITE_NAME"),
44
- remotionFunctionName: optional("VIDFARM_REMOTION_FUNCTION_NAME"),
45
- remotionServeUrl: optional("VIDFARM_REMOTION_SERVE_URL"),
46
- remotionCompositionId: optional("VIDFARM_REMOTION_COMPOSITION_ID") ?? "template-0000",
47
- remotionAwsAccessKeyId: optional("VIDFARM_REMOTION_AWS_ACCESS_KEY_ID"),
48
- remotionAwsSecretAccessKey: optional("VIDFARM_REMOTION_AWS_SECRET_ACCESS_KEY"),
49
- mockProviderResponses: optional("VIDFARM_MOCK_PROVIDER_RESPONSES") ?? "false",
50
- workerPollMs: Number(optional("VIDFARM_WORKER_POLL_MS") ?? "1500"),
51
- workerBatchSize: Number(optional("VIDFARM_WORKER_BATCH_SIZE") ?? "2"),
52
- workerMaxConcurrentJobs: Number(optional("VIDFARM_WORKER_MAX_CONCURRENT_JOBS") ?? "1"),
53
- defaultJobDelaySeconds: Number(optional("VIDFARM_DEFAULT_JOB_DELAY_SECONDS") ?? "20"),
54
- maxPendingJobsGlobal: Number(optional("VIDFARM_MAX_PENDING_JOBS_GLOBAL") ?? "0"),
55
- maxPendingJobsPerCustomer: Number(optional("VIDFARM_MAX_PENDING_JOBS_PER_CUSTOMER") ?? "0"),
56
- instanceType: optional("VIDFARM_INSTANCE_TYPE") ?? "t3.small",
57
- dataVolumeSizeGiB: Number(optional("VIDFARM_DATA_VOLUME_SIZE_GIB") ?? "80")
58
- });
59
- app.synth();