featurebase-node 0.8.0 → 0.9.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 (64) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/client.d.mts +3 -1
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +3 -1
  5. package/client.d.ts.map +1 -1
  6. package/client.js.map +1 -1
  7. package/client.mjs.map +1 -1
  8. package/core/pagination.d.mts +15 -0
  9. package/core/pagination.d.mts.map +1 -1
  10. package/core/pagination.d.ts +15 -0
  11. package/core/pagination.d.ts.map +1 -1
  12. package/core/pagination.js +25 -1
  13. package/core/pagination.js.map +1 -1
  14. package/core/pagination.mjs +23 -0
  15. package/core/pagination.mjs.map +1 -1
  16. package/package.json +1 -1
  17. package/resources/support/conversations/conversations.d.mts +810 -8
  18. package/resources/support/conversations/conversations.d.mts.map +1 -1
  19. package/resources/support/conversations/conversations.d.ts +810 -8
  20. package/resources/support/conversations/conversations.d.ts.map +1 -1
  21. package/resources/support/conversations/conversations.js +240 -4
  22. package/resources/support/conversations/conversations.js.map +1 -1
  23. package/resources/support/conversations/conversations.mjs +240 -4
  24. package/resources/support/conversations/conversations.mjs.map +1 -1
  25. package/resources/support/conversations/index.d.mts +1 -2
  26. package/resources/support/conversations/index.d.mts.map +1 -1
  27. package/resources/support/conversations/index.d.ts +1 -2
  28. package/resources/support/conversations/index.d.ts.map +1 -1
  29. package/resources/support/conversations/index.js +1 -3
  30. package/resources/support/conversations/index.js.map +1 -1
  31. package/resources/support/conversations/index.mjs +0 -1
  32. package/resources/support/conversations/index.mjs.map +1 -1
  33. package/resources/support/index.d.mts +1 -1
  34. package/resources/support/index.d.mts.map +1 -1
  35. package/resources/support/index.d.ts +1 -1
  36. package/resources/support/index.d.ts.map +1 -1
  37. package/resources/support/index.js.map +1 -1
  38. package/resources/support/index.mjs.map +1 -1
  39. package/resources/support/support.d.mts +2 -2
  40. package/resources/support/support.d.mts.map +1 -1
  41. package/resources/support/support.d.ts +2 -2
  42. package/resources/support/support.d.ts.map +1 -1
  43. package/resources/support/support.js.map +1 -1
  44. package/resources/support/support.mjs.map +1 -1
  45. package/src/client.ts +13 -1
  46. package/src/core/pagination.ts +49 -0
  47. package/src/resources/support/conversations/conversations.ts +1059 -86
  48. package/src/resources/support/conversations/index.ts +6 -7
  49. package/src/resources/support/index.ts +6 -0
  50. package/src/resources/support/support.ts +12 -0
  51. package/src/version.ts +1 -1
  52. package/version.d.mts +1 -1
  53. package/version.d.ts +1 -1
  54. package/version.js +1 -1
  55. package/version.mjs +1 -1
  56. package/resources/support/conversations/tags.d.mts +0 -200
  57. package/resources/support/conversations/tags.d.mts.map +0 -1
  58. package/resources/support/conversations/tags.d.ts +0 -200
  59. package/resources/support/conversations/tags.d.ts.map +0 -1
  60. package/resources/support/conversations/tags.js +0 -146
  61. package/resources/support/conversations/tags.js.map +0 -1
  62. package/resources/support/conversations/tags.mjs +0 -142
  63. package/resources/support/conversations/tags.mjs.map +0 -1
  64. package/src/resources/support/conversations/tags.ts +0 -260
@@ -5,14 +5,6 @@ import * as ConversationsAPI from './conversations';
5
5
  import * as ConversationTagsAPI from '../conversation-tags';
6
6
  import * as ParticipantsAPI from './participants';
7
7
  import { ParticipantAddParams, ParticipantRemoveParams, Participants } from './participants';
8
- import * as TagsAPI from './tags';
9
- import {
10
- AttachedConversationTag,
11
- ConversationTagMutationActor,
12
- TagAttachParams,
13
- TagDetachParams,
14
- Tags,
15
- } from './tags';
16
8
  import { APIPromise } from '../../../core/api-promise';
17
9
  import { CursorPage, type CursorPageParams, PagePromise } from '../../../core/pagination';
18
10
  import { buildHeaders } from '../../../internal/headers';
@@ -23,7 +15,6 @@ import { path } from '../../../internal/utils/path';
23
15
  * Conversations are messenger/inbox conversations in your Featurebase organization. Use this endpoint to list and retrieve conversation information.
24
16
  */
25
17
  export class Conversations extends APIResource {
26
- tags: TagsAPI.Tags = new TagsAPI.Tags(this._client);
27
18
  participants: ParticipantsAPI.Participants = new ParticipantsAPI.Participants(this._client);
28
19
 
29
20
  /**
@@ -583,6 +574,148 @@ export class Conversations extends APIResource {
583
574
  });
584
575
  }
585
576
 
577
+ /**
578
+ * Attaches a workspace tag to a conversation.
579
+ *
580
+ * This endpoint requires both the tag ID to attach and the `actingAdminId` of the
581
+ * admin on whose behalf the mutation is recorded.
582
+ *
583
+ * ### Path Parameters
584
+ *
585
+ * - `id` - The conversation ID (short ID)
586
+ *
587
+ * ### Request Body
588
+ *
589
+ * | Field | Type | Required | Description |
590
+ * | --------------- | ------ | -------- | ------------------------------------------------------------------------ |
591
+ * | `tagId` | string | Yes | The Featurebase tag ID to attach |
592
+ * | `actingAdminId` | string | Yes | The admin performing the mutation. Must be a member of the organization. |
593
+ *
594
+ * ### Behavior
595
+ *
596
+ * Featurebase resolves the latest taggable reply/message in the conversation and
597
+ * records the tag attachment against that part so audit metadata remains
598
+ * deterministic.
599
+ *
600
+ * ### Response
601
+ *
602
+ * Returns the affected tag plus attachment metadata such as `targetPartId`,
603
+ * `appliedAt`, and `appliedBy`.
604
+ *
605
+ * ### Example Request
606
+ *
607
+ * ```json
608
+ * {
609
+ * "tagId": "67ec1234abcd5678ef901234",
610
+ * "actingAdminId": "507f1f77bcf86cd799439011"
611
+ * }
612
+ * ```
613
+ *
614
+ * ### Version Availability
615
+ *
616
+ * This endpoint is only available in API version 2026-01-01.nova and newer.
617
+ *
618
+ * @example
619
+ * ```ts
620
+ * const response =
621
+ * await client.support.conversations.attachTag('12345', {
622
+ * actingAdminId: '507f1f77bcf86cd799439011',
623
+ * tagId: '67ec1234abcd5678ef901234',
624
+ * });
625
+ * ```
626
+ */
627
+ attachTag(
628
+ id: string,
629
+ params: ConversationAttachTagParams,
630
+ options?: RequestOptions,
631
+ ): APIPromise<ConversationAttachTagResponse> {
632
+ const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
633
+ return this._client.post(path`/v2/conversations/${id}/tags`, {
634
+ body,
635
+ ...options,
636
+ headers: buildHeaders([
637
+ {
638
+ ...(featurebaseVersion?.toString() != null ?
639
+ { 'Featurebase-Version': featurebaseVersion?.toString() }
640
+ : undefined),
641
+ },
642
+ options?.headers,
643
+ ]),
644
+ });
645
+ }
646
+
647
+ /**
648
+ * Removes a workspace tag from a conversation.
649
+ *
650
+ * This endpoint requires the `actingAdminId` of the admin on whose behalf the
651
+ * mutation is recorded.
652
+ *
653
+ * ### Path Parameters
654
+ *
655
+ * - `id` - The conversation ID (short ID)
656
+ * - `tagId` - The Featurebase tag ID to remove
657
+ *
658
+ * ### Request Body
659
+ *
660
+ * | Field | Type | Required | Description |
661
+ * | --------------- | ------ | -------- | ------------------------------------------------------------------------ |
662
+ * | `actingAdminId` | string | Yes | The admin performing the mutation. Must be a member of the organization. |
663
+ *
664
+ * ### Behavior
665
+ *
666
+ * Featurebase resolves the latest taggable reply/message in the conversation and
667
+ * records the tag removal against that part so audit metadata remains
668
+ * deterministic.
669
+ *
670
+ * ### Response
671
+ *
672
+ * Returns the affected tag payload with the most relevant attachment metadata
673
+ * available for that relationship.
674
+ *
675
+ * ### Example Request
676
+ *
677
+ * ```json
678
+ * {
679
+ * "actingAdminId": "507f1f77bcf86cd799439011"
680
+ * }
681
+ * ```
682
+ *
683
+ * ### Version Availability
684
+ *
685
+ * This endpoint is only available in API version 2026-01-01.nova and newer.
686
+ *
687
+ * @example
688
+ * ```ts
689
+ * const response =
690
+ * await client.support.conversations.detachTag(
691
+ * '67ec1234abcd5678ef901234',
692
+ * {
693
+ * id: '12345',
694
+ * actingAdminId: '507f1f77bcf86cd799439011',
695
+ * },
696
+ * );
697
+ * ```
698
+ */
699
+ detachTag(
700
+ tagID: string,
701
+ params: ConversationDetachTagParams,
702
+ options?: RequestOptions,
703
+ ): APIPromise<ConversationDetachTagResponse> {
704
+ const { id, 'Featurebase-Version': featurebaseVersion, ...body } = params;
705
+ return this._client.delete(path`/v2/conversations/${id}/tags/${tagID}`, {
706
+ body,
707
+ ...options,
708
+ headers: buildHeaders([
709
+ {
710
+ ...(featurebaseVersion?.toString() != null ?
711
+ { 'Featurebase-Version': featurebaseVersion?.toString() }
712
+ : undefined),
713
+ },
714
+ options?.headers,
715
+ ]),
716
+ });
717
+ }
718
+
586
719
  /**
587
720
  * Redacts a conversation part (message) from a conversation. Redaction permanently
588
721
  * removes the message content while preserving the conversation structure.
@@ -801,6 +934,115 @@ export class Conversations extends APIResource {
801
934
  ]),
802
935
  });
803
936
  }
937
+
938
+ /**
939
+ * Search conversations with a structured filter AST and an optional full-text
940
+ * query.
941
+ *
942
+ * The endpoint has two modes that are picked automatically from the body:
943
+ *
944
+ * - **Filter mode** (`query` set, `search` omitted): structured filtering against
945
+ * indexed conversation fields. Sorted by `lastActivityAt` desc by default; set
946
+ * `sort` to `last_activity_at:asc` for the inverse.
947
+ * - **Search mode** (`search` set, `query` optional): full-text search across
948
+ * conversation messages, then narrowed by the same `query` AST so the same
949
+ * filters apply. Results are ranked by relevance.
950
+ *
951
+ * ### Structured query AST
952
+ *
953
+ * Each clause has the shape `{ field, operator, value }`. You can pass a single
954
+ * clause or wrap up to 15 in a top-level `AND` group:
955
+ *
956
+ * ```json
957
+ * {
958
+ * "query": {
959
+ * "operator": "AND",
960
+ * "value": [
961
+ * { "field": "state", "operator": "=", "value": "open" },
962
+ * {
963
+ * "field": "admin_assignee_id",
964
+ * "operator": "=",
965
+ * "value": "507f1f77bcf86cd799439011"
966
+ * }
967
+ * ]
968
+ * }
969
+ * }
970
+ * ```
971
+ *
972
+ * Top-level `OR` groups and nested groups are not supported in this version.
973
+ *
974
+ * ### Supported fields and operators
975
+ *
976
+ * | Field | Type | Operators |
977
+ * | ---------------------------- | ------------------------------------------------- | ---------------------- |
978
+ * | `state` | enum (`open` / `closed` / `snoozed`) | `=`, `!=`, `IN`, `NIN` |
979
+ * | `priority` | boolean | `=`, `!=` |
980
+ * | `admin_assignee_id` | id or null (unassigned) | `=`, `!=`, `IN`, `NIN` |
981
+ * | `team_assignee_id` | id or null (unassigned) | `=`, `!=`, `IN`, `NIN` |
982
+ * | `brand_id` | id or null | `=`, `!=`, `IN`, `NIN` |
983
+ * | `tag_ids` | id (matches any conversation containing this tag) | `=`, `!=`, `IN`, `NIN` |
984
+ * | `user_id` / `participant_id` | id of a conversation participant | `=`, `!=`, `IN`, `NIN` |
985
+ * | `mentioned_admin_ids` | admin id | `=`, `!=`, `IN`, `NIN` |
986
+ * | `created_at` | unix seconds | `=`, `>`, `<` |
987
+ *
988
+ * For unbounded fields a query consisting only of `!=` or `NIN` clauses is
989
+ * rejected with `query_too_broad` to prevent full-org scans. Combine the negation
990
+ * with at least one positive clause (`=`, `IN`, `>`, `<`) instead. Bounded enum
991
+ * fields (`state`, `priority`) are exempt because their negation is naturally
992
+ * bounded.
993
+ *
994
+ * ### Pagination
995
+ *
996
+ * Cursor-based, `limit` between 1 and 100 (default 10). Pagination cursors are
997
+ * mode-specific - reusing a filter-mode cursor in search mode (or vice versa)
998
+ * returns `400`. `totalCount` is approximate and capped at 1000;
999
+ * `totalCountCapped` is `true` when the real count may be higher.
1000
+ *
1001
+ * ### Response
1002
+ *
1003
+ * Returns a slim conversation row optimised for inbox / list rendering - just the
1004
+ * fields you need to render a row and link to the conversation. Fetch the full
1005
+ * conversation via `GET /v2/conversations/{id}` when the user opens one.
1006
+ *
1007
+ * Search-specific additions on each row:
1008
+ *
1009
+ * - `conversationUser` - the customer / lead the conversation is with. Use this
1010
+ * for the row identity.
1011
+ * - `latestConversationParts` - capped latest-message preview window. Each
1012
+ * `previewMarkdown` value is truncated server-side; fetch the full conversation
1013
+ * for complete history and full bodies.
1014
+ * - `matchingPartAuthor` - author of the specific message that matched the search
1015
+ * query (search mode only). May be a teammate or bot.
1016
+ * - `matchingPart` - reference to the matched message (search mode only).
1017
+ * - `matchingBodyPreviewMarkdown` - plain-text / markdown preview of the matched
1018
+ * body (search mode only).
1019
+ * - `relevanceScore` - aggregate score (search mode only).
1020
+ *
1021
+ * ### Version Availability
1022
+ *
1023
+ * This endpoint is only available in API version 2026-01-01.nova and newer.
1024
+ *
1025
+ * @example
1026
+ * ```ts
1027
+ * const response =
1028
+ * await client.support.conversations.search();
1029
+ * ```
1030
+ */
1031
+ search(params: ConversationSearchParams, options?: RequestOptions): APIPromise<ConversationSearchResponse> {
1032
+ const { 'Featurebase-Version': featurebaseVersion, ...body } = params;
1033
+ return this._client.post('/v2/conversations/search', {
1034
+ body,
1035
+ ...options,
1036
+ headers: buildHeaders([
1037
+ {
1038
+ ...(featurebaseVersion?.toString() != null ?
1039
+ { 'Featurebase-Version': featurebaseVersion?.toString() }
1040
+ : undefined),
1041
+ },
1042
+ options?.headers,
1043
+ ]),
1044
+ });
1045
+ }
804
1046
  }
805
1047
 
806
1048
  export type ConversationsCursorPage = CursorPage<Conversation>;
@@ -2022,7 +2264,7 @@ export namespace ConversationPart {
2022
2264
  /**
2023
2265
  * Actor that applied the tag
2024
2266
  */
2025
- actor?: TagsAPI.ConversationTagMutationActor;
2267
+ actor?: TagUpdate.Actor;
2026
2268
 
2027
2269
  /**
2028
2270
  * Tag name at the time of the event or the best available current display name
@@ -2035,6 +2277,28 @@ export namespace ConversationPart {
2035
2277
  targetPartId?: string | null;
2036
2278
  }
2037
2279
 
2280
+ export namespace TagUpdate {
2281
+ /**
2282
+ * Actor that applied the tag
2283
+ */
2284
+ export interface Actor {
2285
+ /**
2286
+ * Actor that caused the tag mutation
2287
+ */
2288
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2289
+
2290
+ /**
2291
+ * Actor identifier when available
2292
+ */
2293
+ id?: string | null;
2294
+
2295
+ /**
2296
+ * Actor display name when available
2297
+ */
2298
+ name?: string | null;
2299
+ }
2300
+ }
2301
+
2038
2302
  /**
2039
2303
  * Represents a workflow wait start, finish, or interruption in the conversation
2040
2304
  * thread
@@ -2249,7 +2513,7 @@ export interface ConversationTagApplication {
2249
2513
  /**
2250
2514
  * Actor that applied the tag
2251
2515
  */
2252
- appliedBy?: TagsAPI.ConversationTagMutationActor;
2516
+ appliedBy?: ConversationTagApplication.AppliedBy;
2253
2517
 
2254
2518
  /**
2255
2519
  * ISO timestamp when the tag was removed from this reply, if it was removed
@@ -2259,7 +2523,7 @@ export interface ConversationTagApplication {
2259
2523
  /**
2260
2524
  * Actor that applied the tag
2261
2525
  */
2262
- removedBy?: TagsAPI.ConversationTagMutationActor;
2526
+ removedBy?: ConversationTagApplication.RemovedBy;
2263
2527
 
2264
2528
  /**
2265
2529
  * Resolved tag object when the tag still exists in the shared workspace catalog
@@ -2267,6 +2531,48 @@ export interface ConversationTagApplication {
2267
2531
  tag?: ConversationTagsAPI.ConversationTag;
2268
2532
  }
2269
2533
 
2534
+ export namespace ConversationTagApplication {
2535
+ /**
2536
+ * Actor that applied the tag
2537
+ */
2538
+ export interface AppliedBy {
2539
+ /**
2540
+ * Actor that caused the tag mutation
2541
+ */
2542
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2543
+
2544
+ /**
2545
+ * Actor identifier when available
2546
+ */
2547
+ id?: string | null;
2548
+
2549
+ /**
2550
+ * Actor display name when available
2551
+ */
2552
+ name?: string | null;
2553
+ }
2554
+
2555
+ /**
2556
+ * Actor that applied the tag
2557
+ */
2558
+ export interface RemovedBy {
2559
+ /**
2560
+ * Actor that caused the tag mutation
2561
+ */
2562
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2563
+
2564
+ /**
2565
+ * Actor identifier when available
2566
+ */
2567
+ id?: string | null;
2568
+
2569
+ /**
2570
+ * Actor display name when available
2571
+ */
2572
+ name?: string | null;
2573
+ }
2574
+ }
2575
+
2270
2576
  export interface CsatEmailDelivery {
2271
2577
  /**
2272
2578
  * Email delivery status for the CSAT request when applicable
@@ -2360,128 +2666,670 @@ export interface ConversationDeleteResponse {
2360
2666
  object: 'conversation';
2361
2667
  }
2362
2668
 
2363
- export interface ConversationCreateParams {
2669
+ export interface ConversationAttachTagResponse {
2364
2670
  /**
2365
- * Body param: The content of the initial message in markdown format. Images
2366
- * referenced by URL or as base64 data URIs will be automatically uploaded and
2367
- * stored.
2671
+ * Unique tag identifier
2368
2672
  */
2369
- bodyMarkdown: string;
2673
+ id: string;
2370
2674
 
2371
2675
  /**
2372
- * Body param: The author initiating the conversation. Use type "contact" for
2373
- * customer/lead or "admin" for outreach.
2676
+ * Current tag name
2374
2677
  */
2375
- from: ConversationCreateParams.ContactFrom | ConversationCreateParams.AdminFrom;
2678
+ name: string;
2376
2679
 
2377
2680
  /**
2378
- * Body param: The channel for the conversation. Defaults to "desktop"
2379
- * (SDK/widget).
2681
+ * Object type identifier for a tag
2380
2682
  */
2381
- channel?: 'desktop' | 'email';
2683
+ type: 'tag';
2382
2684
 
2383
2685
  /**
2384
- * Body param: The time the conversation was created as an ISO timestamp. If not
2385
- * provided, the current time will be used. This field is recommended for migrating
2386
- * past conversations from another source.
2686
+ * ISO timestamp when the tag was applied
2387
2687
  */
2388
- createdAt?: string | null;
2688
+ appliedAt?: string | null;
2389
2689
 
2390
2690
  /**
2391
- * Body param: Recipients for admin-initiated outreach. Required when from.type is
2392
- * "admin". Specify at least one recipient in the "to" field.
2691
+ * Actor that applied the tag
2393
2692
  */
2394
- recipients?: ConversationCreateParams.Recipients;
2693
+ appliedBy?: ConversationAttachTagResponse.AppliedBy | null;
2395
2694
 
2396
2695
  /**
2397
- * Body param: Subject line for the email. Required when channel is "email" and
2398
- * from.type is "admin".
2696
+ * ISO timestamp when the tag was removed, if applicable
2399
2697
  */
2400
- subject?: string;
2698
+ removedAt?: string | null;
2401
2699
 
2402
2700
  /**
2403
- * Header param: API version for this request. Defaults to your organization's
2404
- * configured API version if not specified.
2701
+ * Actor that applied the tag
2405
2702
  */
2406
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
2407
- }
2703
+ removedBy?: ConversationAttachTagResponse.RemovedBy | null;
2408
2704
 
2409
- export namespace ConversationCreateParams {
2410
2705
  /**
2411
- * Conversation initiated by a contact
2706
+ * Reply/message ID used as the deterministic attachment target for this
2707
+ * conversation tag mutation.
2412
2708
  */
2413
- export interface ContactFrom {
2414
- /**
2415
- * The Featurebase contact ID
2416
- */
2417
- id: string;
2709
+ targetPartId?: string | null;
2710
+ }
2418
2711
 
2712
+ export namespace ConversationAttachTagResponse {
2713
+ /**
2714
+ * Actor that applied the tag
2715
+ */
2716
+ export interface AppliedBy {
2419
2717
  /**
2420
- * The type of author. Use "contact" for customer/lead initiated conversations.
2718
+ * Actor that caused the tag mutation
2421
2719
  */
2422
- type: 'contact';
2423
- }
2720
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2424
2721
 
2425
- /**
2426
- * Conversation initiated by an admin (outreach)
2427
- */
2428
- export interface AdminFrom {
2429
2722
  /**
2430
- * The Featurebase admin ID
2723
+ * Actor identifier when available
2431
2724
  */
2432
- id: string;
2725
+ id?: string | null;
2433
2726
 
2434
2727
  /**
2435
- * The type of author. Use "admin" for admin initiated outreach conversations.
2728
+ * Actor display name when available
2436
2729
  */
2437
- type: 'admin';
2730
+ name?: string | null;
2438
2731
  }
2439
2732
 
2440
2733
  /**
2441
- * Recipients for admin-initiated outreach. Required when from.type is "admin".
2442
- * Specify at least one recipient in the "to" field.
2734
+ * Actor that applied the tag
2443
2735
  */
2444
- export interface Recipients {
2736
+ export interface RemovedBy {
2445
2737
  /**
2446
- * Primary recipients (To field)
2738
+ * Actor that caused the tag mutation
2447
2739
  */
2448
- to: ConversationsAPI.EmailRecipients;
2740
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2449
2741
 
2450
2742
  /**
2451
- * Primary recipients (To field)
2743
+ * Actor identifier when available
2452
2744
  */
2453
- bcc?: ConversationsAPI.EmailRecipients;
2745
+ id?: string | null;
2454
2746
 
2455
2747
  /**
2456
- * Primary recipients (To field)
2748
+ * Actor display name when available
2457
2749
  */
2458
- cc?: ConversationsAPI.EmailRecipients;
2750
+ name?: string | null;
2459
2751
  }
2460
2752
  }
2461
2753
 
2462
- export interface ConversationRetrieveParams {
2754
+ export interface ConversationDetachTagResponse {
2463
2755
  /**
2464
- * API version for this request. Defaults to your organization's configured API
2465
- * version if not specified.
2756
+ * Unique tag identifier
2466
2757
  */
2467
- 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
2468
- }
2758
+ id: string;
2469
2759
 
2470
- export interface ConversationUpdateParams {
2471
2760
  /**
2472
- * Body param: The admin ID performing this action. Changes will be attributed to
2473
- * this admin. If not provided, changes are attributed to the system bot user. The
2474
- * admin must be a member of the organization.
2761
+ * Current tag name
2475
2762
  */
2476
- actingAdminId?: string;
2763
+ name: string;
2477
2764
 
2478
2765
  /**
2479
- * Body param: The admin ID to assign the conversation to, or null to unassign.
2766
+ * Object type identifier for a tag
2480
2767
  */
2481
- adminAssigneeId?: string | null;
2768
+ type: 'tag';
2482
2769
 
2483
2770
  /**
2484
- * Body param: Custom attributes to set on the conversation. Uses the same
2771
+ * ISO timestamp when the tag was applied
2772
+ */
2773
+ appliedAt?: string | null;
2774
+
2775
+ /**
2776
+ * Actor that applied the tag
2777
+ */
2778
+ appliedBy?: ConversationDetachTagResponse.AppliedBy | null;
2779
+
2780
+ /**
2781
+ * ISO timestamp when the tag was removed, if applicable
2782
+ */
2783
+ removedAt?: string | null;
2784
+
2785
+ /**
2786
+ * Actor that applied the tag
2787
+ */
2788
+ removedBy?: ConversationDetachTagResponse.RemovedBy | null;
2789
+
2790
+ /**
2791
+ * Reply/message ID used as the deterministic attachment target for this
2792
+ * conversation tag mutation.
2793
+ */
2794
+ targetPartId?: string | null;
2795
+ }
2796
+
2797
+ export namespace ConversationDetachTagResponse {
2798
+ /**
2799
+ * Actor that applied the tag
2800
+ */
2801
+ export interface AppliedBy {
2802
+ /**
2803
+ * Actor that caused the tag mutation
2804
+ */
2805
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2806
+
2807
+ /**
2808
+ * Actor identifier when available
2809
+ */
2810
+ id?: string | null;
2811
+
2812
+ /**
2813
+ * Actor display name when available
2814
+ */
2815
+ name?: string | null;
2816
+ }
2817
+
2818
+ /**
2819
+ * Actor that applied the tag
2820
+ */
2821
+ export interface RemovedBy {
2822
+ /**
2823
+ * Actor that caused the tag mutation
2824
+ */
2825
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'integration' | 'system' | 'workflow';
2826
+
2827
+ /**
2828
+ * Actor identifier when available
2829
+ */
2830
+ id?: string | null;
2831
+
2832
+ /**
2833
+ * Actor display name when available
2834
+ */
2835
+ name?: string | null;
2836
+ }
2837
+ }
2838
+
2839
+ export interface ConversationSearchResponse {
2840
+ /**
2841
+ * Array of search results
2842
+ */
2843
+ data: Array<ConversationSearchResponse.Data>;
2844
+
2845
+ /**
2846
+ * Cursor for fetching the next page (null if no more results)
2847
+ */
2848
+ nextCursor: string | null;
2849
+
2850
+ /**
2851
+ * Object type identifier
2852
+ */
2853
+ object: 'list';
2854
+
2855
+ /**
2856
+ * Total number of conversations matching the query, capped at 200. When the actual
2857
+ * total is at or above the cap, `totalCountCapped` is true and the value is
2858
+ * exactly the cap.
2859
+ */
2860
+ totalCount?: number;
2861
+
2862
+ /**
2863
+ * True when totalCount is exactly the cap and the real count is `>= totalCount`.
2864
+ * UI may render as "200+".
2865
+ */
2866
+ totalCountCapped?: boolean;
2867
+ }
2868
+
2869
+ export namespace ConversationSearchResponse {
2870
+ export interface Data {
2871
+ /**
2872
+ * Unique conversation identifier
2873
+ */
2874
+ id: string;
2875
+
2876
+ /**
2877
+ * ID of the assigned admin
2878
+ */
2879
+ adminAssigneeId: string | null;
2880
+
2881
+ /**
2882
+ * ID of the brand associated with this conversation
2883
+ */
2884
+ brandId: string | null;
2885
+
2886
+ /**
2887
+ * ISO timestamp when conversation was created
2888
+ */
2889
+ createdAt: string;
2890
+
2891
+ /**
2892
+ * ISO timestamp of last activity
2893
+ */
2894
+ lastActivityAt: string | null;
2895
+
2896
+ /**
2897
+ * Object type identifier
2898
+ */
2899
+ object: 'conversation';
2900
+
2901
+ /**
2902
+ * Participants in this conversation
2903
+ */
2904
+ participants: Array<ConversationsAPI.ConversationParticipant>;
2905
+
2906
+ /**
2907
+ * Whether this conversation is marked as priority
2908
+ */
2909
+ priority: boolean;
2910
+
2911
+ /**
2912
+ * ISO timestamp when priority was set
2913
+ */
2914
+ prioritySetAt: string | null;
2915
+
2916
+ /**
2917
+ * Current state of the conversation
2918
+ */
2919
+ state: 'open' | 'closed' | 'snoozed';
2920
+
2921
+ /**
2922
+ * Current tags applied anywhere in this conversation
2923
+ */
2924
+ tags: Array<ConversationTagsAPI.ConversationTag>;
2925
+
2926
+ /**
2927
+ * ID of the assigned team
2928
+ */
2929
+ teamAssigneeId: string | null;
2930
+
2931
+ /**
2932
+ * ISO timestamp when conversation was last updated
2933
+ */
2934
+ updatedAt: string;
2935
+
2936
+ /**
2937
+ * Whether we are awaiting a customer reply
2938
+ */
2939
+ awaitingCustomerReply?: boolean;
2940
+
2941
+ /**
2942
+ * The customer or lead the conversation is with. Use this for the row identity;
2943
+ * use `matchingPartAuthor` if you specifically want the message author.
2944
+ */
2945
+ conversationUser?: Data.ConversationUser | null;
2946
+
2947
+ /**
2948
+ * Latest conversation messages for lightweight timeline previews. Capped and
2949
+ * truncated by the server; fetch the full conversation for complete message
2950
+ * history.
2951
+ */
2952
+ latestConversationParts?: Array<Data.LatestConversationPart>;
2953
+
2954
+ /**
2955
+ * Plain-text / markdown preview of the matching conversation part body (search
2956
+ * mode only)
2957
+ */
2958
+ matchingBodyPreviewMarkdown?: string | null;
2959
+
2960
+ /**
2961
+ * Reference to the conversation part that best matched the search query (search
2962
+ * mode only)
2963
+ */
2964
+ matchingPart?: Data.MatchingPart | null;
2965
+
2966
+ /**
2967
+ * The customer or lead the conversation is with. Use this for the row identity;
2968
+ * use `matchingPartAuthor` if you specifically want the message author.
2969
+ */
2970
+ matchingPartAuthor?: Data.MatchingPartAuthor | null;
2971
+
2972
+ /**
2973
+ * Aggregate relevance score for the conversation (search mode only). Higher is
2974
+ * more relevant.
2975
+ */
2976
+ relevanceScore?: number | null;
2977
+
2978
+ source?: Data.Source;
2979
+
2980
+ /**
2981
+ * Conversation title
2982
+ */
2983
+ title?: string;
2984
+ }
2985
+
2986
+ export namespace Data {
2987
+ /**
2988
+ * The customer or lead the conversation is with. Use this for the row identity;
2989
+ * use `matchingPartAuthor` if you specifically want the message author.
2990
+ */
2991
+ export interface ConversationUser {
2992
+ /**
2993
+ * Author id
2994
+ */
2995
+ id: string;
2996
+
2997
+ /**
2998
+ * Author type
2999
+ */
3000
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3001
+
3002
+ /**
3003
+ * Companies the author belongs to (customers only)
3004
+ */
3005
+ companies?: Array<ConversationUser.Company>;
3006
+
3007
+ /**
3008
+ * Email when known
3009
+ */
3010
+ email?: string | null;
3011
+
3012
+ /**
3013
+ * Display name when known
3014
+ */
3015
+ name?: string | null;
3016
+
3017
+ /**
3018
+ * Profile picture URL when known
3019
+ */
3020
+ profilePicture?: string | null;
3021
+ }
3022
+
3023
+ export namespace ConversationUser {
3024
+ export interface Company {
3025
+ id: string;
3026
+
3027
+ name?: string;
3028
+ }
3029
+ }
3030
+
3031
+ export interface LatestConversationPart {
3032
+ /**
3033
+ * Conversation part id
3034
+ */
3035
+ id: string;
3036
+
3037
+ /**
3038
+ * Plain-text truncated preview of the part body
3039
+ */
3040
+ previewMarkdown: string | null;
3041
+
3042
+ /**
3043
+ * True when previewMarkdown was truncated by the server
3044
+ */
3045
+ previewMarkdownTruncated: boolean;
3046
+
3047
+ /**
3048
+ * The customer or lead the conversation is with. Use this for the row identity;
3049
+ * use `matchingPartAuthor` if you specifically want the message author.
3050
+ */
3051
+ author?: LatestConversationPart.Author | null;
3052
+
3053
+ /**
3054
+ * ISO timestamp when the part was created
3055
+ */
3056
+ createdAt?: string | null;
3057
+
3058
+ /**
3059
+ * Conversation part type
3060
+ */
3061
+ partType?: string;
3062
+ }
3063
+
3064
+ export namespace LatestConversationPart {
3065
+ /**
3066
+ * The customer or lead the conversation is with. Use this for the row identity;
3067
+ * use `matchingPartAuthor` if you specifically want the message author.
3068
+ */
3069
+ export interface Author {
3070
+ /**
3071
+ * Author id
3072
+ */
3073
+ id: string;
3074
+
3075
+ /**
3076
+ * Author type
3077
+ */
3078
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3079
+
3080
+ /**
3081
+ * Companies the author belongs to (customers only)
3082
+ */
3083
+ companies?: Array<Author.Company>;
3084
+
3085
+ /**
3086
+ * Email when known
3087
+ */
3088
+ email?: string | null;
3089
+
3090
+ /**
3091
+ * Display name when known
3092
+ */
3093
+ name?: string | null;
3094
+
3095
+ /**
3096
+ * Profile picture URL when known
3097
+ */
3098
+ profilePicture?: string | null;
3099
+ }
3100
+
3101
+ export namespace Author {
3102
+ export interface Company {
3103
+ id: string;
3104
+
3105
+ name?: string;
3106
+ }
3107
+ }
3108
+ }
3109
+
3110
+ /**
3111
+ * Reference to the conversation part that best matched the search query (search
3112
+ * mode only)
3113
+ */
3114
+ export interface MatchingPart {
3115
+ /**
3116
+ * Conversation part id
3117
+ */
3118
+ id: string;
3119
+
3120
+ /**
3121
+ * ISO timestamp when the matching part was created
3122
+ */
3123
+ createdAt?: string | null;
3124
+
3125
+ /**
3126
+ * Conversation part type
3127
+ */
3128
+ partType?: string;
3129
+ }
3130
+
3131
+ /**
3132
+ * The customer or lead the conversation is with. Use this for the row identity;
3133
+ * use `matchingPartAuthor` if you specifically want the message author.
3134
+ */
3135
+ export interface MatchingPartAuthor {
3136
+ /**
3137
+ * Author id
3138
+ */
3139
+ id: string;
3140
+
3141
+ /**
3142
+ * Author type
3143
+ */
3144
+ type: 'admin' | 'customer' | 'lead' | 'bot' | 'guest' | 'integration';
3145
+
3146
+ /**
3147
+ * Companies the author belongs to (customers only)
3148
+ */
3149
+ companies?: Array<MatchingPartAuthor.Company>;
3150
+
3151
+ /**
3152
+ * Email when known
3153
+ */
3154
+ email?: string | null;
3155
+
3156
+ /**
3157
+ * Display name when known
3158
+ */
3159
+ name?: string | null;
3160
+
3161
+ /**
3162
+ * Profile picture URL when known
3163
+ */
3164
+ profilePicture?: string | null;
3165
+ }
3166
+
3167
+ export namespace MatchingPartAuthor {
3168
+ export interface Company {
3169
+ id: string;
3170
+
3171
+ name?: string;
3172
+ }
3173
+ }
3174
+
3175
+ export interface Source {
3176
+ /**
3177
+ * Body of the initial message as HTML with signed image URLs
3178
+ */
3179
+ bodyHtml: string;
3180
+
3181
+ /**
3182
+ * Body of the initial message as markdown
3183
+ */
3184
+ bodyMarkdown: string;
3185
+
3186
+ /**
3187
+ * Channel through which the conversation was initiated
3188
+ */
3189
+ channel: 'unknown' | 'desktop' | 'android' | 'ios' | 'email';
3190
+
3191
+ author?: ConversationsAPI.ConversationParticipant;
3192
+
3193
+ /**
3194
+ * How the conversation was initiated
3195
+ */
3196
+ deliveredAs?: 'customer_initiated' | 'admin_initiated';
3197
+
3198
+ /**
3199
+ * Subject line for email conversations
3200
+ */
3201
+ subject?: string;
3202
+
3203
+ /**
3204
+ * URL where the conversation was initiated
3205
+ */
3206
+ url?: string;
3207
+ }
3208
+ }
3209
+ }
3210
+
3211
+ export interface ConversationCreateParams {
3212
+ /**
3213
+ * Body param: The content of the initial message in markdown format. Images
3214
+ * referenced by URL or as base64 data URIs will be automatically uploaded and
3215
+ * stored.
3216
+ */
3217
+ bodyMarkdown: string;
3218
+
3219
+ /**
3220
+ * Body param: The author initiating the conversation. Use type "contact" for
3221
+ * customer/lead or "admin" for outreach.
3222
+ */
3223
+ from: ConversationCreateParams.ContactFrom | ConversationCreateParams.AdminFrom;
3224
+
3225
+ /**
3226
+ * Body param: The channel for the conversation. Defaults to "desktop"
3227
+ * (SDK/widget).
3228
+ */
3229
+ channel?: 'desktop' | 'email';
3230
+
3231
+ /**
3232
+ * Body param: The time the conversation was created as an ISO timestamp. If not
3233
+ * provided, the current time will be used. This field is recommended for migrating
3234
+ * past conversations from another source.
3235
+ */
3236
+ createdAt?: string | null;
3237
+
3238
+ /**
3239
+ * Body param: Recipients for admin-initiated outreach. Required when from.type is
3240
+ * "admin". Specify at least one recipient in the "to" field.
3241
+ */
3242
+ recipients?: ConversationCreateParams.Recipients;
3243
+
3244
+ /**
3245
+ * Body param: Subject line for the email. Required when channel is "email" and
3246
+ * from.type is "admin".
3247
+ */
3248
+ subject?: string;
3249
+
3250
+ /**
3251
+ * Header param: API version for this request. Defaults to your organization's
3252
+ * configured API version if not specified.
3253
+ */
3254
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3255
+ }
3256
+
3257
+ export namespace ConversationCreateParams {
3258
+ /**
3259
+ * Conversation initiated by a contact
3260
+ */
3261
+ export interface ContactFrom {
3262
+ /**
3263
+ * The Featurebase contact ID
3264
+ */
3265
+ id: string;
3266
+
3267
+ /**
3268
+ * The type of author. Use "contact" for customer/lead initiated conversations.
3269
+ */
3270
+ type: 'contact';
3271
+ }
3272
+
3273
+ /**
3274
+ * Conversation initiated by an admin (outreach)
3275
+ */
3276
+ export interface AdminFrom {
3277
+ /**
3278
+ * The Featurebase admin ID
3279
+ */
3280
+ id: string;
3281
+
3282
+ /**
3283
+ * The type of author. Use "admin" for admin initiated outreach conversations.
3284
+ */
3285
+ type: 'admin';
3286
+ }
3287
+
3288
+ /**
3289
+ * Recipients for admin-initiated outreach. Required when from.type is "admin".
3290
+ * Specify at least one recipient in the "to" field.
3291
+ */
3292
+ export interface Recipients {
3293
+ /**
3294
+ * Primary recipients (To field)
3295
+ */
3296
+ to: ConversationsAPI.EmailRecipients;
3297
+
3298
+ /**
3299
+ * Primary recipients (To field)
3300
+ */
3301
+ bcc?: ConversationsAPI.EmailRecipients;
3302
+
3303
+ /**
3304
+ * Primary recipients (To field)
3305
+ */
3306
+ cc?: ConversationsAPI.EmailRecipients;
3307
+ }
3308
+ }
3309
+
3310
+ export interface ConversationRetrieveParams {
3311
+ /**
3312
+ * API version for this request. Defaults to your organization's configured API
3313
+ * version if not specified.
3314
+ */
3315
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3316
+ }
3317
+
3318
+ export interface ConversationUpdateParams {
3319
+ /**
3320
+ * Body param: The admin ID performing this action. Changes will be attributed to
3321
+ * this admin. If not provided, changes are attributed to the system bot user. The
3322
+ * admin must be a member of the organization.
3323
+ */
3324
+ actingAdminId?: string;
3325
+
3326
+ /**
3327
+ * Body param: The admin ID to assign the conversation to, or null to unassign.
3328
+ */
3329
+ adminAssigneeId?: string | null;
3330
+
3331
+ /**
3332
+ * Body param: Custom attributes to set on the conversation. Uses the same
2485
3333
  * validation as v1 API.
2486
3334
  */
2487
3335
  customAttributes?: { [key: string]: unknown };
@@ -2572,6 +3420,44 @@ export interface ConversationDeleteParams {
2572
3420
  'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
2573
3421
  }
2574
3422
 
3423
+ export interface ConversationAttachTagParams {
3424
+ /**
3425
+ * Body param: Required admin ID performing this tag attachment. Must be a member
3426
+ * of the organization so the mutation can be attributed to a real admin actor.
3427
+ */
3428
+ actingAdminId: string;
3429
+
3430
+ /**
3431
+ * Body param: The Featurebase tag ID to attach to the conversation.
3432
+ */
3433
+ tagId: string;
3434
+
3435
+ /**
3436
+ * Header param: API version for this request. Defaults to your organization's
3437
+ * configured API version if not specified.
3438
+ */
3439
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3440
+ }
3441
+
3442
+ export interface ConversationDetachTagParams {
3443
+ /**
3444
+ * Path param: Conversation ID (short ID)
3445
+ */
3446
+ id: string;
3447
+
3448
+ /**
3449
+ * Body param: Required admin ID performing this tag removal. Must be a member of
3450
+ * the organization so the mutation can be attributed to a real admin actor.
3451
+ */
3452
+ actingAdminId: string;
3453
+
3454
+ /**
3455
+ * Header param: API version for this request. Defaults to your organization's
3456
+ * configured API version if not specified.
3457
+ */
3458
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3459
+ }
3460
+
2575
3461
  export interface ConversationRedactParams {
2576
3462
  /**
2577
3463
  * Body param: The conversation short ID that contains the part to redact
@@ -2686,7 +3572,96 @@ export declare namespace ConversationReplyParams {
2686
3572
  }
2687
3573
  }
2688
3574
 
2689
- Conversations.Tags = Tags;
3575
+ export interface ConversationSearchParams {
3576
+ /**
3577
+ * Body param: An opaque cursor for pagination. Use the nextCursor value from a
3578
+ * previous response to fetch the next page of results.
3579
+ */
3580
+ cursor?: string;
3581
+
3582
+ /**
3583
+ * Body param: A limit on the number of objects to be returned, between 1 and 100.
3584
+ */
3585
+ limit?: number;
3586
+
3587
+ /**
3588
+ * Body param: Structured filter AST. Either a single filter clause or one
3589
+ * top-level AND group. Use this for filtering by `state`, `tag_ids`,
3590
+ * `admin_assignee_id`, etc.
3591
+ */
3592
+ query?:
3593
+ | ConversationSearchParams.ConversationSearchFilter
3594
+ | ConversationSearchParams.ConversationSearchFilterGroup;
3595
+
3596
+ /**
3597
+ * Body param: Plain-text full-text search across conversation messages.
3598
+ * Server-managed - no operators, no field selection.
3599
+ */
3600
+ search?: string;
3601
+
3602
+ /**
3603
+ * Body param: Sort direction for filter mode (ignored in search mode where results
3604
+ * are sorted by relevance). Defaults to last_activity_at:desc.
3605
+ */
3606
+ sort?: 'last_activity_at:desc' | 'last_activity_at:asc';
3607
+
3608
+ /**
3609
+ * Header param: API version for this request. Defaults to your organization's
3610
+ * configured API version if not specified.
3611
+ */
3612
+ 'Featurebase-Version'?: '2026-01-01.nova' | '2025-12-12.clover';
3613
+ }
3614
+
3615
+ export namespace ConversationSearchParams {
3616
+ export interface ConversationSearchFilter {
3617
+ /**
3618
+ * Field name to filter on (e.g. `state`, `tag_ids`, `created_at`)
3619
+ */
3620
+ field: string;
3621
+
3622
+ /**
3623
+ * Comparison operator
3624
+ */
3625
+ operator: '=' | '!=' | 'IN' | 'NIN' | '>' | '<' | '~' | '!~' | '^' | '$';
3626
+
3627
+ /**
3628
+ * Value to compare against (primitive or array of primitives)
3629
+ */
3630
+ value: string | number | boolean | Array<string | number> | null;
3631
+ }
3632
+
3633
+ export interface ConversationSearchFilterGroup {
3634
+ /**
3635
+ * Group operator: AND (all match) or OR (any match)
3636
+ */
3637
+ operator: 'AND' | 'OR';
3638
+
3639
+ /**
3640
+ * Array of filter clauses (1-15 entries)
3641
+ */
3642
+ value: Array<ConversationSearchFilterGroup.Value>;
3643
+ }
3644
+
3645
+ export namespace ConversationSearchFilterGroup {
3646
+ export interface Value {
3647
+ /**
3648
+ * Field name to filter on (e.g. `state`, `tag_ids`, `created_at`)
3649
+ */
3650
+ field: string;
3651
+
3652
+ /**
3653
+ * Comparison operator
3654
+ */
3655
+ operator: '=' | '!=' | 'IN' | 'NIN' | '>' | '<' | '~' | '!~' | '^' | '$';
3656
+
3657
+ /**
3658
+ * Value to compare against (primitive or array of primitives)
3659
+ */
3660
+ value: string | number | boolean | Array<string | number> | null;
3661
+ }
3662
+ }
3663
+ }
3664
+
2690
3665
  Conversations.Participants = Participants;
2691
3666
 
2692
3667
  export declare namespace Conversations {
@@ -2701,22 +3676,20 @@ export declare namespace Conversations {
2701
3676
  type CsatWorkflowLink as CsatWorkflowLink,
2702
3677
  type EmailRecipients as EmailRecipients,
2703
3678
  type ConversationDeleteResponse as ConversationDeleteResponse,
3679
+ type ConversationAttachTagResponse as ConversationAttachTagResponse,
3680
+ type ConversationDetachTagResponse as ConversationDetachTagResponse,
3681
+ type ConversationSearchResponse as ConversationSearchResponse,
2704
3682
  type ConversationsCursorPage as ConversationsCursorPage,
2705
3683
  type ConversationCreateParams as ConversationCreateParams,
2706
3684
  type ConversationRetrieveParams as ConversationRetrieveParams,
2707
3685
  type ConversationUpdateParams as ConversationUpdateParams,
2708
3686
  type ConversationListParams as ConversationListParams,
2709
3687
  type ConversationDeleteParams as ConversationDeleteParams,
3688
+ type ConversationAttachTagParams as ConversationAttachTagParams,
3689
+ type ConversationDetachTagParams as ConversationDetachTagParams,
2710
3690
  type ConversationRedactParams as ConversationRedactParams,
2711
3691
  type ConversationReplyParams as ConversationReplyParams,
2712
- };
2713
-
2714
- export {
2715
- Tags as Tags,
2716
- type AttachedConversationTag as AttachedConversationTag,
2717
- type ConversationTagMutationActor as ConversationTagMutationActor,
2718
- type TagAttachParams as TagAttachParams,
2719
- type TagDetachParams as TagDetachParams,
3692
+ type ConversationSearchParams as ConversationSearchParams,
2720
3693
  };
2721
3694
 
2722
3695
  export {