@nodaro/sdk 2.32.0 → 2.33.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 (32) hide show
  1. package/dist/{chunk-FB3S2FON.cjs → chunk-56NJIP7P.cjs} +3 -3
  2. package/dist/{chunk-FB3S2FON.cjs.map → chunk-56NJIP7P.cjs.map} +1 -1
  3. package/dist/{chunk-I4A5VJRL.js → chunk-5A7J24LN.js} +68 -20
  4. package/dist/chunk-5A7J24LN.js.map +1 -0
  5. package/dist/{chunk-RAZN6C5R.cjs → chunk-6T54F65Q.cjs} +2 -2
  6. package/dist/{chunk-RAZN6C5R.cjs.map → chunk-6T54F65Q.cjs.map} +1 -1
  7. package/dist/{chunk-S7JQKNVT.cjs → chunk-GKQSA24K.cjs} +6 -6
  8. package/dist/{chunk-S7JQKNVT.cjs.map → chunk-GKQSA24K.cjs.map} +1 -1
  9. package/dist/{chunk-PHEA6FVQ.js → chunk-JSCC2N7N.js} +4 -4
  10. package/dist/{chunk-PHEA6FVQ.js.map → chunk-JSCC2N7N.js.map} +1 -1
  11. package/dist/{chunk-WUIEZ6Z4.cjs → chunk-RHJRLXKY.cjs} +68 -20
  12. package/dist/chunk-RHJRLXKY.cjs.map +1 -0
  13. package/dist/chunk-UKB64254.js +3 -0
  14. package/dist/{chunk-ZH4F2P2G.js.map → chunk-UKB64254.js.map} +1 -1
  15. package/dist/{chunk-GWCOKNST.js → chunk-Y5CYFNNW.js} +3 -3
  16. package/dist/{chunk-GWCOKNST.js.map → chunk-Y5CYFNNW.js.map} +1 -1
  17. package/dist/entries/client.cjs +8 -8
  18. package/dist/entries/client.js +3 -3
  19. package/dist/entries/core.cjs +5 -5
  20. package/dist/entries/core.js +1 -1
  21. package/dist/entries/edit.cjs +8 -8
  22. package/dist/entries/edit.d.cts +134 -24
  23. package/dist/entries/edit.d.ts +134 -24
  24. package/dist/entries/edit.js +2 -2
  25. package/dist/index.cjs +16 -16
  26. package/dist/index.d.cts +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +4 -4
  29. package/package.json +2 -2
  30. package/dist/chunk-I4A5VJRL.js.map +0 -1
  31. package/dist/chunk-WUIEZ6Z4.cjs.map +0 -1
  32. package/dist/chunk-ZH4F2P2G.js +0 -3
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkS7JQKNVT_cjs = require('../chunk-S7JQKNVT.cjs');
3
+ var chunkGKQSA24K_cjs = require('../chunk-GKQSA24K.cjs');
4
4
  require('../chunk-3B47IHB3.cjs');
5
5
  require('../chunk-VGWOIWRQ.cjs');
6
6
  require('../chunk-LKH5M44B.cjs');
@@ -39,11 +39,11 @@ require('../chunk-43FVH6LJ.cjs');
39
39
  require('../chunk-YFS2LMG4.cjs');
40
40
  require('../chunk-NLQQHJ25.cjs');
41
41
  require('../chunk-KNMW722T.cjs');
42
- var chunkFB3S2FON_cjs = require('../chunk-FB3S2FON.cjs');
42
+ var chunk56NJIP7P_cjs = require('../chunk-56NJIP7P.cjs');
43
43
  require('../chunk-HGCVWOGK.cjs');
44
44
  require('../chunk-GB724HW2.cjs');
45
45
  require('../chunk-A3S55XGF.cjs');
46
- require('../chunk-WUIEZ6Z4.cjs');
46
+ require('../chunk-RHJRLXKY.cjs');
47
47
  require('../chunk-N6GLZOE4.cjs');
48
48
  require('../chunk-DKEYSJCE.cjs');
49
49
  require('../chunk-GA4LZZKQ.cjs');
@@ -56,23 +56,23 @@ require('../chunk-WK4VXPPZ.cjs');
56
56
 
57
57
  Object.defineProperty(exports, "NodaroClient", {
58
58
  enumerable: true,
59
- get: function () { return chunkS7JQKNVT_cjs.NodaroClient; }
59
+ get: function () { return chunkGKQSA24K_cjs.NodaroClient; }
60
60
  });
61
61
  Object.defineProperty(exports, "createClient", {
62
62
  enumerable: true,
63
- get: function () { return chunkS7JQKNVT_cjs.createClient; }
63
+ get: function () { return chunkGKQSA24K_cjs.createClient; }
64
64
  });
65
65
  Object.defineProperty(exports, "CallbackAuth", {
66
66
  enumerable: true,
67
- get: function () { return chunkFB3S2FON_cjs.CallbackAuth; }
67
+ get: function () { return chunk56NJIP7P_cjs.CallbackAuth; }
68
68
  });
69
69
  Object.defineProperty(exports, "StaticTokenAuth", {
70
70
  enumerable: true,
71
- get: function () { return chunkFB3S2FON_cjs.StaticTokenAuth; }
71
+ get: function () { return chunk56NJIP7P_cjs.StaticTokenAuth; }
72
72
  });
73
73
  Object.defineProperty(exports, "supabaseAuth", {
74
74
  enumerable: true,
75
- get: function () { return chunkFB3S2FON_cjs.supabaseAuth; }
75
+ get: function () { return chunk56NJIP7P_cjs.supabaseAuth; }
76
76
  });
77
77
  //# sourceMappingURL=client.cjs.map
78
78
  //# sourceMappingURL=client.cjs.map
@@ -1,4 +1,4 @@
1
- export { NodaroClient, createClient } from '../chunk-PHEA6FVQ.js';
1
+ export { NodaroClient, createClient } from '../chunk-JSCC2N7N.js';
2
2
  import '../chunk-YN6CBIIB.js';
3
3
  import '../chunk-ZXJQSFIA.js';
4
4
  import '../chunk-Z5GLY4R3.js';
@@ -37,11 +37,11 @@ import '../chunk-SFB4YLCS.js';
37
37
  import '../chunk-BU5A6K4C.js';
38
38
  import '../chunk-I6CXC345.js';
39
39
  import '../chunk-JMOKD6ZP.js';
40
- export { CallbackAuth, StaticTokenAuth, supabaseAuth } from '../chunk-GWCOKNST.js';
40
+ export { CallbackAuth, StaticTokenAuth, supabaseAuth } from '../chunk-Y5CYFNNW.js';
41
41
  import '../chunk-CK3AMMSC.js';
42
42
  import '../chunk-4CXB7RA6.js';
43
43
  import '../chunk-65E3JBFZ.js';
44
- import '../chunk-I4A5VJRL.js';
44
+ import '../chunk-5A7J24LN.js';
45
45
  import '../chunk-JGS6YBDW.js';
46
46
  import '../chunk-53SXNN3A.js';
47
47
  import '../chunk-3QFTP5P5.js';
@@ -1,26 +1,26 @@
1
1
  'use strict';
2
2
 
3
3
  require('../chunk-X7XP5WBP.cjs');
4
- var chunkFB3S2FON_cjs = require('../chunk-FB3S2FON.cjs');
4
+ var chunk56NJIP7P_cjs = require('../chunk-56NJIP7P.cjs');
5
5
  require('../chunk-N6GLZOE4.cjs');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "CallbackAuth", {
10
10
  enumerable: true,
11
- get: function () { return chunkFB3S2FON_cjs.CallbackAuth; }
11
+ get: function () { return chunk56NJIP7P_cjs.CallbackAuth; }
12
12
  });
13
13
  Object.defineProperty(exports, "NodaroClientCore", {
14
14
  enumerable: true,
15
- get: function () { return chunkFB3S2FON_cjs.NodaroClientCore; }
15
+ get: function () { return chunk56NJIP7P_cjs.NodaroClientCore; }
16
16
  });
17
17
  Object.defineProperty(exports, "StaticTokenAuth", {
18
18
  enumerable: true,
19
- get: function () { return chunkFB3S2FON_cjs.StaticTokenAuth; }
19
+ get: function () { return chunk56NJIP7P_cjs.StaticTokenAuth; }
20
20
  });
21
21
  Object.defineProperty(exports, "supabaseAuth", {
22
22
  enumerable: true,
23
- get: function () { return chunkFB3S2FON_cjs.supabaseAuth; }
23
+ get: function () { return chunk56NJIP7P_cjs.supabaseAuth; }
24
24
  });
25
25
  //# sourceMappingURL=core.cjs.map
26
26
  //# sourceMappingURL=core.cjs.map
@@ -1,5 +1,5 @@
1
1
  import '../chunk-AUDHV3OE.js';
2
- export { CallbackAuth, NodaroClientCore, StaticTokenAuth, supabaseAuth } from '../chunk-GWCOKNST.js';
2
+ export { CallbackAuth, NodaroClientCore, StaticTokenAuth, supabaseAuth } from '../chunk-Y5CYFNNW.js';
3
3
  import '../chunk-JGS6YBDW.js';
4
4
  //# sourceMappingURL=core.js.map
5
5
  //# sourceMappingURL=core.js.map
@@ -1,34 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var chunkRAZN6C5R_cjs = require('../chunk-RAZN6C5R.cjs');
4
- var chunkWUIEZ6Z4_cjs = require('../chunk-WUIEZ6Z4.cjs');
3
+ var chunk6T54F65Q_cjs = require('../chunk-6T54F65Q.cjs');
4
+ var chunkRHJRLXKY_cjs = require('../chunk-RHJRLXKY.cjs');
5
5
  require('../chunk-N6GLZOE4.cjs');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "unwrapEditPlanOutput", {
10
10
  enumerable: true,
11
- get: function () { return chunkRAZN6C5R_cjs.unwrapEditPlanOutput; }
11
+ get: function () { return chunk6T54F65Q_cjs.unwrapEditPlanOutput; }
12
12
  });
13
13
  Object.defineProperty(exports, "CLIP_PACK_MAX_TARGET_SEC", {
14
14
  enumerable: true,
15
- get: function () { return chunkWUIEZ6Z4_cjs.CLIP_PACK_MAX_TARGET_SEC; }
15
+ get: function () { return chunkRHJRLXKY_cjs.CLIP_PACK_MAX_TARGET_SEC; }
16
16
  });
17
17
  Object.defineProperty(exports, "CLIP_PACK_MIN_TARGET_SEC", {
18
18
  enumerable: true,
19
- get: function () { return chunkWUIEZ6Z4_cjs.CLIP_PACK_MIN_TARGET_SEC; }
19
+ get: function () { return chunkRHJRLXKY_cjs.CLIP_PACK_MIN_TARGET_SEC; }
20
20
  });
21
21
  Object.defineProperty(exports, "EditResource", {
22
22
  enumerable: true,
23
- get: function () { return chunkWUIEZ6Z4_cjs.EditResource; }
23
+ get: function () { return chunkRHJRLXKY_cjs.EditResource; }
24
24
  });
25
25
  Object.defineProperty(exports, "TRAILER_FORMATS", {
26
26
  enumerable: true,
27
- get: function () { return chunkWUIEZ6Z4_cjs.TRAILER_FORMATS; }
27
+ get: function () { return chunkRHJRLXKY_cjs.TRAILER_FORMATS; }
28
28
  });
29
29
  Object.defineProperty(exports, "USE_CASE_NODE_TYPES", {
30
30
  enumerable: true,
31
- get: function () { return chunkWUIEZ6Z4_cjs.USE_CASE_NODE_TYPES; }
31
+ get: function () { return chunkRHJRLXKY_cjs.USE_CASE_NODE_TYPES; }
32
32
  });
33
33
  //# sourceMappingURL=edit.cjs.map
34
34
  //# sourceMappingURL=edit.cjs.map
@@ -46,20 +46,51 @@ interface SpeakerMapInput {
46
46
 
47
47
  /**
48
48
  * The inputs of the podcast use-case runs on the `edit` resource (Tighten
49
- * Episode, Chapters, Trailer, Clip Pack) and the request body each one sends.
49
+ * Episode, Chapters, Trailer, Clip Pack, Speaker Layout) and the request body each one sends.
50
50
  * Split from `edit.ts`, which holds the methods, the type list and the
51
51
  * continue routes; every name here is re-exported from there.
52
52
  */
53
53
 
54
54
  /**
55
- * Input for {@link EditResource.tightenEpisode} and
56
- * {@link EditResource.estimateTightenEpisode}: one recording in, the tightened
57
- * episode out. Only `mediaUrl` is required; every other field left out takes
58
- * the node's default.
55
+ * The recordings of a use-case run: one (`mediaUrl`), or the recordings of one
56
+ * conversation (`mediaUrls`, in order — the cameras; one may be sound only),
57
+ * an optional Master audio and the Cameras settings. Pass `mediaUrl` or
58
+ * `mediaUrls`, not both.
59
+ *
60
+ * Several recordings or a Master audio need Speaker Map, which tells who is on
61
+ * which camera: where it is not available to you (not yet on nodaro.ai) the
62
+ * request is refused `403 node_not_available` — send one recording.
59
63
  */
60
- interface TightenEpisodeInput {
64
+ interface UseCaseRecordingsInput {
61
65
  /** The recording — a video or audio URL, up to 3 hours. */
62
- mediaUrl: string;
66
+ mediaUrl?: string;
67
+ /**
68
+ * Instead of `mediaUrl`: the recordings of one conversation, in order — up
69
+ * to six in all with the Master audio; without one, two or more cameras keep
70
+ * a place for the sound, so up to five. With two or more the run lines them
71
+ * up, works out who is on which camera and cuts to whoever is talking.
72
+ */
73
+ mediaUrls?: string[];
74
+ /** The mixer or recorder track: the episode's sound and the clock the recordings are lined up to. */
75
+ masterAudioUrl?: string;
76
+ /** With several recordings or a Master audio: the Cameras settings (ignored with one recording and no Master audio). */
77
+ cameras?: {
78
+ /** Which recording (1-based) is the wide shot, shown when a speaker has no camera of their own; `null` for none. */
79
+ wide?: number | null;
80
+ /** The recordings already share one clock: skip lining them up. */
81
+ synced?: boolean;
82
+ /** Who is on which camera: speaker number (`"1"` = the first voice heard) → recording number, 0 = the wide shot. Overrides the automatic map. */
83
+ speakerCameras?: Record<string, number>;
84
+ };
85
+ }
86
+ /**
87
+ * Input for {@link EditResource.tightenEpisode} and
88
+ * {@link EditResource.estimateTightenEpisode}: the recording (or the
89
+ * recordings of one conversation, see {@link UseCaseRecordingsInput}) in, the
90
+ * tightened episode out. Only the recording is required; every other field
91
+ * left out takes the node's default.
92
+ */
93
+ interface TightenEpisodeInput extends UseCaseRecordingsInput {
63
94
  /** Optional music bed, ducked under the voice and ending with the episode. */
64
95
  musicUrl?: string;
65
96
  /** `"video"` or `"audio"`; an audio recording always makes an audio episode. */
@@ -73,6 +104,16 @@ interface TightenEpisodeInput {
73
104
  aspect: EdlTargetAspect;
74
105
  layout: "auto" | "single" | "side-by-side" | "stacked" | "grid" | "pip";
75
106
  } | null;
107
+ /**
108
+ * With a framing, how it follows the speakers: `"static"` (the default)
109
+ * splits the frame evenly by speaker; `"tracking"` follows faces with
110
+ * Speaker Frames (charged per started block of 1,000 sampled frames; a
111
+ * camera shared by several speakers keeps the even split until faces are
112
+ * named; refused 403 where Speaker Frames is not available to the caller);
113
+ * `"auto"` follows faces while Speaker Frames is available to the caller,
114
+ * else the even split. Ignored without a framing.
115
+ */
116
+ framingSource?: "auto" | "static" | "tracking";
76
117
  /** Captions on a video episode (on by default). */
77
118
  captions?: boolean;
78
119
  /** The captions' look. */
@@ -114,12 +155,13 @@ declare const TRAILER_FORMATS: readonly ["9:16", "1:1", "4:5", "16:9"];
114
155
  type TrailerFormat = (typeof TRAILER_FORMATS)[number];
115
156
  /**
116
157
  * Input for {@link EditResource.episodeTrailer} and
117
- * {@link EditResource.estimateEpisodeTrailer}: one video recording in, a
118
- * 20–40 s trailer out in each chosen format. Only `mediaUrl` is required.
158
+ * {@link EditResource.estimateEpisodeTrailer}: one video recording (or the
159
+ * recordings of one conversation, see {@link UseCaseRecordingsInput}) in, a
160
+ * 20–40 s trailer out in each chosen format. Only the recording is required.
119
161
  */
120
- interface EpisodeTrailerInput {
121
- /** The recording — a video URL, up to 3 hours (an audio-only recording is refused). */
122
- mediaUrl: string;
162
+ interface EpisodeTrailerInput extends UseCaseRecordingsInput {
163
+ /** The recording — a video URL, up to 3 hours (a run with no picture is refused). Or `mediaUrls`. */
164
+ mediaUrl?: string;
123
165
  /** An optional intro card: a short video (15 s at most) played before the trailer. */
124
166
  introCardUrl?: string;
125
167
  /** The formats to deliver, padded, never cropped (default `["9:16", "1:1", "4:5"]`; an empty list is refused). */
@@ -143,13 +185,13 @@ declare const CLIP_PACK_MAX_TARGET_SEC = 180;
143
185
  type ClipPackEmphasis = SpeakerEmphasisStyle | `${Exclude<SpeakerEmphasisStyle, "none">}+${string}`;
144
186
  /**
145
187
  * Input for {@link EditResource.clipPack} and
146
- * {@link EditResource.estimateClipPack}: one recording in, a pack of short
147
- * clips out. Only `mediaUrl` is required; every other field left out takes
148
- * the node's default.
188
+ * {@link EditResource.estimateClipPack}: the recording (or the recordings of
189
+ * one conversation, see {@link UseCaseRecordingsInput} — each clip then cuts
190
+ * to whoever is talking) in, a pack of short clips out. An audio recording
191
+ * makes audio clips (no framing, no captions). Only the recording is
192
+ * required; every other field left out takes the node's default.
149
193
  */
150
- interface ClipPackInput {
151
- /** The recording — a video or audio URL, up to 3 hours. An audio recording makes audio clips (no framing, no captions). */
152
- mediaUrl: string;
194
+ interface ClipPackInput extends UseCaseRecordingsInput {
153
195
  /** How many clips to find, 1–50 (default 8). The plan may find fewer. */
154
196
  count?: number;
155
197
  /** Each clip's target length in seconds, {@link CLIP_PACK_MIN_TARGET_SEC}–{@link CLIP_PACK_MAX_TARGET_SEC} (default 60). */
@@ -168,6 +210,15 @@ interface ClipPackInput {
168
210
  switchType?: SpeakerSwitchId;
169
211
  emphasisStyle?: ClipPackEmphasis;
170
212
  } | null;
213
+ /**
214
+ * With a framing, how it follows the speakers: `"static"` splits the frame
215
+ * evenly by speaker (what a request that leaves this out gets); `"tracking"`
216
+ * runs Speaker Frames once over the whole pack to follow faces (charged per
217
+ * started block of 1,000 sampled frames; refused 403 where Speaker Frames is
218
+ * not available to the caller); `"auto"` follows faces while Speaker Frames
219
+ * is available to the caller, else the even split. Ignored without a framing.
220
+ */
221
+ framingSource?: "auto" | "static" | "tracking";
171
222
  /** Caption each video clip (on by default). */
172
223
  captions?: boolean;
173
224
  /** The captions' look (default `"karaoke"`). */
@@ -185,6 +236,42 @@ interface ClipPackInput {
185
236
  /** A style guide for the planner (up to 4 000 characters). */
186
237
  styleGuide?: string;
187
238
  }
239
+ /**
240
+ * Input for {@link EditResource.speakerLayout} and
241
+ * {@link EditResource.estimateSpeakerLayout}: one video recording (or the
242
+ * recordings of one conversation, see {@link UseCaseRecordingsInput}) in, the
243
+ * whole recording framed by speaker out — the same length, nothing cut. Only
244
+ * the recording is required; every other field left out takes the node's
245
+ * default.
246
+ */
247
+ interface SpeakerLayoutInput extends UseCaseRecordingsInput {
248
+ /** The recording — a video URL, up to 3 hours (an audio-only recording is refused). Or `mediaUrls`. */
249
+ mediaUrl?: string;
250
+ /** The video's shape (default `"9:16"`). With one recording, a video already as narrow as the shape (or narrower) is refused `400 media_shape`. */
251
+ targetAspect?: EdlTargetAspect;
252
+ /** How the speakers are laid out (default `"stacked"`; one the shape does not draw is snapped to one it does). */
253
+ layout?: "auto" | "single" | "side-by-side" | "stacked" | "grid" | "pip";
254
+ /** The switch at each speaker change (default `"cut"`). */
255
+ switchType?: SpeakerSwitchId;
256
+ /** How the speaker talking is emphasised (default `"scale"`): `"none"`, or `"scale"`, `"border"` and `"dim"` joined with `"+"`. */
257
+ emphasisStyle?: ClipPackEmphasis;
258
+ /**
259
+ * How the speakers are followed: `"auto"` (the default) follows faces with
260
+ * Speaker Frames while it is available to the caller, else splits the frame
261
+ * evenly; `"static"` splits the frame evenly by speaker; `"tracking"`
262
+ * follows faces (charged per started block of 1,000 sampled frames;
263
+ * refused 403 where Speaker Frames is not available to the caller). Faces
264
+ * aren't named after a speaker yet, so a camera shared by several speakers
265
+ * keeps the even split.
266
+ */
267
+ framingSource?: "auto" | "static" | "tracking";
268
+ /**
269
+ * Stop at a quick preview for a person to review; render it at full
270
+ * quality with {@link EditResource.continueUseCase}
271
+ * (`mode: "render-final"`, no `editedEdl`: the layout has no cut to change).
272
+ */
273
+ reviewBeforeRender?: boolean;
274
+ }
188
275
 
189
276
  /**
190
277
  * A silence-detect job's `output_data.json` — the value to pass as
@@ -437,7 +524,7 @@ interface CameraSwitchInput {
437
524
  workflowId?: string;
438
525
  }
439
526
 
440
- /** What a use-case run (`tightenEpisode`, `episodeChapters`, `episodeTrailer`, `clipPack`) and `continueUseCase` answer: the run's job to poll. */
527
+ /** What a use-case run (`tightenEpisode`, `episodeChapters`, `episodeTrailer`, `clipPack`, `speakerLayout`) and `continueUseCase` answer: the run's job to poll. */
441
528
  interface UseCaseJobResult extends EditJobResult {
442
529
  /** The run's execution (absent on a deduplicated retry). */
443
530
  executionId?: string;
@@ -465,7 +552,7 @@ interface UseCaseEstimate {
465
552
  type TightenEpisodeEstimate = UseCaseEstimate;
466
553
  /** Input for {@link EditResource.continueUseCase}. */
467
554
  interface UseCaseContinueInput {
468
- /** The run to continue: the job `tightenEpisode`, `episodeChapters`, `episodeTrailer` or `clipPack` (or an earlier continuation) answered. */
555
+ /** The run to continue: the job `tightenEpisode`, `episodeChapters`, `episodeTrailer`, `clipPack` or `speakerLayout` (or an earlier continuation) answered. */
469
556
  jobId: string;
470
557
  /**
471
558
  * `"from-failed"` re-runs what did not finish of a failed run;
@@ -474,7 +561,7 @@ interface UseCaseContinueInput {
474
561
  * a Clip Pack edit that drops every clip is refused `use_case_nothing_kept`).
475
562
  */
476
563
  mode: "from-failed" | "render-final";
477
- /** Render final only: the reviewer's edit of the plan (an EDL). */
564
+ /** Render final only: the reviewer's edit of the plan (an EDL). A Speaker Layout run has no plan: an edit is refused `400 use_case_no_plan`. */
478
565
  editedEdl?: unknown;
479
566
  /**
480
567
  * The run's node type: its continuation goes to `POST /v1/<nodeType>/continue`.
@@ -485,7 +572,7 @@ interface UseCaseContinueInput {
485
572
  */
486
573
  nodeType?: UseCaseNodeType;
487
574
  }
488
- /** Per-call options for the use-case requests (Tighten Episode, Chapters, Trailer, Clip Pack, and their continuations). */
575
+ /** Per-call options for the use-case requests (Tighten Episode, Chapters, Trailer, Clip Pack, Speaker Layout, and their continuations). */
489
576
  interface UseCaseRequestOptions {
490
577
  /**
491
578
  * Sent as the `Idempotency-Key` header. Reuse the same value when retrying
@@ -518,13 +605,15 @@ interface UseCaseRequestOptions {
518
605
  * it in each chosen format in one call; the same connection applies.
519
606
  * - {@link clipPack} cuts a recording into a pack of short clips (framed and
520
607
  * captioned by default) in one call; the same connection applies.
608
+ * - {@link speakerLayout} frames a whole recording by speaker (the same
609
+ * length, nothing cut) in one call; the same connection applies.
521
610
  * - {@link remapTranscript} is a PURE local transform (no request) — the same
522
611
  * remap `applyEdl` performs on its `transcript`, exposed for callers that hold
523
612
  * an EDL and a transcript and only want the re-timed transcript.
524
613
  *
525
614
  * Every request method except the estimates ({@link estimateTightenEpisode},
526
615
  * {@link estimateEpisodeChapters}, {@link estimateEpisodeTrailer},
527
- * {@link estimateClipPack}: a quote, `{ data }`) returns
616
+ * {@link estimateClipPack}, {@link estimateSpeakerLayout}: a quote, `{ data }`) returns
528
617
  * {@link EditJobResult} (the use-case runs a {@link UseCaseJobResult}); poll the
529
618
  * `jobId` with `client.jobs.getStatus(jobId)`.
530
619
  */
@@ -648,6 +737,27 @@ declare class EditResource {
648
737
  estimateClipPack(input: ClipPackInput): Promise<{
649
738
  data: UseCaseEstimate;
650
739
  }>;
740
+ /**
741
+ * Speaker Layout (`POST /v1/speaker-layout`): frame a whole recording by
742
+ * speaker in one call — the same length, nothing cut. One recording: each
743
+ * speaker framed in turn; several recordings of one conversation: lined up,
744
+ * each speaker shown on their own camera. The finished job's
745
+ * `output_data.videoUrl` is the framed video, `output_data.json` the edit
746
+ * Speaker View drew. With `reviewBeforeRender` the run stops at a preview;
747
+ * {@link continueUseCase} (`mode: "render-final"`, no `editedEdl`) renders
748
+ * it at full quality. Priced as its steps at their own rates plus the listed
749
+ * per-run fee; quote it first with {@link estimateSpeakerLayout}.
750
+ */
751
+ speakerLayout(input: SpeakerLayoutInput, options?: UseCaseRequestOptions): Promise<UseCaseJobResult>;
752
+ /**
753
+ * What a Speaker Layout run is estimated at (`POST /v1/speaker-layout/estimate`):
754
+ * its steps at their own rates plus its per-run fee. Nothing is created or
755
+ * charged. A recording whose length cannot be read is estimated at the
756
+ * 180-minute ceiling.
757
+ */
758
+ estimateSpeakerLayout(input: SpeakerLayoutInput): Promise<{
759
+ data: UseCaseEstimate;
760
+ }>;
651
761
  /**
652
762
  * Continue a use-case run as a new job (`POST /v1/<type>/continue`, the
653
763
  * run's own type: `input.nodeType`, else the type the job records, read with
@@ -702,4 +812,4 @@ declare class EditResource {
702
812
  remapTranscript(edl: Edl, transcript: Transcript): Transcript;
703
813
  }
704
814
 
705
- export { type ApplyEdlInput, type AudioSyncInput, type AudioSyncOffset, type AudioSyncResult, type AudioSyncSource, CLIP_PACK_MAX_TARGET_SEC, CLIP_PACK_MIN_TARGET_SEC, type CameraSwitchInput, type ClipPackEmphasis, type ClipPackInput, type EditJobResult, type EditPlanInput, type EditPlanSource, EditResource, type EpisodeChaptersInput, type EpisodeTrailerInput, type SilenceDetectInput, type SilenceRanges, type SpeakerMapInput, type SpeakerMapSource, TRAILER_FORMATS, type TightenEpisodeEstimate, type TightenEpisodeInput, type TightenEpisodeJobResult, type TrailerFormat, type UseCaseContinueInput, type UseCaseEstimate, type UseCaseJobResult, type UseCaseRequestOptions };
815
+ export { type ApplyEdlInput, type AudioSyncInput, type AudioSyncOffset, type AudioSyncResult, type AudioSyncSource, CLIP_PACK_MAX_TARGET_SEC, CLIP_PACK_MIN_TARGET_SEC, type CameraSwitchInput, type ClipPackEmphasis, type ClipPackInput, type EditJobResult, type EditPlanInput, type EditPlanSource, EditResource, type EpisodeChaptersInput, type EpisodeTrailerInput, type SilenceDetectInput, type SilenceRanges, type SpeakerLayoutInput, type SpeakerMapInput, type SpeakerMapSource, TRAILER_FORMATS, type TightenEpisodeEstimate, type TightenEpisodeInput, type TightenEpisodeJobResult, type TrailerFormat, type UseCaseContinueInput, type UseCaseEstimate, type UseCaseJobResult, type UseCaseRecordingsInput, type UseCaseRequestOptions };