digital-workers 2.1.1 → 2.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 (197) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +136 -180
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +34 -21
  5. package/dist/actions.js.map +1 -1
  6. package/dist/agent-comms.d.ts +438 -0
  7. package/dist/agent-comms.d.ts.map +1 -0
  8. package/dist/agent-comms.js +677 -0
  9. package/dist/agent-comms.js.map +1 -0
  10. package/dist/approve.d.ts +40 -8
  11. package/dist/approve.d.ts.map +1 -1
  12. package/dist/approve.js +86 -20
  13. package/dist/approve.js.map +1 -1
  14. package/dist/ask.d.ts +38 -7
  15. package/dist/ask.d.ts.map +1 -1
  16. package/dist/ask.js +85 -25
  17. package/dist/ask.js.map +1 -1
  18. package/dist/browse.d.ts +223 -0
  19. package/dist/browse.d.ts.map +1 -0
  20. package/dist/browse.js +392 -0
  21. package/dist/browse.js.map +1 -0
  22. package/dist/capability-tiers.d.ts +230 -0
  23. package/dist/capability-tiers.d.ts.map +1 -0
  24. package/dist/capability-tiers.js +388 -0
  25. package/dist/capability-tiers.js.map +1 -0
  26. package/dist/cascade-context.d.ts +523 -0
  27. package/dist/cascade-context.d.ts.map +1 -0
  28. package/dist/cascade-context.js +494 -0
  29. package/dist/cascade-context.js.map +1 -0
  30. package/dist/client.d.ts +162 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +64 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/decide.d.ts +42 -6
  35. package/dist/decide.d.ts.map +1 -1
  36. package/dist/decide.js +54 -11
  37. package/dist/decide.js.map +1 -1
  38. package/dist/do.d.ts +36 -7
  39. package/dist/do.d.ts.map +1 -1
  40. package/dist/do.js +82 -39
  41. package/dist/do.js.map +1 -1
  42. package/dist/error-escalation.d.ts +416 -0
  43. package/dist/error-escalation.d.ts.map +1 -0
  44. package/dist/error-escalation.js +656 -0
  45. package/dist/error-escalation.js.map +1 -0
  46. package/dist/generate.d.ts +48 -7
  47. package/dist/generate.d.ts.map +1 -1
  48. package/dist/generate.js +49 -8
  49. package/dist/generate.js.map +1 -1
  50. package/dist/goals.d.ts +10 -9
  51. package/dist/goals.d.ts.map +1 -1
  52. package/dist/goals.js +30 -24
  53. package/dist/goals.js.map +1 -1
  54. package/dist/image.d.ts +189 -0
  55. package/dist/image.d.ts.map +1 -0
  56. package/dist/image.js +528 -0
  57. package/dist/image.js.map +1 -0
  58. package/dist/index.d.ts +59 -2
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +92 -2
  61. package/dist/index.js.map +1 -1
  62. package/dist/is.d.ts +45 -10
  63. package/dist/is.d.ts.map +1 -1
  64. package/dist/is.js +56 -21
  65. package/dist/is.js.map +1 -1
  66. package/dist/kpis.d.ts +24 -15
  67. package/dist/kpis.d.ts.map +1 -1
  68. package/dist/kpis.js +16 -14
  69. package/dist/kpis.js.map +1 -1
  70. package/dist/load-balancing.d.ts +395 -0
  71. package/dist/load-balancing.d.ts.map +1 -0
  72. package/dist/load-balancing.js +991 -0
  73. package/dist/load-balancing.js.map +1 -0
  74. package/dist/logger.d.ts +76 -0
  75. package/dist/logger.d.ts.map +1 -0
  76. package/dist/logger.js +39 -0
  77. package/dist/logger.js.map +1 -0
  78. package/dist/notify.d.ts +38 -9
  79. package/dist/notify.d.ts.map +1 -1
  80. package/dist/notify.js +72 -17
  81. package/dist/notify.js.map +1 -1
  82. package/dist/role.d.ts +5 -4
  83. package/dist/role.d.ts.map +1 -1
  84. package/dist/role.js +13 -10
  85. package/dist/role.js.map +1 -1
  86. package/dist/runtime.d.ts +310 -0
  87. package/dist/runtime.d.ts.map +1 -0
  88. package/dist/runtime.js +510 -0
  89. package/dist/runtime.js.map +1 -0
  90. package/dist/team.d.ts +11 -6
  91. package/dist/team.d.ts.map +1 -1
  92. package/dist/team.js +22 -15
  93. package/dist/team.js.map +1 -1
  94. package/dist/transports/email.d.ts +318 -0
  95. package/dist/transports/email.d.ts.map +1 -0
  96. package/dist/transports/email.js +779 -0
  97. package/dist/transports/email.js.map +1 -0
  98. package/dist/transports/slack.d.ts +515 -0
  99. package/dist/transports/slack.d.ts.map +1 -0
  100. package/dist/transports/slack.js +844 -0
  101. package/dist/transports/slack.js.map +1 -0
  102. package/dist/transports.d.ts.map +1 -1
  103. package/dist/transports.js +44 -25
  104. package/dist/transports.js.map +1 -1
  105. package/dist/types.d.ts +149 -19
  106. package/dist/types.d.ts.map +1 -1
  107. package/dist/types.js +6 -0
  108. package/dist/types.js.map +1 -1
  109. package/dist/utils/id.d.ts +19 -0
  110. package/dist/utils/id.d.ts.map +1 -0
  111. package/dist/utils/id.js +21 -0
  112. package/dist/utils/id.js.map +1 -0
  113. package/dist/video.d.ts +203 -0
  114. package/dist/video.d.ts.map +1 -0
  115. package/dist/video.js +528 -0
  116. package/dist/video.js.map +1 -0
  117. package/dist/worker.d.ts +343 -0
  118. package/dist/worker.d.ts.map +1 -0
  119. package/dist/worker.js +698 -0
  120. package/dist/worker.js.map +1 -0
  121. package/package.json +24 -5
  122. package/src/actions.ts +48 -38
  123. package/src/agent-comms.ts +1200 -0
  124. package/src/approve.ts +91 -20
  125. package/src/ask.ts +99 -25
  126. package/src/browse.ts +627 -0
  127. package/src/capability-tiers.ts +545 -0
  128. package/src/cascade-context.ts +648 -0
  129. package/src/client.ts +221 -0
  130. package/src/decide.ts +81 -35
  131. package/src/do.ts +98 -52
  132. package/src/error-escalation.ts +1123 -0
  133. package/src/generate.ts +52 -18
  134. package/src/goals.ts +36 -27
  135. package/src/image.ts +816 -0
  136. package/src/index.ts +410 -2
  137. package/src/is.ts +59 -25
  138. package/src/kpis.ts +41 -36
  139. package/src/load-balancing.ts +1467 -0
  140. package/src/logger.ts +93 -0
  141. package/src/notify.ts +78 -17
  142. package/src/role.ts +30 -20
  143. package/src/runtime.ts +796 -0
  144. package/src/team.ts +24 -19
  145. package/src/transports/email.ts +1160 -0
  146. package/src/transports/slack.ts +1320 -0
  147. package/src/transports.ts +58 -43
  148. package/src/types.ts +182 -46
  149. package/src/utils/id.ts +21 -0
  150. package/src/video.ts +906 -0
  151. package/src/worker.ts +1007 -0
  152. package/test/agent-comms.test.ts +1397 -0
  153. package/test/approve.test.ts +305 -0
  154. package/test/ask.test.ts +274 -0
  155. package/test/browse.test.ts +361 -0
  156. package/test/capability-tiers.test.ts +631 -0
  157. package/test/cascade-context.test.ts +692 -0
  158. package/test/decide.test.ts +252 -0
  159. package/test/do.test.ts +144 -0
  160. package/test/error-escalation.test.ts +1205 -0
  161. package/test/error-logging.test.ts +357 -0
  162. package/test/generate.test.ts +319 -0
  163. package/test/image.test.ts +398 -0
  164. package/test/is.test.ts +287 -0
  165. package/test/load-balancing-safety.test.ts +404 -0
  166. package/test/load-balancing-thread-safety.test.ts +464 -0
  167. package/test/load-balancing.test.ts +1145 -0
  168. package/test/notify.test.ts +434 -0
  169. package/test/primitives.test.ts +320 -0
  170. package/test/runtime-integration.test.ts +892 -0
  171. package/test/transports/crypto.test.ts +230 -0
  172. package/test/transports/email.test.ts +866 -0
  173. package/test/transports/id-generation.test.ts +91 -0
  174. package/test/transports/slack.test.ts +760 -0
  175. package/test/type-safety.test.ts +834 -0
  176. package/test/types.test.ts +95 -2
  177. package/test/video.test.ts +530 -0
  178. package/test/worker.test.ts +1433 -0
  179. package/tsconfig.json +4 -1
  180. package/vitest.config.ts +42 -0
  181. package/wrangler.jsonc +36 -0
  182. package/.turbo/turbo-build.log +0 -5
  183. package/src/actions.js +0 -436
  184. package/src/approve.js +0 -234
  185. package/src/ask.js +0 -226
  186. package/src/decide.js +0 -244
  187. package/src/do.js +0 -227
  188. package/src/generate.js +0 -298
  189. package/src/goals.js +0 -205
  190. package/src/index.js +0 -68
  191. package/src/is.js +0 -317
  192. package/src/kpis.js +0 -270
  193. package/src/notify.js +0 -219
  194. package/src/role.js +0 -110
  195. package/src/team.js +0 -130
  196. package/src/transports.js +0 -357
  197. package/src/types.js +0 -71
package/dist/video.js ADDED
@@ -0,0 +1,528 @@
1
+ /**
2
+ * Video generation functionality for digital workers
3
+ *
4
+ * This module provides video generation within a worker context,
5
+ * supporting various AI video generation models (Runway, Pika, etc.)
6
+ * with rich metadata about the generation process.
7
+ *
8
+ * @module
9
+ */
10
+ // ============================================================================
11
+ // Helper Functions
12
+ // ============================================================================
13
+ /**
14
+ * Build metadata object, only including defined optional fields
15
+ */
16
+ function buildMetadata(model, duration, resolution, fps, aspectRatio, generationTime, optionals = {}) {
17
+ const metadata = {
18
+ model,
19
+ duration,
20
+ resolution,
21
+ fps,
22
+ aspectRatio,
23
+ generationTime,
24
+ };
25
+ if (optionals.fileSize !== undefined)
26
+ metadata.fileSize = optionals.fileSize;
27
+ if (optionals.format !== undefined)
28
+ metadata.format = optionals.format;
29
+ if (optionals.style !== undefined)
30
+ metadata.style = optionals.style;
31
+ if (optionals.seed !== undefined)
32
+ metadata.seed = optionals.seed;
33
+ if (optionals.cost !== undefined)
34
+ metadata.cost = optionals.cost;
35
+ return metadata;
36
+ }
37
+ /**
38
+ * Resolve the worker URL for video generation based on model
39
+ */
40
+ function resolveVideoWorkerUrl(model) {
41
+ // Map models to their respective worker endpoints
42
+ const workerMap = {
43
+ 'runway-gen3': 'https://video.workers.do/runway/gen3',
44
+ 'runway-gen2': 'https://video.workers.do/runway/gen2',
45
+ 'pika-1.0': 'https://video.workers.do/pika/1.0',
46
+ 'pika-1.5': 'https://video.workers.do/pika/1.5',
47
+ 'stable-video': 'https://video.workers.do/stability/svd',
48
+ minimax: 'https://video.workers.do/minimax',
49
+ kling: 'https://video.workers.do/kling',
50
+ luma: 'https://video.workers.do/luma',
51
+ };
52
+ // Check for custom endpoint in environment
53
+ const customEndpoint = typeof globalThis !== 'undefined' && 'process' in globalThis
54
+ ? globalThis.process?.env?.['VIDEO_WORKER_URL']
55
+ : undefined;
56
+ if (customEndpoint) {
57
+ return customEndpoint;
58
+ }
59
+ return workerMap[model] || `https://video.workers.do/${model}`;
60
+ }
61
+ // ============================================================================
62
+ // Video Generation Function
63
+ // ============================================================================
64
+ /**
65
+ * Generate a video from a text prompt.
66
+ *
67
+ * Creates AI-generated video content using models like Runway, Pika,
68
+ * Stable Video, and others. Returns the video URL with rich metadata
69
+ * about the generation process.
70
+ *
71
+ * @param prompt - Text description of the video to generate
72
+ * @param options - Generation options (duration, fps, resolution, model, etc.)
73
+ * @returns Promise resolving to VideoResult with URL and metadata
74
+ *
75
+ * @example
76
+ * ```ts
77
+ * // Basic video generation
78
+ * const result = await video('A serene mountain lake at sunset with gentle ripples')
79
+ * console.log(result.url) // URL of generated video
80
+ * console.log(result.metadata.duration) // Video duration in seconds
81
+ * ```
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * // With options
86
+ * const result = await video('A futuristic city with flying cars', {
87
+ * duration: 8,
88
+ * resolution: '4k',
89
+ * style: 'cinematic',
90
+ * model: 'runway-gen3',
91
+ * motion: 'dolly',
92
+ * })
93
+ * ```
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * // With negative prompt
98
+ * const result = await video('A happy golden retriever playing in a park', {
99
+ * negativePrompt: 'blurry, distorted, extra limbs',
100
+ * guidance: 12,
101
+ * })
102
+ * ```
103
+ */
104
+ export async function video(prompt, options = {}) {
105
+ const { duration = 4, fps = 24, resolution = '1080p', aspectRatio = '16:9', style, model = 'runway-gen3', negativePrompt, guidance, seed, motion, motionIntensity, loop, modelParams, } = options;
106
+ const startTime = Date.now();
107
+ // Build the worker URL for video generation
108
+ const workerUrl = resolveVideoWorkerUrl(model);
109
+ try {
110
+ const response = await fetch(workerUrl, {
111
+ method: 'POST',
112
+ headers: {
113
+ 'Content-Type': 'application/json',
114
+ },
115
+ body: JSON.stringify({
116
+ prompt,
117
+ duration,
118
+ fps,
119
+ resolution,
120
+ aspectRatio,
121
+ style,
122
+ model,
123
+ negativePrompt,
124
+ guidance,
125
+ seed,
126
+ motion,
127
+ motionIntensity,
128
+ loop,
129
+ ...modelParams,
130
+ }),
131
+ });
132
+ if (!response.ok) {
133
+ const errorText = await response.text();
134
+ throw new Error(`Video generation failed: ${response.status} - ${errorText}`);
135
+ }
136
+ const data = (await response.json());
137
+ const optionals = {
138
+ format: data.format || 'mp4',
139
+ };
140
+ if (data.fileSize !== undefined)
141
+ optionals.fileSize = data.fileSize;
142
+ if (style !== undefined)
143
+ optionals.style = style;
144
+ if (data.seed !== undefined)
145
+ optionals.seed = data.seed;
146
+ else if (seed !== undefined)
147
+ optionals.seed = seed;
148
+ if (data.cost !== undefined)
149
+ optionals.cost = data.cost;
150
+ const result = {
151
+ url: data.url,
152
+ prompt,
153
+ metadata: buildMetadata(model, duration, resolution, fps, aspectRatio, Date.now() - startTime, optionals),
154
+ status: 'completed',
155
+ };
156
+ if (data.thumbnail)
157
+ result.thumbnail = data.thumbnail;
158
+ if (data.preview)
159
+ result.preview = data.preview;
160
+ return result;
161
+ }
162
+ catch (error) {
163
+ const result = {
164
+ url: '',
165
+ prompt,
166
+ metadata: buildMetadata(model, duration, resolution, fps, aspectRatio, Date.now() - startTime),
167
+ status: 'failed',
168
+ error: error instanceof Error ? error.message : String(error),
169
+ };
170
+ return result;
171
+ }
172
+ }
173
+ // ============================================================================
174
+ // Helper Methods
175
+ // ============================================================================
176
+ /**
177
+ * Generate a video from a static image.
178
+ *
179
+ * Animates a source image based on a motion prompt, bringing still
180
+ * images to life with AI-generated animation.
181
+ *
182
+ * @param imageUrl - URL of the source image
183
+ * @param prompt - Text description of the desired motion/animation
184
+ * @param options - Additional generation options
185
+ * @returns Promise resolving to VideoResult
186
+ *
187
+ * @example
188
+ * ```ts
189
+ * const result = await video.fromImage(
190
+ * 'https://example.com/landscape.jpg',
191
+ * 'Camera slowly pans across the scene, clouds drift by',
192
+ * { duration: 6, imageFidelity: 0.8 }
193
+ * )
194
+ * ```
195
+ */
196
+ video.fromImage = async function fromImage(imageUrl, prompt, options = {}) {
197
+ const { duration = 4, fps = 24, resolution = '1080p', aspectRatio = '16:9', style, model = 'runway-gen3', imageFidelity = 0.7, motion, motionIntensity, } = options;
198
+ const startTime = Date.now();
199
+ const workerUrl = resolveVideoWorkerUrl(model);
200
+ try {
201
+ const response = await fetch(workerUrl, {
202
+ method: 'POST',
203
+ headers: {
204
+ 'Content-Type': 'application/json',
205
+ },
206
+ body: JSON.stringify({
207
+ mode: 'image-to-video',
208
+ imageUrl,
209
+ prompt,
210
+ duration,
211
+ fps,
212
+ resolution,
213
+ aspectRatio,
214
+ style,
215
+ model,
216
+ imageFidelity,
217
+ motion,
218
+ motionIntensity,
219
+ }),
220
+ });
221
+ if (!response.ok) {
222
+ const errorText = await response.text();
223
+ throw new Error(`Image-to-video generation failed: ${response.status} - ${errorText}`);
224
+ }
225
+ const data = (await response.json());
226
+ const optionals = {
227
+ format: data.format || 'mp4',
228
+ };
229
+ if (data.fileSize !== undefined)
230
+ optionals.fileSize = data.fileSize;
231
+ if (style !== undefined)
232
+ optionals.style = style;
233
+ if (data.seed !== undefined)
234
+ optionals.seed = data.seed;
235
+ if (data.cost !== undefined)
236
+ optionals.cost = data.cost;
237
+ const result = {
238
+ url: data.url,
239
+ prompt,
240
+ metadata: buildMetadata(model, duration, resolution, fps, aspectRatio, Date.now() - startTime, optionals),
241
+ status: 'completed',
242
+ };
243
+ if (data.thumbnail)
244
+ result.thumbnail = data.thumbnail;
245
+ if (data.preview)
246
+ result.preview = data.preview;
247
+ return result;
248
+ }
249
+ catch (error) {
250
+ return {
251
+ url: '',
252
+ prompt,
253
+ metadata: buildMetadata(model, duration, resolution, fps, aspectRatio, Date.now() - startTime),
254
+ status: 'failed',
255
+ error: error instanceof Error ? error.message : String(error),
256
+ };
257
+ }
258
+ };
259
+ /**
260
+ * Extend an existing video by generating additional frames.
261
+ *
262
+ * Continues a video seamlessly by generating new content that
263
+ * matches the style and content of the original.
264
+ *
265
+ * @param videoUrl - URL of the source video
266
+ * @param duration - Additional duration in seconds to add
267
+ * @param options - Extension options
268
+ * @returns Promise resolving to VideoResult with extended video
269
+ *
270
+ * @example
271
+ * ```ts
272
+ * // Extend video by 4 more seconds
273
+ * const result = await video.extend(
274
+ * 'https://example.com/short-clip.mp4',
275
+ * 4
276
+ * )
277
+ * ```
278
+ *
279
+ * @example
280
+ * ```ts
281
+ * // Extend with a prompt hint
282
+ * const result = await video.extend(
283
+ * 'https://example.com/scene.mp4',
284
+ * 6,
285
+ * { prompt: 'The character turns and walks away', direction: 'forward' }
286
+ * )
287
+ * ```
288
+ */
289
+ video.extend = async function extend(videoUrl, duration, options = {}) {
290
+ const { prompt, direction = 'forward', overlap = 4 } = options;
291
+ const startTime = Date.now();
292
+ const workerUrl = resolveVideoWorkerUrl('runway-gen3');
293
+ try {
294
+ const response = await fetch(workerUrl, {
295
+ method: 'POST',
296
+ headers: {
297
+ 'Content-Type': 'application/json',
298
+ },
299
+ body: JSON.stringify({
300
+ mode: 'extend',
301
+ videoUrl,
302
+ duration,
303
+ prompt,
304
+ direction,
305
+ overlap,
306
+ }),
307
+ });
308
+ if (!response.ok) {
309
+ const errorText = await response.text();
310
+ throw new Error(`Video extension failed: ${response.status} - ${errorText}`);
311
+ }
312
+ const data = (await response.json());
313
+ const resultPrompt = prompt || 'Extended video';
314
+ const optionals = {
315
+ format: data.format || 'mp4',
316
+ };
317
+ if (data.fileSize !== undefined)
318
+ optionals.fileSize = data.fileSize;
319
+ if (data.cost !== undefined)
320
+ optionals.cost = data.cost;
321
+ const result = {
322
+ url: data.url,
323
+ prompt: resultPrompt,
324
+ metadata: buildMetadata('runway-gen3', data.totalDuration || duration, '1080p', 24, '16:9', Date.now() - startTime, optionals),
325
+ status: 'completed',
326
+ };
327
+ if (data.thumbnail)
328
+ result.thumbnail = data.thumbnail;
329
+ if (data.preview)
330
+ result.preview = data.preview;
331
+ return result;
332
+ }
333
+ catch (error) {
334
+ return {
335
+ url: '',
336
+ prompt: prompt || 'Extended video',
337
+ metadata: buildMetadata('runway-gen3', duration, '1080p', 24, '16:9', Date.now() - startTime),
338
+ status: 'failed',
339
+ error: error instanceof Error ? error.message : String(error),
340
+ };
341
+ }
342
+ };
343
+ /**
344
+ * Edit an existing video using AI.
345
+ *
346
+ * Modifies a video based on a text prompt, allowing for
347
+ * style changes, object removal/addition, and other edits.
348
+ *
349
+ * @param videoUrl - URL of the video to edit
350
+ * @param prompt - Text description of the desired edits
351
+ * @param options - Edit options
352
+ * @returns Promise resolving to VideoResult with edited video
353
+ *
354
+ * @example
355
+ * ```ts
356
+ * // Change the style of a video
357
+ * const result = await video.edit(
358
+ * 'https://example.com/original.mp4',
359
+ * 'Make it look like a vintage 1970s film'
360
+ * )
361
+ * ```
362
+ *
363
+ * @example
364
+ * ```ts
365
+ * // Edit with mask
366
+ * const result = await video.edit(
367
+ * 'https://example.com/scene.mp4',
368
+ * 'Replace the car with a spaceship',
369
+ * { maskUrl: 'https://example.com/car-mask.png', strength: 0.9 }
370
+ * )
371
+ * ```
372
+ */
373
+ video.edit = async function edit(videoUrl, prompt, options = {}) {
374
+ const { region, maskUrl, strength = 0.7, preserveAudio = true } = options;
375
+ const startTime = Date.now();
376
+ const workerUrl = resolveVideoWorkerUrl('runway-gen3');
377
+ try {
378
+ const response = await fetch(workerUrl, {
379
+ method: 'POST',
380
+ headers: {
381
+ 'Content-Type': 'application/json',
382
+ },
383
+ body: JSON.stringify({
384
+ mode: 'edit',
385
+ videoUrl,
386
+ prompt,
387
+ region,
388
+ maskUrl,
389
+ strength,
390
+ preserveAudio,
391
+ }),
392
+ });
393
+ if (!response.ok) {
394
+ const errorText = await response.text();
395
+ throw new Error(`Video editing failed: ${response.status} - ${errorText}`);
396
+ }
397
+ const data = (await response.json());
398
+ const optionals = {
399
+ format: data.format || 'mp4',
400
+ };
401
+ if (data.fileSize !== undefined)
402
+ optionals.fileSize = data.fileSize;
403
+ if (data.cost !== undefined)
404
+ optionals.cost = data.cost;
405
+ const result = {
406
+ url: data.url,
407
+ prompt,
408
+ metadata: buildMetadata('runway-gen3', data.duration || 4, '1080p', 24, '16:9', Date.now() - startTime, optionals),
409
+ status: 'completed',
410
+ };
411
+ if (data.thumbnail)
412
+ result.thumbnail = data.thumbnail;
413
+ if (data.preview)
414
+ result.preview = data.preview;
415
+ return result;
416
+ }
417
+ catch (error) {
418
+ return {
419
+ url: '',
420
+ prompt,
421
+ metadata: buildMetadata('runway-gen3', 4, '1080p', 24, '16:9', Date.now() - startTime),
422
+ status: 'failed',
423
+ error: error instanceof Error ? error.message : String(error),
424
+ };
425
+ }
426
+ };
427
+ /**
428
+ * Create a video generator with a preset style.
429
+ *
430
+ * Returns a function that generates videos with the specified
431
+ * style pre-applied. Useful for maintaining consistent aesthetics.
432
+ *
433
+ * @param style - Style preset to apply to all generated videos
434
+ * @returns Function that generates styled videos
435
+ *
436
+ * @example
437
+ * ```ts
438
+ * // Create a cinematic video generator
439
+ * const cinematicVideo = video.style('cinematic')
440
+ *
441
+ * const result1 = await cinematicVideo('A dramatic sunset over the ocean')
442
+ * const result2 = await cinematicVideo('A hero walking into the distance')
443
+ * // Both will have cinematic style applied
444
+ * ```
445
+ *
446
+ * @example
447
+ * ```ts
448
+ * // Chain with other options
449
+ * const animeVideo = video.style('anime')
450
+ * const result = await animeVideo('A magical girl transformation sequence', {
451
+ * duration: 8,
452
+ * resolution: '4k',
453
+ * })
454
+ * ```
455
+ */
456
+ video.style = function style(stylePreset) {
457
+ return function styledVideo(prompt, options = {}) {
458
+ return video(prompt, { ...options, style: stylePreset });
459
+ };
460
+ };
461
+ /**
462
+ * Generate multiple video variations from the same prompt.
463
+ *
464
+ * @param prompt - Text description of the video
465
+ * @param count - Number of variations to generate
466
+ * @param options - Generation options
467
+ * @returns Promise resolving to array of VideoResults
468
+ *
469
+ * @example
470
+ * ```ts
471
+ * const variations = await video.variations(
472
+ * 'A cat playing with a ball of yarn',
473
+ * 3,
474
+ * { duration: 4 }
475
+ * )
476
+ *
477
+ * variations.forEach((v, i) => {
478
+ * console.log(`Variation ${i + 1}: ${v.url}`)
479
+ * })
480
+ * ```
481
+ */
482
+ video.variations = async function variations(prompt, count, options = {}) {
483
+ const results = await Promise.all(Array.from({ length: count }, (_, i) => video(prompt, {
484
+ ...options,
485
+ // Use different seeds for variations
486
+ seed: options.seed !== undefined ? options.seed + i : Math.floor(Math.random() * 1000000) + i,
487
+ })));
488
+ return results;
489
+ };
490
+ /**
491
+ * Generate video with specific camera motion.
492
+ *
493
+ * @param prompt - Text description of the scene
494
+ * @param motion - Camera motion type
495
+ * @param options - Additional generation options
496
+ * @returns Promise resolving to VideoResult
497
+ *
498
+ * @example
499
+ * ```ts
500
+ * const result = await video.withMotion(
501
+ * 'A beautiful landscape',
502
+ * 'dolly',
503
+ * { motionIntensity: 0.5 }
504
+ * )
505
+ * ```
506
+ */
507
+ video.withMotion = async function withMotion(prompt, motion, options = {}) {
508
+ return video(prompt, { ...options, motion });
509
+ };
510
+ /**
511
+ * Generate a looping video (perfect for backgrounds, GIFs).
512
+ *
513
+ * @param prompt - Text description of the video
514
+ * @param options - Generation options
515
+ * @returns Promise resolving to VideoResult with looping video
516
+ *
517
+ * @example
518
+ * ```ts
519
+ * const result = await video.loop(
520
+ * 'Gently swaying grass in the wind',
521
+ * { duration: 3 }
522
+ * )
523
+ * ```
524
+ */
525
+ video.loop = async function loop(prompt, options = {}) {
526
+ return video(prompt, { ...options, loop: true });
527
+ };
528
+ //# sourceMappingURL=video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../src/video.ts"],"names":[],"mappings":"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"}