featurebase-node 0.15.0 → 0.15.2

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 (156) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/client.d.mts +8 -2
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +8 -2
  5. package/client.d.ts.map +1 -1
  6. package/client.js +6 -0
  7. package/client.js.map +1 -1
  8. package/client.mjs +6 -0
  9. package/client.mjs.map +1 -1
  10. package/package.json +1 -1
  11. package/resources/audit-logs.d.mts +2 -2
  12. package/resources/audit-logs.d.mts.map +1 -1
  13. package/resources/audit-logs.d.ts +2 -2
  14. package/resources/audit-logs.d.ts.map +1 -1
  15. package/resources/changelogs/changelogs.d.mts +1166 -6
  16. package/resources/changelogs/changelogs.d.mts.map +1 -1
  17. package/resources/changelogs/changelogs.d.ts +1166 -6
  18. package/resources/changelogs/changelogs.d.ts.map +1 -1
  19. package/resources/changelogs/changelogs.js +53 -3
  20. package/resources/changelogs/changelogs.js.map +1 -1
  21. package/resources/changelogs/changelogs.mjs +53 -3
  22. package/resources/changelogs/changelogs.mjs.map +1 -1
  23. package/resources/changelogs/index.d.mts +1 -1
  24. package/resources/changelogs/index.d.mts.map +1 -1
  25. package/resources/changelogs/index.d.ts +1 -1
  26. package/resources/changelogs/index.d.ts.map +1 -1
  27. package/resources/changelogs/index.js.map +1 -1
  28. package/resources/changelogs/index.mjs.map +1 -1
  29. package/resources/conversation-attributes.d.mts +5 -0
  30. package/resources/conversation-attributes.d.mts.map +1 -1
  31. package/resources/conversation-attributes.d.ts +5 -0
  32. package/resources/conversation-attributes.d.ts.map +1 -1
  33. package/resources/feedback/comments.d.mts +4 -2
  34. package/resources/feedback/comments.d.mts.map +1 -1
  35. package/resources/feedback/comments.d.ts +4 -2
  36. package/resources/feedback/comments.d.ts.map +1 -1
  37. package/resources/feedback/custom-fields.d.mts +12 -0
  38. package/resources/feedback/custom-fields.d.mts.map +1 -1
  39. package/resources/feedback/custom-fields.d.ts +12 -0
  40. package/resources/feedback/custom-fields.d.ts.map +1 -1
  41. package/resources/feedback/posts/index.d.mts +1 -0
  42. package/resources/feedback/posts/index.d.mts.map +1 -1
  43. package/resources/feedback/posts/index.d.ts +1 -0
  44. package/resources/feedback/posts/index.d.ts.map +1 -1
  45. package/resources/feedback/posts/index.js +3 -1
  46. package/resources/feedback/posts/index.js.map +1 -1
  47. package/resources/feedback/posts/index.mjs +1 -0
  48. package/resources/feedback/posts/index.mjs.map +1 -1
  49. package/resources/feedback/posts/insights.d.mts +254 -0
  50. package/resources/feedback/posts/insights.d.mts.map +1 -0
  51. package/resources/feedback/posts/insights.d.ts +254 -0
  52. package/resources/feedback/posts/insights.d.ts.map +1 -0
  53. package/resources/feedback/posts/insights.js +269 -0
  54. package/resources/feedback/posts/insights.js.map +1 -0
  55. package/resources/feedback/posts/insights.mjs +265 -0
  56. package/resources/feedback/posts/insights.mjs.map +1 -0
  57. package/resources/feedback/posts/posts.d.mts +647 -20
  58. package/resources/feedback/posts/posts.d.mts.map +1 -1
  59. package/resources/feedback/posts/posts.d.ts +647 -20
  60. package/resources/feedback/posts/posts.d.ts.map +1 -1
  61. package/resources/feedback/posts/posts.js +199 -7
  62. package/resources/feedback/posts/posts.js.map +1 -1
  63. package/resources/feedback/posts/posts.mjs +199 -7
  64. package/resources/feedback/posts/posts.mjs.map +1 -1
  65. package/resources/index.d.mts +2 -1
  66. package/resources/index.d.mts.map +1 -1
  67. package/resources/index.d.ts +2 -1
  68. package/resources/index.d.ts.map +1 -1
  69. package/resources/index.js +3 -1
  70. package/resources/index.js.map +1 -1
  71. package/resources/index.mjs +1 -0
  72. package/resources/index.mjs.map +1 -1
  73. package/resources/reports.d.mts +101 -19
  74. package/resources/reports.d.mts.map +1 -1
  75. package/resources/reports.d.ts +101 -19
  76. package/resources/reports.d.ts.map +1 -1
  77. package/resources/reports.js +15 -8
  78. package/resources/reports.js.map +1 -1
  79. package/resources/reports.mjs +15 -8
  80. package/resources/reports.mjs.map +1 -1
  81. package/resources/support/conversations/conversations.d.mts +22 -1
  82. package/resources/support/conversations/conversations.d.mts.map +1 -1
  83. package/resources/support/conversations/conversations.d.ts +22 -1
  84. package/resources/support/conversations/conversations.d.ts.map +1 -1
  85. package/resources/support/conversations/conversations.js.map +1 -1
  86. package/resources/support/conversations/conversations.mjs.map +1 -1
  87. package/resources/support/tickets/tickets.d.mts +9 -5
  88. package/resources/support/tickets/tickets.d.mts.map +1 -1
  89. package/resources/support/tickets/tickets.d.ts +9 -5
  90. package/resources/support/tickets/tickets.d.ts.map +1 -1
  91. package/resources/support/tickets/tickets.js.map +1 -1
  92. package/resources/support/tickets/tickets.mjs.map +1 -1
  93. package/resources/training-data/files.d.mts +292 -0
  94. package/resources/training-data/files.d.mts.map +1 -0
  95. package/resources/training-data/files.d.ts +292 -0
  96. package/resources/training-data/files.d.ts.map +1 -0
  97. package/resources/training-data/files.js +171 -0
  98. package/resources/training-data/files.js.map +1 -0
  99. package/resources/training-data/files.mjs +167 -0
  100. package/resources/training-data/files.mjs.map +1 -0
  101. package/resources/training-data/index.d.mts +4 -0
  102. package/resources/training-data/index.d.mts.map +1 -0
  103. package/resources/training-data/index.d.ts +4 -0
  104. package/resources/training-data/index.d.ts.map +1 -0
  105. package/resources/training-data/index.js +11 -0
  106. package/resources/training-data/index.js.map +1 -0
  107. package/resources/training-data/index.mjs +5 -0
  108. package/resources/training-data/index.mjs.map +1 -0
  109. package/resources/training-data/qna.d.mts +370 -0
  110. package/resources/training-data/qna.d.mts.map +1 -0
  111. package/resources/training-data/qna.d.ts +370 -0
  112. package/resources/training-data/qna.d.ts.map +1 -0
  113. package/resources/training-data/qna.js +177 -0
  114. package/resources/training-data/qna.js.map +1 -0
  115. package/resources/training-data/qna.mjs +173 -0
  116. package/resources/training-data/qna.mjs.map +1 -0
  117. package/resources/training-data/training-data.d.mts +442 -0
  118. package/resources/training-data/training-data.d.mts.map +1 -0
  119. package/resources/training-data/training-data.d.ts +442 -0
  120. package/resources/training-data/training-data.d.ts.map +1 -0
  121. package/resources/training-data/training-data.js +105 -0
  122. package/resources/training-data/training-data.js.map +1 -0
  123. package/resources/training-data/training-data.mjs +100 -0
  124. package/resources/training-data/training-data.mjs.map +1 -0
  125. package/resources/training-data.d.mts +2 -0
  126. package/resources/training-data.d.mts.map +1 -0
  127. package/resources/training-data.d.ts +2 -0
  128. package/resources/training-data.d.ts.map +1 -0
  129. package/resources/training-data.js +6 -0
  130. package/resources/training-data.js.map +1 -0
  131. package/resources/training-data.mjs +3 -0
  132. package/resources/training-data.mjs.map +1 -0
  133. package/src/client.ts +22 -0
  134. package/src/resources/audit-logs.ts +12 -0
  135. package/src/resources/changelogs/changelogs.ts +2003 -51
  136. package/src/resources/changelogs/index.ts +1 -0
  137. package/src/resources/conversation-attributes.ts +6 -0
  138. package/src/resources/feedback/comments.ts +4 -2
  139. package/src/resources/feedback/custom-fields.ts +15 -0
  140. package/src/resources/feedback/posts/index.ts +7 -0
  141. package/src/resources/feedback/posts/insights.ts +340 -0
  142. package/src/resources/feedback/posts/posts.ts +764 -20
  143. package/src/resources/index.ts +8 -0
  144. package/src/resources/reports.ts +160 -19
  145. package/src/resources/support/conversations/conversations.ts +27 -1
  146. package/src/resources/support/tickets/tickets.ts +9 -5
  147. package/src/resources/training-data/files.ts +431 -0
  148. package/src/resources/training-data/index.ts +31 -0
  149. package/src/resources/training-data/qna.ts +514 -0
  150. package/src/resources/training-data/training-data.ts +603 -0
  151. package/src/resources/training-data.ts +3 -0
  152. package/src/version.ts +1 -1
  153. package/version.d.mts +1 -1
  154. package/version.d.ts +1 -1
  155. package/version.js +1 -1
  156. package/version.mjs +1 -1
@@ -10,6 +10,7 @@ export {
10
10
  Changelogs,
11
11
  type Changelog,
12
12
  type PublishUnpublishSuccess,
13
+ type ChangelogRetrieveResponse,
13
14
  type ChangelogDeleteResponse,
14
15
  type ChangelogCreateParams,
15
16
  type ChangelogRetrieveParams,
@@ -63,6 +64,13 @@ export {
63
64
  type SurveysCursorPage,
64
65
  type SurveyListResponsesResponsesCursorPage,
65
66
  } from './surveys';
67
+ export {
68
+ TrainingData,
69
+ type KnowledgeSearch,
70
+ type Oracle,
71
+ type TrainingDataOracleParams,
72
+ type TrainingDataSearchParams,
73
+ } from './training-data/training-data';
66
74
  export { Users } from './users/users';
67
75
  export {
68
76
  Webhooks,
@@ -20,6 +20,8 @@ export class Reports extends APIResource {
20
20
  * `dataPointFilters` selecting the data point:
21
21
  *
22
22
  * - `timeBucket` — a `date` from the time series
23
+ * - `timeSegmentValue` + `timeSegmentGranularity` — the selected bucket from a
24
+ * Segment-by-Time series
23
25
  * - `groupValue` / `segmentValue` — a `group` / `segment` value from grouped data
24
26
  * - `dayOfWeek` + `hourOfDay` — a heatmap cell (`hourly_heatmap` view)
25
27
  * - `flowPathId` or `sourceNodeId` + `targetNodeId` — a flow edge (`sankey` view)
@@ -187,14 +189,19 @@ export class Reports extends APIResource {
187
189
  * For high-cardinality breakdowns, cap the number of returned series:
188
190
  *
189
191
  * - `topValuesLimit` keeps only the top **N** `groupBy` values;
190
- * `segmentTopValuesLimit` does the same for `segmentBy`. Allowed values: **5, 7,
191
- * 10, 15, 20**. `topValuesLimit` requires `groupBy`; `segmentTopValuesLimit`
192
- * requires `segmentBy`.
193
- * - Members are ranked by the selected metric/aggregation over the **full filtered
194
- * primary range**, so the ranked set is **stable across every time bucket** (a
195
- * value that spikes in one bucket but is small overall does not enter the set).
196
- * A comparison period reuses the **primary period's** ranked set it is never
197
- * re-ranked, so the legend stays identical period-over-period.
192
+ * `segmentTopValuesLimit` does the same for `segmentBy`. Both accept integers
193
+ * from **1 to 100**; the editor offers common presets plus a Custom value.
194
+ * `topValuesLimit` requires `groupBy`; `segmentTopValuesLimit` requires
195
+ * `segmentBy`.
196
+ * - For time-series segment breakdowns, members are ranked **inside each time
197
+ * bucket**. The response keeps the union of those bucket winners in its series
198
+ * catalog, while a member outside a bucket's Top N has a zero value in that
199
+ * bucket. This matches the chart's per-period ranking semantics. A comparison
200
+ * period is folded into the primary period's union of visible members so current
201
+ * and previous series keep the same identities.
202
+ * - For non-time-series grouped results, members are ranked over the full filtered
203
+ * primary range. A comparison period reuses the primary period's ranked set
204
+ * rather than independently changing the legend.
198
205
  * - `showOther` / `segmentShowOther` append a single synthetic bucket with id
199
206
  * `__other__` and label `Other` that sums every value outside the top set.
200
207
  * Because the values are summed, Show Other is only supported for **additive
@@ -339,6 +346,38 @@ export interface ReportAttributeOption {
339
346
  label: string;
340
347
 
341
348
  value: string;
349
+
350
+ presentation?: ReportAttributeOption.Presentation;
351
+ }
352
+
353
+ export namespace ReportAttributeOption {
354
+ export interface Presentation {
355
+ kind:
356
+ | 'brand'
357
+ | 'company'
358
+ | 'country'
359
+ | 'knowledge_source'
360
+ | 'plain'
361
+ | 'sla'
362
+ | 'tag'
363
+ | 'team'
364
+ | 'teammate'
365
+ | 'ticket_category'
366
+ | 'ticket_state'
367
+ | 'ticket_type'
368
+ | 'user'
369
+ | 'workflow';
370
+
371
+ color?: string;
372
+
373
+ icon?: unknown;
374
+
375
+ iconSvg?: string;
376
+
377
+ imageUrl?: string;
378
+
379
+ secondaryLabel?: string;
380
+ }
342
381
  }
343
382
 
344
383
  export interface ReportDataset {
@@ -428,11 +467,29 @@ export interface ReportGroupedDatum {
428
467
 
429
468
  groupLabel?: string;
430
469
 
470
+ identity?: ReportGroupedDatum.Identity;
471
+
431
472
  previousValue?: number;
432
473
 
433
474
  segments?: Array<ReportSegmentDatum>;
434
475
  }
435
476
 
477
+ export namespace ReportGroupedDatum {
478
+ export interface Identity {
479
+ id: string;
480
+
481
+ kind: 'teammate' | 'team' | 'user' | 'company' | 'fibi';
482
+
483
+ label: string;
484
+
485
+ avatarUrl?: string;
486
+
487
+ color?: string;
488
+
489
+ website?: string;
490
+ }
491
+ }
492
+
436
493
  export interface ReportMetric {
437
494
  /**
438
495
  * Metric ID — use as `metric` in query requests.
@@ -445,6 +502,8 @@ export interface ReportMetric {
445
502
  'count' | 'sum' | 'avg' | 'median' | 'min' | 'max' | 'range' | 'percentile' | 'value'
446
503
  >;
447
504
 
505
+ definitionVersion: number;
506
+
448
507
  description: string;
449
508
 
450
509
  executionKind: 'pipe_aggregate' | 'pipe_computed_ratio';
@@ -528,11 +587,29 @@ export interface ReportSegmentDatum {
528
587
 
529
588
  value: number;
530
589
 
590
+ identity?: ReportSegmentDatum.Identity;
591
+
531
592
  previousValue?: number;
532
593
 
533
594
  segmentLabel?: string;
534
595
  }
535
596
 
597
+ export namespace ReportSegmentDatum {
598
+ export interface Identity {
599
+ id: string;
600
+
601
+ kind: 'teammate' | 'team' | 'user' | 'company' | 'fibi';
602
+
603
+ label: string;
604
+
605
+ avatarUrl?: string;
606
+
607
+ color?: string;
608
+
609
+ website?: string;
610
+ }
611
+ }
612
+
536
613
  export interface ReportTimeSeriesDatum {
537
614
  /**
538
615
  * Time bucket start (ISO 8601).
@@ -687,8 +764,12 @@ export interface ReportLookupFilterValuesResponse {
687
764
 
688
765
  object: 'list';
689
766
 
767
+ lookupContextKey?: string;
768
+
690
769
  nextCursor?: string;
691
770
 
771
+ truncated?: boolean;
772
+
692
773
  unavailableSelectedValues?: Array<string>;
693
774
  }
694
775
 
@@ -820,16 +901,38 @@ export namespace ReportQueryResponse {
820
901
  export interface Cells {
821
902
  display: string;
822
903
 
904
+ deltaPercent?: number;
905
+
823
906
  denominator?: number;
824
907
 
908
+ identity?: Cells.Identity;
909
+
825
910
  numerator?: number;
826
911
 
912
+ previousValue?: number;
913
+
827
914
  raw?: unknown;
828
915
 
829
916
  sortValue?: string | number | null;
830
917
 
831
918
  value?: unknown;
832
919
  }
920
+
921
+ export namespace Cells {
922
+ export interface Identity {
923
+ id: string;
924
+
925
+ kind: 'teammate' | 'team' | 'user' | 'company' | 'fibi';
926
+
927
+ label: string;
928
+
929
+ avatarUrl?: string;
930
+
931
+ color?: string;
932
+
933
+ website?: string;
934
+ }
935
+ }
833
936
  }
834
937
 
835
938
  export interface Sort {
@@ -848,16 +951,38 @@ export namespace ReportQueryResponse {
848
951
  export interface Cells {
849
952
  display: string;
850
953
 
954
+ deltaPercent?: number;
955
+
851
956
  denominator?: number;
852
957
 
958
+ identity?: Cells.Identity;
959
+
853
960
  numerator?: number;
854
961
 
962
+ previousValue?: number;
963
+
855
964
  raw?: unknown;
856
965
 
857
966
  sortValue?: string | number | null;
858
967
 
859
968
  value?: unknown;
860
969
  }
970
+
971
+ export namespace Cells {
972
+ export interface Identity {
973
+ id: string;
974
+
975
+ kind: 'teammate' | 'team' | 'user' | 'company' | 'fibi';
976
+
977
+ label: string;
978
+
979
+ avatarUrl?: string;
980
+
981
+ color?: string;
982
+
983
+ website?: string;
984
+ }
985
+ }
861
986
  }
862
987
  }
863
988
  }
@@ -1018,6 +1143,16 @@ export namespace ReportDrillInParams {
1018
1143
  * Time bucket to drill into (a `date` value from the query time series).
1019
1144
  */
1020
1145
  timeBucket?: string;
1146
+
1147
+ /**
1148
+ * Granularity of `timeSegmentValue`; both fields must be sent together.
1149
+ */
1150
+ timeSegmentGranularity?: 'hour' | 'day' | 'week' | 'month';
1151
+
1152
+ /**
1153
+ * Time-segment bucket selected from a Segment-by-Time series.
1154
+ */
1155
+ timeSegmentValue?: string;
1021
1156
  }
1022
1157
 
1023
1158
  export interface Sort {
@@ -1065,6 +1200,12 @@ export interface ReportLookupFilterValuesParams {
1065
1200
  */
1066
1201
  limit?: number;
1067
1202
 
1203
+ /**
1204
+ * Body param: Opaque client context echoed by the response so stale lookup results
1205
+ * can be discarded safely.
1206
+ */
1207
+ lookupContextKey?: string;
1208
+
1068
1209
  /**
1069
1210
  * Body param
1070
1211
  */
@@ -1177,13 +1318,14 @@ export interface ReportQueryParams {
1177
1318
  segmentShowOther?: boolean;
1178
1319
 
1179
1320
  /**
1180
- * Body param: Keep only the top N `segmentBy` values per series, ranked by the
1181
- * selected metric over the full filtered primary range. Under a time View-by the
1182
- * ranked segment set is identical across every bucket; under a dimension View-by
1183
- * the ranking is applied within each retained parent group. Allowed values: `5`,
1184
- * `7`, `10`, `15`, `20`. Requires `segmentBy`.
1321
+ * Body param: Keep only the top N `segmentBy` values per series. Under a time
1322
+ * View-by, segments are ranked independently inside each time bucket and the
1323
+ * response series catalog contains the union of bucket winners. Under a dimension
1324
+ * View-by, ranking is applied within each retained parent group. Allowed range:
1325
+ * `1` to `100`; the editor offers common presets plus a Custom value. Requires
1326
+ * `segmentBy`.
1185
1327
  */
1186
- segmentTopValuesLimit?: 5 | 7 | 10 | 15 | 20;
1328
+ segmentTopValuesLimit?: number;
1187
1329
 
1188
1330
  /**
1189
1331
  * Body param: When `true`, append a single synthetic group with id `__other__` and
@@ -1202,12 +1344,11 @@ export interface ReportQueryParams {
1202
1344
 
1203
1345
  /**
1204
1346
  * Body param: Keep only the top N `groupBy` (View-by) values, ranked by the
1205
- * selected metric/aggregation over the full filtered primary range. Allowed
1206
- * values: `5`, `7`, `10`, `15`, `20`. The ranked set is stable across every time
1207
- * bucket, and a comparison period reuses the primary period's ranked set (never
1208
- * re-ranked). Requires `groupBy`.
1347
+ * selected metric/aggregation over the full filtered primary range. Allowed range:
1348
+ * `1` to `100`; the editor offers common presets plus a Custom value. A comparison
1349
+ * period reuses the primary period's ranked set. Requires `groupBy`.
1209
1350
  */
1210
- topValuesLimit?: 5 | 7 | 10 | 15 | 20;
1351
+ topValuesLimit?: number;
1211
1352
 
1212
1353
  /**
1213
1354
  * Body param: Result shape. `standard` returns a time series (plus grouped/segment
@@ -1546,6 +1546,12 @@ export interface ConversationAttributeValue {
1546
1546
  */
1547
1547
  options?: Array<ConversationAttributesAPI.ConversationAttributeOption>;
1548
1548
 
1549
+ /**
1550
+ * Whether teammates must set a value before closing a conversation from the Inbox.
1551
+ * Closes via the API, workflows, and Fibi are not blocked.
1552
+ */
1553
+ required?: boolean;
1554
+
1549
1555
  /**
1550
1556
  * The conversation-specific custom attribute value.
1551
1557
  */
@@ -2683,7 +2689,17 @@ export interface CsatEmailDelivery {
2683
2689
  /**
2684
2690
  * Email delivery status for the CSAT request when applicable
2685
2691
  */
2686
- status: 'pending' | 'sent' | 'failed';
2692
+ status: 'pending' | 'sending' | 'ambiguous' | 'retry_wait' | 'sent' | 'failed';
2693
+
2694
+ /**
2695
+ * Number of delivery attempts made for this CSAT email
2696
+ */
2697
+ attempts?: number;
2698
+
2699
+ /**
2700
+ * ISO timestamp when the current delivery attempt was durably claimed
2701
+ */
2702
+ claimedAt?: string;
2687
2703
 
2688
2704
  /**
2689
2705
  * ISO timestamp when the CSAT email failed
@@ -2695,11 +2711,21 @@ export interface CsatEmailDelivery {
2695
2711
  */
2696
2712
  failureReason?: string;
2697
2713
 
2714
+ /**
2715
+ * Stable provider-correlation key for this CSAT delivery
2716
+ */
2717
+ idempotencyKey?: string;
2718
+
2698
2719
  /**
2699
2720
  * Email message ID associated with delivery
2700
2721
  */
2701
2722
  messageId?: string;
2702
2723
 
2724
+ /**
2725
+ * ISO timestamp when a retry-waiting CSAT email may be attempted again
2726
+ */
2727
+ nextAttemptAt?: string;
2728
+
2703
2729
  /**
2704
2730
  * ISO timestamp when the CSAT email was sent
2705
2731
  */
@@ -368,9 +368,11 @@ export class Tickets extends APIResource {
368
368
  export type TicketsCursorPage = CursorPage<Ticket>;
369
369
 
370
370
  /**
371
- * Author to attribute the post to. If not provided, uses the authenticated user.
372
- * Supports multiple identification methods: id (Featurebase ID), userId (external
373
- * SSO ID), or email.
371
+ * Author to attribute the post to. If not provided, uses the authenticated user
372
+ * unless `source` is given, in which case a guest author is synthesised from
373
+ * `source.label` (or the channel name), because a relayed request belongs to the
374
+ * customer who said it. Supports multiple identification methods: id (Featurebase
375
+ * ID), userId (external SSO ID), or email.
374
376
  */
375
377
  export interface AuthorInput {
376
378
  /**
@@ -713,8 +715,10 @@ export interface TicketDeleteResponse {
713
715
  export interface TicketCreateParams {
714
716
  /**
715
717
  * Body param: Author to attribute the post to. If not provided, uses the
716
- * authenticated user. Supports multiple identification methods: id (Featurebase
717
- * ID), userId (external SSO ID), or email.
718
+ * authenticated user unless `source` is given, in which case a guest author is
719
+ * synthesised from `source.label` (or the channel name), because a relayed request
720
+ * belongs to the customer who said it. Supports multiple identification methods:
721
+ * id (Featurebase ID), userId (external SSO ID), or email.
718
722
  */
719
723
  author: AuthorInput;
720
724