@vitrina/api 15.21.0 → 15.23.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/dist/index.d.cts CHANGED
@@ -141461,7 +141461,7 @@ interface paths {
141461
141461
  aiReplied?: boolean | null;
141462
141462
  fromAd?: boolean | null;
141463
141463
  fromCampaign?: boolean | null;
141464
- /** @description true: only conversations where a customer is waiting on a human («Esperando respuesta»), team-wide. Waiting = open or pending, not filtered, on a channel you can reply in, and either an AI handoff nobody on the team has answered yet (a reply from ANY teammate clears it, including WhatsApp Business / Instagram app replies; a silent «Visita acordada» notice needs no answer) or a human-handled thread whose last message is the customer’s; waits older than 7 days are left out; and what the customer wrote still asks for a reply: a thread whose newest unanswered customer message was judged, with high confidence, as the customer closing the chat («ok», «gracias», 👍 after we answered) or owing nothing, a customer who paid (a transfer receipt after our bank details) or is at the store («llegué», «voy subiendo»), or a follow-up we promised for a later day that is not due yet, is left out (any other open promise of ours always stays). `closed`: exactly those left-out threads, still live (not resolved) — `waiting_state` says why, `waiting_due_at` when a promised follow-up falls due. Each row carries `waiting_since`, `waiting_state` and `waiting_due_at`. Pair with `sort=wait` for the queue order. */
141464
+ /** @description true: only conversations where a customer is waiting on a human («Esperando respuesta»), team-wide. Waiting = open or pending, not filtered, on a channel you can reply in, and either an AI handoff nobody on the team has answered yet (a reply from ANY teammate clears it, including WhatsApp Business / Instagram app replies; a silent «Visita acordada» notice needs no answer) or a human-handled thread whose last message is the customer’s; waits older than 7 days are left out; and what the customer wrote still asks for a reply: a thread whose newest unanswered customer message was judged, with high confidence, as the customer closing the chat («ok», «gracias», 👍 after we answered) or owing nothing, a customer who paid (a transfer receipt after our bank details) or is at the store («llegué», «voy subiendo»), or a follow-up we promised for a later day that is not due yet, is left out (any other open promise of ours always stays). `closed`: exactly those left-out threads, still live (not resolved) — `waiting_state` says why, `waiting_due_at` when a promised follow-up falls due. Each row carries `waiting_since`, `waiting_state`, `waiting_due_at` and `waiting_subject_id` (the message, or handoff event, the wait is about — `POST /conversations/{id}/no-reply-needed` takes it as `subject_id`). Pair with `sort=wait` for the queue order. */
141465
141465
  waiting?: boolean | "closed" | null;
141466
141466
  /** @description `wait`: urgent (`handoff_urgent`) first, then by `waiting_since` — `order=desc` (default) is the longest wait first, `asc` the newest; conversations that are not waiting go last. */
141467
141467
  sort?: "created_at" | "updated_at" | "last_message_date" | "wait";
@@ -141606,7 +141606,8 @@ interface paths {
141606
141606
  * "handoff_urgent": false,
141607
141607
  * "waiting_since": null,
141608
141608
  * "waiting_state": null,
141609
- * "waiting_due_at": null
141609
+ * "waiting_due_at": null,
141610
+ * "waiting_subject_id": null
141610
141611
  * },
141611
141612
  * {
141612
141613
  * "id": "bbbbbbbb-0000-4000-8000-000000000002",
@@ -141746,7 +141747,8 @@ interface paths {
141746
141747
  * "handoff_urgent": false,
141747
141748
  * "waiting_since": null,
141748
141749
  * "waiting_state": null,
141749
- * "waiting_due_at": null
141750
+ * "waiting_due_at": null,
141751
+ * "waiting_subject_id": null
141750
141752
  * }
141751
141753
  * ],
141752
141754
  * "meta": {
@@ -142310,6 +142312,7 @@ interface paths {
142310
142312
  * "waiting_since": null,
142311
142313
  * "waiting_state": null,
142312
142314
  * "waiting_due_at": null,
142315
+ * "waiting_subject_id": null,
142313
142316
  * "ad_origin_nudge": null,
142314
142317
  * "handoff_resolved_suggested": false,
142315
142318
  * "message": [
@@ -147028,6 +147031,229 @@ interface paths {
147028
147031
  patch?: never;
147029
147032
  trace?: never;
147030
147033
  };
147034
+ "/conversations/{id}/no-reply-needed": {
147035
+ parameters: {
147036
+ query?: never;
147037
+ header?: never;
147038
+ path?: never;
147039
+ cookie?: never;
147040
+ };
147041
+ get?: never;
147042
+ put?: never;
147043
+ /**
147044
+ * Mark the current wait as needing no reply («No requiere respuesta»)
147045
+ * @description Takes the conversation out of «Esperando respuesta» for the wait the person saw: `subject_id` is the row’s `waiting_subject_id` (the newest customer message nobody on the team answered; with none pending, the open handoff’s event). If the customer wrote again since, the call answers 409 `WAITING_SUBJECT_CHANGED` (`details.subject_id` = the current one) and records nothing. The customer’s next message starts a new wait. Recorded as a correction of the `reply_owed` verdict on that subject (label `nothing_owed`); a click outranks any verdict on the same subject, and this workspace’s later verdicts read recent clicks as examples — never another workspace’s. Idempotent (one click per verdict, concurrent clicks included): already out of the queue → `changed: false`. Other 409s carry `details.reason`: `not_waiting`, or one the queue never hides — `urgent`, `payment_obligation` (a payment held open), `promised_human_contact` (the AI told the customer a person would contact them). `subject_kind` is `message` or `handoff`; `waiting_state` is the thread’s state after the call.
147046
+ */
147047
+ post: {
147048
+ parameters: {
147049
+ query?: never;
147050
+ header?: {
147051
+ /** @description Replay-safe retries: resending the SAME key with the SAME body returns the original response (`X-Idempotent-Replay: 1`) instead of creating a second copy — safe to send whenever a response might not have arrived. The same key with a DIFFERENT body answers `409 IDEMPOTENCY_KEY_CONFLICT`; use a fresh key per operation. */
147052
+ "Idempotency-Key"?: string;
147053
+ };
147054
+ path: {
147055
+ id: string;
147056
+ };
147057
+ cookie?: never;
147058
+ };
147059
+ requestBody?: {
147060
+ content: {
147061
+ /**
147062
+ * @example {
147063
+ * "subject_id": "01a17d4e-c0de-7a11-9d0e-5e1a7e5b0c11"
147064
+ * }
147065
+ */
147066
+ "application/json": {
147067
+ /** Format: uuid */
147068
+ subject_id: string;
147069
+ };
147070
+ };
147071
+ };
147072
+ responses: {
147073
+ /** @description `{ conversation_id, subject_id, subject_kind, waiting_state, changed }` */
147074
+ 200: {
147075
+ headers: {
147076
+ [name: string]: unknown;
147077
+ };
147078
+ content: {
147079
+ /**
147080
+ * @example {
147081
+ * "data": {
147082
+ * "conversation_id": "bbbbbbbb-0000-4000-8000-000000000001",
147083
+ * "subject_id": "01a17d4e-c0de-7a11-9d0e-5e1a7e5b0c11",
147084
+ * "subject_kind": "message",
147085
+ * "waiting_state": "nothing_owed",
147086
+ * "changed": true
147087
+ * }
147088
+ * }
147089
+ */
147090
+ "application/json": {
147091
+ data?: unknown;
147092
+ meta?: {
147093
+ [key: string]: unknown;
147094
+ };
147095
+ };
147096
+ };
147097
+ };
147098
+ /** @description Validation error */
147099
+ 400: {
147100
+ headers: {
147101
+ [name: string]: unknown;
147102
+ };
147103
+ content: {
147104
+ "application/json": components["schemas"]["Error"];
147105
+ };
147106
+ };
147107
+ /** @description Unauthorized */
147108
+ 401: {
147109
+ headers: {
147110
+ [name: string]: unknown;
147111
+ };
147112
+ content: {
147113
+ "application/json": components["schemas"]["Error"];
147114
+ };
147115
+ };
147116
+ /** @description Forbidden */
147117
+ 403: {
147118
+ headers: {
147119
+ [name: string]: unknown;
147120
+ };
147121
+ content: {
147122
+ "application/json": components["schemas"]["Error"];
147123
+ };
147124
+ };
147125
+ /** @description Not found */
147126
+ 404: {
147127
+ headers: {
147128
+ [name: string]: unknown;
147129
+ };
147130
+ content: {
147131
+ "application/json": components["schemas"]["Error"];
147132
+ };
147133
+ };
147134
+ /** @description Conflict (incl. Idempotency-Key reuse with different body) */
147135
+ 409: {
147136
+ headers: {
147137
+ [name: string]: unknown;
147138
+ };
147139
+ content: {
147140
+ "application/json": components["schemas"]["Error"];
147141
+ };
147142
+ };
147143
+ /** @description Rate limited */
147144
+ 429: {
147145
+ headers: {
147146
+ [name: string]: unknown;
147147
+ };
147148
+ content: {
147149
+ "application/json": components["schemas"]["Error"];
147150
+ };
147151
+ };
147152
+ };
147153
+ };
147154
+ /**
147155
+ * Undo «No requiere respuesta»
147156
+ * @description Removes the click `POST /conversations/{id}/no-reply-needed` recorded on the current wait (and the verdict row it created), so the conversation waits again as before. `subject_id` (optional) names the wait the undo is for: when the conversation now waits on another message, nothing changes. Nothing to undo → `changed: false`.
147157
+ */
147158
+ delete: {
147159
+ parameters: {
147160
+ query?: {
147161
+ subject_id?: string;
147162
+ };
147163
+ header?: never;
147164
+ path: {
147165
+ id: string;
147166
+ };
147167
+ cookie?: never;
147168
+ };
147169
+ requestBody?: never;
147170
+ responses: {
147171
+ /** @description `{ conversation_id, subject_id, subject_kind, waiting_state, changed }` */
147172
+ 200: {
147173
+ headers: {
147174
+ [name: string]: unknown;
147175
+ };
147176
+ content: {
147177
+ /**
147178
+ * @example {
147179
+ * "data": {
147180
+ * "conversation_id": "bbbbbbbb-0000-4000-8000-000000000001",
147181
+ * "subject_id": "01a17d4e-c0de-7a11-9d0e-5e1a7e5b0c11",
147182
+ * "subject_kind": "message",
147183
+ * "waiting_state": "nothing_owed",
147184
+ * "changed": true
147185
+ * }
147186
+ * }
147187
+ */
147188
+ "application/json": {
147189
+ data?: unknown;
147190
+ meta?: {
147191
+ [key: string]: unknown;
147192
+ };
147193
+ };
147194
+ };
147195
+ };
147196
+ /** @description Validation error */
147197
+ 400: {
147198
+ headers: {
147199
+ [name: string]: unknown;
147200
+ };
147201
+ content: {
147202
+ "application/json": components["schemas"]["Error"];
147203
+ };
147204
+ };
147205
+ /** @description Unauthorized */
147206
+ 401: {
147207
+ headers: {
147208
+ [name: string]: unknown;
147209
+ };
147210
+ content: {
147211
+ "application/json": components["schemas"]["Error"];
147212
+ };
147213
+ };
147214
+ /** @description Forbidden */
147215
+ 403: {
147216
+ headers: {
147217
+ [name: string]: unknown;
147218
+ };
147219
+ content: {
147220
+ "application/json": components["schemas"]["Error"];
147221
+ };
147222
+ };
147223
+ /** @description Not found */
147224
+ 404: {
147225
+ headers: {
147226
+ [name: string]: unknown;
147227
+ };
147228
+ content: {
147229
+ "application/json": components["schemas"]["Error"];
147230
+ };
147231
+ };
147232
+ /** @description Conflict (incl. Idempotency-Key reuse with different body) */
147233
+ 409: {
147234
+ headers: {
147235
+ [name: string]: unknown;
147236
+ };
147237
+ content: {
147238
+ "application/json": components["schemas"]["Error"];
147239
+ };
147240
+ };
147241
+ /** @description Rate limited */
147242
+ 429: {
147243
+ headers: {
147244
+ [name: string]: unknown;
147245
+ };
147246
+ content: {
147247
+ "application/json": components["schemas"]["Error"];
147248
+ };
147249
+ };
147250
+ };
147251
+ };
147252
+ options?: never;
147253
+ head?: never;
147254
+ patch?: never;
147255
+ trace?: never;
147256
+ };
147031
147257
  "/conversations/{id}/filter-sender": {
147032
147258
  parameters: {
147033
147259
  query?: never;
@@ -166653,7 +166879,7 @@ interface paths {
166653
166879
  };
166654
166880
  /**
166655
166881
  * Conversation volume and resolution
166656
- * @description Volume, resolution and handling time over the window — the top-level view the other reports break down.
166882
+ * @description Volume, resolution and handling time over the window — the top-level view the other reports break down. `waiting_clears` counts how «Esperando respuesta» was cleared in the window: `by_jev` (the `reply_owed` verdict took a wait out), `by_button` («No requiere respuesta», `POST /conversations/{id}/no-reply-needed`; undone clicks excluded) and `corrected_to_owed` (a person answered a thread Jev had taken out, so it was owed after all); `null` when it could not be read.
166657
166883
  */
166658
166884
  get: {
166659
166885
  parameters: {
@@ -166761,7 +166987,12 @@ interface paths {
166761
166987
  * ]
166762
166988
  * },
166763
166989
  * "facturables": 4,
166764
- * "solo_humano": 14
166990
+ * "solo_humano": 14,
166991
+ * "waiting_clears": {
166992
+ * "by_jev": 9,
166993
+ * "by_button": 2,
166994
+ * "corrected_to_owed": 1
166995
+ * }
166765
166996
  * },
166766
166997
  * "meta": {
166767
166998
  * "window": {
@@ -200311,6 +200542,8 @@ interface paths {
200311
200542
  * "original_filename": "IMG_2231.HEIC",
200312
200543
  * "ai_enabled": true,
200313
200544
  * "shows_person": true,
200545
+ * "speaker": null,
200546
+ * "is_intro": false,
200314
200547
  * "consent_confirmed_at": "2026-10-29T14:00:00.000Z",
200315
200548
  * "consent_confirmed_by": "2f1e0d9c-8b7a-4c6d-9e5f-1a2b3c4d5e6f",
200316
200549
  * "expires_at": null,
@@ -200394,7 +200627,7 @@ interface paths {
200394
200627
  put?: never;
200395
200628
  /**
200396
200629
  * Upload a file to the library
200397
- * @description Uploads `file` with its details. The kind (image, video, audio, document) is read from the bytes. Accepted files and caps: images JPG/PNG/WebP/HEIC ≤ 10 MB (auto-rotated, every metadata block — EXIF, GPS — removed, long edge ≤ 2560 px, stored as JPEG, or PNG when it was PNG, ≤ 5 MB); videos MP4/MOV/WebM ≤ 50 MB (converted to a WhatsApp-safe MP4 that must end ≤ 16 MB); PDF ≤ 16 MB; audio OGG/Opus, MP3, M4A/AAC, WAV, WebM, AMR ≤ 16 MB (transcribed unless `transcript` is sent). Refusals carry `details.code`: 413 `MEDIA_TOO_LARGE` (`details.limit_bytes`), 415 `MEDIA_UNSUPPORTED_TYPE` (an HEIC the server cannot decode included: convert it to JPG), 422 `MEDIA_EMPTY`. `name` defaults to the file name. `shows_person` defaults to true for images and videos in a healthcare workspace; while it is true and the consent is not confirmed nobody can send the file. A file identical to one already in the library is still created and the answer carries `duplicate_of: {id, name}`. 409 `MEDIA_LIBRARY_FULL` past 500 files; 422 for an unknown topic.
200630
+ * @description Uploads `file` with its details. The kind (image, video, audio, document) is read from the bytes. Accepted files and caps: images JPG/PNG/WebP/HEIC ≤ 10 MB (auto-rotated, every metadata block — EXIF, GPS — removed, long edge ≤ 2560 px, stored as JPEG, or PNG when it was PNG, ≤ 5 MB); videos MP4/MOV/WebM ≤ 50 MB (converted to a WhatsApp-safe MP4 that must end ≤ 16 MB); PDF ≤ 16 MB; audio OGG/Opus, MP3, M4A/AAC, WAV, WebM, AMR ≤ 16 MB (transcribed unless `transcript` is sent). Refusals carry `details.code`: 413 `MEDIA_TOO_LARGE` (`details.limit_bytes`), 415 `MEDIA_UNSUPPORTED_TYPE` (an HEIC the server cannot decode included: convert it to JPG), 422 `MEDIA_EMPTY`. `name` defaults to the file name. `shows_person` defaults to true for images and videos in a healthcare workspace; while it is true and the consent is not confirmed nobody can send the file. A file identical to one already in the library is still created and the answer carries `duplicate_of: {id, name}`. 409 `MEDIA_LIBRARY_FULL` past 500 files; 422 for an unknown topic. Audio and video may name their `speaker` («Voz de», ≤ 80 characters; images and PDFs: 400 `MEDIA_SPEAKER_KIND`). An audio with a speaker may be that speaker’s `is_intro` («Presentación»): a short greeting the agent is never offered; the platform sends it once per conversation, right before the first audio of that speaker. 400 `MEDIA_INTRO_AUDIO_ONLY` / `MEDIA_INTRO_NEEDS_SPEAKER`; one live intro per speaker (case-insensitive): a second is 409 `MEDIA_INTRO_EXISTS` with `details.speaker`, `details.intro_id`, `details.intro_name`.
200398
200631
  *
200399
200632
  * **Or a JSON body** (`application/json`) — what an MCP connector sends through `call_operation`, which cannot build multipart: `{ filename, content, content_encoding?, content_type? }` plus the operation's own form fields. `content` is UTF-8 text by default, or base64 when `content_encoding` is `"base64"` (images, PDF, audio, video). The same byte cap applies to the decoded bytes (413 above it); invalid base64 is a 400; the content type defaults from the filename extension.
200400
200633
  */
@@ -200444,6 +200677,10 @@ interface paths {
200444
200677
  models?: string[];
200445
200678
  /** @description Audio: what it says. When given, speech-to-text is skipped. */
200446
200679
  transcript?: string;
200680
+ /** @description «Voz de»: who speaks in this audio or video (e.g. "Dra. Valentina"), ≤ 80 characters, trimmed; empty = nobody in particular. Images and PDFs: 400 `MEDIA_SPEAKER_KIND`. */
200681
+ speaker?: string;
200682
+ /** @description «Presentación»: this audio is the speaker’s short greeting ("Hola, soy …"). Never offered to the agent: the platform sends it once per conversation, right before the first audio of that speaker. Audio with a `speaker` only (400 `MEDIA_INTRO_AUDIO_ONLY` / `MEDIA_INTRO_NEEDS_SPEAKER`); one per speaker (409 `MEDIA_INTRO_EXISTS`). Default false. */
200683
+ is_intro?: boolean;
200447
200684
  file?: unknown;
200448
200685
  };
200449
200686
  /**
@@ -200494,6 +200731,10 @@ interface paths {
200494
200731
  models?: string[];
200495
200732
  /** @description Audio: what it says. When given, speech-to-text is skipped. */
200496
200733
  transcript?: string;
200734
+ /** @description «Voz de»: who speaks in this audio or video (e.g. "Dra. Valentina"), ≤ 80 characters, trimmed; empty = nobody in particular. Images and PDFs: 400 `MEDIA_SPEAKER_KIND`. */
200735
+ speaker?: string;
200736
+ /** @description «Presentación»: this audio is the speaker’s short greeting ("Hola, soy …"). Never offered to the agent: the platform sends it once per conversation, right before the first audio of that speaker. Audio with a `speaker` only (400 `MEDIA_INTRO_AUDIO_ONLY` / `MEDIA_INTRO_NEEDS_SPEAKER`); one per speaker (409 `MEDIA_INTRO_EXISTS`). Default false. */
200737
+ is_intro?: boolean;
200497
200738
  };
200498
200739
  };
200499
200740
  };
@@ -200532,6 +200773,8 @@ interface paths {
200532
200773
  * "original_filename": "IMG_2231.HEIC",
200533
200774
  * "ai_enabled": true,
200534
200775
  * "shows_person": true,
200776
+ * "speaker": null,
200777
+ * "is_intro": false,
200535
200778
  * "consent_confirmed_at": "2026-10-29T14:00:00.000Z",
200536
200779
  * "consent_confirmed_by": "2f1e0d9c-8b7a-4c6d-9e5f-1a2b3c4d5e6f",
200537
200780
  * "expires_at": null,
@@ -200615,6 +200858,113 @@ interface paths {
200615
200858
  patch?: never;
200616
200859
  trace?: never;
200617
200860
  };
200861
+ "/media-assets/speakers": {
200862
+ parameters: {
200863
+ query?: never;
200864
+ header?: never;
200865
+ path?: never;
200866
+ cookie?: never;
200867
+ };
200868
+ /**
200869
+ * List the speakers of the library
200870
+ * @description The distinct `speaker` values («Voz de») of the live files, case-insensitive, by name — the suggestions for a new upload. Each carries how many live files name it and the id of its «Presentación» (`intro_id`, null when it has none).
200871
+ */
200872
+ get: {
200873
+ parameters: {
200874
+ query?: never;
200875
+ header?: never;
200876
+ path?: never;
200877
+ cookie?: never;
200878
+ };
200879
+ requestBody?: never;
200880
+ responses: {
200881
+ /** @description Speakers */
200882
+ 200: {
200883
+ headers: {
200884
+ [name: string]: unknown;
200885
+ };
200886
+ content: {
200887
+ /**
200888
+ * @example [
200889
+ * {
200890
+ * "speaker": "Dra. Valentina",
200891
+ * "assets": 4,
200892
+ * "intro_id": "5a4b3c2d-1e0f-4a9b-8c7d-6e5f4a3b2c1d"
200893
+ * }
200894
+ * ]
200895
+ */
200896
+ "application/json": {
200897
+ data?: unknown;
200898
+ meta?: {
200899
+ [key: string]: unknown;
200900
+ };
200901
+ };
200902
+ };
200903
+ };
200904
+ /** @description Validation error */
200905
+ 400: {
200906
+ headers: {
200907
+ [name: string]: unknown;
200908
+ };
200909
+ content: {
200910
+ "application/json": components["schemas"]["Error"];
200911
+ };
200912
+ };
200913
+ /** @description Unauthorized */
200914
+ 401: {
200915
+ headers: {
200916
+ [name: string]: unknown;
200917
+ };
200918
+ content: {
200919
+ "application/json": components["schemas"]["Error"];
200920
+ };
200921
+ };
200922
+ /** @description Forbidden */
200923
+ 403: {
200924
+ headers: {
200925
+ [name: string]: unknown;
200926
+ };
200927
+ content: {
200928
+ "application/json": components["schemas"]["Error"];
200929
+ };
200930
+ };
200931
+ /** @description Not found */
200932
+ 404: {
200933
+ headers: {
200934
+ [name: string]: unknown;
200935
+ };
200936
+ content: {
200937
+ "application/json": components["schemas"]["Error"];
200938
+ };
200939
+ };
200940
+ /** @description Conflict (incl. Idempotency-Key reuse with different body) */
200941
+ 409: {
200942
+ headers: {
200943
+ [name: string]: unknown;
200944
+ };
200945
+ content: {
200946
+ "application/json": components["schemas"]["Error"];
200947
+ };
200948
+ };
200949
+ /** @description Rate limited */
200950
+ 429: {
200951
+ headers: {
200952
+ [name: string]: unknown;
200953
+ };
200954
+ content: {
200955
+ "application/json": components["schemas"]["Error"];
200956
+ };
200957
+ };
200958
+ };
200959
+ };
200960
+ put?: never;
200961
+ post?: never;
200962
+ delete?: never;
200963
+ options?: never;
200964
+ head?: never;
200965
+ patch?: never;
200966
+ trace?: never;
200967
+ };
200618
200968
  "/media-assets/{id}": {
200619
200969
  parameters: {
200620
200970
  query?: never;
@@ -200671,6 +201021,8 @@ interface paths {
200671
201021
  * "original_filename": "IMG_2231.HEIC",
200672
201022
  * "ai_enabled": true,
200673
201023
  * "shows_person": true,
201024
+ * "speaker": null,
201025
+ * "is_intro": false,
200674
201026
  * "consent_confirmed_at": "2026-10-29T14:00:00.000Z",
200675
201027
  * "consent_confirmed_by": "2f1e0d9c-8b7a-4c6d-9e5f-1a2b3c4d5e6f",
200676
201028
  * "expires_at": null,
@@ -200834,7 +201186,7 @@ interface paths {
200834
201186
  head?: never;
200835
201187
  /**
200836
201188
  * Edit a library file
200837
- * @description Changes the details; the bytes are replaced with `POST /media-assets/{id}/file`. `tags`, `topic_ids` and `models` replace their sets. `caption: null` and `expires_at: null` clear them. `consent_confirmed: true` records the calling member and now as the consent confirmation (a member only; an API key gets 422), `false` clears it. At least one field is required; an unknown topic is 422.
201189
+ * @description Changes the details; the bytes are replaced with `POST /media-assets/{id}/file`. `tags`, `topic_ids` and `models` replace their sets. `caption: null` and `expires_at: null` clear them. `consent_confirmed: true` records the calling member and now as the consent confirmation (a member only; an API key gets 422), `false` clears it. At least one field is required; an unknown topic is 422. `speaker: null` (or empty) clears the speaker and with it `is_intro`. Audio and video may name their `speaker` («Voz de», ≤ 80 characters; images and PDFs: 400 `MEDIA_SPEAKER_KIND`). An audio with a speaker may be that speaker’s `is_intro` («Presentación»): a short greeting the agent is never offered; the platform sends it once per conversation, right before the first audio of that speaker. 400 `MEDIA_INTRO_AUDIO_ONLY` / `MEDIA_INTRO_NEEDS_SPEAKER`; one live intro per speaker (case-insensitive): a second is 409 `MEDIA_INTRO_EXISTS` with `details.speaker`, `details.intro_id`, `details.intro_name`.
200838
201190
  */
200839
201191
  patch: {
200840
201192
  parameters: {
@@ -200877,6 +201229,10 @@ interface paths {
200877
201229
  * @description When the file stops being sendable (ISO 8601). Null = never. An expired file stays in the library, marked `expired`.
200878
201230
  */
200879
201231
  expires_at?: string | null;
201232
+ /** @description «Voz de»: who speaks in this audio or video (e.g. "Dra. Valentina"), ≤ 80 characters, trimmed; empty = nobody in particular. Images and PDFs: 400 `MEDIA_SPEAKER_KIND`. null or empty clears it, and with it `is_intro`. */
201233
+ speaker?: string | null;
201234
+ /** @description «Presentación»: this audio is the speaker’s short greeting ("Hola, soy …"). Never offered to the agent: the platform sends it once per conversation, right before the first audio of that speaker. Audio with a `speaker` only (400 `MEDIA_INTRO_AUDIO_ONLY` / `MEDIA_INTRO_NEEDS_SPEAKER`); one per speaker (409 `MEDIA_INTRO_EXISTS`). */
201235
+ is_intro?: boolean;
200880
201236
  };
200881
201237
  };
200882
201238
  };
@@ -200915,6 +201271,8 @@ interface paths {
200915
201271
  * "original_filename": "IMG_2231.HEIC",
200916
201272
  * "ai_enabled": true,
200917
201273
  * "shows_person": true,
201274
+ * "speaker": null,
201275
+ * "is_intro": false,
200918
201276
  * "consent_confirmed_at": "2026-10-29T14:00:00.000Z",
200919
201277
  * "consent_confirmed_by": "2f1e0d9c-8b7a-4c6d-9e5f-1a2b3c4d5e6f",
200920
201278
  * "expires_at": null,
@@ -201094,6 +201452,8 @@ interface paths {
201094
201452
  * "original_filename": "IMG_2231.HEIC",
201095
201453
  * "ai_enabled": true,
201096
201454
  * "shows_person": true,
201455
+ * "speaker": null,
201456
+ * "is_intro": false,
201097
201457
  * "consent_confirmed_at": "2026-10-29T14:00:00.000Z",
201098
201458
  * "consent_confirmed_by": "2f1e0d9c-8b7a-4c6d-9e5f-1a2b3c4d5e6f",
201099
201459
  * "expires_at": null,
@@ -272209,7 +272569,7 @@ declare function createClient(opts: CreateClientOptions): VitrinaClient;
272209
272569
  * is regenerated — narrow on the ones you handle, never assume this
272210
272570
  * list is exhaustive at runtime.
272211
272571
  */
272212
- type ErrorCode = 'VALIDATION_ERROR' | 'NOT_FOUND' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'CONFLICT' | 'ACCOUNT_DELETION_BLOCKED' | 'CONFIRMATION_REQUIRED' | 'VERSION_CONFLICT' | 'UNIQUE_CONFLICT' | 'IDEMPOTENCY_KEY_CONFLICT' | 'VERTICAL_NOT_ENABLED' | 'MODULE_NOT_ENABLED' | 'ENTITLEMENT_NOT_ACTIVE' | 'UNSUPPORTED_VEHICLE_TYPE' | 'VEHICLE_VALUE_OUT_OF_RANGE' | 'PRICE_CHANGE_CONFIRMATION_REQUIRED' | 'NO_OFFERING_ADAPTER' | 'PAYLOAD_TOO_LARGE' | 'UNSUPPORTED_MEDIA_TYPE' | 'UPSTREAM_ERROR' | 'RATE_LIMITED' | 'FINANZAS_SYNC_THROTTLED' | 'FINANZAS_CLAVE_ERROR' | 'GONE' | 'INTERNAL_ERROR' | 'MESSAGING_ACCOUNT_TENANT_MISSING' | 'COPILOT_APPROVALS_UNAVAILABLE' | 'COPILOT_APPROVAL_REPLAY_BLOCKED' | 'COPILOT_DISABLED' | 'COPILOT_BUDGET_EXCEEDED' | 'DEALER_SITES_NOT_CONFIGURED' | 'STAGE_QUALIFIES_LEAD_NOT_ALLOWED' | 'STOREFRONT_ZONES_NOT_CONFIGURED' | 'RECONTACTO_NOT_ENABLED' | 'SYNC_QUEUE_UNAVAILABLE' | 'SHARE_IMAGE_UNAVAILABLE' | 'AUDIO_RENDITION_PENDING' | 'MEDIA_SIGNING_UNAVAILABLE' | 'ATTRIBUTION_PROFILE_UNAVAILABLE' | 'DOCUMENT_LOGO_UNAVAILABLE' | 'ATTRIBUTION_PROFILE_MISMATCH' | 'ADS_KEY_NEEDS_REMINT' | 'ADS_ACTION_READ_UNAVAILABLE' | 'ADS_ACTION_REPLAY_BLOCKED' | 'ADS_ACTION_NOT_AVAILABLE' | 'ADS_ACTION_NOT_REVERSIBLE' | 'ADS_ACTION_CONSENT_REQUIRED' | 'GTM_NOT_CONFIGURED' | 'GTM_NOT_CONNECTED' | 'GTM_CONSENT_REQUIRED' | 'GTM_PERMISSION_DENIED' | 'GTM_CONTAINER_REQUIRED' | 'GTM_PENDING_CHANGES' | 'GTM_WORKSPACE_CONFLICT' | 'GTM_WORKSPACE_LIMIT' | 'MISSING_SIGNATURE' | 'MALFORMED_SIGNATURE' | 'STALE_SIGNATURE' | 'INVALID_SIGNATURE' | 'REPLAY_DETECTED' | 'TURNSTILE_UNAVAILABLE' | 'TASADOR_QUOTA_EXHAUSTED' | 'TASADOR_ANON_DAILY_LIMIT' | 'TASADOR_CAPACITY_REACHED' | 'CLINIC_PLAN_REQUIRED' | 'TENANT_BILLING_PAUSED';
272572
+ type ErrorCode = 'VALIDATION_ERROR' | 'NOT_FOUND' | 'UNAUTHORIZED' | 'FORBIDDEN' | 'CONFLICT' | 'ACCOUNT_DELETION_BLOCKED' | 'CONFIRMATION_REQUIRED' | 'VERSION_CONFLICT' | 'UNIQUE_CONFLICT' | 'IDEMPOTENCY_KEY_CONFLICT' | 'VERTICAL_NOT_ENABLED' | 'MODULE_NOT_ENABLED' | 'ENTITLEMENT_NOT_ACTIVE' | 'UNSUPPORTED_VEHICLE_TYPE' | 'VEHICLE_VALUE_OUT_OF_RANGE' | 'PRICE_CHANGE_CONFIRMATION_REQUIRED' | 'NO_OFFERING_ADAPTER' | 'PAYLOAD_TOO_LARGE' | 'UNSUPPORTED_MEDIA_TYPE' | 'UPSTREAM_ERROR' | 'RATE_LIMITED' | 'FINANZAS_SYNC_THROTTLED' | 'FINANZAS_CLAVE_ERROR' | 'GONE' | 'INTERNAL_ERROR' | 'MESSAGING_ACCOUNT_TENANT_MISSING' | 'COPILOT_APPROVALS_UNAVAILABLE' | 'COPILOT_APPROVAL_REPLAY_BLOCKED' | 'COPILOT_DISABLED' | 'COPILOT_BUDGET_EXCEEDED' | 'DEALER_SITES_NOT_CONFIGURED' | 'STAGE_QUALIFIES_LEAD_NOT_ALLOWED' | 'STOREFRONT_ZONES_NOT_CONFIGURED' | 'RECONTACTO_NOT_ENABLED' | 'SYNC_QUEUE_UNAVAILABLE' | 'SHARE_IMAGE_UNAVAILABLE' | 'AUDIO_RENDITION_PENDING' | 'MEDIA_SIGNING_UNAVAILABLE' | 'ATTRIBUTION_PROFILE_UNAVAILABLE' | 'DOCUMENT_LOGO_UNAVAILABLE' | 'ATTRIBUTION_PROFILE_MISMATCH' | 'ADS_KEY_NEEDS_REMINT' | 'ADS_ACTION_READ_UNAVAILABLE' | 'ADS_ACTION_REPLAY_BLOCKED' | 'ADS_ACTION_NOT_AVAILABLE' | 'ADS_ACTION_NOT_REVERSIBLE' | 'ADS_ACTION_CONSENT_REQUIRED' | 'GTM_NOT_CONFIGURED' | 'GTM_NOT_CONNECTED' | 'GTM_CONSENT_REQUIRED' | 'GTM_PERMISSION_DENIED' | 'GTM_CONTAINER_REQUIRED' | 'GTM_PENDING_CHANGES' | 'GTM_WORKSPACE_CONFLICT' | 'GTM_WORKSPACE_LIMIT' | 'MISSING_SIGNATURE' | 'MALFORMED_SIGNATURE' | 'STALE_SIGNATURE' | 'INVALID_SIGNATURE' | 'REPLAY_DETECTED' | 'TURNSTILE_UNAVAILABLE' | 'TASADOR_QUOTA_EXHAUSTED' | 'TASADOR_ANON_DAILY_LIMIT' | 'TASADOR_CAPACITY_REACHED' | 'CLINIC_PLAN_REQUIRED' | 'TENANT_BILLING_PAUSED' | 'WAITING_SUBJECT_CHANGED';
272213
272573
  declare const ERROR_CODES: readonly ErrorCode[];
272214
272574
 
272215
272575
  /**