@aicopycoders/exodus 2026.9.2000-beta.1 → 2026.9.2000-beta.11

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.
@@ -1,6 +1,9 @@
1
1
  import { type ApiResponse } from "../lib/client.js";
2
2
  import type { FlagOccurrence } from "../lib/args.js";
3
3
  import { type RunProvenance, type WorkflowRun } from "./workflow.js";
4
+ declare const CONCEIT_KEYS: readonly ["podcast", "ugc", "stage", "street", "personification"];
5
+ declare const VOICE_MODES: readonly ["native", "voice-first"];
6
+ type VoiceMode = (typeof VOICE_MODES)[number];
4
7
  export declare const helpText: string;
5
8
  export declare const VOICES_PATH = "/api/v2/video/voices";
6
9
  export interface ClipWord {
@@ -8,10 +11,31 @@ export interface ClipWord {
8
11
  s: number;
9
12
  e: number;
10
13
  }
14
+ export type ClipQcTakeNeighbours = {
15
+ state: "not-applicable";
16
+ } | {
17
+ state: "not-attached";
18
+ } | {
19
+ state: "none-accepted";
20
+ } | {
21
+ state: "attached";
22
+ scenes: number[];
23
+ };
24
+ export interface ClipQcTake {
25
+ kind: "take" | "soft-retry";
26
+ failCodes: string[];
27
+ warnCodes: string[];
28
+ neighbours: ClipQcTakeNeighbours;
29
+ judgeWording?: {
30
+ code: string;
31
+ wording: string;
32
+ }[];
33
+ }
11
34
  export interface ClipQc {
12
35
  verdict: "pass" | "fail";
13
36
  attempts: number;
14
37
  neighbours?: number[];
38
+ takes?: ClipQcTake[];
15
39
  }
16
40
  export interface ClipFinding {
17
41
  check: string;
@@ -21,6 +45,9 @@ export interface ClipFinding {
21
45
  judgeDetail?: string;
22
46
  judgeSeverity?: "fail" | "warn";
23
47
  }
48
+ export declare function qcWithoutJudgeWording(qc: ClipQc): ClipQc;
49
+ export declare const NO_TAKE_HISTORY_LINE = "no history recorded for this clip";
50
+ export declare function renderQcTakeHistory(takes: ClipQcTake[] | undefined): string[];
24
51
  export type ArtifactSubset = {
25
52
  type: "storyboard";
26
53
  storyboard?: unknown;
@@ -47,6 +74,7 @@ export type ArtifactSubset = {
47
74
  speechTrimmed?: boolean;
48
75
  tailTrimmed?: boolean;
49
76
  rawStorageId?: string;
77
+ voiceMode?: "voice-first";
50
78
  } | {
51
79
  type: "audio";
52
80
  sceneIndex?: number;
@@ -69,12 +97,23 @@ export type ArtifactSubset = {
69
97
  } | {
70
98
  type: "text" | "primer" | "session" | "document";
71
99
  };
100
+ export interface PlanFailureRecord {
101
+ kind: string;
102
+ partsTotal?: number;
103
+ acceptedParts?: number;
104
+ acceptedScenes?: number;
105
+ failedPart?: number;
106
+ reasons?: string[];
107
+ lines: string[];
108
+ }
72
109
  export interface VideoRunNode {
73
110
  nodeId: string;
74
111
  kind: string;
75
- status: "idle" | "running" | "done" | "failed" | "skipped";
112
+ status: "idle" | "running" | "done" | "failed" | "skipped" | "out-of-scope";
76
113
  error?: string;
77
114
  warning?: string;
115
+ planFailure?: PlanFailureRecord;
116
+ hasRejectedDraft?: boolean;
78
117
  outputs?: ArtifactSubset[];
79
118
  }
80
119
  export type BuilderPauseReason = "taste" | "repair" | "slots" | "call" | "checkpoint";
@@ -103,6 +142,8 @@ export interface VideoRun {
103
142
  pauseAhead?: WorkflowRun["pauseAhead"];
104
143
  castLock?: PullCastLock | null;
105
144
  provenance?: RunProvenance;
145
+ musicBed?: boolean;
146
+ videoChoice?: RunVideoChoice;
106
147
  workflowId?: string;
107
148
  moduleOwned?: boolean;
108
149
  }
@@ -117,6 +158,15 @@ export interface NodeItem {
117
158
  flagged?: boolean;
118
159
  findings?: ClipFinding[];
119
160
  staleClaim?: boolean;
161
+ lastRedo?: {
162
+ take: number;
163
+ outcome: string;
164
+ label: string;
165
+ displacedHistory?: {
166
+ title: string;
167
+ lines: string[];
168
+ };
169
+ };
120
170
  artifact?: ArtifactSubset;
121
171
  }
122
172
  export interface ShowRow {
@@ -168,6 +218,7 @@ export type RunStop = {
168
218
  at: "storyboard-gate";
169
219
  nodeId?: string;
170
220
  framesNodeId?: string;
221
+ showAd?: true;
171
222
  } | {
172
223
  at: "final-watch";
173
224
  } | {
@@ -184,11 +235,24 @@ export type RunStop = {
184
235
  at: "finished";
185
236
  status: string;
186
237
  };
238
+ export type ResolvedStop = Exclude<RunStop, {
239
+ at: "final-watch";
240
+ }> | {
241
+ at: "final-watch";
242
+ cutAttached: boolean | null;
243
+ };
187
244
  export declare function classifyRun(run: VideoRun): RunStop;
245
+ export declare function hasAttachedCut(items: NodeItem[]): boolean;
246
+ export declare function resolveStop(stop: RunStop, cutAttached: boolean | null): ResolvedStop;
247
+ export declare function resolveStopAtPark(stop: RunStop, runId: string, deps: Pick<VideoDeps, "get">): Promise<ResolvedStop>;
188
248
  export declare function stageWord(stage: string): string;
189
249
  export declare function stepName(kind: string | undefined): string;
250
+ export declare function isShowAd(run: Pick<VideoRun, "moduleOwned">): boolean;
190
251
  export declare function reviewUrl(dashboardUrl: string, run: Pick<VideoRun, "_id" | "workflowId" | "moduleOwned">): string;
191
- export declare function stopLines(stop: RunStop, runId: string, runUrl: string): string[];
252
+ export declare function stopLines(stop: ResolvedStop, runId: string, runUrl: string): string[];
253
+ export declare function failedStoryboardNode(run: VideoRun): VideoRunNode | undefined;
254
+ export declare function errorEchoesReasons(error: string | undefined, record: PlanFailureRecord | undefined): boolean;
255
+ export declare function planFailureLines(node: VideoRunNode | undefined, runId: string): string[];
192
256
  export interface PullDownload {
193
257
  file: string;
194
258
  url: string;
@@ -210,6 +274,7 @@ export interface ManifestScene {
210
274
  revoiced: boolean | null;
211
275
  speechTrimmed: boolean | null;
212
276
  rawStorageId: string | null;
277
+ voiceMode: "voice-first" | null;
213
278
  clipStatus: string;
214
279
  error: string | null;
215
280
  flagged: boolean;
@@ -231,6 +296,14 @@ export interface ManifestCastRef {
231
296
  voiceLabel: string | null;
232
297
  voiceDescription: string | null;
233
298
  }
299
+ export type MusicBedState = "on" | "off" | "unknown";
300
+ export interface RunVideoChoice {
301
+ videoModel: string;
302
+ videoModelLabel: string;
303
+ voiceMode: string;
304
+ voiceModeLabel: string;
305
+ }
306
+ export declare const MUSIC_HEARD_CODE = "music-heard";
234
307
  export interface VideoManifest {
235
308
  runId: string;
236
309
  pulledAt: string;
@@ -238,6 +311,8 @@ export interface VideoManifest {
238
311
  storyboard: string | null;
239
312
  reference: string | null;
240
313
  music: string | null;
314
+ musicBed: MusicBedState;
315
+ musicHeardScenes: number[];
241
316
  cast: ManifestCastRef[];
242
317
  narration: {
243
318
  file: string;
@@ -246,8 +321,13 @@ export interface VideoManifest {
246
321
  scenes: ManifestScene[];
247
322
  failed: PullFailure[];
248
323
  provenance?: RunProvenance;
324
+ videoChoice?: {
325
+ videoModel: string;
326
+ voiceMode: string;
327
+ };
249
328
  }
250
- export declare const CAST_LEDGER_BASE = 910000;
329
+ export declare const CAST_LEDGER_BASE: number;
330
+ export declare function musicBedState(run: VideoRun): MusicBedState;
251
331
  export interface PullPlan {
252
332
  downloads: PullDownload[];
253
333
  texts: PullTextFile[];
@@ -270,7 +350,39 @@ export interface StartOptions {
270
350
  wait: boolean;
271
351
  json: boolean;
272
352
  }
353
+ export interface ScriptStartOptions {
354
+ scriptFile: string;
355
+ conceit: (typeof CONCEIT_KEYS)[number];
356
+ style: string;
357
+ direction?: string;
358
+ voicePath?: string;
359
+ videoModel?: string;
360
+ voiceMode?: VoiceMode;
361
+ music?: boolean;
362
+ wait: boolean;
363
+ json: boolean;
364
+ }
365
+ export type VideoStartPlan = {
366
+ kind: "usage";
367
+ line: string;
368
+ } | {
369
+ kind: "show";
370
+ opts: StartOptions;
371
+ } | {
372
+ kind: "script";
373
+ opts: ScriptStartOptions;
374
+ };
273
375
  export declare function startFlow(opts: StartOptions, deps: VideoDeps): Promise<FlowResult>;
376
+ export type MusicChoice = {
377
+ ok: true;
378
+ music: boolean | undefined;
379
+ } | {
380
+ ok: false;
381
+ line: string;
382
+ };
383
+ export declare function planMusicChoice(occurrences: FlagOccurrence[]): MusicChoice;
384
+ export declare function planVideoStart(flags: Record<string, string | boolean>, occurrences: FlagOccurrence[]): VideoStartPlan;
385
+ export declare function startScriptFlow(opts: ScriptStartOptions, deps: VideoDeps): Promise<FlowResult>;
274
386
  export declare function waitFlow(runId: string, opts: {
275
387
  json: boolean;
276
388
  url?: string;
@@ -278,8 +390,12 @@ export declare function waitFlow(runId: string, opts: {
278
390
  maxPolls?: number;
279
391
  }, deps: VideoDeps): Promise<FlowResult>;
280
392
  export declare function statusFlow(runId: string, json: boolean, deps: VideoDeps): Promise<FlowResult>;
393
+ export declare function rejectedDraftFlow(runId: string, json: boolean, deps: VideoDeps): Promise<FlowResult>;
281
394
  export declare function storyboardFlow(runId: string, json: boolean, deps: VideoDeps): Promise<FlowResult>;
282
- export declare function approveFlow(runId: string, json: boolean, deps: VideoDeps): Promise<FlowResult>;
395
+ export declare function approveFlow(runId: string, opts: {
396
+ json: boolean;
397
+ approveStaleCut: boolean;
398
+ }, deps: VideoDeps): Promise<FlowResult>;
283
399
  export declare function flagFlow(runId: string, note: string, json: boolean, deps: VideoDeps): Promise<FlowResult>;
284
400
  export declare function retryFrameFlow(runId: string, nodeId: string, sceneIndex: number, note: string | undefined, json: boolean, deps: VideoDeps): Promise<FlowResult>;
285
401
  export type ClipRedoPlan = {
@@ -297,7 +413,11 @@ export interface ClipRedoTarget {
297
413
  nodeId?: string;
298
414
  }
299
415
  export declare function planClipRedo(run: VideoRun, items: NodeItem[], target: ClipRedoTarget): ClipRedoPlan;
300
- export declare function retryClipFlow(runId: string, target: ClipRedoTarget, note: string | undefined, json: boolean, deps: VideoDeps): Promise<FlowResult>;
416
+ export interface ClipRedoOptions {
417
+ note?: string;
418
+ voiceFirst?: boolean;
419
+ }
420
+ export declare function retryClipFlow(runId: string, target: ClipRedoTarget, { note, voiceFirst }: ClipRedoOptions, json: boolean, deps: VideoDeps): Promise<FlowResult>;
301
421
  export declare const VOICE_PATHS_NEVER_HEARD: Set<string>;
302
422
  export declare function planClipRevoice(run: VideoRun, items: NodeItem[], target: ClipRedoTarget): ClipRedoPlan;
303
423
  export type RevoiceTarget = ClipRedoTarget | {
@@ -365,3 +485,4 @@ export declare function describeFetchFailure(err: unknown): string;
365
485
  export declare function uploadFlow(runId: string, filePath: string, durationFlag: string | undefined, json: boolean, deps: VideoDeps): Promise<FlowResult>;
366
486
  export declare function parsePositional(args?: string[]): string[];
367
487
  export declare function run(flags: Record<string, string | boolean>, occurrences: FlagOccurrence[]): Promise<void>;
488
+ export {};