@mux/ai 0.17.1 → 0.19.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.
package/README.md CHANGED
@@ -229,6 +229,7 @@ import { workflows, primitives } from "@mux/ai";
229
229
  | [Audio-Only Workflows](./docs/AUDIO-ONLY.md) | Working with audio-only assets (no video track) |
230
230
  | [Evaluations](./docs/EVALS.md) | AI eval testing with the 3 E's framework — [public dashboard](https://evaluating-mux-ai.vercel.app/) |
231
231
  | [Examples](./docs/EXAMPLES.md) | Running the example scripts from the repository |
232
+ | [Security](./docs/SECURITY.md) | Prompt-injection threat model, trust boundaries for workflow options, and the `safety` field on results |
232
233
 
233
234
  ### Additional Resources
234
235
 
@@ -17,6 +17,56 @@ interface ImageDownloadOptions {
17
17
  exponentialBackoff?: boolean;
18
18
  }
19
19
 
20
+ /**
21
+ * Which detector fired on a leak, or `null` when the text is clean.
22
+ *
23
+ * - `canary` — the system-prompt canary token appeared in the output.
24
+ * Near-zero false-positive rate; treat as a confirmed leak.
25
+ * - `prompt_tag` — an XML-like tag taken from our prompt structure
26
+ * appeared in the output. Low false-positive rate.
27
+ * - `encoded_blob` — a long run of base64- or hex-shaped characters
28
+ * appeared in a field expected to hold prose. Heuristic; some false
29
+ * positives on hashes or tokens in tech-content transcripts.
30
+ * - `unexpected_key` — the model emitted a JSON field not declared in
31
+ * the schema (see {@link detectUnexpectedKeys}). Stripped silently
32
+ * by zod's default `.strip()` mode; this signal surfaces the
33
+ * smuggling attempt rather than letting it go unseen.
34
+ */
35
+ type LeakReason = "canary" | "prompt_tag" | "encoded_blob" | "unexpected_key" | null;
36
+ /**
37
+ * Per-field record of a detected leak. Collected across every scrub
38
+ * performed inside a single workflow invocation and returned to the
39
+ * caller in the workflow result's `safety` field.
40
+ */
41
+ interface ScrubbedFieldReport {
42
+ /**
43
+ * Identifier for the field that leaked. Format is workflow-specific
44
+ * (e.g. "reasoning[0]", "moment_insight[2]", "description"). Intended
45
+ * for debugging and observability; do not parse programmatically.
46
+ */
47
+ field: string;
48
+ /** Which detector fired — see {@link LeakReason}. */
49
+ reason: Exclude<LeakReason, null>;
50
+ }
51
+ /**
52
+ * Aggregate safety report returned from workflows that perform
53
+ * output-side scrubbing.
54
+ *
55
+ * Operators can use this to alert on suspected prompt-injection traffic
56
+ * without inspecting log warnings. Shape is stable across workflows so a
57
+ * single observer can consume it uniformly.
58
+ */
59
+ interface SafetyReport {
60
+ /** `true` when at least one field was suppressed by the scrubber. */
61
+ leaksDetected: boolean;
62
+ /**
63
+ * One entry per suppressed field. Empty (but present) when no leaks
64
+ * were detected. Iteration order matches the order scrubs ran, so
65
+ * callers can correlate entries with workflow structure if they wish.
66
+ */
67
+ scrubbedFields: ScrubbedFieldReport[];
68
+ }
69
+
20
70
  type SupportedProvider = "openai" | "anthropic" | "google";
21
71
  type SupportedEmbeddingProvider = "openai" | "google";
22
72
  type OpenAIModelId = Parameters<ReturnType<typeof createOpenAI>["chat"]>[0];
@@ -72,6 +122,20 @@ interface AskQuestionsOptions extends MuxAIOptions {
72
122
  imageDownloadOptions?: ImageDownloadOptions;
73
123
  /** Storyboard width in pixels (defaults to 640). */
74
124
  storyboardWidth?: number;
125
+ /**
126
+ * Maximum length (in characters) allowed for each entry in a question's
127
+ * `answerOptions` array. Defaults to 150.
128
+ *
129
+ * The cap exists to reject instruction-shaped answer options — a common
130
+ * prompt-injection shape pairs sentence-length options that presuppose
131
+ * the desired outcome, making "answering correctly" equivalent to
132
+ * leaking. Domain-specific category labels (e.g. moderation labels like
133
+ * "Depicts underage individuals in sexual content") can legitimately
134
+ * run 40–80 characters, so the default is set generously. Raise this
135
+ * if your use case has genuinely longer category labels; never widen
136
+ * it to accept arbitrary untrusted input without other safeguards.
137
+ */
138
+ maxAnswerOptionLength?: number;
75
139
  }
76
140
  /** Structured return payload for askQuestions workflow. */
77
141
  interface AskQuestionsResult {
@@ -85,8 +149,37 @@ interface AskQuestionsResult {
85
149
  usage?: TokenUsage;
86
150
  /** Raw transcript text used for analysis (when includeTranscript is true). */
87
151
  transcriptText?: string;
152
+ /**
153
+ * Aggregate report of output-side scrubbing performed during this call.
154
+ * Populated by {@link scrubFreeTextField}. When present with
155
+ * `leaksDetected: true`, at least one free-text field was suppressed as
156
+ * a suspected prompt leak — consult `scrubbedFields` for details.
157
+ */
158
+ safety?: SafetyReport;
88
159
  }
89
- /** Zod schema for a single answer (matches the public QuestionAnswer interface). */
160
+ /**
161
+ * Zod schema for a single answer (matches the public QuestionAnswer interface).
162
+ *
163
+ * Uses zod's default `.strip()` mode (rather than `.strict()`) so that
164
+ * an extra key emitted by the model does not fail the whole workflow —
165
+ * it is silently stripped during parse. The smuggling-channel concern
166
+ * (a coerced model emitting a prompt fragment under an unexpected key)
167
+ * is handled out-of-band: the call site re-parses `response.text`,
168
+ * runs {@link detectUnexpectedKeysFromRawText}, and records each extra
169
+ * as an `unexpected_key` entry in the workflow's safety report.
170
+ *
171
+ * The `.max(1000)` cap on `reasoning` is a mechanical limit on how much
172
+ * content can be exfiltrated through this channel.
173
+ *
174
+ * Tuning notes:
175
+ * - `REASONING_FIELD_SCOPE` asks the model to keep reasoning to 1–3
176
+ * concise sentences. Observed lengths are typically 50–200 chars.
177
+ * - The 1000-char cap leaves ~5x headroom over typical output while
178
+ * making a full system-prompt dump (3000+ chars) unable to fit.
179
+ * - A plausible tighter value is 500. Before tightening, confirm via
180
+ * the `safety` telemetry that 90th-percentile observed lengths on
181
+ * legitimate traffic stay well under the new target.
182
+ */
90
183
  declare const questionAnswerSchema: z.ZodObject<{
91
184
  question: z.ZodString;
92
185
  answer: z.ZodNullable<z.ZodString>;
@@ -210,6 +303,15 @@ interface BurnedInCaptionsResult {
210
303
  storyboardUrl: string;
211
304
  /** Token usage from the AI provider (for efficiency/cost analysis). */
212
305
  usage?: TokenUsage;
306
+ /**
307
+ * Aggregate report of output-side safety signals detected during this
308
+ * call. The workflow's free-text surface is limited to
309
+ * `detectedLanguage`, so most entries here will be `unexpected_key`
310
+ * records — the model emitting a field not declared in
311
+ * `burnedInCaptionsSchema` (which is then silently stripped by
312
+ * zod.strip() but surfaced here as a smuggling signal).
313
+ */
314
+ safety?: SafetyReport;
213
315
  }
214
316
  /**
215
317
  * Sections of the burned-in captions user prompt that can be overridden.
@@ -247,7 +349,27 @@ interface BurnedInCaptionsOptions extends MuxAIOptions {
247
349
  */
248
350
  promptOverrides?: BurnedInCaptionsPromptOverrides;
249
351
  }
250
- /** Schema used to validate burned-in captions analysis responses. */
352
+ /**
353
+ * Schema used to validate burned-in captions analysis responses.
354
+ *
355
+ * Uses zod's default `.strip()` mode rather than `.strict()`: extra keys
356
+ * the model emits are silently dropped during parse so a provider
357
+ * quirk doesn't fail the whole workflow. The smuggling-channel concern
358
+ * (a coerced model emitting e.g. `{ ..., system_prompt_verbatim: "..." }`)
359
+ * is addressed out-of-band by the `detectUnexpectedKeys` call at the
360
+ * parse site — which logs the extras and records them in the workflow's
361
+ * safety report as `unexpected_key` leaks.
362
+ *
363
+ * `.max(100)` on `detectedLanguage` caps the one free-text field.
364
+ *
365
+ * Tuning notes:
366
+ * - Real language names are short ("English", "Mandarin Chinese",
367
+ * "Brazilian Portuguese"), typically 5–30 chars.
368
+ * - 100 chars leaves ~3x headroom while preventing a multi-hundred-
369
+ * character dump.
370
+ * - Could plausibly tighten to 60 once telemetry shows legitimate
371
+ * outputs consistently well under that.
372
+ */
251
373
  declare const burnedInCaptionsSchema: z.ZodObject<{
252
374
  hasBurnedInCaptions: z.ZodBoolean;
253
375
  confidence: z.ZodNumber;
@@ -265,6 +387,23 @@ declare const burnedInCaptionsSchema: z.ZodObject<{
265
387
  type BurnedInCaptionsAnalysis = z.infer<typeof burnedInCaptionsSchema>;
266
388
  declare function hasBurnedInCaptions(assetId: string, options?: BurnedInCaptionsOptions): Promise<BurnedInCaptionsResult>;
267
389
 
390
+ /**
391
+ * Uses zod's default `.strip()` on both schemas so extra keys the model
392
+ * emits are silently stripped rather than failing the workflow. The
393
+ * smuggling-channel concern (a coerced model emitting prompt fragments
394
+ * under an unexpected key) is surfaced by the call site's
395
+ * `detectUnexpectedKeysFromRawText` pass, which records each extra as
396
+ * an `unexpected_key` entry in the workflow's safety report.
397
+ *
398
+ * `.max(300)` on `title` caps the exfiltration channel.
399
+ *
400
+ * Tuning notes:
401
+ * - Chapter titles are short labels ("Introduction", "Main Topic
402
+ * Discussion") and typically run 10–50 characters.
403
+ * - 300 chars leaves generous headroom (~6x typical). Could plausibly
404
+ * tighten to 150 once telemetry shows no legitimate output
405
+ * approaches that length.
406
+ */
268
407
  declare const chapterSchema: z.ZodObject<{
269
408
  startTime: z.ZodNumber;
270
409
  title: z.ZodString;
@@ -306,6 +445,14 @@ interface ChaptersResult {
306
445
  chapters: Chapter[];
307
446
  /** Token usage from the AI provider (for efficiency/cost analysis). */
308
447
  usage?: TokenUsage;
448
+ /**
449
+ * Aggregate report of output-side scrubbing performed during this call.
450
+ * When `leaksDetected` is `true`, at least one chapter title was
451
+ * suppressed. Suppressed chapters are dropped from the returned
452
+ * `chapters` array so playback timelines are not decorated with blank
453
+ * titles; consult `scrubbedFields` to know how many were removed.
454
+ */
455
+ safety?: SafetyReport;
309
456
  }
310
457
  /**
311
458
  * Sections of the chaptering user prompt that can be overridden.
@@ -360,7 +507,7 @@ interface ChaptersOptions extends MuxAIOptions {
360
507
  * Sections of the chaptering system prompt that can be overridden.
361
508
  * Use these to customize the AI's persona and constraints.
362
509
  */
363
- type ChapterSystemPromptSections = "role" | "context" | "constraints" | "qualityGuidelines";
510
+ type ChapterSystemPromptSections = "role" | "context" | "security" | "constraints" | "qualityGuidelines";
364
511
  declare function generateChapters(assetId: string, options?: ChaptersOptions): Promise<ChaptersResult>;
365
512
 
366
513
  /** Replacement strategy for censored words. */
@@ -373,6 +520,8 @@ interface AutoCensorProfanityOptions {
373
520
  interface CaptionReplacement {
374
521
  find: string;
375
522
  replace: string;
523
+ /** Match `find` with case-sensitivity. Defaults to `true`. */
524
+ caseSensitive?: boolean;
376
525
  }
377
526
  interface ReplacementRecord {
378
527
  cueStartTime: number;
@@ -432,8 +581,35 @@ interface EditCaptionsResult {
432
581
  uploadedTrackId?: string;
433
582
  presignedUrl?: string;
434
583
  usage?: TokenUsage;
584
+ /**
585
+ * Aggregate report of output-side scrubbing performed during this call.
586
+ * When `leaksDetected` is `true`, at least one entry returned by the
587
+ * profanity detector contained signs of a system-prompt leak (for
588
+ * example, a tag marker emitted in place of a profane word). Leaked
589
+ * entries are dropped before regex construction so they never drive
590
+ * transcript edits.
591
+ */
592
+ safety?: SafetyReport;
435
593
  }
436
- /** Schema used when requesting profanity detection from a language model. */
594
+ /**
595
+ * Schema used when requesting profanity detection from a language model.
596
+ *
597
+ * Uses zod's default `.strip()` mode. Extra keys emitted by the model
598
+ * are silently dropped at parse time; the call site re-parses
599
+ * `response.text` and records each extra as an `unexpected_key` entry
600
+ * in the workflow's safety report.
601
+ *
602
+ * `.max(100)` on each array entry caps how much content can be smuggled
603
+ * through a single "word" slot.
604
+ *
605
+ * Tuning notes:
606
+ * - Legitimate profane words and short phrases are typically 4–20
607
+ * chars, rarely more than 30.
608
+ * - 100 chars leaves ~3x headroom while preventing multi-hundred-char
609
+ * prompt fragments from hiding in a single entry.
610
+ * - Could plausibly tighten to 50 once telemetry shows no legitimate
611
+ * detection approaches that length.
612
+ */
437
613
  declare const profanityDetectionSchema: z.ZodObject<{
438
614
  profanity: z.ZodArray<z.ZodString, "many">;
439
615
  }, "strip", z.ZodTypeAny, {
@@ -475,9 +651,11 @@ declare function censorVttContent(rawVtt: string, profanity: string[], mode: Cen
475
651
  declare function applyOverrideLists(detected: string[], alwaysCensor: string[], neverCensor: string[]): string[];
476
652
  /**
477
653
  * Applies static find/replace pairs to cue text lines in raw VTT content
478
- * using word-boundary regex. Case-sensitive matching since static replacements
479
- * target specific known strings. Headers, timestamps, and cue identifiers are
480
- * untouched. Returns the edited VTT and the total number of replacements.
654
+ * using word-boundary regex. Defaults to case-sensitive matching since static
655
+ * replacements typically target specific known strings; each entry may opt
656
+ * into case-insensitive matching via `caseSensitive: false`. Headers,
657
+ * timestamps, and cue identifiers are untouched. Returns the edited VTT and
658
+ * the total number of replacements.
481
659
  */
482
660
  declare function applyReplacements(rawVtt: string, replacements: CaptionReplacement[]): {
483
661
  editedVtt: string;
@@ -565,6 +743,14 @@ interface EngagementInsightsResult {
565
743
  overallInsight: OverallInsight;
566
744
  /** Token usage from the AI provider (for efficiency/cost analysis). */
567
745
  usage?: TokenUsage;
746
+ /**
747
+ * Aggregate report of output-side scrubbing performed during this call.
748
+ * When `leaksDetected` is `true`, at least one `insight`, the overall
749
+ * `summary`, or an entry of `trends` was suppressed as a suspected
750
+ * prompt leak. Suppressed insights and the summary are replaced with
751
+ * a neutral placeholder; suppressed trends are dropped.
752
+ */
753
+ safety?: SafetyReport;
568
754
  }
569
755
  /**
570
756
  * Extracts transcript segments that align with hotspot time ranges.
@@ -712,11 +898,36 @@ declare function getModerationScores(assetId: string, options?: ModerationOption
712
898
  declare const DEFAULT_SUMMARY_KEYWORD_LIMIT = 10;
713
899
  declare const DEFAULT_TITLE_LENGTH = 10;
714
900
  declare const DEFAULT_DESCRIPTION_LENGTH = 50;
901
+ /**
902
+ * Length caps (`.max(...)`) on each free-text field are a mechanical
903
+ * defence-in-depth against exfiltration: even if an injection payload
904
+ * coerces the model into leaking, it cannot fit more than the declared
905
+ * number of characters.
906
+ *
907
+ * Typical legitimate lengths and current margin:
908
+ *
909
+ * - `title`: real titles are 25–150 chars (10–20 words). Cap is 500 —
910
+ * very generous. Could plausibly tighten to 200 once telemetry from
911
+ * the `safety` field shows no legitimate outputs approach 200.
912
+ * - `description`: configurable via `descriptionLength` (word count).
913
+ * Default 50 words ≈ 300 chars. The exported schema uses a permissive
914
+ * 10000-char ceiling so consumers who call `summarySchema.parse`
915
+ * directly don't hit surprise failures on large `descriptionLength`
916
+ * configs; the workflow itself parses with a tighter dynamic cap —
917
+ * see {@link buildSummarySchema}.
918
+ * - `keywords` entries: legitimate tags are 10–30 chars. Cap is 200.
919
+ * Could tighten to 80 if we wanted less slack.
920
+ *
921
+ * Tuning signal: a `safety.leaksDetected` hit with `reason: "canary"`
922
+ * or `"prompt_tag"` while legitimate 90th-percentile lengths stay well
923
+ * below the cap is evidence the cap can be tightened without breaking
924
+ * real outputs.
925
+ */
715
926
  declare const summarySchema: z.ZodObject<{
716
927
  keywords: z.ZodArray<z.ZodString, "many">;
717
928
  title: z.ZodString;
718
929
  description: z.ZodString;
719
- }, "strict", z.ZodTypeAny, {
930
+ }, "strip", z.ZodTypeAny, {
720
931
  title: string;
721
932
  description: string;
722
933
  keywords: string[];
@@ -742,6 +953,15 @@ interface SummaryAndTagsResult {
742
953
  usage?: TokenUsage;
743
954
  /** Raw transcript text used for analysis (when includeTranscript is true). */
744
955
  transcriptText?: string;
956
+ /**
957
+ * Aggregate report of output-side scrubbing performed during this call.
958
+ * When `leaksDetected` is `true`, at least one of `title`, `description`,
959
+ * or an element of `tags` was suppressed because the scrubber detected
960
+ * signs of a prompt leak — consult `scrubbedFields` for which.
961
+ * Suppressed fields are returned as empty strings or omitted from the
962
+ * tags array.
963
+ */
964
+ safety?: SafetyReport;
745
965
  }
746
966
  /**
747
967
  * Sections of the summarization user prompt that can be overridden.
@@ -975,6 +1195,15 @@ interface TranslationResult {
975
1195
  presignedUrl?: string;
976
1196
  /** Token usage from the AI provider (for efficiency/cost analysis). */
977
1197
  usage?: TokenUsage;
1198
+ /**
1199
+ * Aggregate report of output-side scrubbing performed during this call.
1200
+ * When `leaksDetected` is `true`, at least one translated cue was
1201
+ * suppressed because the scrubber detected signs of a prompt leak; the
1202
+ * cue's source text is substituted back in place so the 1:1 cue
1203
+ * contract and timeline alignment are preserved. Consult
1204
+ * `scrubbedFields` to know which cues were affected.
1205
+ */
1206
+ safety?: SafetyReport;
978
1207
  }
979
1208
  /** Configuration accepted by `translateCaptions`. */
980
1209
  interface TranslationOptions<P extends SupportedProvider = SupportedProvider> extends MuxAIOptions {
@@ -1027,7 +1256,16 @@ interface TranslationChunkingOptions {
1027
1256
  /** Approximate cap for cue text tokens included in a single AI translation chunk. Defaults to 2000. */
1028
1257
  maxCueTextTokensPerChunk?: number;
1029
1258
  }
1030
- /** Schema used when requesting caption translation from a language model. */
1259
+ /**
1260
+ * Schema used when requesting caption translation from a language model.
1261
+ *
1262
+ * Uses zod's default `.strip()` mode. Extras emitted by the model are
1263
+ * silently dropped during parse so a benign provider quirk does not
1264
+ * fail the workflow; the call site re-parses `response.text` via
1265
+ * `detectUnexpectedKeysFromRawText` and records each extra as an
1266
+ * `unexpected_key` entry in the safety report — see the matching note
1267
+ * on `burnedInCaptionsSchema` for the full rationale.
1268
+ */
1031
1269
  declare const translationSchema: z.ZodObject<{
1032
1270
  translation: z.ZodString;
1033
1271
  }, "strip", z.ZodTypeAny, {
@@ -1039,6 +1277,39 @@ declare const translationSchema: z.ZodObject<{
1039
1277
  type TranslationPayload = z.infer<typeof translationSchema>;
1040
1278
  declare function shouldSplitChunkTranslationError(error: unknown): boolean;
1041
1279
  declare function aggregateTokenUsage(usages: TokenUsage[]): TokenUsage;
1280
+ /**
1281
+ * Normalise a model-returned VTT string for robustness against
1282
+ * provider wrapping quirks.
1283
+ *
1284
+ * We have observed Anthropic (and occasionally other providers) wrap
1285
+ * their translated VTT output in code fences or HTML tags, lower-case
1286
+ * the `WEBVTT` header, or drop the header entirely. The Mux Video
1287
+ * track ingestion API and web-native VTT players both require the
1288
+ * exact uppercase `WEBVTT` header at the start of the file, so leaving
1289
+ * these quirks in place produces downstream breakage even though the
1290
+ * cue content is correct.
1291
+ *
1292
+ * Transformations (idempotent on already-valid VTT):
1293
+ *
1294
+ * - Strip a surrounding markdown fence with an optional language hint:
1295
+ * "```vtt\\nWEBVTT\\n...\\n```" -> "WEBVTT\\n..."
1296
+ * "```webvtt\\n...\\n```" -> "WEBVTT\\n..."
1297
+ * "```\\nWEBVTT\\n...\\n```" -> "WEBVTT\\n..."
1298
+ *
1299
+ * - Strip a surrounding <code> / <pre> wrapper (Anthropic's common
1300
+ * habit on this task):
1301
+ * "<code>webvtt\\n...\\n</code>" -> "webvtt\\n..." (then normalised)
1302
+ *
1303
+ * - Upper-case a lowercase `webvtt` / `Webvtt` header prefix.
1304
+ *
1305
+ * - Prepend `WEBVTT\\n\\n` if the header is missing entirely (model
1306
+ * jumped straight to the first cue block).
1307
+ *
1308
+ * Only the whole-VTT translation path calls this — the cue-chunked
1309
+ * path rebuilds the VTT locally via `buildVttFromTranslatedCueBlocks`,
1310
+ * so the header comes from our code and needs no fix-up.
1311
+ */
1312
+ declare function normalizeTranslatedVtt(translation: string): string;
1042
1313
  declare function translateCaptions<P extends SupportedProvider = SupportedProvider>(assetId: string, trackId: string, toLanguageCode: string, options: TranslationOptions<P>): Promise<TranslationResult>;
1043
1314
 
1044
1315
  type index_AskQuestionsOptions = AskQuestionsOptions;
@@ -1114,6 +1385,7 @@ declare const index_getModerationScores: typeof getModerationScores;
1114
1385
  declare const index_getSummaryAndTags: typeof getSummaryAndTags;
1115
1386
  declare const index_hasBurnedInCaptions: typeof hasBurnedInCaptions;
1116
1387
  declare const index_mapShotsToHotspots: typeof mapShotsToHotspots;
1388
+ declare const index_normalizeTranslatedVtt: typeof normalizeTranslatedVtt;
1117
1389
  declare const index_profanityDetectionSchema: typeof profanityDetectionSchema;
1118
1390
  declare const index_questionAnswerSchema: typeof questionAnswerSchema;
1119
1391
  declare const index_shouldSplitChunkTranslationError: typeof shouldSplitChunkTranslationError;
@@ -1123,7 +1395,7 @@ declare const index_translateAudio: typeof translateAudio;
1123
1395
  declare const index_translateCaptions: typeof translateCaptions;
1124
1396
  declare const index_translationSchema: typeof translationSchema;
1125
1397
  declare namespace index {
1126
- export { type index_AskQuestionsOptions as AskQuestionsOptions, type index_AskQuestionsResult as AskQuestionsResult, type index_AskQuestionsType as AskQuestionsType, type index_AudioTranslationOptions as AudioTranslationOptions, type index_AudioTranslationResult as AudioTranslationResult, type index_AutoCensorProfanityOptions as AutoCensorProfanityOptions, type index_BurnedInCaptionsAnalysis as BurnedInCaptionsAnalysis, type index_BurnedInCaptionsOptions as BurnedInCaptionsOptions, type index_BurnedInCaptionsPromptOverrides as BurnedInCaptionsPromptOverrides, type index_BurnedInCaptionsPromptSections as BurnedInCaptionsPromptSections, type index_BurnedInCaptionsResult as BurnedInCaptionsResult, type index_CaptionReplacement as CaptionReplacement, type index_CensorMode as CensorMode, type index_Chapter as Chapter, type index_ChapterSystemPromptSections as ChapterSystemPromptSections, type index_ChaptersOptions as ChaptersOptions, type index_ChaptersPromptOverrides as ChaptersPromptOverrides, type index_ChaptersPromptSections as ChaptersPromptSections, type index_ChaptersResult as ChaptersResult, type index_ChaptersType as ChaptersType, index_DEFAULT_DESCRIPTION_LENGTH as DEFAULT_DESCRIPTION_LENGTH, index_DEFAULT_SUMMARY_KEYWORD_LIMIT as DEFAULT_SUMMARY_KEYWORD_LIMIT, index_DEFAULT_TITLE_LENGTH as DEFAULT_TITLE_LENGTH, type index_EditCaptionsOptions as EditCaptionsOptions, type index_EditCaptionsResult as EditCaptionsResult, type index_EmbeddingsOptions as EmbeddingsOptions, type index_EmbeddingsResult as EmbeddingsResult, type index_EngagementInsightsOptions as EngagementInsightsOptions, type index_EngagementInsightsResult as EngagementInsightsResult, index_HIVE_SEXUAL_CATEGORIES as HIVE_SEXUAL_CATEGORIES, index_HIVE_VIOLENCE_CATEGORIES as HIVE_VIOLENCE_CATEGORIES, type index_HiveModerationOutput as HiveModerationOutput, type index_HiveModerationSource as HiveModerationSource, type index_ModerationOptions as ModerationOptions, type index_ModerationProvider as ModerationProvider, type index_ModerationResult as ModerationResult, type index_MomentInsight as MomentInsight, type index_OverallInsight as OverallInsight, type index_ProfanityDetectionPayload as ProfanityDetectionPayload, type index_Question as Question, type index_QuestionAnswer as QuestionAnswer, type index_QuestionAnswerType as QuestionAnswerType, type index_ReplacementRecord as ReplacementRecord, type index_SummarizationOptions as SummarizationOptions, type index_SummarizationPromptOverrides as SummarizationPromptOverrides, type index_SummarizationPromptSections as SummarizationPromptSections, type index_SummaryAndTagsResult as SummaryAndTagsResult, type index_SummaryType as SummaryType, type index_ThumbnailModerationScore as ThumbnailModerationScore, type index_TranslationChunkingOptions as TranslationChunkingOptions, type index_TranslationOptions as TranslationOptions, type index_TranslationPayload as TranslationPayload, type index_TranslationResult as TranslationResult, index_aggregateTokenUsage as aggregateTokenUsage, index_applyOverrideLists as applyOverrideLists, index_applyReplacements as applyReplacements, index_askQuestions as askQuestions, index_buildReplacementRegex as buildReplacementRegex, index_burnedInCaptionsSchema as burnedInCaptionsSchema, index_censorVttContent as censorVttContent, index_chapterSchema as chapterSchema, index_chaptersSchema as chaptersSchema, index_createReplacer as createReplacer, index_editCaptions as editCaptions, index_extractTranscriptSegmentsForHotspots as extractTranscriptSegmentsForHotspots, index_generateChapters as generateChapters, index_generateEmbeddings as generateEmbeddings, index_generateEngagementInsights as generateEngagementInsights, index_generateVideoEmbeddings as generateVideoEmbeddings, index_getModerationScores as getModerationScores, index_getSummaryAndTags as getSummaryAndTags, index_hasBurnedInCaptions as hasBurnedInCaptions, index_mapShotsToHotspots as mapShotsToHotspots, index_profanityDetectionSchema as profanityDetectionSchema, index_questionAnswerSchema as questionAnswerSchema, index_shouldSplitChunkTranslationError as shouldSplitChunkTranslationError, index_summarySchema as summarySchema, index_transformCueText as transformCueText, index_translateAudio as translateAudio, index_translateCaptions as translateCaptions, index_translationSchema as translationSchema };
1398
+ export { type index_AskQuestionsOptions as AskQuestionsOptions, type index_AskQuestionsResult as AskQuestionsResult, type index_AskQuestionsType as AskQuestionsType, type index_AudioTranslationOptions as AudioTranslationOptions, type index_AudioTranslationResult as AudioTranslationResult, type index_AutoCensorProfanityOptions as AutoCensorProfanityOptions, type index_BurnedInCaptionsAnalysis as BurnedInCaptionsAnalysis, type index_BurnedInCaptionsOptions as BurnedInCaptionsOptions, type index_BurnedInCaptionsPromptOverrides as BurnedInCaptionsPromptOverrides, type index_BurnedInCaptionsPromptSections as BurnedInCaptionsPromptSections, type index_BurnedInCaptionsResult as BurnedInCaptionsResult, type index_CaptionReplacement as CaptionReplacement, type index_CensorMode as CensorMode, type index_Chapter as Chapter, type index_ChapterSystemPromptSections as ChapterSystemPromptSections, type index_ChaptersOptions as ChaptersOptions, type index_ChaptersPromptOverrides as ChaptersPromptOverrides, type index_ChaptersPromptSections as ChaptersPromptSections, type index_ChaptersResult as ChaptersResult, type index_ChaptersType as ChaptersType, index_DEFAULT_DESCRIPTION_LENGTH as DEFAULT_DESCRIPTION_LENGTH, index_DEFAULT_SUMMARY_KEYWORD_LIMIT as DEFAULT_SUMMARY_KEYWORD_LIMIT, index_DEFAULT_TITLE_LENGTH as DEFAULT_TITLE_LENGTH, type index_EditCaptionsOptions as EditCaptionsOptions, type index_EditCaptionsResult as EditCaptionsResult, type index_EmbeddingsOptions as EmbeddingsOptions, type index_EmbeddingsResult as EmbeddingsResult, type index_EngagementInsightsOptions as EngagementInsightsOptions, type index_EngagementInsightsResult as EngagementInsightsResult, index_HIVE_SEXUAL_CATEGORIES as HIVE_SEXUAL_CATEGORIES, index_HIVE_VIOLENCE_CATEGORIES as HIVE_VIOLENCE_CATEGORIES, type index_HiveModerationOutput as HiveModerationOutput, type index_HiveModerationSource as HiveModerationSource, type index_ModerationOptions as ModerationOptions, type index_ModerationProvider as ModerationProvider, type index_ModerationResult as ModerationResult, type index_MomentInsight as MomentInsight, type index_OverallInsight as OverallInsight, type index_ProfanityDetectionPayload as ProfanityDetectionPayload, type index_Question as Question, type index_QuestionAnswer as QuestionAnswer, type index_QuestionAnswerType as QuestionAnswerType, type index_ReplacementRecord as ReplacementRecord, type index_SummarizationOptions as SummarizationOptions, type index_SummarizationPromptOverrides as SummarizationPromptOverrides, type index_SummarizationPromptSections as SummarizationPromptSections, type index_SummaryAndTagsResult as SummaryAndTagsResult, type index_SummaryType as SummaryType, type index_ThumbnailModerationScore as ThumbnailModerationScore, type index_TranslationChunkingOptions as TranslationChunkingOptions, type index_TranslationOptions as TranslationOptions, type index_TranslationPayload as TranslationPayload, type index_TranslationResult as TranslationResult, index_aggregateTokenUsage as aggregateTokenUsage, index_applyOverrideLists as applyOverrideLists, index_applyReplacements as applyReplacements, index_askQuestions as askQuestions, index_buildReplacementRegex as buildReplacementRegex, index_burnedInCaptionsSchema as burnedInCaptionsSchema, index_censorVttContent as censorVttContent, index_chapterSchema as chapterSchema, index_chaptersSchema as chaptersSchema, index_createReplacer as createReplacer, index_editCaptions as editCaptions, index_extractTranscriptSegmentsForHotspots as extractTranscriptSegmentsForHotspots, index_generateChapters as generateChapters, index_generateEmbeddings as generateEmbeddings, index_generateEngagementInsights as generateEngagementInsights, index_generateVideoEmbeddings as generateVideoEmbeddings, index_getModerationScores as getModerationScores, index_getSummaryAndTags as getSummaryAndTags, index_hasBurnedInCaptions as hasBurnedInCaptions, index_mapShotsToHotspots as mapShotsToHotspots, index_normalizeTranslatedVtt as normalizeTranslatedVtt, index_profanityDetectionSchema as profanityDetectionSchema, index_questionAnswerSchema as questionAnswerSchema, index_shouldSplitChunkTranslationError as shouldSplitChunkTranslationError, index_summarySchema as summarySchema, index_transformCueText as transformCueText, index_translateAudio as translateAudio, index_translateCaptions as translateCaptions, index_translationSchema as translationSchema };
1127
1399
  }
1128
1400
 
1129
- export { type TranslationResult as $, type AskQuestionsOptions as A, type BurnedInCaptionsAnalysis as B, type CaptionReplacement as C, DEFAULT_DESCRIPTION_LENGTH as D, type EditCaptionsOptions as E, type HiveModerationOutput as F, type HiveModerationSource as G, HIVE_SEXUAL_CATEGORIES as H, type ModerationProvider as I, type ModerationResult as J, type MomentInsight as K, type QuestionAnswer as L, type ModerationOptions as M, type QuestionAnswerType as N, type OverallInsight as O, type ProfanityDetectionPayload as P, type Question as Q, type ReplacementRecord as R, type SummarizationOptions as S, type SummarizationPromptOverrides as T, type SummarizationPromptSections as U, type SummaryAndTagsResult as V, type SummaryType as W, type ThumbnailModerationScore as X, type TranslationChunkingOptions as Y, type TranslationOptions as Z, type TranslationPayload as _, type AskQuestionsResult as a, aggregateTokenUsage as a0, applyOverrideLists as a1, applyReplacements as a2, askQuestions as a3, buildReplacementRegex as a4, burnedInCaptionsSchema as a5, censorVttContent as a6, chapterSchema as a7, chaptersSchema as a8, createReplacer as a9, editCaptions as aa, extractTranscriptSegmentsForHotspots as ab, generateChapters as ac, generateEmbeddings as ad, generateEngagementInsights as ae, generateVideoEmbeddings as af, getModerationScores as ag, getSummaryAndTags as ah, hasBurnedInCaptions as ai, mapShotsToHotspots as aj, profanityDetectionSchema as ak, questionAnswerSchema as al, shouldSplitChunkTranslationError as am, summarySchema as an, transformCueText as ao, translateAudio as ap, translateCaptions as aq, translationSchema as ar, type AskQuestionsType as b, type AudioTranslationOptions as c, type AudioTranslationResult as d, type AutoCensorProfanityOptions as e, type BurnedInCaptionsOptions as f, type BurnedInCaptionsPromptOverrides as g, type BurnedInCaptionsPromptSections as h, index as i, type BurnedInCaptionsResult as j, type CensorMode as k, type Chapter as l, type ChapterSystemPromptSections as m, type ChaptersOptions as n, type ChaptersPromptOverrides as o, type ChaptersPromptSections as p, type ChaptersResult as q, type ChaptersType as r, DEFAULT_SUMMARY_KEYWORD_LIMIT as s, DEFAULT_TITLE_LENGTH as t, type EditCaptionsResult as u, type EmbeddingsOptions as v, type EmbeddingsResult as w, type EngagementInsightsOptions as x, type EngagementInsightsResult as y, HIVE_VIOLENCE_CATEGORIES as z };
1401
+ export { type TranslationResult as $, type AskQuestionsOptions as A, type BurnedInCaptionsAnalysis as B, type CaptionReplacement as C, DEFAULT_DESCRIPTION_LENGTH as D, type EditCaptionsOptions as E, type HiveModerationOutput as F, type HiveModerationSource as G, HIVE_SEXUAL_CATEGORIES as H, type ModerationProvider as I, type ModerationResult as J, type MomentInsight as K, type QuestionAnswer as L, type ModerationOptions as M, type QuestionAnswerType as N, type OverallInsight as O, type ProfanityDetectionPayload as P, type Question as Q, type ReplacementRecord as R, type SummarizationOptions as S, type SummarizationPromptOverrides as T, type SummarizationPromptSections as U, type SummaryAndTagsResult as V, type SummaryType as W, type ThumbnailModerationScore as X, type TranslationChunkingOptions as Y, type TranslationOptions as Z, type TranslationPayload as _, type AskQuestionsResult as a, aggregateTokenUsage as a0, applyOverrideLists as a1, applyReplacements as a2, askQuestions as a3, buildReplacementRegex as a4, burnedInCaptionsSchema as a5, censorVttContent as a6, chapterSchema as a7, chaptersSchema as a8, createReplacer as a9, editCaptions as aa, extractTranscriptSegmentsForHotspots as ab, generateChapters as ac, generateEmbeddings as ad, generateEngagementInsights as ae, generateVideoEmbeddings as af, getModerationScores as ag, getSummaryAndTags as ah, hasBurnedInCaptions as ai, mapShotsToHotspots as aj, normalizeTranslatedVtt as ak, profanityDetectionSchema as al, questionAnswerSchema as am, shouldSplitChunkTranslationError as an, summarySchema as ao, transformCueText as ap, translateAudio as aq, translateCaptions as ar, translationSchema as as, type AskQuestionsType as b, type AudioTranslationOptions as c, type AudioTranslationResult as d, type AutoCensorProfanityOptions as e, type BurnedInCaptionsOptions as f, type BurnedInCaptionsPromptOverrides as g, type BurnedInCaptionsPromptSections as h, index as i, type BurnedInCaptionsResult as j, type CensorMode as k, type Chapter as l, type ChapterSystemPromptSections as m, type ChaptersOptions as n, type ChaptersPromptOverrides as o, type ChaptersPromptSections as p, type ChaptersResult as q, type ChaptersType as r, DEFAULT_SUMMARY_KEYWORD_LIMIT as s, DEFAULT_TITLE_LENGTH as t, type EditCaptionsResult as u, type EmbeddingsOptions as v, type EmbeddingsResult as w, type EngagementInsightsOptions as x, type EngagementInsightsResult as y, HIVE_VIOLENCE_CATEGORIES as z };
@@ -106,6 +106,76 @@ declare const LOW_CONFIDENCE_THRESHOLD = 0.5;
106
106
  * @param confidenceThreshold - Minimum confidence to trust auto-detected language (default: {@link LOW_CONFIDENCE_THRESHOLD})
107
107
  */
108
108
  declare function getReliableLanguageCode(track: AssetTextTrack | undefined, confidenceThreshold?: number): string | undefined;
109
+ /**
110
+ * Sanitise untrusted text (typically a VTT cue or joined transcript)
111
+ * before it is interpolated into a prompt. Thin wrapper around the
112
+ * shared {@link normalizeUntrustedUnicode} helper, with a null/empty
113
+ * guard for convenience.
114
+ */
115
+ declare function sanitizeUntrustedText(value: string): string;
116
+ /**
117
+ * Upper bound on individual cue text length before we consider the cue
118
+ * adversarial and truncate it.
119
+ *
120
+ * Legitimate captions are short — a long monologue cue rarely exceeds
121
+ * 500 characters, and most captioning standards recommend well under
122
+ * that for readability. We set the cap at 2000 to give comfortable
123
+ * headroom for edge cases (stage directions, speaker identification,
124
+ * multi-line blocks) while making "hide a multi-kilobyte injection
125
+ * payload inside a single cue" mechanically infeasible.
126
+ */
127
+ declare const MAX_CUE_TEXT_CHARS = 2000;
128
+ /**
129
+ * Strip VTT metadata blocks that are never rendered by players but can
130
+ * still carry text through to an LLM when the raw VTT is used in a prompt:
131
+ *
132
+ * - NOTE blocks (VTT comments)
133
+ * - STYLE blocks (CSS for cue styling)
134
+ * - REGION blocks (positioning definitions)
135
+ *
136
+ * Viewers never see the contents of these blocks. That makes them an
137
+ * ideal hiding spot for prompt-injection payloads — an attacker-controlled
138
+ * caption file can carry hundreds of bytes of "NOTE ignore previous
139
+ * instructions…" that will be stripped from any player but will reach the
140
+ * model if the raw VTT is passed through. Removing them before sending
141
+ * the VTT to the model closes that channel without changing what the
142
+ * model sees for legitimate cue content.
143
+ *
144
+ * Cue identifiers, timing lines, and cue payload text are preserved.
145
+ * In particular: a cue whose first payload line happens to start with
146
+ * `NOTE `/`STYLE `/`REGION ` (plausible in legitimate captions — e.g.
147
+ * `"NOTE THAT..."`, `"STYLE GUIDE"`, `"NOTE how the villain plots..."`)
148
+ * is NOT treated as a metadata block. The scanner tracks cue-payload
149
+ * state: metadata headers are only recognised between cues (i.e. when
150
+ * the previous non-blank line was not a timing line).
151
+ *
152
+ * Example input:
153
+ *
154
+ * WEBVTT
155
+ *
156
+ * NOTE This is a comment with hidden instructions
157
+ * that span multiple lines until a blank line appears.
158
+ *
159
+ * STYLE
160
+ * ::cue(b) { font-weight: bold; }
161
+ *
162
+ * 00:00:01.000 --> 00:00:04.000
163
+ * Legitimate caption text
164
+ *
165
+ * 00:00:05.000 --> 00:00:08.000
166
+ * NOTE THAT the hero wins
167
+ *
168
+ * Returns:
169
+ *
170
+ * WEBVTT
171
+ *
172
+ * 00:00:01.000 --> 00:00:04.000
173
+ * Legitimate caption text
174
+ *
175
+ * 00:00:05.000 --> 00:00:08.000
176
+ * NOTE THAT the hero wins
177
+ */
178
+ declare function stripVttMetadataBlocks(vttContent: string): string;
109
179
  declare function extractTextFromVTT(vttContent: string): string;
110
180
  declare function vttTimestampToSeconds(timestamp: string): number;
111
181
  /**
@@ -247,6 +317,7 @@ declare const index_Hotspot: typeof Hotspot;
247
317
  declare const index_HotspotOptions: typeof HotspotOptions;
248
318
  declare const index_HotspotResponse: typeof HotspotResponse;
249
319
  declare const index_LOW_CONFIDENCE_THRESHOLD: typeof LOW_CONFIDENCE_THRESHOLD;
320
+ declare const index_MAX_CUE_TEXT_CHARS: typeof MAX_CUE_TEXT_CHARS;
250
321
  declare const index_PendingShotsResult: typeof PendingShotsResult;
251
322
  declare const index_Shot: typeof Shot;
252
323
  declare const index_ShotRequestOptions: typeof ShotRequestOptions;
@@ -287,12 +358,14 @@ declare const index_getThumbnailUrls: typeof getThumbnailUrls;
287
358
  declare const index_parseVTTCues: typeof parseVTTCues;
288
359
  declare const index_replaceCueText: typeof replaceCueText;
289
360
  declare const index_requestShotsForAsset: typeof requestShotsForAsset;
361
+ declare const index_sanitizeUntrustedText: typeof sanitizeUntrustedText;
290
362
  declare const index_secondsToTimestamp: typeof secondsToTimestamp;
291
363
  declare const index_splitVttPreambleAndCueBlocks: typeof splitVttPreambleAndCueBlocks;
364
+ declare const index_stripVttMetadataBlocks: typeof stripVttMetadataBlocks;
292
365
  declare const index_vttTimestampToSeconds: typeof vttTimestampToSeconds;
293
366
  declare const index_waitForShotsForAsset: typeof waitForShotsForAsset;
294
367
  declare namespace index {
295
- export { index_CompletedShotsResult as CompletedShotsResult, index_DEFAULT_STORYBOARD_WIDTH as DEFAULT_STORYBOARD_WIDTH, index_ErroredShotsResult as ErroredShotsResult, type index_HeatmapOptions as HeatmapOptions, type index_HeatmapResponse as HeatmapResponse, index_Hotspot as Hotspot, index_HotspotOptions as HotspotOptions, index_HotspotResponse as HotspotResponse, index_LOW_CONFIDENCE_THRESHOLD as LOW_CONFIDENCE_THRESHOLD, index_PendingShotsResult as PendingShotsResult, index_Shot as Shot, index_ShotRequestOptions as ShotRequestOptions, index_ShotsResult as ShotsResult, type index_ThumbnailOptions as ThumbnailOptions, type index_TranscriptFetchOptions as TranscriptFetchOptions, type index_TranscriptResult as TranscriptResult, type index_VTTCue as VTTCue, type index_VTTCueBudgetChunkingOptions as VTTCueBudgetChunkingOptions, type index_VTTDurationChunk as VTTDurationChunk, type index_VTTDurationChunkingOptions as VTTDurationChunkingOptions, index_WaitForShotsOptions as WaitForShotsOptions, index_buildTranscriptUrl as buildTranscriptUrl, index_buildVttFromCueBlocks as buildVttFromCueBlocks, index_buildVttFromTranslatedCueBlocks as buildVttFromTranslatedCueBlocks, index_chunkByTokens as chunkByTokens, index_chunkText as chunkText, index_chunkVTTCues as chunkVTTCues, index_chunkVTTCuesByBudget as chunkVTTCuesByBudget, index_chunkVTTCuesByDuration as chunkVTTCuesByDuration, index_concatenateVttSegments as concatenateVttSegments, index_estimateTokenCount as estimateTokenCount, index_extractTextFromVTT as extractTextFromVTT, index_extractTimestampedTranscript as extractTimestampedTranscript, index_fetchTranscriptForAsset as fetchTranscriptForAsset, index_findCaptionTrack as findCaptionTrack, index_getHeatmapForAsset as getHeatmapForAsset, index_getHeatmapForPlaybackId as getHeatmapForPlaybackId, index_getHeatmapForVideo as getHeatmapForVideo, index_getHotspotsForAsset as getHotspotsForAsset, index_getHotspotsForPlaybackId as getHotspotsForPlaybackId, index_getHotspotsForVideo as getHotspotsForVideo, index_getReadyTextTracks as getReadyTextTracks, index_getReliableLanguageCode as getReliableLanguageCode, index_getShotsForAsset as getShotsForAsset, index_getStoryboardUrl as getStoryboardUrl, index_getThumbnailUrls as getThumbnailUrls, index_parseVTTCues as parseVTTCues, index_replaceCueText as replaceCueText, index_requestShotsForAsset as requestShotsForAsset, index_secondsToTimestamp as secondsToTimestamp, index_splitVttPreambleAndCueBlocks as splitVttPreambleAndCueBlocks, index_vttTimestampToSeconds as vttTimestampToSeconds, index_waitForShotsForAsset as waitForShotsForAsset };
368
+ export { index_CompletedShotsResult as CompletedShotsResult, index_DEFAULT_STORYBOARD_WIDTH as DEFAULT_STORYBOARD_WIDTH, index_ErroredShotsResult as ErroredShotsResult, type index_HeatmapOptions as HeatmapOptions, type index_HeatmapResponse as HeatmapResponse, index_Hotspot as Hotspot, index_HotspotOptions as HotspotOptions, index_HotspotResponse as HotspotResponse, index_LOW_CONFIDENCE_THRESHOLD as LOW_CONFIDENCE_THRESHOLD, index_MAX_CUE_TEXT_CHARS as MAX_CUE_TEXT_CHARS, index_PendingShotsResult as PendingShotsResult, index_Shot as Shot, index_ShotRequestOptions as ShotRequestOptions, index_ShotsResult as ShotsResult, type index_ThumbnailOptions as ThumbnailOptions, type index_TranscriptFetchOptions as TranscriptFetchOptions, type index_TranscriptResult as TranscriptResult, type index_VTTCue as VTTCue, type index_VTTCueBudgetChunkingOptions as VTTCueBudgetChunkingOptions, type index_VTTDurationChunk as VTTDurationChunk, type index_VTTDurationChunkingOptions as VTTDurationChunkingOptions, index_WaitForShotsOptions as WaitForShotsOptions, index_buildTranscriptUrl as buildTranscriptUrl, index_buildVttFromCueBlocks as buildVttFromCueBlocks, index_buildVttFromTranslatedCueBlocks as buildVttFromTranslatedCueBlocks, index_chunkByTokens as chunkByTokens, index_chunkText as chunkText, index_chunkVTTCues as chunkVTTCues, index_chunkVTTCuesByBudget as chunkVTTCuesByBudget, index_chunkVTTCuesByDuration as chunkVTTCuesByDuration, index_concatenateVttSegments as concatenateVttSegments, index_estimateTokenCount as estimateTokenCount, index_extractTextFromVTT as extractTextFromVTT, index_extractTimestampedTranscript as extractTimestampedTranscript, index_fetchTranscriptForAsset as fetchTranscriptForAsset, index_findCaptionTrack as findCaptionTrack, index_getHeatmapForAsset as getHeatmapForAsset, index_getHeatmapForPlaybackId as getHeatmapForPlaybackId, index_getHeatmapForVideo as getHeatmapForVideo, index_getHotspotsForAsset as getHotspotsForAsset, index_getHotspotsForPlaybackId as getHotspotsForPlaybackId, index_getHotspotsForVideo as getHotspotsForVideo, index_getReadyTextTracks as getReadyTextTracks, index_getReliableLanguageCode as getReliableLanguageCode, index_getShotsForAsset as getShotsForAsset, index_getStoryboardUrl as getStoryboardUrl, index_getThumbnailUrls as getThumbnailUrls, index_parseVTTCues as parseVTTCues, index_replaceCueText as replaceCueText, index_requestShotsForAsset as requestShotsForAsset, index_sanitizeUntrustedText as sanitizeUntrustedText, index_secondsToTimestamp as secondsToTimestamp, index_splitVttPreambleAndCueBlocks as splitVttPreambleAndCueBlocks, index_stripVttMetadataBlocks as stripVttMetadataBlocks, index_vttTimestampToSeconds as vttTimestampToSeconds, index_waitForShotsForAsset as waitForShotsForAsset };
296
369
  }
297
370
 
298
- export { getStoryboardUrl as A, getThumbnailUrls as B, parseVTTCues as C, DEFAULT_STORYBOARD_WIDTH as D, replaceCueText as E, secondsToTimestamp as F, splitVttPreambleAndCueBlocks as G, type HeatmapOptions as H, vttTimestampToSeconds as I, LOW_CONFIDENCE_THRESHOLD as L, type ThumbnailOptions as T, type VTTCue as V, type HeatmapResponse as a, type TranscriptFetchOptions as b, type TranscriptResult as c, type VTTCueBudgetChunkingOptions as d, type VTTDurationChunk as e, type VTTDurationChunkingOptions as f, buildTranscriptUrl as g, buildVttFromCueBlocks as h, index as i, buildVttFromTranslatedCueBlocks as j, chunkByTokens as k, chunkText as l, chunkVTTCues as m, chunkVTTCuesByBudget as n, chunkVTTCuesByDuration as o, concatenateVttSegments as p, estimateTokenCount as q, extractTextFromVTT as r, extractTimestampedTranscript as s, fetchTranscriptForAsset as t, findCaptionTrack as u, getHeatmapForAsset as v, getHeatmapForPlaybackId as w, getHeatmapForVideo as x, getReadyTextTracks as y, getReliableLanguageCode as z };
371
+ export { getStoryboardUrl as A, getThumbnailUrls as B, parseVTTCues as C, DEFAULT_STORYBOARD_WIDTH as D, replaceCueText as E, sanitizeUntrustedText as F, secondsToTimestamp as G, type HeatmapOptions as H, splitVttPreambleAndCueBlocks as I, stripVttMetadataBlocks as J, vttTimestampToSeconds as K, LOW_CONFIDENCE_THRESHOLD as L, MAX_CUE_TEXT_CHARS as M, type ThumbnailOptions as T, type VTTCue as V, type HeatmapResponse as a, type TranscriptFetchOptions as b, type TranscriptResult as c, type VTTCueBudgetChunkingOptions as d, type VTTDurationChunk as e, type VTTDurationChunkingOptions as f, buildTranscriptUrl as g, buildVttFromCueBlocks as h, index as i, buildVttFromTranslatedCueBlocks as j, chunkByTokens as k, chunkText as l, chunkVTTCues as m, chunkVTTCuesByBudget as n, chunkVTTCuesByDuration as o, concatenateVttSegments as p, estimateTokenCount as q, extractTextFromVTT as r, extractTimestampedTranscript as s, fetchTranscriptForAsset as t, findCaptionTrack as u, getHeatmapForAsset as v, getHeatmapForPlaybackId as w, getHeatmapForVideo as x, getReadyTextTracks as y, getReliableLanguageCode as z };
package/dist/index.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  import { W as WorkflowCredentials, S as StoragePutObjectInput, a as StoragePresignGetObjectInput } from './shots-BFYOfBgN.js';
2
2
  export { A as AssetTextTrack, C as ChunkEmbedding, b as ChunkingStrategy, E as Encrypted, c as EncryptedPayload, I as ImageSubmissionMode, M as MuxAIOptions, d as MuxAsset, P as PlaybackAsset, e as PlaybackPolicy, f as StorageAdapter, T as TextChunk, g as TokenChunkingConfig, h as TokenUsage, i as ToneType, U as UsageMetadata, V as VTTChunkingConfig, j as VideoEmbeddingsResult, k as WorkflowCredentialsInput, l as WorkflowMuxClient, m as decryptFromWorkflow, n as encryptForWorkflow } from './shots-BFYOfBgN.js';
3
3
  import { WORKFLOW_SERIALIZE, WORKFLOW_DESERIALIZE } from '@workflow/serde';
4
- export { i as primitives } from './index-3G00N5QH.js';
5
- export { i as workflows } from './index-BfsJvx3r.js';
4
+ export { i as primitives } from './index-Drj9Cy_k.js';
5
+ export { i as workflows } from './index-CwzNfBjV.js';
6
6
  import '@mux/mux-node';
7
7
  import 'zod';
8
8
  import '@ai-sdk/anthropic';
9
9
  import '@ai-sdk/google';
10
10
  import '@ai-sdk/openai';
11
11
 
12
- var version = "0.17.1";
12
+ var version = "0.19.0";
13
13
 
14
14
  type MuxAiErrorType = "validation_error" | "processing_error" | "timeout_error";
15
15
  /**
@@ -45,6 +45,25 @@ declare class MuxAiError extends Error {
45
45
  *
46
46
  * Use this in catch blocks that re-throw so a customer-safe error from a
47
47
  * callee isn't accidentally converted into an internal error.
48
+ *
49
+ * The upstream `detail` is scrubbed for **high-confidence** signs of a
50
+ * system-prompt leak before being folded into the thrown message.
51
+ * Rationale: the AI SDK and some providers include the offending model
52
+ * output in their error messages (e.g. "Failed to parse structured
53
+ * output: { reasoning: '<role>…' }"). If an injection payload caused
54
+ * the parse failure, the raw output would otherwise bypass the
55
+ * free-text scrubber and reach the caller through the error channel.
56
+ *
57
+ * Only the `canary` and `prompt_tag` detectors trigger suppression
58
+ * here — they have very low false-positive rates. The `encoded_blob`
59
+ * heuristic is intentionally NOT applied to error messages: legitimate
60
+ * upstream errors from infrastructure (S3 errors containing ETags,
61
+ * git errors containing SHAs, AWS request IDs, content hashes) can
62
+ * match the encoded-blob shape without being a prompt leak. Suppressing
63
+ * those would erase useful debugging information with no security
64
+ * benefit, because an attacker exfiltrating through a shaped blob would
65
+ * trigger the much stronger field-level scrubber on the preceding
66
+ * model output.
48
67
  */
49
68
  declare function wrapError(error: unknown, message: string): never;
50
69