venice-video-harness 2.4.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 (264) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +598 -0
  4. package/dist/assembly/manifest-builder.d.ts +8 -0
  5. package/dist/assembly/manifest-builder.d.ts.map +1 -0
  6. package/dist/assembly/manifest-builder.js +196 -0
  7. package/dist/assembly/manifest-builder.js.map +1 -0
  8. package/dist/assembly/remotion-scaffold.d.ts +14 -0
  9. package/dist/assembly/remotion-scaffold.d.ts.map +1 -0
  10. package/dist/assembly/remotion-scaffold.js +292 -0
  11. package/dist/assembly/remotion-scaffold.js.map +1 -0
  12. package/dist/assembly/types.d.ts +67 -0
  13. package/dist/assembly/types.d.ts.map +1 -0
  14. package/dist/assembly/types.js +5 -0
  15. package/dist/assembly/types.js.map +1 -0
  16. package/dist/characters/describer.d.ts +32 -0
  17. package/dist/characters/describer.d.ts.map +1 -0
  18. package/dist/characters/describer.js +309 -0
  19. package/dist/characters/describer.js.map +1 -0
  20. package/dist/characters/extractor.d.ts +27 -0
  21. package/dist/characters/extractor.d.ts.map +1 -0
  22. package/dist/characters/extractor.js +274 -0
  23. package/dist/characters/extractor.js.map +1 -0
  24. package/dist/characters/reference-manager.d.ts +95 -0
  25. package/dist/characters/reference-manager.d.ts.map +1 -0
  26. package/dist/characters/reference-manager.js +346 -0
  27. package/dist/characters/reference-manager.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +310 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/config.d.ts +22 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +66 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/editing/aligner.d.ts +44 -0
  37. package/dist/editing/aligner.d.ts.map +1 -0
  38. package/dist/editing/aligner.js +201 -0
  39. package/dist/editing/aligner.js.map +1 -0
  40. package/dist/editing/edl.d.ts +45 -0
  41. package/dist/editing/edl.d.ts.map +1 -0
  42. package/dist/editing/edl.js +133 -0
  43. package/dist/editing/edl.js.map +1 -0
  44. package/dist/editing/overlays.d.ts +97 -0
  45. package/dist/editing/overlays.d.ts.map +1 -0
  46. package/dist/editing/overlays.js +41 -0
  47. package/dist/editing/overlays.js.map +1 -0
  48. package/dist/editing/packer.d.ts +52 -0
  49. package/dist/editing/packer.d.ts.map +1 -0
  50. package/dist/editing/packer.js +170 -0
  51. package/dist/editing/packer.js.map +1 -0
  52. package/dist/editing/providers/whisper-cpp.d.ts +32 -0
  53. package/dist/editing/providers/whisper-cpp.d.ts.map +1 -0
  54. package/dist/editing/providers/whisper-cpp.js +239 -0
  55. package/dist/editing/providers/whisper-cpp.js.map +1 -0
  56. package/dist/editing/render.d.ts +36 -0
  57. package/dist/editing/render.d.ts.map +1 -0
  58. package/dist/editing/render.js +227 -0
  59. package/dist/editing/render.js.map +1 -0
  60. package/dist/editing/self-eval.d.ts +48 -0
  61. package/dist/editing/self-eval.d.ts.map +1 -0
  62. package/dist/editing/self-eval.js +293 -0
  63. package/dist/editing/self-eval.js.map +1 -0
  64. package/dist/editing/silence.d.ts +76 -0
  65. package/dist/editing/silence.d.ts.map +1 -0
  66. package/dist/editing/silence.js +189 -0
  67. package/dist/editing/silence.js.map +1 -0
  68. package/dist/editing/types.d.ts +178 -0
  69. package/dist/editing/types.d.ts.map +1 -0
  70. package/dist/editing/types.js +13 -0
  71. package/dist/editing/types.js.map +1 -0
  72. package/dist/index.d.ts +6 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +5 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/interactive.d.ts +12 -0
  77. package/dist/interactive.d.ts.map +1 -0
  78. package/dist/interactive.js +78 -0
  79. package/dist/interactive.js.map +1 -0
  80. package/dist/mini-drama/assembler.d.ts +61 -0
  81. package/dist/mini-drama/assembler.d.ts.map +1 -0
  82. package/dist/mini-drama/assembler.js +466 -0
  83. package/dist/mini-drama/assembler.js.map +1 -0
  84. package/dist/mini-drama/audio-mix.d.ts +65 -0
  85. package/dist/mini-drama/audio-mix.d.ts.map +1 -0
  86. package/dist/mini-drama/audio-mix.js +118 -0
  87. package/dist/mini-drama/audio-mix.js.map +1 -0
  88. package/dist/mini-drama/cli.d.ts +3 -0
  89. package/dist/mini-drama/cli.d.ts.map +1 -0
  90. package/dist/mini-drama/cli.js +2869 -0
  91. package/dist/mini-drama/cli.js.map +1 -0
  92. package/dist/mini-drama/fcpxml-export.d.ts +2 -0
  93. package/dist/mini-drama/fcpxml-export.d.ts.map +1 -0
  94. package/dist/mini-drama/fcpxml-export.js +5 -0
  95. package/dist/mini-drama/fcpxml-export.js.map +1 -0
  96. package/dist/mini-drama/generation-planner.d.ts +24 -0
  97. package/dist/mini-drama/generation-planner.d.ts.map +1 -0
  98. package/dist/mini-drama/generation-planner.js +304 -0
  99. package/dist/mini-drama/generation-planner.js.map +1 -0
  100. package/dist/mini-drama/location-generator.d.ts +23 -0
  101. package/dist/mini-drama/location-generator.d.ts.map +1 -0
  102. package/dist/mini-drama/location-generator.js +144 -0
  103. package/dist/mini-drama/location-generator.js.map +1 -0
  104. package/dist/mini-drama/music-cues.d.ts +96 -0
  105. package/dist/mini-drama/music-cues.d.ts.map +1 -0
  106. package/dist/mini-drama/music-cues.js +332 -0
  107. package/dist/mini-drama/music-cues.js.map +1 -0
  108. package/dist/mini-drama/panel-fixer.d.ts +12 -0
  109. package/dist/mini-drama/panel-fixer.d.ts.map +1 -0
  110. package/dist/mini-drama/panel-fixer.js +319 -0
  111. package/dist/mini-drama/panel-fixer.js.map +1 -0
  112. package/dist/mini-drama/prompt-builder.d.ts +149 -0
  113. package/dist/mini-drama/prompt-builder.d.ts.map +1 -0
  114. package/dist/mini-drama/prompt-builder.js +722 -0
  115. package/dist/mini-drama/prompt-builder.js.map +1 -0
  116. package/dist/mini-drama/reference-slots.d.ts +31 -0
  117. package/dist/mini-drama/reference-slots.d.ts.map +1 -0
  118. package/dist/mini-drama/reference-slots.js +161 -0
  119. package/dist/mini-drama/reference-slots.js.map +1 -0
  120. package/dist/mini-drama/shot-paths.d.ts +77 -0
  121. package/dist/mini-drama/shot-paths.d.ts.map +1 -0
  122. package/dist/mini-drama/shot-paths.js +101 -0
  123. package/dist/mini-drama/shot-paths.js.map +1 -0
  124. package/dist/mini-drama/storyboard-reference-generator.d.ts +47 -0
  125. package/dist/mini-drama/storyboard-reference-generator.d.ts.map +1 -0
  126. package/dist/mini-drama/storyboard-reference-generator.js +293 -0
  127. package/dist/mini-drama/storyboard-reference-generator.js.map +1 -0
  128. package/dist/mini-drama/subtitle-generator.d.ts +12 -0
  129. package/dist/mini-drama/subtitle-generator.d.ts.map +1 -0
  130. package/dist/mini-drama/subtitle-generator.js +139 -0
  131. package/dist/mini-drama/subtitle-generator.js.map +1 -0
  132. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts +3 -0
  133. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts.map +1 -0
  134. package/dist/mini-drama/timeline-export/davinci-fcpxml.js +150 -0
  135. package/dist/mini-drama/timeline-export/davinci-fcpxml.js.map +1 -0
  136. package/dist/mini-drama/timeline-export/fcpxml.d.ts +11 -0
  137. package/dist/mini-drama/timeline-export/fcpxml.d.ts.map +1 -0
  138. package/dist/mini-drama/timeline-export/fcpxml.js +140 -0
  139. package/dist/mini-drama/timeline-export/fcpxml.js.map +1 -0
  140. package/dist/mini-drama/timeline-export/index.d.ts +13 -0
  141. package/dist/mini-drama/timeline-export/index.d.ts.map +1 -0
  142. package/dist/mini-drama/timeline-export/index.js +26 -0
  143. package/dist/mini-drama/timeline-export/index.js.map +1 -0
  144. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts +3 -0
  145. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts.map +1 -0
  146. package/dist/mini-drama/timeline-export/premiere-xmeml.js +211 -0
  147. package/dist/mini-drama/timeline-export/premiere-xmeml.js.map +1 -0
  148. package/dist/mini-drama/timeline-export/probe.d.ts +53 -0
  149. package/dist/mini-drama/timeline-export/probe.d.ts.map +1 -0
  150. package/dist/mini-drama/timeline-export/probe.js +89 -0
  151. package/dist/mini-drama/timeline-export/probe.js.map +1 -0
  152. package/dist/mini-drama/timeline-export/types.d.ts +57 -0
  153. package/dist/mini-drama/timeline-export/types.d.ts.map +1 -0
  154. package/dist/mini-drama/timeline-export/types.js +14 -0
  155. package/dist/mini-drama/timeline-export/types.js.map +1 -0
  156. package/dist/mini-drama/video-generator.d.ts +22 -0
  157. package/dist/mini-drama/video-generator.d.ts.map +1 -0
  158. package/dist/mini-drama/video-generator.js +1305 -0
  159. package/dist/mini-drama/video-generator.js.map +1 -0
  160. package/dist/mini-drama/voice-reference.d.ts +42 -0
  161. package/dist/mini-drama/voice-reference.d.ts.map +1 -0
  162. package/dist/mini-drama/voice-reference.js +170 -0
  163. package/dist/mini-drama/voice-reference.js.map +1 -0
  164. package/dist/output/html-renderer.d.ts +2 -0
  165. package/dist/output/html-renderer.d.ts.map +1 -0
  166. package/dist/output/html-renderer.js +37 -0
  167. package/dist/output/html-renderer.js.map +1 -0
  168. package/dist/parsers/fountain-parser.d.ts +34 -0
  169. package/dist/parsers/fountain-parser.d.ts.map +1 -0
  170. package/dist/parsers/fountain-parser.js +71 -0
  171. package/dist/parsers/fountain-parser.js.map +1 -0
  172. package/dist/parsers/pdf-parser.d.ts +24 -0
  173. package/dist/parsers/pdf-parser.d.ts.map +1 -0
  174. package/dist/parsers/pdf-parser.js +237 -0
  175. package/dist/parsers/pdf-parser.js.map +1 -0
  176. package/dist/parsers/scene-extractor.d.ts +41 -0
  177. package/dist/parsers/scene-extractor.d.ts.map +1 -0
  178. package/dist/parsers/scene-extractor.js +400 -0
  179. package/dist/parsers/scene-extractor.js.map +1 -0
  180. package/dist/series/manager.d.ts +64 -0
  181. package/dist/series/manager.d.ts.map +1 -0
  182. package/dist/series/manager.js +282 -0
  183. package/dist/series/manager.js.map +1 -0
  184. package/dist/series/types.d.ts +641 -0
  185. package/dist/series/types.d.ts.map +1 -0
  186. package/dist/series/types.js +304 -0
  187. package/dist/series/types.js.map +1 -0
  188. package/dist/storyboard/assembler.d.ts +134 -0
  189. package/dist/storyboard/assembler.d.ts.map +1 -0
  190. package/dist/storyboard/assembler.js +319 -0
  191. package/dist/storyboard/assembler.js.map +1 -0
  192. package/dist/storyboard/prompt-builder.d.ts +113 -0
  193. package/dist/storyboard/prompt-builder.d.ts.map +1 -0
  194. package/dist/storyboard/prompt-builder.js +578 -0
  195. package/dist/storyboard/prompt-builder.js.map +1 -0
  196. package/dist/storyboard/shot-planner.d.ts +34 -0
  197. package/dist/storyboard/shot-planner.d.ts.map +1 -0
  198. package/dist/storyboard/shot-planner.js +446 -0
  199. package/dist/storyboard/shot-planner.js.map +1 -0
  200. package/dist/user-config.d.ts +15 -0
  201. package/dist/user-config.d.ts.map +1 -0
  202. package/dist/user-config.js +103 -0
  203. package/dist/user-config.js.map +1 -0
  204. package/dist/venice/audio-preflight.d.ts +80 -0
  205. package/dist/venice/audio-preflight.d.ts.map +1 -0
  206. package/dist/venice/audio-preflight.js +142 -0
  207. package/dist/venice/audio-preflight.js.map +1 -0
  208. package/dist/venice/audio.d.ts +88 -0
  209. package/dist/venice/audio.d.ts.map +1 -0
  210. package/dist/venice/audio.js +234 -0
  211. package/dist/venice/audio.js.map +1 -0
  212. package/dist/venice/client.d.ts +86 -0
  213. package/dist/venice/client.d.ts.map +1 -0
  214. package/dist/venice/client.js +375 -0
  215. package/dist/venice/client.js.map +1 -0
  216. package/dist/venice/edit.d.ts +57 -0
  217. package/dist/venice/edit.d.ts.map +1 -0
  218. package/dist/venice/edit.js +100 -0
  219. package/dist/venice/edit.js.map +1 -0
  220. package/dist/venice/generate.d.ts +47 -0
  221. package/dist/venice/generate.d.ts.map +1 -0
  222. package/dist/venice/generate.js +150 -0
  223. package/dist/venice/generate.js.map +1 -0
  224. package/dist/venice/image-bytes.d.ts +26 -0
  225. package/dist/venice/image-bytes.d.ts.map +1 -0
  226. package/dist/venice/image-bytes.js +101 -0
  227. package/dist/venice/image-bytes.js.map +1 -0
  228. package/dist/venice/models.d.ts +143 -0
  229. package/dist/venice/models.d.ts.map +1 -0
  230. package/dist/venice/models.js +984 -0
  231. package/dist/venice/models.js.map +1 -0
  232. package/dist/venice/multi-edit.d.ts +40 -0
  233. package/dist/venice/multi-edit.d.ts.map +1 -0
  234. package/dist/venice/multi-edit.js +97 -0
  235. package/dist/venice/multi-edit.js.map +1 -0
  236. package/dist/venice/provenance.d.ts +66 -0
  237. package/dist/venice/provenance.d.ts.map +1 -0
  238. package/dist/venice/provenance.js +151 -0
  239. package/dist/venice/provenance.js.map +1 -0
  240. package/dist/venice/recipe.d.ts +69 -0
  241. package/dist/venice/recipe.d.ts.map +1 -0
  242. package/dist/venice/recipe.js +103 -0
  243. package/dist/venice/recipe.js.map +1 -0
  244. package/dist/venice/rejection.d.ts +63 -0
  245. package/dist/venice/rejection.d.ts.map +1 -0
  246. package/dist/venice/rejection.js +111 -0
  247. package/dist/venice/rejection.js.map +1 -0
  248. package/dist/venice/seedance-preflight.d.ts +38 -0
  249. package/dist/venice/seedance-preflight.d.ts.map +1 -0
  250. package/dist/venice/seedance-preflight.js +29 -0
  251. package/dist/venice/seedance-preflight.js.map +1 -0
  252. package/dist/venice/types.d.ts +212 -0
  253. package/dist/venice/types.d.ts.map +1 -0
  254. package/dist/venice/types.js +9 -0
  255. package/dist/venice/types.js.map +1 -0
  256. package/dist/venice/video.d.ts +77 -0
  257. package/dist/venice/video.d.ts.map +1 -0
  258. package/dist/venice/video.js +163 -0
  259. package/dist/venice/video.js.map +1 -0
  260. package/dist/venice/voices.d.ts +40 -0
  261. package/dist/venice/voices.d.ts.map +1 -0
  262. package/dist/venice/voices.js +194 -0
  263. package/dist/venice/voices.js.map +1 -0
  264. package/package.json +79 -0
@@ -0,0 +1,103 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Shot Recipe Sidecar
3
+ //
4
+ // A per-asset, append-only log of every AI-model call that produced or
5
+ // transformed the asset. Where the provenance sidecar answers "which model
6
+ // families touched this file?" (for the Seedance compatibility gate), the
7
+ // recipe sidecar answers "how do I reproduce or continue this asset with
8
+ // another AI call?".
9
+ //
10
+ // Design intent: a project started with the harness can be FINISHED by any
11
+ // AI-driven workflow (an agent, the MCP, a manual operator directing edit
12
+ // models). The recipe is the complete handoff contract — each entry is a
13
+ // replayable Venice API call: model, prompt, negative prompt, seed, cfg,
14
+ // and the reference images that were attached (by stable path, never by
15
+ // data: URI).
16
+ //
17
+ // Storage format
18
+ // --------------
19
+ // For `/path/to/shot-003.png` (or `.mp4`) we write
20
+ // `/path/to/shot-003.recipe.json`:
21
+ //
22
+ // {
23
+ // "asset": "shot-003.png",
24
+ // "passes": [
25
+ // { "pass": 1, "kind": "generate", "role": "content", "model": "seedream-v5-lite", ... },
26
+ // { "pass": 2, "kind": "multi-edit", "role": "identity", "model": "seedream-v5-lite-edit", ... },
27
+ // { "pass": 3, "kind": "multi-edit", "role": "look", ... }
28
+ // ],
29
+ // "createdAt": "...",
30
+ // "updatedAt": "..."
31
+ // }
32
+ //
33
+ // Roles let a finishing agent reason about what is safe to redo:
34
+ // - "content" — establishes what is in the frame (base generation, scene-ref injection)
35
+ // - "identity" — anchors character identity (character-refine passes, R2V identity locks)
36
+ // - "look" — style/grade only (style-match passes, polish edits)
37
+ // - "mechanical" — local non-AI ops that changed pixels (aspect-restore crop, format conversion)
38
+ //
39
+ // Finishing convention: any AI pass applied after the harness hands off MUST
40
+ // be appended here too (and, for face-bearing images edited by a non-seedream
41
+ // model, recorded via recordEditProvenance so the Seedance gate stays honest).
42
+ // Use `appendRecipePass()` for both — it writes recipe + provenance together.
43
+ // ---------------------------------------------------------------------------
44
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
45
+ import { existsSync } from 'node:fs';
46
+ import { basename, dirname } from 'node:path';
47
+ import { writeImageProvenance, recordEditProvenance } from './provenance.js';
48
+ // ---- Path helpers ---------------------------------------------------------
49
+ export function recipeSidecarPath(assetPath) {
50
+ return assetPath.replace(/\.(png|jpg|jpeg|webp|mp4|mov|mp3|wav)$/i, '.recipe.json');
51
+ }
52
+ // ---- Read / append --------------------------------------------------------
53
+ export async function readShotRecipe(assetPath) {
54
+ const sidecar = recipeSidecarPath(assetPath);
55
+ if (!existsSync(sidecar))
56
+ return null;
57
+ try {
58
+ const raw = await readFile(sidecar, 'utf-8');
59
+ return JSON.parse(raw);
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ /**
66
+ * Append one pass to the asset's recipe sidecar (creating it if needed), and
67
+ * optionally record provenance in the same step so the two sidecars can never
68
+ * drift apart. This is the single write-path both the harness pipeline and
69
+ * any finishing script should use.
70
+ *
71
+ * Never throws — recipe logging must not break a render that already
72
+ * succeeded. Failures are reported on stderr.
73
+ */
74
+ export async function appendRecipePass(assetPath, pass, options = {}) {
75
+ try {
76
+ const sidecar = recipeSidecarPath(assetPath);
77
+ await mkdir(dirname(sidecar), { recursive: true });
78
+ const existing = await readShotRecipe(assetPath);
79
+ const now = new Date().toISOString();
80
+ const entry = {
81
+ ...pass,
82
+ pass: (existing?.passes.length ?? 0) + 1,
83
+ at: now,
84
+ };
85
+ const next = {
86
+ asset: existing?.asset ?? basename(assetPath),
87
+ passes: [...(existing?.passes ?? []), entry],
88
+ createdAt: existing?.createdAt ?? now,
89
+ updatedAt: now,
90
+ };
91
+ await writeFile(sidecar, JSON.stringify(next, null, 2), 'utf-8');
92
+ if (options.provenance === 'generate') {
93
+ await writeImageProvenance(assetPath, pass.model, [], { hasFace: options.hasFace });
94
+ }
95
+ else if (options.provenance === 'edit') {
96
+ await recordEditProvenance(assetPath, pass.model, { hasFace: options.hasFace });
97
+ }
98
+ }
99
+ catch (err) {
100
+ console.warn(` ⚠ recipe sidecar write failed for ${assetPath}: ${err.message}`);
101
+ }
102
+ }
103
+ //# sourceMappingURL=recipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/venice/recipe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ export declare const SILENT_REJECT_THRESHOLD_IMAGE = 30000;
2
+ export declare const SILENT_REJECT_THRESHOLD_VIDEO = 100000;
3
+ /**
4
+ * Per-resolution image thresholds. The flat 30_000 ceiling lets some real
5
+ * rejections slip through at 1K (the LEGISLATOR profile in the PNW
6
+ * field-guide came back as a ~2 KB refusal stub which is well under 30 KB
7
+ * but we need a wider margin at 1K to catch noisier rejections that still
8
+ * compress lower than a real photo). Conversely small-resolution outputs
9
+ * can legitimately be under 30 KB.
10
+ *
11
+ * Lookup with `thresholdForResolution(res)`; unknown values fall back to
12
+ * the flat default.
13
+ */
14
+ export declare const SILENT_REJECT_THRESHOLDS_BY_RESOLUTION: Record<string, number>;
15
+ export declare function thresholdForResolution(res?: string): number;
16
+ export interface VeniceRejectionInfo {
17
+ model: string;
18
+ prompt?: string;
19
+ byteSize: number;
20
+ threshold: number;
21
+ kind: 'image' | 'video';
22
+ message?: string;
23
+ }
24
+ export declare class VeniceRejectionError extends Error {
25
+ readonly kind: 'image' | 'video';
26
+ readonly model: string;
27
+ readonly prompt?: string;
28
+ readonly byteSize: number;
29
+ readonly threshold: number;
30
+ constructor(info: VeniceRejectionInfo);
31
+ }
32
+ /**
33
+ * Throw if an image buffer is below the silent-reject threshold.
34
+ *
35
+ * Pass the decoded image bytes (NOT the base64 string). The threshold is
36
+ * calibrated for 1K outputs; smaller resolutions may need an override.
37
+ */
38
+ export declare function assertNotSilentRejectImage(buf: Buffer | Uint8Array, ctx: {
39
+ model: string;
40
+ prompt?: string;
41
+ threshold?: number;
42
+ }): void;
43
+ /**
44
+ * Throw if a video buffer is below the silent-reject threshold.
45
+ *
46
+ * Pass the downloaded MP4 bytes. Threshold calibrated for 720p/5s clips;
47
+ * very short or low-resolution clips may need an override.
48
+ */
49
+ export declare function assertNotSilentRejectVideo(buf: Buffer | Uint8Array, ctx: {
50
+ model: string;
51
+ prompt?: string;
52
+ threshold?: number;
53
+ }): void;
54
+ /**
55
+ * Decode a base64 image and assert it is not a silent rejection.
56
+ * Returns the decoded buffer for downstream use.
57
+ */
58
+ export declare function decodeAndAssertImage(b64: string, ctx: {
59
+ model: string;
60
+ prompt?: string;
61
+ threshold?: number;
62
+ }): Buffer;
63
+ //# sourceMappingURL=rejection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejection.d.ts","sourceRoot":"","sources":["../../src/venice/rejection.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,6BAA6B,QAAS,CAAC;AACpD,eAAO,MAAM,6BAA6B,SAAU,CAAC;AAErD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sCAAsC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWzE,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,IAAI,EAAE,mBAAmB;CAYtC;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,GAAG,UAAU,EACxB,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,IAAI,CAWN;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,GAAG,UAAU,EACxB,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,IAAI,CAWN;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,MAAM,CAIR"}
@@ -0,0 +1,111 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Silent-rejection guard for Venice API responses.
3
+ //
4
+ // Venice's image and video endpoints sometimes return HTTP 200 with a tiny
5
+ // placeholder (7-byte WebP, sub-100KB MP4) when content moderation silently
6
+ // rejects a prompt. Downstream pipelines then process the placeholder as if
7
+ // it were real media. This module exposes:
8
+ //
9
+ // - byte-size thresholds for image and video responses,
10
+ // - a typed `VeniceRejectionError` callers can catch and rephrase against,
11
+ // - `assertNotSilentReject{Image,Video}` helpers that throw before writing
12
+ // placeholder bytes to disk.
13
+ //
14
+ // Threshold reference values (from ):
15
+ // image: < 30_000 bytes at 1K -> silent reject
16
+ // video: < 100_000 bytes at 720p/5s -> silent reject
17
+ // ---------------------------------------------------------------------------
18
+ export const SILENT_REJECT_THRESHOLD_IMAGE = 30_000;
19
+ export const SILENT_REJECT_THRESHOLD_VIDEO = 100_000;
20
+ /**
21
+ * Per-resolution image thresholds. The flat 30_000 ceiling lets some real
22
+ * rejections slip through at 1K (the LEGISLATOR profile in the PNW
23
+ * field-guide came back as a ~2 KB refusal stub which is well under 30 KB
24
+ * but we need a wider margin at 1K to catch noisier rejections that still
25
+ * compress lower than a real photo). Conversely small-resolution outputs
26
+ * can legitimately be under 30 KB.
27
+ *
28
+ * Lookup with `thresholdForResolution(res)`; unknown values fall back to
29
+ * the flat default.
30
+ */
31
+ export const SILENT_REJECT_THRESHOLDS_BY_RESOLUTION = {
32
+ '512x512': 20_000,
33
+ '512': 20_000,
34
+ '720p': 30_000,
35
+ '1K': 50_000,
36
+ '1k': 50_000,
37
+ '1080p': 75_000,
38
+ '2K': 150_000,
39
+ '2k': 150_000,
40
+ '4K': 400_000,
41
+ '4k': 400_000,
42
+ };
43
+ export function thresholdForResolution(res) {
44
+ if (!res)
45
+ return SILENT_REJECT_THRESHOLD_IMAGE;
46
+ return SILENT_REJECT_THRESHOLDS_BY_RESOLUTION[res] ?? SILENT_REJECT_THRESHOLD_IMAGE;
47
+ }
48
+ export class VeniceRejectionError extends Error {
49
+ kind;
50
+ model;
51
+ prompt;
52
+ byteSize;
53
+ threshold;
54
+ constructor(info) {
55
+ const detail = info.message ??
56
+ `Response under threshold (${info.byteSize}b < ${info.threshold}b) — silent moderation reject suspected`;
57
+ super(`[VeniceRejection:${info.kind}] ${info.model} :: ${detail}`);
58
+ this.name = 'VeniceRejectionError';
59
+ this.kind = info.kind;
60
+ this.model = info.model;
61
+ this.prompt = info.prompt;
62
+ this.byteSize = info.byteSize;
63
+ this.threshold = info.threshold;
64
+ }
65
+ }
66
+ /**
67
+ * Throw if an image buffer is below the silent-reject threshold.
68
+ *
69
+ * Pass the decoded image bytes (NOT the base64 string). The threshold is
70
+ * calibrated for 1K outputs; smaller resolutions may need an override.
71
+ */
72
+ export function assertNotSilentRejectImage(buf, ctx) {
73
+ const threshold = ctx.threshold ?? SILENT_REJECT_THRESHOLD_IMAGE;
74
+ if (buf.length < threshold) {
75
+ throw new VeniceRejectionError({
76
+ kind: 'image',
77
+ model: ctx.model,
78
+ prompt: ctx.prompt,
79
+ byteSize: buf.length,
80
+ threshold,
81
+ });
82
+ }
83
+ }
84
+ /**
85
+ * Throw if a video buffer is below the silent-reject threshold.
86
+ *
87
+ * Pass the downloaded MP4 bytes. Threshold calibrated for 720p/5s clips;
88
+ * very short or low-resolution clips may need an override.
89
+ */
90
+ export function assertNotSilentRejectVideo(buf, ctx) {
91
+ const threshold = ctx.threshold ?? SILENT_REJECT_THRESHOLD_VIDEO;
92
+ if (buf.length < threshold) {
93
+ throw new VeniceRejectionError({
94
+ kind: 'video',
95
+ model: ctx.model,
96
+ prompt: ctx.prompt,
97
+ byteSize: buf.length,
98
+ threshold,
99
+ });
100
+ }
101
+ }
102
+ /**
103
+ * Decode a base64 image and assert it is not a silent rejection.
104
+ * Returns the decoded buffer for downstream use.
105
+ */
106
+ export function decodeAndAssertImage(b64, ctx) {
107
+ const buf = Buffer.from(b64, 'base64');
108
+ assertNotSilentRejectImage(buf, ctx);
109
+ return buf;
110
+ }
111
+ //# sourceMappingURL=rejection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejection.js","sourceRoot":"","sources":["../../src/venice/rejection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { VeniceClient } from './client.js';
2
+ /** All image-path fields on the request body that Seedance inspects. */
3
+ export interface SeedanceInputImagePaths {
4
+ imageUrl?: string;
5
+ endImageUrl?: string;
6
+ referenceImagePaths?: string[];
7
+ sceneImagePaths?: string[];
8
+ elementsFrontalPaths?: string[];
9
+ elementsReferencePaths?: string[];
10
+ }
11
+ export interface PreflightOptions {
12
+ /** @deprecated The gate is neutralized; this option is ignored. */
13
+ mode?: import('../series/types.js').SeedanceCompatibilityMode;
14
+ /** @deprecated The gate is neutralized; this option is ignored. */
15
+ nonInteractive?: boolean;
16
+ }
17
+ export type PreflightAction = {
18
+ type: 'proceed';
19
+ model: string;
20
+ imagePaths: SeedanceInputImagePaths;
21
+ } | {
22
+ type: 'fallback';
23
+ newModel: string;
24
+ reason: string;
25
+ imagePaths: SeedanceInputImagePaths;
26
+ } | {
27
+ type: 'laundered';
28
+ model: string;
29
+ imagePaths: SeedanceInputImagePaths;
30
+ lauderedPaths: string[];
31
+ };
32
+ /**
33
+ * No-op Seedance pre-flight. Always returns `proceed` with the original model
34
+ * and image paths. Retained only so existing callers keep compiling — Venice
35
+ * removed the seedream-only face restriction that this gate used to enforce.
36
+ */
37
+ export declare function ensureSeedanceCompatibility(_client: VeniceClient, targetModel: string, images: SeedanceInputImagePaths, _options?: PreflightOptions): Promise<PreflightAction>;
38
+ //# sourceMappingURL=seedance-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seedance-preflight.d.ts","sourceRoot":"","sources":["../../src/venice/seedance-preflight.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,wEAAwE;AACxE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,IAAI,CAAC,EAAE,OAAO,oBAAoB,EAAE,yBAAyB,CAAC;IAC9D,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,uBAAuB,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,uBAAuB,CAAA;CAAE,GAC3F;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,uBAAuB,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAIvG;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,uBAAuB,EAC/B,QAAQ,GAAE,gBAAqB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAE1B"}
@@ -0,0 +1,29 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Seedance 2.0 Compatibility Pre-flight — NEUTRALIZED (2026-07)
3
+ //
4
+ // Historical behavior: Seedance 2.0 used to reject face-bearing input images
5
+ // that weren't produced by `seedream-v5-lite` / `seedream-v5-lite-edit`. This
6
+ // module ran a provenance check before every Seedance call and, on a face-
7
+ // bearing non-seedream image, either rerouted the shot to a Kling/Veo fallback
8
+ // or "laundered" the image through a seedream edit pass.
9
+ //
10
+ // **Venice removed that cross-family restriction.** Seedance now accepts face-
11
+ // bearing input images from ANY image family, so the gate has nothing to do.
12
+ // `ensureSeedanceCompatibility` is kept as a no-op that always proceeds, so the
13
+ // remaining callers (a couple of one-off scripts) keep compiling; it can be
14
+ // deleted entirely once nothing imports it.
15
+ //
16
+ // NOTE: the Seedance face *consent* attestation (HTTP 409 `needs_consent`) is a
17
+ // SEPARATE mechanism handled at queue time in `video.ts` / `video-generator.ts`
18
+ // — it was never part of this provenance gate and is unaffected.
19
+ // ---------------------------------------------------------------------------
20
+ // ---- Public entry point (no-op) -------------------------------------------
21
+ /**
22
+ * No-op Seedance pre-flight. Always returns `proceed` with the original model
23
+ * and image paths. Retained only so existing callers keep compiling — Venice
24
+ * removed the seedream-only face restriction that this gate used to enforce.
25
+ */
26
+ export async function ensureSeedanceCompatibility(_client, targetModel, images, _options = {}) {
27
+ return { type: 'proceed', model: targetModel, imagePaths: images };
28
+ }
29
+ //# sourceMappingURL=seedance-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seedance-preflight.js","sourceRoot":"","sources":["../../src/venice/seedance-preflight.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,yDAAyD;AACzD,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,4CAA4C;AAC5C,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,iEAAiE;AACjE,8EAA8E;AA4B9E,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAqB,EACrB,WAAmB,EACnB,MAA+B,EAC/B,WAA6B,EAAE;IAE/B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,212 @@
1
+ /** Supported init-image modes for img2img generation. */
2
+ export type InitImageMode = "IMAGE_STRENGTH" | "STEP_SCHEDULE";
3
+ /** Request body for the image generation endpoint. */
4
+ export interface ImageGenerateRequest {
5
+ model: string;
6
+ prompt: string;
7
+ negative_prompt?: string;
8
+ resolution?: string;
9
+ aspect_ratio?: string;
10
+ /** @deprecated Use resolution + aspect_ratio instead. */
11
+ width?: number;
12
+ /** @deprecated Use resolution + aspect_ratio instead. */
13
+ height?: number;
14
+ steps?: number;
15
+ cfg_scale?: number;
16
+ seed?: number;
17
+ safe_mode?: boolean;
18
+ return_binary?: boolean;
19
+ hide_watermark?: boolean;
20
+ fidelity?: number;
21
+ image?: string;
22
+ init_image_mode?: InitImageMode;
23
+ format?: 'jpeg' | 'png' | 'webp';
24
+ variants?: number;
25
+ style_preset?: string;
26
+ lora_strength?: number;
27
+ embed_exif_metadata?: boolean;
28
+ enable_web_search?: boolean;
29
+ }
30
+ /** A single generated image entry returned by the API. */
31
+ export interface GeneratedImage {
32
+ b64_json: string;
33
+ seed?: number;
34
+ }
35
+ /** Response body from the image generation endpoint (JSON mode). */
36
+ export interface ImageGenerateResponse {
37
+ id?: string;
38
+ images: GeneratedImage[];
39
+ timing?: {
40
+ inferenceDuration: number;
41
+ inferencePreprocessingTime: number;
42
+ inferenceQueueTime: number;
43
+ total: number;
44
+ };
45
+ }
46
+ /**
47
+ * @deprecated Inpainting via /images/edit was disabled May 19, 2025.
48
+ * Use multi-edit (/image/multi-edit) instead.
49
+ */
50
+ export interface ImageEditRequest {
51
+ image: string;
52
+ mask?: string;
53
+ prompt: string;
54
+ strength?: number;
55
+ model?: string;
56
+ steps?: number;
57
+ cfg_scale?: number;
58
+ seed?: number;
59
+ safe_mode?: boolean;
60
+ }
61
+ /** @deprecated */
62
+ export interface ImageEditResponse {
63
+ images: GeneratedImage[];
64
+ }
65
+ export type MultiEditModel = 'qwen-edit' | 'qwen-image-2-edit' | 'qwen-image-2-pro-edit' | 'flux-2-max-edit' | 'gpt-image-1-5-edit' | 'gpt-image-2-edit' | 'grok-imagine-edit' | 'nano-banana-2-edit' | 'nano-banana-pro-edit' | 'seedream-v4-edit' | 'seedream-v5-lite-edit';
66
+ export interface MultiEditRequest {
67
+ modelId: MultiEditModel;
68
+ prompt: string;
69
+ /**
70
+ * 1-3 images: first is base image, rest are reference layers.
71
+ * Each can be a raw base64 string, data URL, or HTTP URL.
72
+ */
73
+ images: string[];
74
+ }
75
+ export interface ImageUpscaleRequest {
76
+ model?: string;
77
+ image: string;
78
+ scale?: number;
79
+ }
80
+ export interface BackgroundRemoveRequest {
81
+ model?: string;
82
+ image: string;
83
+ }
84
+ export interface VideoElement {
85
+ frontal_image_url?: string;
86
+ reference_image_urls?: string[];
87
+ video_url?: string;
88
+ }
89
+ export interface VideoQueueRequest {
90
+ model: string;
91
+ prompt: string;
92
+ duration: string;
93
+ image_url?: string;
94
+ end_image_url?: string;
95
+ negative_prompt?: string;
96
+ aspect_ratio?: string;
97
+ resolution?: string;
98
+ audio?: boolean;
99
+ audio_url?: string;
100
+ video_url?: string;
101
+ reference_image_urls?: string[];
102
+ elements?: VideoElement[];
103
+ scene_image_urls?: string[];
104
+ /**
105
+ * Voice-donor reference clips (up to 3, 2-15s each, ≤15s aggregate,
106
+ * wav/mp3, ≤15MB per file) bound in-prompt as @Audio1, @Audio2, … so a
107
+ * character's voice stays consistent across shots. Only accepted by the
108
+ * Seedance 2.0 R2V family and HappyHorse 1.1 R2V, and only alongside at
109
+ * least one reference image (audio-only is rejected at validation).
110
+ */
111
+ reference_audio_urls?: string[];
112
+ }
113
+ export interface VideoQueueResponse {
114
+ model: string;
115
+ queue_id: string;
116
+ }
117
+ export interface VideoRetrieveRequest {
118
+ model: string;
119
+ queue_id: string;
120
+ delete_media_on_completion?: boolean;
121
+ }
122
+ export interface VideoRetrieveStatus {
123
+ status: 'PROCESSING';
124
+ average_execution_time: number;
125
+ execution_duration: number;
126
+ }
127
+ export interface VideoQuoteRequest {
128
+ model: string;
129
+ duration: string;
130
+ aspect_ratio?: string | null;
131
+ resolution?: string;
132
+ audio?: boolean | null;
133
+ }
134
+ export interface VideoQuoteResponse {
135
+ quote: number;
136
+ }
137
+ export interface VideoCompleteRequest {
138
+ model: string;
139
+ queue_id: string;
140
+ }
141
+ export interface SpeechRequest {
142
+ input: string;
143
+ model?: string;
144
+ voice?: string;
145
+ response_format?: 'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm';
146
+ speed?: number;
147
+ streaming?: boolean;
148
+ /** Qwen3 TTS only: style prompt for emotion/delivery control. */
149
+ prompt?: string;
150
+ /** Qwen3 TTS only: language selection. */
151
+ language?: string;
152
+ /** Qwen3 TTS only: sampling temperature (0-2). */
153
+ temperature?: number;
154
+ /** Qwen3 TTS only: nucleus sampling (0-1). */
155
+ top_p?: number;
156
+ }
157
+ export interface AudioQueueRequest {
158
+ model: string;
159
+ prompt: string;
160
+ lyrics_prompt?: string;
161
+ duration_seconds?: number | string;
162
+ force_instrumental?: boolean;
163
+ voice?: string;
164
+ language_code?: string;
165
+ speed?: number;
166
+ }
167
+ export interface AudioQueueResponse {
168
+ model: string;
169
+ queue_id: string;
170
+ status: 'QUEUED';
171
+ }
172
+ export interface AudioRetrieveRequest {
173
+ model: string;
174
+ queue_id: string;
175
+ delete_media_on_completion?: boolean;
176
+ }
177
+ export interface AudioRetrieveStatus {
178
+ status: 'PROCESSING';
179
+ average_execution_time: number;
180
+ execution_duration: number;
181
+ }
182
+ export interface CharacterReference {
183
+ name: string;
184
+ role: string;
185
+ base64Image: string;
186
+ }
187
+ export interface GenerateWithReferencesOptions {
188
+ prompt: string;
189
+ negative_prompt?: string;
190
+ resolution?: string;
191
+ aspect_ratio?: string;
192
+ steps?: number;
193
+ cfg_scale?: number;
194
+ seed?: number;
195
+ safe_mode?: boolean;
196
+ hide_watermark?: boolean;
197
+ model?: string;
198
+ referenceImages: CharacterReference[];
199
+ faceSlots?: number;
200
+ }
201
+ export interface GenerateWithReferencesResult {
202
+ base64: string;
203
+ seed: number | undefined;
204
+ }
205
+ export interface VeniceApiError {
206
+ error: {
207
+ message: string;
208
+ type?: string;
209
+ code?: string | number;
210
+ };
211
+ }
212
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/venice/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Venice AI API -- TypeScript type definitions
3
+ //
4
+ // Covers image/generate, image/multi-edit, image/edit, image/upscale,
5
+ // image/background-remove, video/queue, video/retrieve, video/quote,
6
+ // audio/speech, audio/queue, and character references.
7
+ // ---------------------------------------------------------------------------
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/venice/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,uDAAuD;AACvD,8EAA8E"}