useyuva 0.0.3 → 0.0.5

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.
@@ -442,7 +442,9 @@ export interface paths {
442
442
  };
443
443
  /**
444
444
  * List members
445
- * @description Scope: `inboxes:read`.
445
+ * @description Every member of the workspace with their `availability` and whether they are `online`.
446
+ *
447
+ * Scope: `inboxes:read`.
446
448
  */
447
449
  get: operations["listMembers"];
448
450
  put?: never;
@@ -812,7 +814,11 @@ export interface paths {
812
814
  };
813
815
  /**
814
816
  * List contacts
815
- * @description Newest first. `q` searches names, e-mail addresses and external ids.
817
+ * @description Newest first, or most recently active first with `sort=last_seen` (contacts never seen sort
818
+ * by when they were created). `q` searches names, e-mail addresses and external ids.
819
+ * With `sort=last_seen`, a contact who becomes active while you page moves above the pages
820
+ * already read and does not appear on the later ones; no contact appears twice.
821
+ * Each item carries `activity`, counted over the inboxes the caller can see.
816
822
  *
817
823
  * Scope: `contacts:read`.
818
824
  */
@@ -940,6 +946,80 @@ export interface paths {
940
946
  patch?: never;
941
947
  trace?: never;
942
948
  };
949
+ "/v1/contacts/{contactId}/notes": {
950
+ parameters: {
951
+ query?: never;
952
+ header?: never;
953
+ path?: never;
954
+ cookie?: never;
955
+ };
956
+ /**
957
+ * List notes about a contact
958
+ * @description Team-only notes about the contact, not tied to a conversation, newest first. Whoever can
959
+ * see the contact can read and add them; contacts never see them, and no event or webhook
960
+ * carries them.
961
+ *
962
+ * Scope: `contacts:read`.
963
+ */
964
+ get: operations["listContactNotes"];
965
+ put?: never;
966
+ /**
967
+ * Add a note about a contact
968
+ * @description Scope: `contacts:write`.
969
+ */
970
+ post: operations["createContactNote"];
971
+ delete?: never;
972
+ options?: never;
973
+ head?: never;
974
+ patch?: never;
975
+ trace?: never;
976
+ };
977
+ "/v1/contacts/{contactId}/notes/{noteId}": {
978
+ parameters: {
979
+ query?: never;
980
+ header?: never;
981
+ path?: never;
982
+ cookie?: never;
983
+ };
984
+ get?: never;
985
+ put?: never;
986
+ post?: never;
987
+ /**
988
+ * Delete a note about a contact
989
+ * @description Its author (a member, or the API key that wrote it) or an owner or admin; anyone else gets
990
+ * `403 forbidden`.
991
+ *
992
+ * Scope: `contacts:write`.
993
+ */
994
+ delete: operations["deleteContactNote"];
995
+ options?: never;
996
+ head?: never;
997
+ patch?: never;
998
+ trace?: never;
999
+ };
1000
+ "/v1/contacts/{contactId}/summary": {
1001
+ parameters: {
1002
+ query?: never;
1003
+ header?: never;
1004
+ path?: never;
1005
+ cookie?: never;
1006
+ };
1007
+ /**
1008
+ * How the team served a contact
1009
+ * @description First-reply time and ratings over the contact's conversations the caller can see. The
1010
+ * counts of conversations are on the contact's `activity`.
1011
+ *
1012
+ * Scope: `contacts:read` and `conversations:read`.
1013
+ */
1014
+ get: operations["getContactSummary"];
1015
+ put?: never;
1016
+ post?: never;
1017
+ delete?: never;
1018
+ options?: never;
1019
+ head?: never;
1020
+ patch?: never;
1021
+ trace?: never;
1022
+ };
943
1023
  "/v1/contacts/{contactId}/presence": {
944
1024
  parameters: {
945
1025
  query?: never;
@@ -1006,8 +1086,8 @@ export interface paths {
1006
1086
  /**
1007
1087
  * Count open conversations
1008
1088
  * @description Open conversations in the inboxes the caller can see: all of them, those assigned to the
1009
- * calling member (`0` for API keys), unassigned ones, and per inbox and per label. Inboxes and
1010
- * labels without open conversations are left out of their lists. Conversations flagged as
1089
+ * calling member (`0` for API keys), unassigned ones, and per inbox, per assignee and per
1090
+ * label. Inboxes, assignees and labels without open conversations are left out of their lists. Conversations flagged as
1011
1091
  * spam are counted only in `spam`.
1012
1092
  *
1013
1093
  * Scope: `conversations:read`.
@@ -1021,6 +1101,36 @@ export interface paths {
1021
1101
  patch?: never;
1022
1102
  trace?: never;
1023
1103
  };
1104
+ "/v1/stats": {
1105
+ parameters: {
1106
+ query?: never;
1107
+ header?: never;
1108
+ path?: never;
1109
+ cookie?: never;
1110
+ };
1111
+ /**
1112
+ * Team activity since a moment
1113
+ * @description What the team did in the inboxes the caller can see (or in one of them) from `since` until
1114
+ * now: replies sent by members (messages members wrote or drafts they sent; not notes, not
1115
+ * bots' own messages), conversations closed, the median time from a contact's first
1116
+ * message to the first member reply, over the conversations whose first reply falls in the
1117
+ * window, and the ratings contacts gave in it. `members` breaks replies and closes down per member, leaving out members with
1118
+ * neither. Nothing is stored for it; it is counted from the messages each time.
1119
+ *
1120
+ * `since` defaults to the start of today in `timezone` (an IANA name, `UTC` by default); the
1121
+ * panel sends the browser's zone. It must be in the past and at most 366 days ago.
1122
+ *
1123
+ * Scope: `conversations:read`.
1124
+ */
1125
+ get: operations["getStats"];
1126
+ put?: never;
1127
+ post?: never;
1128
+ delete?: never;
1129
+ options?: never;
1130
+ head?: never;
1131
+ patch?: never;
1132
+ trace?: never;
1133
+ };
1024
1134
  "/v1/conversations/bulk": {
1025
1135
  parameters: {
1026
1136
  query?: never;
@@ -1305,8 +1415,8 @@ export interface paths {
1305
1415
  /**
1306
1416
  * Get a message's e-mail details
1307
1417
  * @description The full text with the quoted history and signature that the thread hides, the full
1308
- * sanitized HTML, and the headers that matter. Only messages that came or went by e-mail
1309
- * have them; others answer `404`.
1418
+ * sanitized HTML, the original HTML with the sender's styling, and the headers that matter.
1419
+ * Only messages that came or went by e-mail have them; others answer `404`.
1310
1420
  *
1311
1421
  * Scope: `conversations:read`.
1312
1422
  */
@@ -1888,7 +1998,10 @@ export interface paths {
1888
1998
  * admins and API keys (an agent learns of a new inbox from `inbox_access.changed`);
1889
1999
  * `inbox.deleted` reaches everyone who could see the inbox. `conversation.read` reaches only
1890
2000
  * the connections of the member who read. `typing` (a contact or another member typing) has no
1891
- * `id`, is not stored and is not replayed.
2001
+ * `id`, is not stored and is not replayed. `member.presence` (a member of the workspace opened
2002
+ * or closed the panel or changed `availability`) reaches member sessions only, also has no
2003
+ * `id` and is not replayed; so does `viewing` (another member opened or left a conversation),
2004
+ * which follows inbox access like conversation events.
1892
2005
  *
1893
2006
  * A member session's open connection also makes the member available to contacts of `live`
1894
2007
  * inboxes they can access (see `availability` on `/v1/me`).
@@ -1905,8 +2018,10 @@ export interface paths {
1905
2018
  * a text frame `{"type": "viewing", "conversation_id": "<id>"}`, and
1906
2019
  * `{"type": "viewing", "conversation_id": null}` when it shows none or the page is hidden;
1907
2020
  * send it again after every reconnect. While a connection of the member views a
1908
- * conversation, the member gets no push or e-mail notification about it. Other client
1909
- * frames are ignored. Close codes: 1008 (`unauthenticated`, `forbidden`) when the session
2021
+ * conversation, the member gets no push or e-mail notification about it. Other members who
2022
+ * can see the conversation get a `viewing` event when the member opens or leaves it, and
2023
+ * the reporting connection gets a `viewing` event for each other member already there.
2024
+ * Other client frames are ignored. Close codes: 1008 (`unauthenticated`, `forbidden`) when the session
1910
2025
  * or membership ends, 1013 (`slow_consumer`) when the client does not read fast enough, 1012
1911
2026
  * (`restart`) when the server restarts or loses its event feed. Reconnect with
1912
2027
  * `last_event_id` after any of them except 1008. While the server is reconnecting its own event
@@ -2104,6 +2219,31 @@ export interface paths {
2104
2219
  patch?: never;
2105
2220
  trace?: never;
2106
2221
  };
2222
+ "/client/v1/conversations/{conversationId}/rating": {
2223
+ parameters: {
2224
+ query?: never;
2225
+ header?: never;
2226
+ path?: never;
2227
+ cookie?: never;
2228
+ };
2229
+ get?: never;
2230
+ put?: never;
2231
+ /**
2232
+ * Rate a closed conversation
2233
+ * @description Records the contact's rating (`good` or `bad`) and optional comment for a conversation
2234
+ * whose `can_rate` is true. It is stored once per close: members see it in the thread as a
2235
+ * `rated` event and on the conversation, and it sends the `conversation.rated` webhook.
2236
+ * Answers `409 rating_unavailable` when `can_rate` is false (the inbox does not ask for
2237
+ * ratings, the conversation is open, the close is older than 30 days) and
2238
+ * `409 already_rated` when the contact already rated this close.
2239
+ */
2240
+ post: operations["rateClientConversation"];
2241
+ delete?: never;
2242
+ options?: never;
2243
+ head?: never;
2244
+ patch?: never;
2245
+ trace?: never;
2246
+ };
2107
2247
  "/client/v1/conversations/{conversationId}/typing": {
2108
2248
  parameters: {
2109
2249
  query?: never;
@@ -2494,6 +2634,27 @@ export interface webhooks {
2494
2634
  patch?: never;
2495
2635
  trace?: never;
2496
2636
  };
2637
+ "conversation.rated": {
2638
+ parameters: {
2639
+ query?: never;
2640
+ header?: never;
2641
+ path?: never;
2642
+ cookie?: never;
2643
+ };
2644
+ get?: never;
2645
+ put?: never;
2646
+ /**
2647
+ * A contact rated a conversation
2648
+ * @description The contact rated a closed conversation; `conversation.rating` holds the rating and
2649
+ * comment. Sent once per rating, with `conversation.updated` for the same change.
2650
+ */
2651
+ post: operations["webhookConversationRated"];
2652
+ delete?: never;
2653
+ options?: never;
2654
+ head?: never;
2655
+ patch?: never;
2656
+ trace?: never;
2657
+ };
2497
2658
  "conversation.updated": {
2498
2659
  parameters: {
2499
2660
  query?: never;
@@ -2756,9 +2917,72 @@ export interface components {
2756
2917
  email: components["schemas"]["Email"];
2757
2918
  name: string;
2758
2919
  role: components["schemas"]["Role"];
2920
+ availability: components["schemas"]["Availability"];
2921
+ /**
2922
+ * @description The member has a `/v1/realtime` connection seen in the last 75 seconds (any panel tab
2923
+ * or device). `member.presence` events on `/v1/realtime` report changes.
2924
+ */
2925
+ online: boolean;
2759
2926
  /** Format: date-time */
2760
2927
  created_at: string;
2761
2928
  };
2929
+ MemberPresence: {
2930
+ /** Format: uuid */
2931
+ member_id: string;
2932
+ availability: components["schemas"]["Availability"];
2933
+ online: boolean;
2934
+ };
2935
+ Viewing: {
2936
+ /** Format: uuid */
2937
+ member_id: string;
2938
+ /** Format: uuid */
2939
+ conversation_id: string;
2940
+ /** @description `false` when the member no longer has the conversation open anywhere. */
2941
+ viewing: boolean;
2942
+ };
2943
+ /**
2944
+ * @description Another member opened (`viewing: true`) or left a conversation, as their panel reported
2945
+ * with a `viewing` frame; leaving includes hiding the page and disconnecting. Right after a
2946
+ * connection reports a conversation, it also gets one `viewing: true` event for every other
2947
+ * member who already has it open. Not stored: it has no `id` and is not replayed. Sent to
2948
+ * member sessions that can see the conversation's inbox; members do not get their own.
2949
+ */
2950
+ ViewingEvent: {
2951
+ /**
2952
+ * @description discriminator enum property added by openapi-typescript
2953
+ * @enum {string}
2954
+ */
2955
+ type: "viewing";
2956
+ /** Format: uuid */
2957
+ workspace_id: string;
2958
+ /** Format: uuid */
2959
+ inbox_id: string;
2960
+ /** Format: uuid */
2961
+ conversation_id: string;
2962
+ /** Format: date-time */
2963
+ created_at: string;
2964
+ data: components["schemas"]["Viewing"];
2965
+ };
2966
+ /**
2967
+ * @description A member's `availability` or `online` changed (they opened or closed the panel, or set
2968
+ * themselves away). Carries the member's current state, so it may repeat the previous one.
2969
+ * Not stored: it has no `id` and is not replayed; reload `/v1/members` after a reconnect.
2970
+ * A server process that stops without closing its connections sends none: such members
2971
+ * turn offline in `/v1/members` 75 seconds later. Sent to member sessions only, the member's
2972
+ * own included.
2973
+ */
2974
+ MemberPresenceEvent: {
2975
+ /**
2976
+ * @description discriminator enum property added by openapi-typescript
2977
+ * @enum {string}
2978
+ */
2979
+ type: "member.presence";
2980
+ /** Format: uuid */
2981
+ workspace_id: string;
2982
+ /** Format: date-time */
2983
+ created_at: string;
2984
+ data: components["schemas"]["MemberPresence"];
2985
+ };
2762
2986
  MemberList: {
2763
2987
  items: components["schemas"]["Member"][];
2764
2988
  };
@@ -2944,6 +3168,7 @@ export interface components {
2944
3168
  message_in_my_conversation: components["schemas"]["NotificationChannels"];
2945
3169
  message_in_unassigned_conversation: components["schemas"]["NotificationChannels"];
2946
3170
  assigned_to_me: components["schemas"]["NotificationChannels"];
3171
+ mentioned: components["schemas"]["NotificationChannels"];
2947
3172
  };
2948
3173
  /** @description Some events and their channels. */
2949
3174
  NotificationEventsUpdate: {
@@ -2952,6 +3177,7 @@ export interface components {
2952
3177
  message_in_my_conversation?: components["schemas"]["NotificationChannels"];
2953
3178
  message_in_unassigned_conversation?: components["schemas"]["NotificationChannels"];
2954
3179
  assigned_to_me?: components["schemas"]["NotificationChannels"];
3180
+ mentioned?: components["schemas"]["NotificationChannels"];
2955
3181
  };
2956
3182
  NotificationSettings: {
2957
3183
  events: components["schemas"]["NotificationEvents"];
@@ -2986,7 +3212,7 @@ export interface components {
2986
3212
  * @description What caused it (see the `notifications` tag), or `test`.
2987
3213
  * @enum {string}
2988
3214
  */
2989
- event: "new_live_conversation" | "new_async_conversation" | "message_in_my_conversation" | "message_in_unassigned_conversation" | "assigned_to_me" | "test";
3215
+ event: "new_live_conversation" | "new_async_conversation" | "message_in_my_conversation" | "message_in_unassigned_conversation" | "assigned_to_me" | "mentioned" | "test";
2990
3216
  /**
2991
3217
  * @description The inbox name and the contact's name.
2992
3218
  * @example Support · Ayşe Yılmaz
@@ -3096,6 +3322,13 @@ export interface components {
3096
3322
  */
3097
3323
  expected_reply_minutes?: number;
3098
3324
  business_hours: components["schemas"]["BusinessHours"];
3325
+ /**
3326
+ * @description Contacts may rate a closed conversation (`good` or `bad`, with an optional comment):
3327
+ * the widget and the mobile SDKs offer it, and e-mail contacts get a request with two
3328
+ * links after a member's conversation is closed. Off by default. Only conversations
3329
+ * closed after it was turned on can be rated; turning it off and on again starts over.
3330
+ */
3331
+ ask_for_rating: boolean;
3099
3332
  /** Format: date-time */
3100
3333
  created_at: string;
3101
3334
  /** Format: date-time */
@@ -3112,6 +3345,8 @@ export interface components {
3112
3345
  /** Format: int32 */
3113
3346
  expected_reply_minutes?: number;
3114
3347
  business_hours?: components["schemas"]["BusinessHours"];
3348
+ /** @default false */
3349
+ ask_for_rating: boolean;
3115
3350
  };
3116
3351
  InboxUpdate: {
3117
3352
  name?: string;
@@ -3126,6 +3361,7 @@ export interface components {
3126
3361
  */
3127
3362
  expected_reply_minutes?: number | null;
3128
3363
  business_hours?: components["schemas"]["BusinessHours"];
3364
+ ask_for_rating?: boolean;
3129
3365
  };
3130
3366
  InboxCreated: {
3131
3367
  inbox: components["schemas"]["Inbox"];
@@ -3293,11 +3529,75 @@ export interface components {
3293
3529
  locale?: components["schemas"]["LanguageTag"];
3294
3530
  /** @description The contact's addresses that must not be mailed. */
3295
3531
  undeliverable: components["schemas"]["UndeliverableEmail"][];
3532
+ activity?: components["schemas"]["ContactActivity"];
3296
3533
  /** Format: date-time */
3297
3534
  created_at: string;
3298
3535
  /** Format: date-time */
3299
3536
  updated_at: string;
3300
3537
  };
3538
+ /**
3539
+ * @description Only on `GET /v1/contacts` and `GET /v1/contacts/{contactId}`. The counts cover the
3540
+ * conversations the caller can see, spam left out; `last_seen_at` does not depend on the caller.
3541
+ */
3542
+ ContactActivity: {
3543
+ /**
3544
+ * Format: date-time
3545
+ * @description The contact's last activity: a message (any channel), a rating, or use of a widget or
3546
+ * app session. Absent when never active.
3547
+ */
3548
+ last_seen_at?: string;
3549
+ /** Format: int64 */
3550
+ conversations: number;
3551
+ /** Format: int64 */
3552
+ open_conversations: number;
3553
+ /**
3554
+ * Format: date-time
3555
+ * @description The last message in any of those conversations, else when the newest one started.
3556
+ */
3557
+ last_conversation_at?: string;
3558
+ };
3559
+ ContactNote: {
3560
+ /** Format: uuid */
3561
+ id: string;
3562
+ /** Format: uuid */
3563
+ contact_id: string;
3564
+ /** @description A `member` or a `bot` (API key); `member_id` is absent once the member was removed. */
3565
+ author: components["schemas"]["MessageAuthor"];
3566
+ /** @description Plain text. */
3567
+ body: string;
3568
+ /** Format: date-time */
3569
+ created_at: string;
3570
+ };
3571
+ ContactNoteCreate: {
3572
+ body: string;
3573
+ };
3574
+ ContactNotePage: {
3575
+ items: components["schemas"]["ContactNote"][];
3576
+ next_cursor?: string;
3577
+ };
3578
+ /**
3579
+ * @description How the team has served the contact, over all their conversations the caller can see (spam
3580
+ * left out).
3581
+ */
3582
+ ContactSummary: {
3583
+ /**
3584
+ * Format: int64
3585
+ * @description Conversations where a member answered the contact's first message.
3586
+ */
3587
+ first_replies: number;
3588
+ /**
3589
+ * Format: int64
3590
+ * @description Median seconds from the contact's first message to the first member reply; absent when `first_replies` is 0.
3591
+ */
3592
+ median_first_reply_seconds?: number;
3593
+ /** @description The latest rating of each conversation. */
3594
+ ratings: {
3595
+ /** Format: int64 */
3596
+ good: number;
3597
+ /** Format: int64 */
3598
+ bad: number;
3599
+ };
3600
+ };
3301
3601
  ContactPresence: {
3302
3602
  /** Format: uuid */
3303
3603
  contact_id: string;
@@ -3337,7 +3637,7 @@ export interface components {
3337
3637
  count: number;
3338
3638
  };
3339
3639
  /** @enum {string} */
3340
- WebhookEventType: "conversation.created" | "conversation.updated" | "message.created" | "feedback.created" | "contact.updated" | "contact.deleted" | "draft.created" | "draft.updated" | "draft.deleted";
3640
+ WebhookEventType: "conversation.created" | "conversation.updated" | "conversation.rated" | "message.created" | "feedback.created" | "contact.updated" | "contact.deleted" | "draft.created" | "draft.updated" | "draft.deleted";
3341
3641
  WebhookEndpoint: {
3342
3642
  /** Format: uuid */
3343
3643
  id: string;
@@ -3622,11 +3922,30 @@ export interface components {
3622
3922
  * @description The last message or note, or the creation time.
3623
3923
  */
3624
3924
  last_activity_at: string;
3925
+ /**
3926
+ * Format: date-time
3927
+ * @description When it was last closed; absent when it never was.
3928
+ */
3929
+ closed_at?: string;
3930
+ rating?: components["schemas"]["ConversationRating"];
3625
3931
  /** Format: date-time */
3626
3932
  created_at: string;
3627
3933
  /** Format: date-time */
3628
3934
  updated_at: string;
3629
3935
  };
3936
+ /**
3937
+ * @description The contact's latest rating. A conversation can be rated once each time it is closed, so
3938
+ * this may belong to an earlier close (compare `rated_at` with `closed_at`). The thread also
3939
+ * has it as a `rated` event message whose body is the comment.
3940
+ */
3941
+ ConversationRating: {
3942
+ rating: components["schemas"]["Rating"];
3943
+ comment?: string;
3944
+ /** Format: date-time */
3945
+ rated_at: string;
3946
+ };
3947
+ /** @enum {string} */
3948
+ Rating: "good" | "bad";
3630
3949
  ConversationCreate: {
3631
3950
  /** Format: uuid */
3632
3951
  inbox_id: string;
@@ -3738,6 +4057,62 @@ export interface components {
3738
4057
  /** Format: int64 */
3739
4058
  count: number;
3740
4059
  };
4060
+ Stats: {
4061
+ /** Format: date-time */
4062
+ since: string;
4063
+ /**
4064
+ * Format: date-time
4065
+ * @description When it was counted.
4066
+ */
4067
+ until: string;
4068
+ /**
4069
+ * Format: int64
4070
+ * @description Replies sent by members.
4071
+ */
4072
+ replies: number;
4073
+ /**
4074
+ * Format: int64
4075
+ * @description Times a conversation was closed, by anyone (members, API keys, the server).
4076
+ */
4077
+ closed: number;
4078
+ /**
4079
+ * Format: int64
4080
+ * @description Conversations whose first member reply to the contact was sent in the window.
4081
+ */
4082
+ first_replies: number;
4083
+ /**
4084
+ * Format: int64
4085
+ * @description Median seconds from the contact's first message to that reply; absent when `first_replies` is 0.
4086
+ */
4087
+ median_first_reply_seconds?: number;
4088
+ ratings: components["schemas"]["RatingStats"];
4089
+ /** @description Per member, by member id. */
4090
+ members: components["schemas"]["MemberStats"][];
4091
+ };
4092
+ /** @description Ratings contacts gave in the window, in total and per inbox (inboxes without any are left out). */
4093
+ RatingStats: {
4094
+ /** Format: int64 */
4095
+ good: number;
4096
+ /** Format: int64 */
4097
+ bad: number;
4098
+ inboxes: components["schemas"]["InboxRatingStats"][];
4099
+ };
4100
+ InboxRatingStats: {
4101
+ /** Format: uuid */
4102
+ inbox_id: string;
4103
+ /** Format: int64 */
4104
+ good: number;
4105
+ /** Format: int64 */
4106
+ bad: number;
4107
+ };
4108
+ MemberStats: {
4109
+ /** Format: uuid */
4110
+ member_id: string;
4111
+ /** Format: int64 */
4112
+ replies: number;
4113
+ /** Format: int64 */
4114
+ closed: number;
4115
+ };
3741
4116
  /** @description Open conversations in the inboxes the caller can see. */
3742
4117
  ConversationCounts: {
3743
4118
  /**
@@ -3760,6 +4135,11 @@ export interface components {
3760
4135
  unassigned: number;
3761
4136
  /** @description Per inbox id. */
3762
4137
  inboxes: components["schemas"]["CountByID"][];
4138
+ /**
4139
+ * @description Per assignee's member id: each member's open load, for choosing whom to hand a
4140
+ * conversation to. Counts only the inboxes the caller can see.
4141
+ */
4142
+ assignees: components["schemas"]["CountByID"][];
3763
4143
  /** @description Per label id. */
3764
4144
  labels: components["schemas"]["CountByID"][];
3765
4145
  };
@@ -3824,7 +4204,7 @@ export interface components {
3824
4204
  via?: string;
3825
4205
  };
3826
4206
  /** @enum {string} */
3827
- EventType: "assigned" | "unassigned" | "status_changed" | "labels_changed" | "moved";
4207
+ EventType: "assigned" | "unassigned" | "status_changed" | "labels_changed" | "moved" | "rated";
3828
4208
  MessageEvent: {
3829
4209
  type: components["schemas"]["EventType"];
3830
4210
  /**
@@ -3851,6 +4231,8 @@ export interface components {
3851
4231
  * @description The inbox it moved from (`moved`).
3852
4232
  */
3853
4233
  previous_inbox_id?: string;
4234
+ /** @description `rated` only: the contact's rating; the message body is their comment. */
4235
+ rating?: components["schemas"]["Rating"];
3854
4236
  };
3855
4237
  Attachment: {
3856
4238
  /**
@@ -3897,6 +4279,8 @@ export interface components {
3897
4279
  draft: boolean;
3898
4280
  /** @description Who sent a draft (`member` or `bot`); absent for messages that were never drafts. */
3899
4281
  sent_by?: components["schemas"]["MessageAuthor"];
4282
+ /** @description Members a note mentions (notes only; absent when it mentions nobody). */
4283
+ mentions?: string[];
3900
4284
  /**
3901
4285
  * Format: date-time
3902
4286
  * @description For a sent draft, when it was sent.
@@ -3956,7 +4340,16 @@ export interface components {
3956
4340
  full_text: string;
3957
4341
  /** @description The whole HTML part, sanitized. */
3958
4342
  full_html?: string;
3959
- /** @description `full_html` loads images from other servers; block them until the member asks. */
4343
+ /**
4344
+ * @description The whole HTML part of the kept original, built on request and sanitized with a policy
4345
+ * that keeps inline styles limited to an allowlist of CSS properties (no `url(`,
4346
+ * `expression` or `@import` values) and the colour, alignment and size attributes of
4347
+ * tables and `font`; never `<style>` blocks, scripts, forms, frames, stylesheets or event
4348
+ * handlers. `cid:` sources are kept as in `full_html`. Absent when the original is not
4349
+ * kept, has no HTML part or is too large.
4350
+ */
4351
+ original_html?: string;
4352
+ /** @description `full_html` or `original_html` loads images from other servers; block them until the member asks. */
3960
4353
  has_remote_images: boolean;
3961
4354
  in_reply_to?: string;
3962
4355
  references?: string[];
@@ -3979,6 +4372,14 @@ export interface components {
3979
4372
  client_id?: string;
3980
4373
  /** @description Stores an outgoing message as a draft instead of delivering it. */
3981
4374
  draft?: boolean;
4375
+ /**
4376
+ * @description Notes only: members to notify about the note. Each must be a member of the workspace
4377
+ * who can see the conversation's inbox (`400 validation_failed` otherwise). They get the
4378
+ * `mentioned` notification (realtime as `message.created`, Web Push and e-mail per their
4379
+ * notification settings); the author is never notified. The panel shows mentions in the
4380
+ * body as it likes; the server does not parse `@` in the text.
4381
+ */
4382
+ mentions?: string[];
3982
4383
  };
3983
4384
  MessageCreateMultipart: {
3984
4385
  /** @enum {string} */
@@ -3988,6 +4389,8 @@ export interface components {
3988
4389
  html?: string;
3989
4390
  client_id?: string;
3990
4391
  draft?: boolean;
4392
+ /** @description Notes only; repeat the field once per member id. */
4393
+ mentions?: string[];
3991
4394
  files?: string[];
3992
4395
  };
3993
4396
  /** @description Only the fields sent change. */
@@ -4345,7 +4748,7 @@ export interface components {
4345
4748
  id: number;
4346
4749
  };
4347
4750
  /** @description One server message on `/v1/realtime`, told apart by `type`. */
4348
- RealtimeMessage: components["schemas"]["ConversationEvent"] | components["schemas"]["ConversationMovedEvent"] | components["schemas"]["MessageCreatedEvent"] | components["schemas"]["MessageUpdatedEvent"] | components["schemas"]["DraftEvent"] | components["schemas"]["ContactUpdatedEvent"] | components["schemas"]["ContactDeletedEvent"] | components["schemas"]["InboxCreatedEvent"] | components["schemas"]["InboxUpdatedEvent"] | components["schemas"]["InboxDeletedEvent"] | components["schemas"]["InboxAccessChangedEvent"] | components["schemas"]["ConversationReadEvent"] | components["schemas"]["TypingEvent"] | components["schemas"]["RealtimeReady"] | components["schemas"]["RealtimeResyncRequired"];
4751
+ RealtimeMessage: components["schemas"]["ConversationEvent"] | components["schemas"]["ConversationMovedEvent"] | components["schemas"]["MessageCreatedEvent"] | components["schemas"]["MessageUpdatedEvent"] | components["schemas"]["DraftEvent"] | components["schemas"]["ContactUpdatedEvent"] | components["schemas"]["ContactDeletedEvent"] | components["schemas"]["InboxCreatedEvent"] | components["schemas"]["InboxUpdatedEvent"] | components["schemas"]["InboxDeletedEvent"] | components["schemas"]["InboxAccessChangedEvent"] | components["schemas"]["ConversationReadEvent"] | components["schemas"]["TypingEvent"] | components["schemas"]["MemberPresenceEvent"] | components["schemas"]["ViewingEvent"] | components["schemas"]["RealtimeReady"] | components["schemas"]["RealtimeResyncRequired"];
4349
4752
  /**
4350
4753
  * @description `auto`: available in `live` inboxes while connected to `/v1/realtime` within business
4351
4754
  * hours. `away`: never shown as available.
@@ -4565,6 +4968,11 @@ export interface components {
4565
4968
  chat: components["schemas"]["ClientChatSettings"];
4566
4969
  /** @description The categories `POST /client/v1/feedback` accepts, in display order. */
4567
4970
  feedback_categories: components["schemas"]["FeedbackCategory"][];
4971
+ /**
4972
+ * @description The inbox asks contacts to rate closed conversations; offer it where `can_rate` is true
4973
+ * on a conversation.
4974
+ */
4975
+ ask_for_rating: boolean;
4568
4976
  };
4569
4977
  ClientContact: {
4570
4978
  /** Format: uuid */
@@ -4596,6 +5004,9 @@ export interface components {
4596
5004
  /** Format: uuid */
4597
5005
  id: string;
4598
5006
  status: components["schemas"]["ConversationStatus"];
5007
+ /** @description As on `ClientConversation`. */
5008
+ can_rate: boolean;
5009
+ rating?: components["schemas"]["Rating"];
4599
5010
  /** Format: date-time */
4600
5011
  updated_at: string;
4601
5012
  };
@@ -4628,9 +5039,23 @@ export interface components {
4628
5039
  * when no member has read the conversation, and in `async` inboxes.
4629
5040
  */
4630
5041
  last_read_by_member_at?: string;
5042
+ /**
5043
+ * @description The contact may rate it now with `POST /client/v1/conversations/{id}/rating`: the inbox
5044
+ * asks for ratings (`ask_for_rating`), the conversation is closed, was closed at most 30
5045
+ * days ago and after the inbox started asking, and has no rating since it was closed. A message from the contact reopens it,
5046
+ * and the next close allows a new rating.
5047
+ */
5048
+ can_rate: boolean;
5049
+ /** @description The contact's rating since the last close; absent when they have not rated it. */
5050
+ rating?: components["schemas"]["Rating"];
4631
5051
  /** Format: date-time */
4632
5052
  created_at: string;
4633
5053
  };
5054
+ ClientRatingCreate: {
5055
+ rating: components["schemas"]["Rating"];
5056
+ /** @description Optional; blank is the same as absent. */
5057
+ comment?: string;
5058
+ };
4634
5059
  ClientConversationPage: {
4635
5060
  items: components["schemas"]["ClientConversation"][];
4636
5061
  /** @description Absent on the last page. */
@@ -6502,6 +6927,14 @@ export interface operations {
6502
6927
  query?: {
6503
6928
  /** @description Full-text search (Postgres `simple` configuration, `websearch` syntax). */
6504
6929
  q?: components["parameters"]["Search"];
6930
+ /**
6931
+ * @description `known`: the contact has an e-mail address or an external id. `visitor`: neither (an
6932
+ * anonymous widget visitor, or someone known only by a typed, unconfirmed address).
6933
+ */
6934
+ kind?: "known" | "visitor";
6935
+ /** @description Only contacts with (`true`) or without (`false`) an open conversation the caller can see; spam does not count. */
6936
+ has_open?: boolean;
6937
+ sort?: "created" | "last_seen";
6505
6938
  /** @description The `next_cursor` of the previous page. */
6506
6939
  cursor?: components["parameters"]["Cursor"];
6507
6940
  /** @description Page size, 1 to 100; 25 by default. */
@@ -6744,6 +7177,128 @@ export interface operations {
6744
7177
  404: components["responses"]["Problem"];
6745
7178
  };
6746
7179
  };
7180
+ listContactNotes: {
7181
+ parameters: {
7182
+ query?: {
7183
+ /** @description The `next_cursor` of the previous page. */
7184
+ cursor?: components["parameters"]["Cursor"];
7185
+ /** @description Page size, 1 to 100; 25 by default. */
7186
+ limit?: components["parameters"]["Limit"];
7187
+ };
7188
+ header?: {
7189
+ /** @description The workspace to act on; see "Workspace selection". */
7190
+ "Yuva-Workspace"?: components["parameters"]["WorkspaceHeader"];
7191
+ };
7192
+ path: {
7193
+ contactId: components["parameters"]["ContactId"];
7194
+ };
7195
+ cookie?: never;
7196
+ };
7197
+ requestBody?: never;
7198
+ responses: {
7199
+ /** @description A page of notes. */
7200
+ 200: {
7201
+ headers: {
7202
+ [name: string]: unknown;
7203
+ };
7204
+ content: {
7205
+ "application/json": components["schemas"]["ContactNotePage"];
7206
+ };
7207
+ };
7208
+ 400: components["responses"]["Problem"];
7209
+ 401: components["responses"]["Problem"];
7210
+ 403: components["responses"]["Problem"];
7211
+ 404: components["responses"]["Problem"];
7212
+ };
7213
+ };
7214
+ createContactNote: {
7215
+ parameters: {
7216
+ query?: never;
7217
+ header?: {
7218
+ /** @description The workspace to act on; see "Workspace selection". */
7219
+ "Yuva-Workspace"?: components["parameters"]["WorkspaceHeader"];
7220
+ };
7221
+ path: {
7222
+ contactId: components["parameters"]["ContactId"];
7223
+ };
7224
+ cookie?: never;
7225
+ };
7226
+ requestBody: {
7227
+ content: {
7228
+ "application/json": components["schemas"]["ContactNoteCreate"];
7229
+ };
7230
+ };
7231
+ responses: {
7232
+ /** @description The note. */
7233
+ 201: {
7234
+ headers: {
7235
+ [name: string]: unknown;
7236
+ };
7237
+ content: {
7238
+ "application/json": components["schemas"]["ContactNote"];
7239
+ };
7240
+ };
7241
+ 400: components["responses"]["Problem"];
7242
+ 401: components["responses"]["Problem"];
7243
+ 403: components["responses"]["Problem"];
7244
+ 404: components["responses"]["Problem"];
7245
+ };
7246
+ };
7247
+ deleteContactNote: {
7248
+ parameters: {
7249
+ query?: never;
7250
+ header?: {
7251
+ /** @description The workspace to act on; see "Workspace selection". */
7252
+ "Yuva-Workspace"?: components["parameters"]["WorkspaceHeader"];
7253
+ };
7254
+ path: {
7255
+ contactId: components["parameters"]["ContactId"];
7256
+ noteId: string;
7257
+ };
7258
+ cookie?: never;
7259
+ };
7260
+ requestBody?: never;
7261
+ responses: {
7262
+ /** @description Deleted. */
7263
+ 204: {
7264
+ headers: {
7265
+ [name: string]: unknown;
7266
+ };
7267
+ content?: never;
7268
+ };
7269
+ 401: components["responses"]["Problem"];
7270
+ 403: components["responses"]["Problem"];
7271
+ 404: components["responses"]["Problem"];
7272
+ };
7273
+ };
7274
+ getContactSummary: {
7275
+ parameters: {
7276
+ query?: never;
7277
+ header?: {
7278
+ /** @description The workspace to act on; see "Workspace selection". */
7279
+ "Yuva-Workspace"?: components["parameters"]["WorkspaceHeader"];
7280
+ };
7281
+ path: {
7282
+ contactId: components["parameters"]["ContactId"];
7283
+ };
7284
+ cookie?: never;
7285
+ };
7286
+ requestBody?: never;
7287
+ responses: {
7288
+ /** @description The summary. */
7289
+ 200: {
7290
+ headers: {
7291
+ [name: string]: unknown;
7292
+ };
7293
+ content: {
7294
+ "application/json": components["schemas"]["ContactSummary"];
7295
+ };
7296
+ };
7297
+ 401: components["responses"]["Problem"];
7298
+ 403: components["responses"]["Problem"];
7299
+ 404: components["responses"]["Problem"];
7300
+ };
7301
+ };
6747
7302
  getContactPresence: {
6748
7303
  parameters: {
6749
7304
  query?: never;
@@ -6880,6 +7435,40 @@ export interface operations {
6880
7435
  403: components["responses"]["Problem"];
6881
7436
  };
6882
7437
  };
7438
+ getStats: {
7439
+ parameters: {
7440
+ query?: {
7441
+ /** @description Only this inbox (`404` when the caller cannot see it). */
7442
+ inbox_id?: string;
7443
+ /** @description Start of the window; the start of today in `timezone` when absent. */
7444
+ since?: string;
7445
+ /** @description IANA time zone for the default `since`. */
7446
+ timezone?: string;
7447
+ };
7448
+ header?: {
7449
+ /** @description The workspace to act on; see "Workspace selection". */
7450
+ "Yuva-Workspace"?: components["parameters"]["WorkspaceHeader"];
7451
+ };
7452
+ path?: never;
7453
+ cookie?: never;
7454
+ };
7455
+ requestBody?: never;
7456
+ responses: {
7457
+ /** @description The activity. */
7458
+ 200: {
7459
+ headers: {
7460
+ [name: string]: unknown;
7461
+ };
7462
+ content: {
7463
+ "application/json": components["schemas"]["Stats"];
7464
+ };
7465
+ };
7466
+ 400: components["responses"]["Problem"];
7467
+ 401: components["responses"]["Problem"];
7468
+ 403: components["responses"]["Problem"];
7469
+ 404: components["responses"]["Problem"];
7470
+ };
7471
+ };
6883
7472
  bulkUpdateConversations: {
6884
7473
  parameters: {
6885
7474
  query?: never;
@@ -8473,6 +9062,37 @@ export interface operations {
8473
9062
  404: components["responses"]["Problem"];
8474
9063
  };
8475
9064
  };
9065
+ rateClientConversation: {
9066
+ parameters: {
9067
+ query?: never;
9068
+ header?: never;
9069
+ path: {
9070
+ conversationId: components["parameters"]["ConversationId"];
9071
+ };
9072
+ cookie?: never;
9073
+ };
9074
+ requestBody: {
9075
+ content: {
9076
+ "application/json": components["schemas"]["ClientRatingCreate"];
9077
+ };
9078
+ };
9079
+ responses: {
9080
+ /** @description The conversation with its rating. */
9081
+ 201: {
9082
+ headers: {
9083
+ [name: string]: unknown;
9084
+ };
9085
+ content: {
9086
+ "application/json": components["schemas"]["ClientConversation"];
9087
+ };
9088
+ };
9089
+ 400: components["responses"]["Problem"];
9090
+ 401: components["responses"]["Problem"];
9091
+ 403: components["responses"]["Problem"];
9092
+ 404: components["responses"]["Problem"];
9093
+ 409: components["responses"]["Problem"];
9094
+ };
9095
+ };
8476
9096
  setClientTyping: {
8477
9097
  parameters: {
8478
9098
  query?: never;
@@ -8940,6 +9560,39 @@ export interface operations {
8940
9560
  };
8941
9561
  };
8942
9562
  };
9563
+ webhookConversationRated: {
9564
+ parameters: {
9565
+ query?: never;
9566
+ header: {
9567
+ /** @description The delivery's id, the same on every retry; use it to ignore duplicates. */
9568
+ "webhook-id": components["parameters"]["WebhookIdHeader"];
9569
+ /** @description Unix seconds of this attempt. Refuse values far from your clock. */
9570
+ "webhook-timestamp": components["parameters"]["WebhookTimestampHeader"];
9571
+ /**
9572
+ * @description Space-separated `v1,<base64>` signatures: HMAC-SHA256 over
9573
+ * `<webhook-id>.<webhook-timestamp>.<body>` with the base64-decoded part of the
9574
+ * `whsec_` secret (Standard Webhooks). Two during a secret rotation.
9575
+ */
9576
+ "webhook-signature": components["parameters"]["WebhookSignatureHeader"];
9577
+ };
9578
+ path?: never;
9579
+ cookie?: never;
9580
+ };
9581
+ requestBody: {
9582
+ content: {
9583
+ "application/json": components["schemas"]["WebhookConversationPayload"];
9584
+ };
9585
+ };
9586
+ responses: {
9587
+ /** @description Any 2xx answer counts as delivered. */
9588
+ 200: {
9589
+ headers: {
9590
+ [name: string]: unknown;
9591
+ };
9592
+ content?: never;
9593
+ };
9594
+ };
9595
+ };
8943
9596
  webhookConversationUpdated: {
8944
9597
  parameters: {
8945
9598
  query?: never;