@roarkanalytics/sdk 3.10.0 → 3.12.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 (101) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/client.d.mts +7 -4
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +7 -4
  5. package/client.d.ts.map +1 -1
  6. package/client.js +3 -0
  7. package/client.js.map +1 -1
  8. package/client.mjs +3 -0
  9. package/client.mjs.map +1 -1
  10. package/package.json +1 -1
  11. package/resources/agent-prompt.d.mts +129 -0
  12. package/resources/agent-prompt.d.mts.map +1 -0
  13. package/resources/agent-prompt.d.ts +129 -0
  14. package/resources/agent-prompt.d.ts.map +1 -0
  15. package/resources/agent-prompt.js +58 -0
  16. package/resources/agent-prompt.js.map +1 -0
  17. package/resources/agent-prompt.mjs +54 -0
  18. package/resources/agent-prompt.mjs.map +1 -0
  19. package/resources/call.d.mts +1 -1
  20. package/resources/call.d.mts.map +1 -1
  21. package/resources/call.d.ts +1 -1
  22. package/resources/call.d.ts.map +1 -1
  23. package/resources/config.d.mts +166 -18
  24. package/resources/config.d.mts.map +1 -1
  25. package/resources/config.d.ts +166 -18
  26. package/resources/config.d.ts.map +1 -1
  27. package/resources/customer-flow-edge-case.d.mts +72 -9
  28. package/resources/customer-flow-edge-case.d.mts.map +1 -1
  29. package/resources/customer-flow-edge-case.d.ts +72 -9
  30. package/resources/customer-flow-edge-case.d.ts.map +1 -1
  31. package/resources/customer-flow.d.mts +2005 -78
  32. package/resources/customer-flow.d.mts.map +1 -1
  33. package/resources/customer-flow.d.ts +2005 -78
  34. package/resources/customer-flow.d.ts.map +1 -1
  35. package/resources/customer-flow.js +18 -0
  36. package/resources/customer-flow.js.map +1 -1
  37. package/resources/customer-flow.mjs +18 -0
  38. package/resources/customer-flow.mjs.map +1 -1
  39. package/resources/index.d.mts +3 -2
  40. package/resources/index.d.mts.map +1 -1
  41. package/resources/index.d.ts +3 -2
  42. package/resources/index.d.ts.map +1 -1
  43. package/resources/index.js +3 -1
  44. package/resources/index.js.map +1 -1
  45. package/resources/index.mjs +1 -0
  46. package/resources/index.mjs.map +1 -1
  47. package/resources/simulation-environment.d.mts +163 -1
  48. package/resources/simulation-environment.d.mts.map +1 -1
  49. package/resources/simulation-environment.d.ts +163 -1
  50. package/resources/simulation-environment.d.ts.map +1 -1
  51. package/resources/simulation-environment.js +51 -0
  52. package/resources/simulation-environment.js.map +1 -1
  53. package/resources/simulation-environment.mjs +51 -0
  54. package/resources/simulation-environment.mjs.map +1 -1
  55. package/resources/simulation-job.d.mts +62 -2
  56. package/resources/simulation-job.d.mts.map +1 -1
  57. package/resources/simulation-job.d.ts +62 -2
  58. package/resources/simulation-job.d.ts.map +1 -1
  59. package/resources/simulation-persona.d.mts +42 -6
  60. package/resources/simulation-persona.d.mts.map +1 -1
  61. package/resources/simulation-persona.d.ts +42 -6
  62. package/resources/simulation-persona.d.ts.map +1 -1
  63. package/resources/simulation-run-plan-job.d.mts +31 -1
  64. package/resources/simulation-run-plan-job.d.mts.map +1 -1
  65. package/resources/simulation-run-plan-job.d.ts +31 -1
  66. package/resources/simulation-run-plan-job.d.ts.map +1 -1
  67. package/resources/simulation-run-plan.d.mts +154 -12
  68. package/resources/simulation-run-plan.d.mts.map +1 -1
  69. package/resources/simulation-run-plan.d.ts +154 -12
  70. package/resources/simulation-run-plan.d.ts.map +1 -1
  71. package/resources/simulation-template.d.mts +10 -0
  72. package/resources/simulation-template.d.mts.map +1 -1
  73. package/resources/simulation-template.d.ts +10 -0
  74. package/resources/simulation-template.d.ts.map +1 -1
  75. package/resources/simulation.d.mts +221 -6
  76. package/resources/simulation.d.mts.map +1 -1
  77. package/resources/simulation.d.ts +221 -6
  78. package/resources/simulation.d.ts.map +1 -1
  79. package/resources/simulation.js +10 -3
  80. package/resources/simulation.js.map +1 -1
  81. package/resources/simulation.mjs +10 -3
  82. package/resources/simulation.mjs.map +1 -1
  83. package/src/client.ts +33 -0
  84. package/src/resources/agent-prompt.ts +183 -0
  85. package/src/resources/call.ts +1 -1
  86. package/src/resources/config.ts +310 -20
  87. package/src/resources/customer-flow-edge-case.ts +180 -9
  88. package/src/resources/customer-flow.ts +3091 -63
  89. package/src/resources/index.ts +15 -0
  90. package/src/resources/simulation-environment.ts +244 -0
  91. package/src/resources/simulation-job.ts +92 -2
  92. package/src/resources/simulation-persona.ts +108 -6
  93. package/src/resources/simulation-run-plan-job.ts +39 -1
  94. package/src/resources/simulation-run-plan.ts +176 -12
  95. package/src/resources/simulation-template.ts +11 -0
  96. package/src/resources/simulation.ts +247 -6
  97. package/src/version.ts +1 -1
  98. package/version.d.mts +1 -1
  99. package/version.d.ts +1 -1
  100. package/version.js +1 -1
  101. package/version.mjs +1 -1
@@ -80,6 +80,29 @@ export class CustomerFlow extends APIResource {
80
80
  return this._client.delete(path`/v1/customer-flow/${flowID}`, options);
81
81
  }
82
82
 
83
+ /**
84
+ * Deep-copies a flow into a new project-owned flow. The copy carries the source's
85
+ * description, branching mode, linked agents, flow-level expectations and
86
+ * flow-owned metrics. A scripted flow copies its whole step graph; an improv flow
87
+ * copies its variants (personas, briefs, expectations). Duplicating a
88
+ * Roark-managed flow is how you customise it. Voicemail flows are Roark-managed
89
+ * and cannot be duplicated.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const response = await client.customerFlow.duplicate(
94
+ * '182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e',
95
+ * );
96
+ * ```
97
+ */
98
+ duplicate(
99
+ flowID: string,
100
+ body: CustomerFlowDuplicateParams | null | undefined = {},
101
+ options?: RequestOptions,
102
+ ): APIPromise<CustomerFlowDuplicateResponse> {
103
+ return this._client.post(path`/v1/customer-flow/${flowID}/duplicate`, { body, ...options });
104
+ }
105
+
83
106
  /**
84
107
  * Returns a customer flow with its happy path, edge cases, expectations and linked
85
108
  * agents. Scripted flows also carry their step graph.
@@ -165,12 +188,23 @@ export class CustomerFlow extends APIResource {
165
188
  * step is a root wired straight from the start of the flow, so a merge target
166
189
  * parked there would also be reachable directly.
167
190
  *
191
+ * A `CUSTOMER_TURN` describes what the simulated customer says and the persona
192
+ * phrases it; a `CUSTOMER_VERBATIM_TURN` is said word for word, and one placed as
193
+ * a top-level step opens the call the moment it connects, before the agent speaks.
194
+ * `CUSTOMER_FIRST_MESSAGE` is the retired name for that opening case: still
195
+ * accepted, stored and returned as `CUSTOMER_VERBATIM_TURN`.
196
+ *
168
197
  * The two DTMF types are mirror images and both require `dtmfDigits`.
169
198
  * `CUSTOMER_DTMF` is keys the simulated caller presses while navigating your
170
199
  * agent. `AGENT_DTMF` is keys your agent under test is expected to press while
171
200
  * navigating a menu the simulation is playing, so its digits are an assertion the
172
201
  * run is graded against rather than an instruction, and it counts as an agent turn
173
202
  * for role alternation.
203
+ *
204
+ * In a STRICT flow an `AGENT_TURN` may carry its own `offScriptPolicy`, which
205
+ * replaces the flow-level one at that step. Omit it (or send null) to follow the
206
+ * flow's policy. Use it where one missed step makes the rest of the call
207
+ * meaningless: an authentication menu, say, with `then: HANG_UP_INVALIDATE`.
174
208
  */
175
209
  export type FlowStep =
176
210
  | FlowStep.UnionMember0
@@ -180,7 +214,8 @@ export type FlowStep =
180
214
  | FlowStep.UnionMember4
181
215
  | FlowStep.UnionMember5
182
216
  | FlowStep.UnionMember6
183
- | FlowStep.UnionMember7;
217
+ | FlowStep.UnionMember7
218
+ | FlowStep.UnionMember8;
184
219
 
185
220
  export namespace FlowStep {
186
221
  export interface UnionMember0 {
@@ -192,11 +227,27 @@ export namespace FlowStep {
192
227
 
193
228
  nodeId?: string;
194
229
 
230
+ offScriptPolicy?: UnionMember0.OffScriptPolicy | null;
231
+
195
232
  ref?: string;
196
233
 
197
234
  steps?: Array<CustomerFlowAPI.FlowStep>;
198
235
  }
199
236
 
237
+ export namespace UnionMember0 {
238
+ export interface OffScriptPolicy {
239
+ maxAttempts: number;
240
+
241
+ reaction: 'STAY_SILENT' | 'REPEAT' | 'RESPOND' | 'SAY';
242
+
243
+ then: 'HANG_UP' | 'MOVE_ON' | 'ADAPT' | 'HANG_UP_INVALIDATE';
244
+
245
+ sayLine?: string | null;
246
+
247
+ waitSeconds?: number | null;
248
+ }
249
+ }
250
+
200
251
  export interface UnionMember1 {
201
252
  type: 'CUSTOMER_TURN';
202
253
 
@@ -226,6 +277,20 @@ export namespace FlowStep {
226
277
  }
227
278
 
228
279
  export interface UnionMember3 {
280
+ type: 'CUSTOMER_VERBATIM_TURN';
281
+
282
+ content?: string | null;
283
+
284
+ mergeIntoNodeIds?: Array<string>;
285
+
286
+ nodeId?: string;
287
+
288
+ ref?: string;
289
+
290
+ steps?: Array<CustomerFlowAPI.FlowStep>;
291
+ }
292
+
293
+ export interface UnionMember4 {
229
294
  type: 'CUSTOMER_SILENCE';
230
295
 
231
296
  mergeIntoNodeIds?: Array<string>;
@@ -239,7 +304,7 @@ export namespace FlowStep {
239
304
  steps?: Array<CustomerFlowAPI.FlowStep>;
240
305
  }
241
306
 
242
- export interface UnionMember4 {
307
+ export interface UnionMember5 {
243
308
  type: 'CUSTOMER_DTMF';
244
309
 
245
310
  dtmfDigits?: string | null;
@@ -253,7 +318,7 @@ export namespace FlowStep {
253
318
  steps?: Array<CustomerFlowAPI.FlowStep>;
254
319
  }
255
320
 
256
- export interface UnionMember5 {
321
+ export interface UnionMember6 {
257
322
  type: 'AGENT_DTMF';
258
323
 
259
324
  dtmfDigits?: string | null;
@@ -267,7 +332,7 @@ export namespace FlowStep {
267
332
  steps?: Array<CustomerFlowAPI.FlowStep>;
268
333
  }
269
334
 
270
- export interface UnionMember6 {
335
+ export interface UnionMember7 {
271
336
  type: 'VOICEMAIL';
272
337
 
273
338
  mergeIntoNodeIds?: Array<string>;
@@ -279,7 +344,7 @@ export namespace FlowStep {
279
344
  steps?: Array<CustomerFlowAPI.FlowStep>;
280
345
  }
281
346
 
282
- export interface UnionMember7 {
347
+ export interface UnionMember8 {
283
348
  type: 'SCENARIO_LINK';
284
349
 
285
350
  linkedCustomerFlowId?: string | null;
@@ -346,6 +411,30 @@ export namespace CustomerFlowCreateResponse {
346
411
  */
347
412
  happyPath: ScriptedCustomerFlow.HappyPath | null;
348
413
 
414
+ /**
415
+ * STRICT only. What the simulated customer does when your agent does not say the
416
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
417
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
418
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
419
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
420
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
421
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
422
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
423
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
424
+ * AGENT_TURN step can carry its own.
425
+ */
426
+ offScriptPolicy: ScriptedCustomerFlow.OffScriptPolicy | null;
427
+
428
+ /**
429
+ * How closely a run follows the script. LOOSE (default) hands the whole script to
430
+ * the simulated customer as one prompt; it keeps the call moving whatever your
431
+ * agent says. STRICT runs the script as a state machine on the agent service: at
432
+ * every agent step the simulated customer waits, silent, until your agent has said
433
+ * the expected line, and only then moves on. Scripted flows only; STRICT needs the
434
+ * agent-service transport and is not available on realtime models.
435
+ */
436
+ scriptAdherence: 'LOOSE' | 'STRICT';
437
+
349
438
  source: 'SYSTEM' | 'CUSTOM';
350
439
 
351
440
  title: string;
@@ -496,6 +585,8 @@ export namespace CustomerFlowCreateResponse {
496
585
  | 'OFFICE'
497
586
  | 'THUNDERSTORM';
498
587
 
588
+ backgroundNoiseVolume: number;
589
+
499
590
  /**
500
591
  * Creation timestamp in ISO 8601 format
501
592
  */
@@ -578,7 +669,10 @@ export namespace CustomerFlowCreateResponse {
578
669
  | 'FRUSTRATED'
579
670
  | 'SKEPTICAL'
580
671
  | 'RUSHED'
581
- | 'DISTRACTED';
672
+ | 'DISTRACTED'
673
+ | 'ANGRY'
674
+ | 'ANXIOUS'
675
+ | 'SAD';
582
676
 
583
677
  /**
584
678
  * How the persona confirms information
@@ -720,6 +814,13 @@ export namespace CustomerFlowCreateResponse {
720
814
  */
721
815
  description?: string | null;
722
816
 
817
+ /**
818
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
819
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
820
+ * or set null to display the name itself.
821
+ */
822
+ displayName?: string | null;
823
+
723
824
  /**
724
825
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
725
826
  */
@@ -811,6 +912,8 @@ export namespace CustomerFlowCreateResponse {
811
912
  | 'OFFICE'
812
913
  | 'THUNDERSTORM';
813
914
 
915
+ backgroundNoiseVolume: number;
916
+
814
917
  /**
815
918
  * Creation timestamp in ISO 8601 format
816
919
  */
@@ -893,7 +996,10 @@ export namespace CustomerFlowCreateResponse {
893
996
  | 'FRUSTRATED'
894
997
  | 'SKEPTICAL'
895
998
  | 'RUSHED'
896
- | 'DISTRACTED';
999
+ | 'DISTRACTED'
1000
+ | 'ANGRY'
1001
+ | 'ANXIOUS'
1002
+ | 'SAD';
897
1003
 
898
1004
  /**
899
1005
  * How the persona confirms information
@@ -1035,12 +1141,43 @@ export namespace CustomerFlowCreateResponse {
1035
1141
  */
1036
1142
  description?: string | null;
1037
1143
 
1144
+ /**
1145
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
1146
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
1147
+ * or set null to display the name itself.
1148
+ */
1149
+ displayName?: string | null;
1150
+
1038
1151
  /**
1039
1152
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
1040
1153
  */
1041
1154
  secondaryLanguage?: 'EN' | null;
1042
1155
  }
1043
1156
  }
1157
+
1158
+ /**
1159
+ * STRICT only. What the simulated customer does when your agent does not say the
1160
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
1161
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
1162
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
1163
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
1164
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
1165
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
1166
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
1167
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
1168
+ * AGENT_TURN step can carry its own.
1169
+ */
1170
+ export interface OffScriptPolicy {
1171
+ maxAttempts: number;
1172
+
1173
+ reaction: 'STAY_SILENT' | 'REPEAT' | 'RESPOND' | 'SAY';
1174
+
1175
+ then: 'HANG_UP' | 'MOVE_ON' | 'ADAPT' | 'HANG_UP_INVALIDATE';
1176
+
1177
+ sayLine?: string | null;
1178
+
1179
+ waitSeconds?: number | null;
1180
+ }
1044
1181
  }
1045
1182
 
1046
1183
  /**
@@ -1213,6 +1350,8 @@ export namespace CustomerFlowCreateResponse {
1213
1350
  | 'OFFICE'
1214
1351
  | 'THUNDERSTORM';
1215
1352
 
1353
+ backgroundNoiseVolume: number;
1354
+
1216
1355
  /**
1217
1356
  * Creation timestamp in ISO 8601 format
1218
1357
  */
@@ -1295,7 +1434,10 @@ export namespace CustomerFlowCreateResponse {
1295
1434
  | 'FRUSTRATED'
1296
1435
  | 'SKEPTICAL'
1297
1436
  | 'RUSHED'
1298
- | 'DISTRACTED';
1437
+ | 'DISTRACTED'
1438
+ | 'ANGRY'
1439
+ | 'ANXIOUS'
1440
+ | 'SAD';
1299
1441
 
1300
1442
  /**
1301
1443
  * How the persona confirms information
@@ -1437,6 +1579,13 @@ export namespace CustomerFlowCreateResponse {
1437
1579
  */
1438
1580
  description?: string | null;
1439
1581
 
1582
+ /**
1583
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
1584
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
1585
+ * or set null to display the name itself.
1586
+ */
1587
+ displayName?: string | null;
1588
+
1440
1589
  /**
1441
1590
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
1442
1591
  */
@@ -1526,6 +1675,8 @@ export namespace CustomerFlowCreateResponse {
1526
1675
  | 'OFFICE'
1527
1676
  | 'THUNDERSTORM';
1528
1677
 
1678
+ backgroundNoiseVolume: number;
1679
+
1529
1680
  /**
1530
1681
  * Creation timestamp in ISO 8601 format
1531
1682
  */
@@ -1608,7 +1759,10 @@ export namespace CustomerFlowCreateResponse {
1608
1759
  | 'FRUSTRATED'
1609
1760
  | 'SKEPTICAL'
1610
1761
  | 'RUSHED'
1611
- | 'DISTRACTED';
1762
+ | 'DISTRACTED'
1763
+ | 'ANGRY'
1764
+ | 'ANXIOUS'
1765
+ | 'SAD';
1612
1766
 
1613
1767
  /**
1614
1768
  * How the persona confirms information
@@ -1750,6 +1904,13 @@ export namespace CustomerFlowCreateResponse {
1750
1904
  */
1751
1905
  description?: string | null;
1752
1906
 
1907
+ /**
1908
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
1909
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
1910
+ * or set null to display the name itself.
1911
+ */
1912
+ displayName?: string | null;
1913
+
1753
1914
  /**
1754
1915
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
1755
1916
  */
@@ -1922,6 +2083,8 @@ export namespace CustomerFlowCreateResponse {
1922
2083
  | 'OFFICE'
1923
2084
  | 'THUNDERSTORM';
1924
2085
 
2086
+ backgroundNoiseVolume: number;
2087
+
1925
2088
  /**
1926
2089
  * Creation timestamp in ISO 8601 format
1927
2090
  */
@@ -2004,7 +2167,10 @@ export namespace CustomerFlowCreateResponse {
2004
2167
  | 'FRUSTRATED'
2005
2168
  | 'SKEPTICAL'
2006
2169
  | 'RUSHED'
2007
- | 'DISTRACTED';
2170
+ | 'DISTRACTED'
2171
+ | 'ANGRY'
2172
+ | 'ANXIOUS'
2173
+ | 'SAD';
2008
2174
 
2009
2175
  /**
2010
2176
  * How the persona confirms information
@@ -2146,6 +2312,13 @@ export namespace CustomerFlowCreateResponse {
2146
2312
  */
2147
2313
  description?: string | null;
2148
2314
 
2315
+ /**
2316
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
2317
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
2318
+ * or set null to display the name itself.
2319
+ */
2320
+ displayName?: string | null;
2321
+
2149
2322
  /**
2150
2323
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
2151
2324
  */
@@ -2230,6 +2403,8 @@ export namespace CustomerFlowCreateResponse {
2230
2403
  | 'OFFICE'
2231
2404
  | 'THUNDERSTORM';
2232
2405
 
2406
+ backgroundNoiseVolume: number;
2407
+
2233
2408
  /**
2234
2409
  * Creation timestamp in ISO 8601 format
2235
2410
  */
@@ -2312,7 +2487,10 @@ export namespace CustomerFlowCreateResponse {
2312
2487
  | 'FRUSTRATED'
2313
2488
  | 'SKEPTICAL'
2314
2489
  | 'RUSHED'
2315
- | 'DISTRACTED';
2490
+ | 'DISTRACTED'
2491
+ | 'ANGRY'
2492
+ | 'ANXIOUS'
2493
+ | 'SAD';
2316
2494
 
2317
2495
  /**
2318
2496
  * How the persona confirms information
@@ -2454,6 +2632,13 @@ export namespace CustomerFlowCreateResponse {
2454
2632
  */
2455
2633
  description?: string | null;
2456
2634
 
2635
+ /**
2636
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
2637
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
2638
+ * or set null to display the name itself.
2639
+ */
2640
+ displayName?: string | null;
2641
+
2457
2642
  /**
2458
2643
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
2459
2644
  */
@@ -2513,6 +2698,30 @@ export namespace CustomerFlowUpdateResponse {
2513
2698
  */
2514
2699
  happyPath: ScriptedCustomerFlow.HappyPath | null;
2515
2700
 
2701
+ /**
2702
+ * STRICT only. What the simulated customer does when your agent does not say the
2703
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
2704
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
2705
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
2706
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
2707
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
2708
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
2709
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
2710
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
2711
+ * AGENT_TURN step can carry its own.
2712
+ */
2713
+ offScriptPolicy: ScriptedCustomerFlow.OffScriptPolicy | null;
2714
+
2715
+ /**
2716
+ * How closely a run follows the script. LOOSE (default) hands the whole script to
2717
+ * the simulated customer as one prompt; it keeps the call moving whatever your
2718
+ * agent says. STRICT runs the script as a state machine on the agent service: at
2719
+ * every agent step the simulated customer waits, silent, until your agent has said
2720
+ * the expected line, and only then moves on. Scripted flows only; STRICT needs the
2721
+ * agent-service transport and is not available on realtime models.
2722
+ */
2723
+ scriptAdherence: 'LOOSE' | 'STRICT';
2724
+
2516
2725
  source: 'SYSTEM' | 'CUSTOM';
2517
2726
 
2518
2727
  title: string;
@@ -2663,6 +2872,8 @@ export namespace CustomerFlowUpdateResponse {
2663
2872
  | 'OFFICE'
2664
2873
  | 'THUNDERSTORM';
2665
2874
 
2875
+ backgroundNoiseVolume: number;
2876
+
2666
2877
  /**
2667
2878
  * Creation timestamp in ISO 8601 format
2668
2879
  */
@@ -2745,7 +2956,10 @@ export namespace CustomerFlowUpdateResponse {
2745
2956
  | 'FRUSTRATED'
2746
2957
  | 'SKEPTICAL'
2747
2958
  | 'RUSHED'
2748
- | 'DISTRACTED';
2959
+ | 'DISTRACTED'
2960
+ | 'ANGRY'
2961
+ | 'ANXIOUS'
2962
+ | 'SAD';
2749
2963
 
2750
2964
  /**
2751
2965
  * How the persona confirms information
@@ -2887,6 +3101,13 @@ export namespace CustomerFlowUpdateResponse {
2887
3101
  */
2888
3102
  description?: string | null;
2889
3103
 
3104
+ /**
3105
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
3106
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
3107
+ * or set null to display the name itself.
3108
+ */
3109
+ displayName?: string | null;
3110
+
2890
3111
  /**
2891
3112
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
2892
3113
  */
@@ -2978,6 +3199,8 @@ export namespace CustomerFlowUpdateResponse {
2978
3199
  | 'OFFICE'
2979
3200
  | 'THUNDERSTORM';
2980
3201
 
3202
+ backgroundNoiseVolume: number;
3203
+
2981
3204
  /**
2982
3205
  * Creation timestamp in ISO 8601 format
2983
3206
  */
@@ -3060,7 +3283,10 @@ export namespace CustomerFlowUpdateResponse {
3060
3283
  | 'FRUSTRATED'
3061
3284
  | 'SKEPTICAL'
3062
3285
  | 'RUSHED'
3063
- | 'DISTRACTED';
3286
+ | 'DISTRACTED'
3287
+ | 'ANGRY'
3288
+ | 'ANXIOUS'
3289
+ | 'SAD';
3064
3290
 
3065
3291
  /**
3066
3292
  * How the persona confirms information
@@ -3202,12 +3428,43 @@ export namespace CustomerFlowUpdateResponse {
3202
3428
  */
3203
3429
  description?: string | null;
3204
3430
 
3431
+ /**
3432
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
3433
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
3434
+ * or set null to display the name itself.
3435
+ */
3436
+ displayName?: string | null;
3437
+
3205
3438
  /**
3206
3439
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
3207
3440
  */
3208
3441
  secondaryLanguage?: 'EN' | null;
3209
3442
  }
3210
3443
  }
3444
+
3445
+ /**
3446
+ * STRICT only. What the simulated customer does when your agent does not say the
3447
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
3448
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
3449
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
3450
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
3451
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
3452
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
3453
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
3454
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
3455
+ * AGENT_TURN step can carry its own.
3456
+ */
3457
+ export interface OffScriptPolicy {
3458
+ maxAttempts: number;
3459
+
3460
+ reaction: 'STAY_SILENT' | 'REPEAT' | 'RESPOND' | 'SAY';
3461
+
3462
+ then: 'HANG_UP' | 'MOVE_ON' | 'ADAPT' | 'HANG_UP_INVALIDATE';
3463
+
3464
+ sayLine?: string | null;
3465
+
3466
+ waitSeconds?: number | null;
3467
+ }
3211
3468
  }
3212
3469
 
3213
3470
  /**
@@ -3380,6 +3637,8 @@ export namespace CustomerFlowUpdateResponse {
3380
3637
  | 'OFFICE'
3381
3638
  | 'THUNDERSTORM';
3382
3639
 
3640
+ backgroundNoiseVolume: number;
3641
+
3383
3642
  /**
3384
3643
  * Creation timestamp in ISO 8601 format
3385
3644
  */
@@ -3462,7 +3721,10 @@ export namespace CustomerFlowUpdateResponse {
3462
3721
  | 'FRUSTRATED'
3463
3722
  | 'SKEPTICAL'
3464
3723
  | 'RUSHED'
3465
- | 'DISTRACTED';
3724
+ | 'DISTRACTED'
3725
+ | 'ANGRY'
3726
+ | 'ANXIOUS'
3727
+ | 'SAD';
3466
3728
 
3467
3729
  /**
3468
3730
  * How the persona confirms information
@@ -3604,6 +3866,13 @@ export namespace CustomerFlowUpdateResponse {
3604
3866
  */
3605
3867
  description?: string | null;
3606
3868
 
3869
+ /**
3870
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
3871
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
3872
+ * or set null to display the name itself.
3873
+ */
3874
+ displayName?: string | null;
3875
+
3607
3876
  /**
3608
3877
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
3609
3878
  */
@@ -3693,6 +3962,8 @@ export namespace CustomerFlowUpdateResponse {
3693
3962
  | 'OFFICE'
3694
3963
  | 'THUNDERSTORM';
3695
3964
 
3965
+ backgroundNoiseVolume: number;
3966
+
3696
3967
  /**
3697
3968
  * Creation timestamp in ISO 8601 format
3698
3969
  */
@@ -3775,7 +4046,10 @@ export namespace CustomerFlowUpdateResponse {
3775
4046
  | 'FRUSTRATED'
3776
4047
  | 'SKEPTICAL'
3777
4048
  | 'RUSHED'
3778
- | 'DISTRACTED';
4049
+ | 'DISTRACTED'
4050
+ | 'ANGRY'
4051
+ | 'ANXIOUS'
4052
+ | 'SAD';
3779
4053
 
3780
4054
  /**
3781
4055
  * How the persona confirms information
@@ -3917,6 +4191,13 @@ export namespace CustomerFlowUpdateResponse {
3917
4191
  */
3918
4192
  description?: string | null;
3919
4193
 
4194
+ /**
4195
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
4196
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
4197
+ * or set null to display the name itself.
4198
+ */
4199
+ displayName?: string | null;
4200
+
3920
4201
  /**
3921
4202
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
3922
4203
  */
@@ -4089,6 +4370,8 @@ export namespace CustomerFlowUpdateResponse {
4089
4370
  | 'OFFICE'
4090
4371
  | 'THUNDERSTORM';
4091
4372
 
4373
+ backgroundNoiseVolume: number;
4374
+
4092
4375
  /**
4093
4376
  * Creation timestamp in ISO 8601 format
4094
4377
  */
@@ -4171,7 +4454,10 @@ export namespace CustomerFlowUpdateResponse {
4171
4454
  | 'FRUSTRATED'
4172
4455
  | 'SKEPTICAL'
4173
4456
  | 'RUSHED'
4174
- | 'DISTRACTED';
4457
+ | 'DISTRACTED'
4458
+ | 'ANGRY'
4459
+ | 'ANXIOUS'
4460
+ | 'SAD';
4175
4461
 
4176
4462
  /**
4177
4463
  * How the persona confirms information
@@ -4313,6 +4599,13 @@ export namespace CustomerFlowUpdateResponse {
4313
4599
  */
4314
4600
  description?: string | null;
4315
4601
 
4602
+ /**
4603
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
4604
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
4605
+ * or set null to display the name itself.
4606
+ */
4607
+ displayName?: string | null;
4608
+
4316
4609
  /**
4317
4610
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
4318
4611
  */
@@ -4397,6 +4690,8 @@ export namespace CustomerFlowUpdateResponse {
4397
4690
  | 'OFFICE'
4398
4691
  | 'THUNDERSTORM';
4399
4692
 
4693
+ backgroundNoiseVolume: number;
4694
+
4400
4695
  /**
4401
4696
  * Creation timestamp in ISO 8601 format
4402
4697
  */
@@ -4479,7 +4774,10 @@ export namespace CustomerFlowUpdateResponse {
4479
4774
  | 'FRUSTRATED'
4480
4775
  | 'SKEPTICAL'
4481
4776
  | 'RUSHED'
4482
- | 'DISTRACTED';
4777
+ | 'DISTRACTED'
4778
+ | 'ANGRY'
4779
+ | 'ANXIOUS'
4780
+ | 'SAD';
4483
4781
 
4484
4782
  /**
4485
4783
  * How the persona confirms information
@@ -4621,6 +4919,13 @@ export namespace CustomerFlowUpdateResponse {
4621
4919
  */
4622
4920
  description?: string | null;
4623
4921
 
4922
+ /**
4923
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
4924
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
4925
+ * or set null to display the name itself.
4926
+ */
4927
+ displayName?: string | null;
4928
+
4624
4929
  /**
4625
4930
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
4626
4931
  */
@@ -4683,6 +4988,30 @@ export namespace CustomerFlowListResponse {
4683
4988
  */
4684
4989
  happyPath: ScriptedCustomerFlow.HappyPath | null;
4685
4990
 
4991
+ /**
4992
+ * STRICT only. What the simulated customer does when your agent does not say the
4993
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
4994
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
4995
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
4996
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
4997
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
4998
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
4999
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
5000
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
5001
+ * AGENT_TURN step can carry its own.
5002
+ */
5003
+ offScriptPolicy: ScriptedCustomerFlow.OffScriptPolicy | null;
5004
+
5005
+ /**
5006
+ * How closely a run follows the script. LOOSE (default) hands the whole script to
5007
+ * the simulated customer as one prompt; it keeps the call moving whatever your
5008
+ * agent says. STRICT runs the script as a state machine on the agent service: at
5009
+ * every agent step the simulated customer waits, silent, until your agent has said
5010
+ * the expected line, and only then moves on. Scripted flows only; STRICT needs the
5011
+ * agent-service transport and is not available on realtime models.
5012
+ */
5013
+ scriptAdherence: 'LOOSE' | 'STRICT';
5014
+
4686
5015
  source: 'SYSTEM' | 'CUSTOM';
4687
5016
 
4688
5017
  title: string;
@@ -4833,6 +5162,8 @@ export namespace CustomerFlowListResponse {
4833
5162
  | 'OFFICE'
4834
5163
  | 'THUNDERSTORM';
4835
5164
 
5165
+ backgroundNoiseVolume: number;
5166
+
4836
5167
  /**
4837
5168
  * Creation timestamp in ISO 8601 format
4838
5169
  */
@@ -4915,7 +5246,10 @@ export namespace CustomerFlowListResponse {
4915
5246
  | 'FRUSTRATED'
4916
5247
  | 'SKEPTICAL'
4917
5248
  | 'RUSHED'
4918
- | 'DISTRACTED';
5249
+ | 'DISTRACTED'
5250
+ | 'ANGRY'
5251
+ | 'ANXIOUS'
5252
+ | 'SAD';
4919
5253
 
4920
5254
  /**
4921
5255
  * How the persona confirms information
@@ -5057,6 +5391,13 @@ export namespace CustomerFlowListResponse {
5057
5391
  */
5058
5392
  description?: string | null;
5059
5393
 
5394
+ /**
5395
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
5396
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
5397
+ * or set null to display the name itself.
5398
+ */
5399
+ displayName?: string | null;
5400
+
5060
5401
  /**
5061
5402
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
5062
5403
  */
@@ -5148,6 +5489,8 @@ export namespace CustomerFlowListResponse {
5148
5489
  | 'OFFICE'
5149
5490
  | 'THUNDERSTORM';
5150
5491
 
5492
+ backgroundNoiseVolume: number;
5493
+
5151
5494
  /**
5152
5495
  * Creation timestamp in ISO 8601 format
5153
5496
  */
@@ -5230,7 +5573,10 @@ export namespace CustomerFlowListResponse {
5230
5573
  | 'FRUSTRATED'
5231
5574
  | 'SKEPTICAL'
5232
5575
  | 'RUSHED'
5233
- | 'DISTRACTED';
5576
+ | 'DISTRACTED'
5577
+ | 'ANGRY'
5578
+ | 'ANXIOUS'
5579
+ | 'SAD';
5234
5580
 
5235
5581
  /**
5236
5582
  * How the persona confirms information
@@ -5372,12 +5718,43 @@ export namespace CustomerFlowListResponse {
5372
5718
  */
5373
5719
  description?: string | null;
5374
5720
 
5721
+ /**
5722
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
5723
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
5724
+ * or set null to display the name itself.
5725
+ */
5726
+ displayName?: string | null;
5727
+
5375
5728
  /**
5376
5729
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
5377
5730
  */
5378
5731
  secondaryLanguage?: 'EN' | null;
5379
5732
  }
5380
5733
  }
5734
+
5735
+ /**
5736
+ * STRICT only. What the simulated customer does when your agent does not say the
5737
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
5738
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
5739
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
5740
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
5741
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
5742
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
5743
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
5744
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
5745
+ * AGENT_TURN step can carry its own.
5746
+ */
5747
+ export interface OffScriptPolicy {
5748
+ maxAttempts: number;
5749
+
5750
+ reaction: 'STAY_SILENT' | 'REPEAT' | 'RESPOND' | 'SAY';
5751
+
5752
+ then: 'HANG_UP' | 'MOVE_ON' | 'ADAPT' | 'HANG_UP_INVALIDATE';
5753
+
5754
+ sayLine?: string | null;
5755
+
5756
+ waitSeconds?: number | null;
5757
+ }
5381
5758
  }
5382
5759
 
5383
5760
  /**
@@ -5550,6 +5927,8 @@ export namespace CustomerFlowListResponse {
5550
5927
  | 'OFFICE'
5551
5928
  | 'THUNDERSTORM';
5552
5929
 
5930
+ backgroundNoiseVolume: number;
5931
+
5553
5932
  /**
5554
5933
  * Creation timestamp in ISO 8601 format
5555
5934
  */
@@ -5632,7 +6011,10 @@ export namespace CustomerFlowListResponse {
5632
6011
  | 'FRUSTRATED'
5633
6012
  | 'SKEPTICAL'
5634
6013
  | 'RUSHED'
5635
- | 'DISTRACTED';
6014
+ | 'DISTRACTED'
6015
+ | 'ANGRY'
6016
+ | 'ANXIOUS'
6017
+ | 'SAD';
5636
6018
 
5637
6019
  /**
5638
6020
  * How the persona confirms information
@@ -5774,6 +6156,13 @@ export namespace CustomerFlowListResponse {
5774
6156
  */
5775
6157
  description?: string | null;
5776
6158
 
6159
+ /**
6160
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
6161
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
6162
+ * or set null to display the name itself.
6163
+ */
6164
+ displayName?: string | null;
6165
+
5777
6166
  /**
5778
6167
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
5779
6168
  */
@@ -5863,6 +6252,8 @@ export namespace CustomerFlowListResponse {
5863
6252
  | 'OFFICE'
5864
6253
  | 'THUNDERSTORM';
5865
6254
 
6255
+ backgroundNoiseVolume: number;
6256
+
5866
6257
  /**
5867
6258
  * Creation timestamp in ISO 8601 format
5868
6259
  */
@@ -5945,7 +6336,10 @@ export namespace CustomerFlowListResponse {
5945
6336
  | 'FRUSTRATED'
5946
6337
  | 'SKEPTICAL'
5947
6338
  | 'RUSHED'
5948
- | 'DISTRACTED';
6339
+ | 'DISTRACTED'
6340
+ | 'ANGRY'
6341
+ | 'ANXIOUS'
6342
+ | 'SAD';
5949
6343
 
5950
6344
  /**
5951
6345
  * How the persona confirms information
@@ -6087,6 +6481,13 @@ export namespace CustomerFlowListResponse {
6087
6481
  */
6088
6482
  description?: string | null;
6089
6483
 
6484
+ /**
6485
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
6486
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
6487
+ * or set null to display the name itself.
6488
+ */
6489
+ displayName?: string | null;
6490
+
6090
6491
  /**
6091
6492
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
6092
6493
  */
@@ -6259,6 +6660,8 @@ export namespace CustomerFlowListResponse {
6259
6660
  | 'OFFICE'
6260
6661
  | 'THUNDERSTORM';
6261
6662
 
6663
+ backgroundNoiseVolume: number;
6664
+
6262
6665
  /**
6263
6666
  * Creation timestamp in ISO 8601 format
6264
6667
  */
@@ -6341,7 +6744,10 @@ export namespace CustomerFlowListResponse {
6341
6744
  | 'FRUSTRATED'
6342
6745
  | 'SKEPTICAL'
6343
6746
  | 'RUSHED'
6344
- | 'DISTRACTED';
6747
+ | 'DISTRACTED'
6748
+ | 'ANGRY'
6749
+ | 'ANXIOUS'
6750
+ | 'SAD';
6345
6751
 
6346
6752
  /**
6347
6753
  * How the persona confirms information
@@ -6483,6 +6889,13 @@ export namespace CustomerFlowListResponse {
6483
6889
  */
6484
6890
  description?: string | null;
6485
6891
 
6892
+ /**
6893
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
6894
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
6895
+ * or set null to display the name itself.
6896
+ */
6897
+ displayName?: string | null;
6898
+
6486
6899
  /**
6487
6900
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
6488
6901
  */
@@ -6567,6 +6980,8 @@ export namespace CustomerFlowListResponse {
6567
6980
  | 'OFFICE'
6568
6981
  | 'THUNDERSTORM';
6569
6982
 
6983
+ backgroundNoiseVolume: number;
6984
+
6570
6985
  /**
6571
6986
  * Creation timestamp in ISO 8601 format
6572
6987
  */
@@ -6649,7 +7064,10 @@ export namespace CustomerFlowListResponse {
6649
7064
  | 'FRUSTRATED'
6650
7065
  | 'SKEPTICAL'
6651
7066
  | 'RUSHED'
6652
- | 'DISTRACTED';
7067
+ | 'DISTRACTED'
7068
+ | 'ANGRY'
7069
+ | 'ANXIOUS'
7070
+ | 'SAD';
6653
7071
 
6654
7072
  /**
6655
7073
  * How the persona confirms information
@@ -6791,6 +7209,13 @@ export namespace CustomerFlowListResponse {
6791
7209
  */
6792
7210
  description?: string | null;
6793
7211
 
7212
+ /**
7213
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
7214
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
7215
+ * or set null to display the name itself.
7216
+ */
7217
+ displayName?: string | null;
7218
+
6794
7219
  /**
6795
7220
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
6796
7221
  */
@@ -6830,17 +7255,17 @@ export namespace CustomerFlowDeleteResponse {
6830
7255
  }
6831
7256
  }
6832
7257
 
6833
- export interface CustomerFlowGetByIDResponse {
7258
+ export interface CustomerFlowDuplicateResponse {
6834
7259
  /**
6835
7260
  * The conversation a simulated customer has with the agent under test.
6836
7261
  */
6837
7262
  data:
6838
- | CustomerFlowGetByIDResponse.ScriptedCustomerFlow
6839
- | CustomerFlowGetByIDResponse.ImprovCustomerFlow
6840
- | CustomerFlowGetByIDResponse.VoicemailCustomerFlow;
7263
+ | CustomerFlowDuplicateResponse.ScriptedCustomerFlow
7264
+ | CustomerFlowDuplicateResponse.ImprovCustomerFlow
7265
+ | CustomerFlowDuplicateResponse.VoicemailCustomerFlow;
6841
7266
  }
6842
7267
 
6843
- export namespace CustomerFlowGetByIDResponse {
7268
+ export namespace CustomerFlowDuplicateResponse {
6844
7269
  /**
6845
7270
  * A flow whose conversation is written out as a graph of turns.
6846
7271
  */
@@ -6880,6 +7305,30 @@ export namespace CustomerFlowGetByIDResponse {
6880
7305
  */
6881
7306
  happyPath: ScriptedCustomerFlow.HappyPath | null;
6882
7307
 
7308
+ /**
7309
+ * STRICT only. What the simulated customer does when your agent does not say the
7310
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
7311
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
7312
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
7313
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
7314
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
7315
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
7316
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
7317
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
7318
+ * AGENT_TURN step can carry its own.
7319
+ */
7320
+ offScriptPolicy: ScriptedCustomerFlow.OffScriptPolicy | null;
7321
+
7322
+ /**
7323
+ * How closely a run follows the script. LOOSE (default) hands the whole script to
7324
+ * the simulated customer as one prompt; it keeps the call moving whatever your
7325
+ * agent says. STRICT runs the script as a state machine on the agent service: at
7326
+ * every agent step the simulated customer waits, silent, until your agent has said
7327
+ * the expected line, and only then moves on. Scripted flows only; STRICT needs the
7328
+ * agent-service transport and is not available on realtime models.
7329
+ */
7330
+ scriptAdherence: 'LOOSE' | 'STRICT';
7331
+
6883
7332
  source: 'SYSTEM' | 'CUSTOM';
6884
7333
 
6885
7334
  title: string;
@@ -7030,6 +7479,8 @@ export namespace CustomerFlowGetByIDResponse {
7030
7479
  | 'OFFICE'
7031
7480
  | 'THUNDERSTORM';
7032
7481
 
7482
+ backgroundNoiseVolume: number;
7483
+
7033
7484
  /**
7034
7485
  * Creation timestamp in ISO 8601 format
7035
7486
  */
@@ -7112,7 +7563,10 @@ export namespace CustomerFlowGetByIDResponse {
7112
7563
  | 'FRUSTRATED'
7113
7564
  | 'SKEPTICAL'
7114
7565
  | 'RUSHED'
7115
- | 'DISTRACTED';
7566
+ | 'DISTRACTED'
7567
+ | 'ANGRY'
7568
+ | 'ANXIOUS'
7569
+ | 'SAD';
7116
7570
 
7117
7571
  /**
7118
7572
  * How the persona confirms information
@@ -7254,6 +7708,13 @@ export namespace CustomerFlowGetByIDResponse {
7254
7708
  */
7255
7709
  description?: string | null;
7256
7710
 
7711
+ /**
7712
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
7713
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
7714
+ * or set null to display the name itself.
7715
+ */
7716
+ displayName?: string | null;
7717
+
7257
7718
  /**
7258
7719
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
7259
7720
  */
@@ -7345,6 +7806,8 @@ export namespace CustomerFlowGetByIDResponse {
7345
7806
  | 'OFFICE'
7346
7807
  | 'THUNDERSTORM';
7347
7808
 
7809
+ backgroundNoiseVolume: number;
7810
+
7348
7811
  /**
7349
7812
  * Creation timestamp in ISO 8601 format
7350
7813
  */
@@ -7427,7 +7890,10 @@ export namespace CustomerFlowGetByIDResponse {
7427
7890
  | 'FRUSTRATED'
7428
7891
  | 'SKEPTICAL'
7429
7892
  | 'RUSHED'
7430
- | 'DISTRACTED';
7893
+ | 'DISTRACTED'
7894
+ | 'ANGRY'
7895
+ | 'ANXIOUS'
7896
+ | 'SAD';
7431
7897
 
7432
7898
  /**
7433
7899
  * How the persona confirms information
@@ -7569,12 +8035,43 @@ export namespace CustomerFlowGetByIDResponse {
7569
8035
  */
7570
8036
  description?: string | null;
7571
8037
 
8038
+ /**
8039
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
8040
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
8041
+ * or set null to display the name itself.
8042
+ */
8043
+ displayName?: string | null;
8044
+
7572
8045
  /**
7573
8046
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
7574
8047
  */
7575
8048
  secondaryLanguage?: 'EN' | null;
7576
8049
  }
7577
8050
  }
8051
+
8052
+ /**
8053
+ * STRICT only. What the simulated customer does when your agent does not say the
8054
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
8055
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
8056
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
8057
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
8058
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
8059
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
8060
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
8061
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
8062
+ * AGENT_TURN step can carry its own.
8063
+ */
8064
+ export interface OffScriptPolicy {
8065
+ maxAttempts: number;
8066
+
8067
+ reaction: 'STAY_SILENT' | 'REPEAT' | 'RESPOND' | 'SAY';
8068
+
8069
+ then: 'HANG_UP' | 'MOVE_ON' | 'ADAPT' | 'HANG_UP_INVALIDATE';
8070
+
8071
+ sayLine?: string | null;
8072
+
8073
+ waitSeconds?: number | null;
8074
+ }
7578
8075
  }
7579
8076
 
7580
8077
  /**
@@ -7747,6 +8244,8 @@ export namespace CustomerFlowGetByIDResponse {
7747
8244
  | 'OFFICE'
7748
8245
  | 'THUNDERSTORM';
7749
8246
 
8247
+ backgroundNoiseVolume: number;
8248
+
7750
8249
  /**
7751
8250
  * Creation timestamp in ISO 8601 format
7752
8251
  */
@@ -7829,7 +8328,10 @@ export namespace CustomerFlowGetByIDResponse {
7829
8328
  | 'FRUSTRATED'
7830
8329
  | 'SKEPTICAL'
7831
8330
  | 'RUSHED'
7832
- | 'DISTRACTED';
8331
+ | 'DISTRACTED'
8332
+ | 'ANGRY'
8333
+ | 'ANXIOUS'
8334
+ | 'SAD';
7833
8335
 
7834
8336
  /**
7835
8337
  * How the persona confirms information
@@ -7971,6 +8473,13 @@ export namespace CustomerFlowGetByIDResponse {
7971
8473
  */
7972
8474
  description?: string | null;
7973
8475
 
8476
+ /**
8477
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
8478
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
8479
+ * or set null to display the name itself.
8480
+ */
8481
+ displayName?: string | null;
8482
+
7974
8483
  /**
7975
8484
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
7976
8485
  */
@@ -8060,6 +8569,8 @@ export namespace CustomerFlowGetByIDResponse {
8060
8569
  | 'OFFICE'
8061
8570
  | 'THUNDERSTORM';
8062
8571
 
8572
+ backgroundNoiseVolume: number;
8573
+
8063
8574
  /**
8064
8575
  * Creation timestamp in ISO 8601 format
8065
8576
  */
@@ -8142,7 +8653,10 @@ export namespace CustomerFlowGetByIDResponse {
8142
8653
  | 'FRUSTRATED'
8143
8654
  | 'SKEPTICAL'
8144
8655
  | 'RUSHED'
8145
- | 'DISTRACTED';
8656
+ | 'DISTRACTED'
8657
+ | 'ANGRY'
8658
+ | 'ANXIOUS'
8659
+ | 'SAD';
8146
8660
 
8147
8661
  /**
8148
8662
  * How the persona confirms information
@@ -8284,6 +8798,13 @@ export namespace CustomerFlowGetByIDResponse {
8284
8798
  */
8285
8799
  description?: string | null;
8286
8800
 
8801
+ /**
8802
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
8803
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
8804
+ * or set null to display the name itself.
8805
+ */
8806
+ displayName?: string | null;
8807
+
8287
8808
  /**
8288
8809
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
8289
8810
  */
@@ -8456,6 +8977,8 @@ export namespace CustomerFlowGetByIDResponse {
8456
8977
  | 'OFFICE'
8457
8978
  | 'THUNDERSTORM';
8458
8979
 
8980
+ backgroundNoiseVolume: number;
8981
+
8459
8982
  /**
8460
8983
  * Creation timestamp in ISO 8601 format
8461
8984
  */
@@ -8538,7 +9061,10 @@ export namespace CustomerFlowGetByIDResponse {
8538
9061
  | 'FRUSTRATED'
8539
9062
  | 'SKEPTICAL'
8540
9063
  | 'RUSHED'
8541
- | 'DISTRACTED';
9064
+ | 'DISTRACTED'
9065
+ | 'ANGRY'
9066
+ | 'ANXIOUS'
9067
+ | 'SAD';
8542
9068
 
8543
9069
  /**
8544
9070
  * How the persona confirms information
@@ -8680,6 +9206,13 @@ export namespace CustomerFlowGetByIDResponse {
8680
9206
  */
8681
9207
  description?: string | null;
8682
9208
 
9209
+ /**
9210
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
9211
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
9212
+ * or set null to display the name itself.
9213
+ */
9214
+ displayName?: string | null;
9215
+
8683
9216
  /**
8684
9217
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
8685
9218
  */
@@ -8764,6 +9297,8 @@ export namespace CustomerFlowGetByIDResponse {
8764
9297
  | 'OFFICE'
8765
9298
  | 'THUNDERSTORM';
8766
9299
 
9300
+ backgroundNoiseVolume: number;
9301
+
8767
9302
  /**
8768
9303
  * Creation timestamp in ISO 8601 format
8769
9304
  */
@@ -8846,7 +9381,10 @@ export namespace CustomerFlowGetByIDResponse {
8846
9381
  | 'FRUSTRATED'
8847
9382
  | 'SKEPTICAL'
8848
9383
  | 'RUSHED'
8849
- | 'DISTRACTED';
9384
+ | 'DISTRACTED'
9385
+ | 'ANGRY'
9386
+ | 'ANXIOUS'
9387
+ | 'SAD';
8850
9388
 
8851
9389
  /**
8852
9390
  * How the persona confirms information
@@ -8988,6 +9526,13 @@ export namespace CustomerFlowGetByIDResponse {
8988
9526
  */
8989
9527
  description?: string | null;
8990
9528
 
9529
+ /**
9530
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
9531
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
9532
+ * or set null to display the name itself.
9533
+ */
9534
+ displayName?: string | null;
9535
+
8991
9536
  /**
8992
9537
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
8993
9538
  */
@@ -8997,45 +9542,2332 @@ export namespace CustomerFlowGetByIDResponse {
8997
9542
  }
8998
9543
  }
8999
9544
 
9000
- export interface CustomerFlowReplaceGraphResponse {
9001
- data: CustomerFlowReplaceGraphResponse.Data;
9545
+ export interface CustomerFlowGetByIDResponse {
9546
+ /**
9547
+ * The conversation a simulated customer has with the agent under test.
9548
+ */
9549
+ data:
9550
+ | CustomerFlowGetByIDResponse.ScriptedCustomerFlow
9551
+ | CustomerFlowGetByIDResponse.ImprovCustomerFlow
9552
+ | CustomerFlowGetByIDResponse.VoicemailCustomerFlow;
9002
9553
  }
9003
9554
 
9004
- export namespace CustomerFlowReplaceGraphResponse {
9005
- export interface Data {
9555
+ export namespace CustomerFlowGetByIDResponse {
9556
+ /**
9557
+ * A flow whose conversation is written out as a graph of turns.
9558
+ */
9559
+ export interface ScriptedCustomerFlow {
9560
+ id: string;
9561
+
9562
+ agentExpectations: Array<ScriptedCustomerFlow.AgentExpectation>;
9563
+
9006
9564
  /**
9007
- * The edge cases after the write.
9565
+ * The agents this flow is run against.
9008
9566
  */
9009
- edgeCases: Array<Data.ScriptedFlowVariant | Data.ImprovFlowVariant | Data.VoicemailFlowVariant>;
9010
-
9011
- graph: Array<CustomerFlowAPI.FlowStep>;
9567
+ agents: Array<ScriptedCustomerFlow.Agent>;
9012
9568
 
9013
9569
  /**
9014
- * The way a customer flow is meant to go.
9570
+ * How a run walks the graph. DETERMINISTIC ("Simulate every path" in the app)
9571
+ * places one call per variant, each following its path exactly whatever the agent
9572
+ * says. ADAPTIVE ("Adapt to your agent") collapses the paths into one call PER
9573
+ * PERSONA, on which the simulated customer picks a branch from what the agent
9574
+ * actually said. Both modes speak the exact authored lines, and neither changes
9575
+ * how metrics or expectations grade.
9015
9576
  */
9016
- happyPath: Data.ScriptedFlowVariant | Data.ImprovFlowVariant | Data.VoicemailFlowVariant | null;
9577
+ branchingMode: 'DETERMINISTIC' | 'ADAPTIVE';
9017
9578
 
9018
9579
  /**
9019
- * True when the write changed the set of paths, so the flow's variants were
9020
- * re-seeded and any variant id you were holding may no longer exist.
9580
+ * Creation timestamp in ISO 8601 format
9021
9581
  */
9022
- variantsReshaped: boolean;
9582
+ createdAt: string;
9023
9583
 
9024
- warnings: Array<string>;
9025
- }
9584
+ /**
9585
+ * Every other way of running this flow.
9586
+ */
9587
+ edgeCases: Array<ScriptedCustomerFlow.EdgeCase>;
9026
9588
 
9027
- export namespace Data {
9028
9589
  /**
9029
9590
  * One path through a scripted flow. The path engine owns which paths exist, so
9030
9591
  * editing the graph is what creates and removes these.
9031
9592
  */
9032
- export interface ScriptedFlowVariant {
9033
- id: string;
9593
+ happyPath: ScriptedCustomerFlow.HappyPath | null;
9034
9594
 
9035
- /**
9036
- * Graded on top of the flow's own expectations, for this variant only.
9037
- */
9038
- additionalExpectations: Array<ScriptedFlowVariant.AdditionalExpectation>;
9595
+ /**
9596
+ * STRICT only. What the simulated customer does when your agent does not say the
9597
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
9598
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
9599
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
9600
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
9601
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
9602
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
9603
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
9604
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
9605
+ * AGENT_TURN step can carry its own.
9606
+ */
9607
+ offScriptPolicy: ScriptedCustomerFlow.OffScriptPolicy | null;
9608
+
9609
+ /**
9610
+ * How closely a run follows the script. LOOSE (default) hands the whole script to
9611
+ * the simulated customer as one prompt; it keeps the call moving whatever your
9612
+ * agent says. STRICT runs the script as a state machine on the agent service: at
9613
+ * every agent step the simulated customer waits, silent, until your agent has said
9614
+ * the expected line, and only then moves on. Scripted flows only; STRICT needs the
9615
+ * agent-service transport and is not available on realtime models.
9616
+ */
9617
+ scriptAdherence: 'LOOSE' | 'STRICT';
9618
+
9619
+ source: 'SYSTEM' | 'CUSTOM';
9620
+
9621
+ title: string;
9622
+
9623
+ type: 'SCRIPTED';
9624
+
9625
+ /**
9626
+ * Last update timestamp in ISO 8601 format
9627
+ */
9628
+ updatedAt: string;
9629
+
9630
+ description?: string | null;
9631
+
9632
+ /**
9633
+ * The conversation, as a graph of steps. Present on a single flow; omitted from
9634
+ * the list, where reading it would mean walking the project step graph once per
9635
+ * row.
9636
+ */
9637
+ graph?: Array<CustomerFlowAPI.FlowStep>;
9638
+ }
9639
+
9640
+ export namespace ScriptedCustomerFlow {
9641
+ /**
9642
+ * One thing the agent under test is graded against.
9643
+ */
9644
+ export interface AgentExpectation {
9645
+ id: string;
9646
+
9647
+ /**
9648
+ * What the agent under test is graded against.
9649
+ */
9650
+ prompt: string;
9651
+ }
9652
+
9653
+ export interface Agent {
9654
+ /**
9655
+ * Unique identifier of the agent
9656
+ */
9657
+ id: string;
9658
+
9659
+ /**
9660
+ * Creation timestamp in ISO 8601 format
9661
+ */
9662
+ createdAt: string;
9663
+
9664
+ /**
9665
+ * Custom identifier for the agent
9666
+ */
9667
+ customId: string | null;
9668
+
9669
+ /**
9670
+ * Description of the agent
9671
+ */
9672
+ description: string | null;
9673
+
9674
+ /**
9675
+ * Name of the agent
9676
+ */
9677
+ name: string;
9678
+
9679
+ /**
9680
+ * Last update timestamp in ISO 8601 format
9681
+ */
9682
+ updatedAt: string;
9683
+ }
9684
+
9685
+ /**
9686
+ * One path through a scripted flow. The path engine owns which paths exist, so
9687
+ * editing the graph is what creates and removes these.
9688
+ */
9689
+ export interface EdgeCase {
9690
+ id: string;
9691
+
9692
+ /**
9693
+ * Graded on top of the flow's own expectations, for this variant only.
9694
+ */
9695
+ additionalExpectations: Array<EdgeCase.AdditionalExpectation>;
9696
+
9697
+ /**
9698
+ * Creation timestamp in ISO 8601 format
9699
+ */
9700
+ createdAt: string;
9701
+
9702
+ /**
9703
+ * A simulation environment: the ambient conditions a customer flow variant runs
9704
+ * under. The list includes both your own and the ones Roark curates for every
9705
+ * project.
9706
+ */
9707
+ environment: EdgeCase.Environment | null;
9708
+
9709
+ isGenerated: boolean;
9710
+
9711
+ /**
9712
+ * The persona this runs as instead of the happy path's. Null means it inherits.
9713
+ */
9714
+ personaOverride: EdgeCase.PersonaOverride | null;
9715
+
9716
+ precededByCustomerFlowId: string | null;
9717
+
9718
+ precededByCustomerFlowVariantId: string | null;
9719
+
9720
+ /**
9721
+ * The one path through the graph this variant runs, in order. Linear by
9722
+ * construction, so these steps never nest.
9723
+ */
9724
+ steps: Array<CustomerFlowAPI.FlowStep>;
9725
+
9726
+ title: string;
9727
+
9728
+ type: 'SCRIPTED';
9729
+
9730
+ /**
9731
+ * Last update timestamp in ISO 8601 format
9732
+ */
9733
+ updatedAt: string;
9734
+
9735
+ systemKey?: string | null;
9736
+ }
9737
+
9738
+ export namespace EdgeCase {
9739
+ /**
9740
+ * One thing the agent under test is graded against.
9741
+ */
9742
+ export interface AdditionalExpectation {
9743
+ id: string;
9744
+
9745
+ /**
9746
+ * What the agent under test is graded against.
9747
+ */
9748
+ prompt: string;
9749
+ }
9750
+
9751
+ /**
9752
+ * A simulation environment: the ambient conditions a customer flow variant runs
9753
+ * under. The list includes both your own and the ones Roark curates for every
9754
+ * project.
9755
+ */
9756
+ export interface Environment {
9757
+ id: string;
9758
+
9759
+ backgroundNoise:
9760
+ | 'NONE'
9761
+ | 'AIRPORT'
9762
+ | 'CHILDREN_PLAYING'
9763
+ | 'CITY'
9764
+ | 'COFFEE_SHOP'
9765
+ | 'DRIVING'
9766
+ | 'OFFICE'
9767
+ | 'THUNDERSTORM';
9768
+
9769
+ backgroundNoiseVolume: number;
9770
+
9771
+ /**
9772
+ * Creation timestamp in ISO 8601 format
9773
+ */
9774
+ createdAt: string;
9775
+
9776
+ name: string;
9777
+
9778
+ /**
9779
+ * Last update timestamp in ISO 8601 format
9780
+ */
9781
+ updatedAt: string;
9782
+
9783
+ description?: string | null;
9784
+ }
9785
+
9786
+ /**
9787
+ * The persona this runs as instead of the happy path's. Null means it inherits.
9788
+ */
9789
+ export interface PersonaOverride {
9790
+ /**
9791
+ * Unique identifier of the persona
9792
+ */
9793
+ id: string;
9794
+
9795
+ /**
9796
+ * Accent of the persona, defined using ISO 3166-1 alpha-2 country codes with
9797
+ * optional variants
9798
+ */
9799
+ accent:
9800
+ | 'US'
9801
+ | 'US_X_SOUTH'
9802
+ | 'GB'
9803
+ | 'ES'
9804
+ | 'DE'
9805
+ | 'IN'
9806
+ | 'FR'
9807
+ | 'NL'
9808
+ | 'SA'
9809
+ | 'GR'
9810
+ | 'AU'
9811
+ | 'IT'
9812
+ | 'ID'
9813
+ | 'TH'
9814
+ | 'JP'
9815
+ | 'NZ'
9816
+ | 'PH'
9817
+ | 'SG'
9818
+ | 'MY'
9819
+ | 'HK'
9820
+ | 'TR'
9821
+ | 'PT'
9822
+ | 'IL';
9823
+
9824
+ /**
9825
+ * How old the caller sounds and behaves. Only ages the persona's accent has a
9826
+ * voice for are accepted; defaults to ADULT, which every accent supports.
9827
+ */
9828
+ age: 'CHILD' | 'TEENAGER' | 'ADULT' | 'ELDERLY';
9829
+
9830
+ /**
9831
+ * Background noise setting
9832
+ */
9833
+ backgroundNoise:
9834
+ | 'NONE'
9835
+ | 'AIRPORT'
9836
+ | 'CHILDREN_PLAYING'
9837
+ | 'CITY'
9838
+ | 'COFFEE_SHOP'
9839
+ | 'DRIVING'
9840
+ | 'OFFICE'
9841
+ | 'THUNDERSTORM';
9842
+
9843
+ /**
9844
+ * Base emotional state of the persona
9845
+ */
9846
+ baseEmotion:
9847
+ | 'NEUTRAL'
9848
+ | 'CHEERFUL'
9849
+ | 'CONFUSED'
9850
+ | 'FRUSTRATED'
9851
+ | 'SKEPTICAL'
9852
+ | 'RUSHED'
9853
+ | 'DISTRACTED'
9854
+ | 'ANGRY'
9855
+ | 'ANXIOUS'
9856
+ | 'SAD';
9857
+
9858
+ /**
9859
+ * How the persona confirms information
9860
+ */
9861
+ confirmationStyle: 'EXPLICIT' | 'VAGUE';
9862
+
9863
+ /**
9864
+ * Creation timestamp
9865
+ */
9866
+ createdAt: string;
9867
+
9868
+ /**
9869
+ * Gender of the persona
9870
+ */
9871
+ gender: 'MALE' | 'FEMALE';
9872
+
9873
+ /**
9874
+ * Whether the persona uses filler words like "um" and "uh"
9875
+ */
9876
+ hasDisfluencies: boolean;
9877
+
9878
+ /**
9879
+ * Maximum number of idle messages the persona will send before giving up
9880
+ */
9881
+ idleMessageMaxSpokenCount: number;
9882
+
9883
+ /**
9884
+ * Whether the idle message counter resets when the agent speaks
9885
+ */
9886
+ idleMessageResetCountOnUserSpeechEnabled: boolean;
9887
+
9888
+ /**
9889
+ * Messages the persona will say when the agent goes silent during a call. null =
9890
+ * "Automatic": language-appropriate defaults are used at call time.
9891
+ */
9892
+ idleMessages: Array<string> | null;
9893
+
9894
+ /**
9895
+ * Seconds of silence before the persona sends an idle message
9896
+ */
9897
+ idleTimeoutSeconds: number;
9898
+
9899
+ /**
9900
+ * How clearly the persona expresses their intentions
9901
+ */
9902
+ intentClarity: 'CLEAR' | 'INDIRECT' | 'VAGUE';
9903
+
9904
+ /**
9905
+ * Primary language ISO 639-1 code for the persona
9906
+ */
9907
+ language:
9908
+ | 'EN'
9909
+ | 'ES'
9910
+ | 'DE'
9911
+ | 'HI'
9912
+ | 'FR'
9913
+ | 'NL'
9914
+ | 'AR'
9915
+ | 'EL'
9916
+ | 'IT'
9917
+ | 'ID'
9918
+ | 'TH'
9919
+ | 'JA'
9920
+ | 'TL'
9921
+ | 'MS'
9922
+ | 'ZH'
9923
+ | 'TR'
9924
+ | 'PT'
9925
+ | 'HE';
9926
+
9927
+ /**
9928
+ * How reliable the persona's memory is
9929
+ */
9930
+ memoryReliability: 'HIGH' | 'LOW';
9931
+
9932
+ /**
9933
+ * The name the agent will identify as during conversations
9934
+ */
9935
+ name: string;
9936
+
9937
+ /**
9938
+ * Additional custom properties about the persona
9939
+ */
9940
+ properties: { [key: string]: unknown };
9941
+
9942
+ /**
9943
+ * Controls how quickly the persona responds to pauses in conversation (QUICK,
9944
+ * NORMAL, RELAXED)
9945
+ */
9946
+ responseTiming: 'RELAXED' | 'NORMAL' | 'QUICK';
9947
+
9948
+ /**
9949
+ * Speech clarity of the persona
9950
+ */
9951
+ speechClarity: 'CLEAR' | 'VAGUE' | 'RAMBLING';
9952
+
9953
+ /**
9954
+ * Speech pace of the persona
9955
+ */
9956
+ speechPace: 'SUPER_SLOW' | 'SLOW' | 'NORMAL' | 'FAST' | 'SUPER_FAST';
9957
+
9958
+ /**
9959
+ * Languages the persona can understand. Multilingual combinations are limited by
9960
+ * multilingual speech recognition support.
9961
+ */
9962
+ understoodLanguages: Array<
9963
+ | 'EN'
9964
+ | 'ES'
9965
+ | 'DE'
9966
+ | 'HI'
9967
+ | 'FR'
9968
+ | 'NL'
9969
+ | 'AR'
9970
+ | 'EL'
9971
+ | 'IT'
9972
+ | 'ID'
9973
+ | 'TH'
9974
+ | 'JA'
9975
+ | 'TL'
9976
+ | 'MS'
9977
+ | 'ZH'
9978
+ | 'TR'
9979
+ | 'PT'
9980
+ | 'HE'
9981
+ >;
9982
+
9983
+ /**
9984
+ * Last update timestamp
9985
+ */
9986
+ updatedAt: string;
9987
+
9988
+ /**
9989
+ * Background story and behavioral patterns for the persona
9990
+ */
9991
+ backstoryPrompt?: string | null;
9992
+
9993
+ /**
9994
+ * Human-readable description of the persona
9995
+ */
9996
+ description?: string | null;
9997
+
9998
+ /**
9999
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
10000
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
10001
+ * or set null to display the name itself.
10002
+ */
10003
+ displayName?: string | null;
10004
+
10005
+ /**
10006
+ * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
10007
+ */
10008
+ secondaryLanguage?: 'EN' | null;
10009
+ }
10010
+ }
10011
+
10012
+ /**
10013
+ * One path through a scripted flow. The path engine owns which paths exist, so
10014
+ * editing the graph is what creates and removes these.
10015
+ */
10016
+ export interface HappyPath {
10017
+ id: string;
10018
+
10019
+ /**
10020
+ * Graded on top of the flow's own expectations, for this variant only.
10021
+ */
10022
+ additionalExpectations: Array<HappyPath.AdditionalExpectation>;
10023
+
10024
+ /**
10025
+ * Creation timestamp in ISO 8601 format
10026
+ */
10027
+ createdAt: string;
10028
+
10029
+ /**
10030
+ * A simulation environment: the ambient conditions a customer flow variant runs
10031
+ * under. The list includes both your own and the ones Roark curates for every
10032
+ * project.
10033
+ */
10034
+ environment: HappyPath.Environment | null;
10035
+
10036
+ isGenerated: boolean;
10037
+
10038
+ /**
10039
+ * The persona this runs as instead of the happy path's. Null means it inherits.
10040
+ */
10041
+ personaOverride: HappyPath.PersonaOverride | null;
10042
+
10043
+ precededByCustomerFlowId: string | null;
10044
+
10045
+ precededByCustomerFlowVariantId: string | null;
10046
+
10047
+ /**
10048
+ * The one path through the graph this variant runs, in order. Linear by
10049
+ * construction, so these steps never nest.
10050
+ */
10051
+ steps: Array<CustomerFlowAPI.FlowStep>;
10052
+
10053
+ title: string;
10054
+
10055
+ type: 'SCRIPTED';
10056
+
10057
+ /**
10058
+ * Last update timestamp in ISO 8601 format
10059
+ */
10060
+ updatedAt: string;
10061
+
10062
+ systemKey?: string | null;
10063
+ }
10064
+
10065
+ export namespace HappyPath {
10066
+ /**
10067
+ * One thing the agent under test is graded against.
10068
+ */
10069
+ export interface AdditionalExpectation {
10070
+ id: string;
10071
+
10072
+ /**
10073
+ * What the agent under test is graded against.
10074
+ */
10075
+ prompt: string;
10076
+ }
10077
+
10078
+ /**
10079
+ * A simulation environment: the ambient conditions a customer flow variant runs
10080
+ * under. The list includes both your own and the ones Roark curates for every
10081
+ * project.
10082
+ */
10083
+ export interface Environment {
10084
+ id: string;
10085
+
10086
+ backgroundNoise:
10087
+ | 'NONE'
10088
+ | 'AIRPORT'
10089
+ | 'CHILDREN_PLAYING'
10090
+ | 'CITY'
10091
+ | 'COFFEE_SHOP'
10092
+ | 'DRIVING'
10093
+ | 'OFFICE'
10094
+ | 'THUNDERSTORM';
10095
+
10096
+ backgroundNoiseVolume: number;
10097
+
10098
+ /**
10099
+ * Creation timestamp in ISO 8601 format
10100
+ */
10101
+ createdAt: string;
10102
+
10103
+ name: string;
10104
+
10105
+ /**
10106
+ * Last update timestamp in ISO 8601 format
10107
+ */
10108
+ updatedAt: string;
10109
+
10110
+ description?: string | null;
10111
+ }
10112
+
10113
+ /**
10114
+ * The persona this runs as instead of the happy path's. Null means it inherits.
10115
+ */
10116
+ export interface PersonaOverride {
10117
+ /**
10118
+ * Unique identifier of the persona
10119
+ */
10120
+ id: string;
10121
+
10122
+ /**
10123
+ * Accent of the persona, defined using ISO 3166-1 alpha-2 country codes with
10124
+ * optional variants
10125
+ */
10126
+ accent:
10127
+ | 'US'
10128
+ | 'US_X_SOUTH'
10129
+ | 'GB'
10130
+ | 'ES'
10131
+ | 'DE'
10132
+ | 'IN'
10133
+ | 'FR'
10134
+ | 'NL'
10135
+ | 'SA'
10136
+ | 'GR'
10137
+ | 'AU'
10138
+ | 'IT'
10139
+ | 'ID'
10140
+ | 'TH'
10141
+ | 'JP'
10142
+ | 'NZ'
10143
+ | 'PH'
10144
+ | 'SG'
10145
+ | 'MY'
10146
+ | 'HK'
10147
+ | 'TR'
10148
+ | 'PT'
10149
+ | 'IL';
10150
+
10151
+ /**
10152
+ * How old the caller sounds and behaves. Only ages the persona's accent has a
10153
+ * voice for are accepted; defaults to ADULT, which every accent supports.
10154
+ */
10155
+ age: 'CHILD' | 'TEENAGER' | 'ADULT' | 'ELDERLY';
10156
+
10157
+ /**
10158
+ * Background noise setting
10159
+ */
10160
+ backgroundNoise:
10161
+ | 'NONE'
10162
+ | 'AIRPORT'
10163
+ | 'CHILDREN_PLAYING'
10164
+ | 'CITY'
10165
+ | 'COFFEE_SHOP'
10166
+ | 'DRIVING'
10167
+ | 'OFFICE'
10168
+ | 'THUNDERSTORM';
10169
+
10170
+ /**
10171
+ * Base emotional state of the persona
10172
+ */
10173
+ baseEmotion:
10174
+ | 'NEUTRAL'
10175
+ | 'CHEERFUL'
10176
+ | 'CONFUSED'
10177
+ | 'FRUSTRATED'
10178
+ | 'SKEPTICAL'
10179
+ | 'RUSHED'
10180
+ | 'DISTRACTED'
10181
+ | 'ANGRY'
10182
+ | 'ANXIOUS'
10183
+ | 'SAD';
10184
+
10185
+ /**
10186
+ * How the persona confirms information
10187
+ */
10188
+ confirmationStyle: 'EXPLICIT' | 'VAGUE';
10189
+
10190
+ /**
10191
+ * Creation timestamp
10192
+ */
10193
+ createdAt: string;
10194
+
10195
+ /**
10196
+ * Gender of the persona
10197
+ */
10198
+ gender: 'MALE' | 'FEMALE';
10199
+
10200
+ /**
10201
+ * Whether the persona uses filler words like "um" and "uh"
10202
+ */
10203
+ hasDisfluencies: boolean;
10204
+
10205
+ /**
10206
+ * Maximum number of idle messages the persona will send before giving up
10207
+ */
10208
+ idleMessageMaxSpokenCount: number;
10209
+
10210
+ /**
10211
+ * Whether the idle message counter resets when the agent speaks
10212
+ */
10213
+ idleMessageResetCountOnUserSpeechEnabled: boolean;
10214
+
10215
+ /**
10216
+ * Messages the persona will say when the agent goes silent during a call. null =
10217
+ * "Automatic": language-appropriate defaults are used at call time.
10218
+ */
10219
+ idleMessages: Array<string> | null;
10220
+
10221
+ /**
10222
+ * Seconds of silence before the persona sends an idle message
10223
+ */
10224
+ idleTimeoutSeconds: number;
10225
+
10226
+ /**
10227
+ * How clearly the persona expresses their intentions
10228
+ */
10229
+ intentClarity: 'CLEAR' | 'INDIRECT' | 'VAGUE';
10230
+
10231
+ /**
10232
+ * Primary language ISO 639-1 code for the persona
10233
+ */
10234
+ language:
10235
+ | 'EN'
10236
+ | 'ES'
10237
+ | 'DE'
10238
+ | 'HI'
10239
+ | 'FR'
10240
+ | 'NL'
10241
+ | 'AR'
10242
+ | 'EL'
10243
+ | 'IT'
10244
+ | 'ID'
10245
+ | 'TH'
10246
+ | 'JA'
10247
+ | 'TL'
10248
+ | 'MS'
10249
+ | 'ZH'
10250
+ | 'TR'
10251
+ | 'PT'
10252
+ | 'HE';
10253
+
10254
+ /**
10255
+ * How reliable the persona's memory is
10256
+ */
10257
+ memoryReliability: 'HIGH' | 'LOW';
10258
+
10259
+ /**
10260
+ * The name the agent will identify as during conversations
10261
+ */
10262
+ name: string;
10263
+
10264
+ /**
10265
+ * Additional custom properties about the persona
10266
+ */
10267
+ properties: { [key: string]: unknown };
10268
+
10269
+ /**
10270
+ * Controls how quickly the persona responds to pauses in conversation (QUICK,
10271
+ * NORMAL, RELAXED)
10272
+ */
10273
+ responseTiming: 'RELAXED' | 'NORMAL' | 'QUICK';
10274
+
10275
+ /**
10276
+ * Speech clarity of the persona
10277
+ */
10278
+ speechClarity: 'CLEAR' | 'VAGUE' | 'RAMBLING';
10279
+
10280
+ /**
10281
+ * Speech pace of the persona
10282
+ */
10283
+ speechPace: 'SUPER_SLOW' | 'SLOW' | 'NORMAL' | 'FAST' | 'SUPER_FAST';
10284
+
10285
+ /**
10286
+ * Languages the persona can understand. Multilingual combinations are limited by
10287
+ * multilingual speech recognition support.
10288
+ */
10289
+ understoodLanguages: Array<
10290
+ | 'EN'
10291
+ | 'ES'
10292
+ | 'DE'
10293
+ | 'HI'
10294
+ | 'FR'
10295
+ | 'NL'
10296
+ | 'AR'
10297
+ | 'EL'
10298
+ | 'IT'
10299
+ | 'ID'
10300
+ | 'TH'
10301
+ | 'JA'
10302
+ | 'TL'
10303
+ | 'MS'
10304
+ | 'ZH'
10305
+ | 'TR'
10306
+ | 'PT'
10307
+ | 'HE'
10308
+ >;
10309
+
10310
+ /**
10311
+ * Last update timestamp
10312
+ */
10313
+ updatedAt: string;
10314
+
10315
+ /**
10316
+ * Background story and behavioral patterns for the persona
10317
+ */
10318
+ backstoryPrompt?: string | null;
10319
+
10320
+ /**
10321
+ * Human-readable description of the persona
10322
+ */
10323
+ description?: string | null;
10324
+
10325
+ /**
10326
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
10327
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
10328
+ * or set null to display the name itself.
10329
+ */
10330
+ displayName?: string | null;
10331
+
10332
+ /**
10333
+ * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
10334
+ */
10335
+ secondaryLanguage?: 'EN' | null;
10336
+ }
10337
+ }
10338
+
10339
+ /**
10340
+ * STRICT only. What the simulated customer does when your agent does not say the
10341
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
10342
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
10343
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
10344
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
10345
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
10346
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
10347
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
10348
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
10349
+ * AGENT_TURN step can carry its own.
10350
+ */
10351
+ export interface OffScriptPolicy {
10352
+ maxAttempts: number;
10353
+
10354
+ reaction: 'STAY_SILENT' | 'REPEAT' | 'RESPOND' | 'SAY';
10355
+
10356
+ then: 'HANG_UP' | 'MOVE_ON' | 'ADAPT' | 'HANG_UP_INVALIDATE';
10357
+
10358
+ sayLine?: string | null;
10359
+
10360
+ waitSeconds?: number | null;
10361
+ }
10362
+ }
10363
+
10364
+ /**
10365
+ * A flow whose conversation is not written out: each variant gives the simulated
10366
+ * customer a brief and lets it improvise.
10367
+ */
10368
+ export interface ImprovCustomerFlow {
10369
+ id: string;
10370
+
10371
+ agentExpectations: Array<ImprovCustomerFlow.AgentExpectation>;
10372
+
10373
+ /**
10374
+ * The agents this flow is run against.
10375
+ */
10376
+ agents: Array<ImprovCustomerFlow.Agent>;
10377
+
10378
+ /**
10379
+ * Creation timestamp in ISO 8601 format
10380
+ */
10381
+ createdAt: string;
10382
+
10383
+ /**
10384
+ * Every other way of running this flow.
10385
+ */
10386
+ edgeCases: Array<ImprovCustomerFlow.EdgeCase>;
10387
+
10388
+ /**
10389
+ * One brief to run an improv flow with.
10390
+ */
10391
+ happyPath: ImprovCustomerFlow.HappyPath | null;
10392
+
10393
+ source: 'SYSTEM' | 'CUSTOM';
10394
+
10395
+ title: string;
10396
+
10397
+ type: 'IMPROV';
10398
+
10399
+ /**
10400
+ * Last update timestamp in ISO 8601 format
10401
+ */
10402
+ updatedAt: string;
10403
+
10404
+ description?: string | null;
10405
+ }
10406
+
10407
+ export namespace ImprovCustomerFlow {
10408
+ /**
10409
+ * One thing the agent under test is graded against.
10410
+ */
10411
+ export interface AgentExpectation {
10412
+ id: string;
10413
+
10414
+ /**
10415
+ * What the agent under test is graded against.
10416
+ */
10417
+ prompt: string;
10418
+ }
10419
+
10420
+ export interface Agent {
10421
+ /**
10422
+ * Unique identifier of the agent
10423
+ */
10424
+ id: string;
10425
+
10426
+ /**
10427
+ * Creation timestamp in ISO 8601 format
10428
+ */
10429
+ createdAt: string;
10430
+
10431
+ /**
10432
+ * Custom identifier for the agent
10433
+ */
10434
+ customId: string | null;
10435
+
10436
+ /**
10437
+ * Description of the agent
10438
+ */
10439
+ description: string | null;
10440
+
10441
+ /**
10442
+ * Name of the agent
10443
+ */
10444
+ name: string;
10445
+
10446
+ /**
10447
+ * Last update timestamp in ISO 8601 format
10448
+ */
10449
+ updatedAt: string;
10450
+ }
10451
+
10452
+ /**
10453
+ * One brief to run an improv flow with.
10454
+ */
10455
+ export interface EdgeCase {
10456
+ id: string;
10457
+
10458
+ /**
10459
+ * Graded on top of the flow's own expectations, for this variant only.
10460
+ */
10461
+ additionalExpectations: Array<EdgeCase.AdditionalExpectation>;
10462
+
10463
+ /**
10464
+ * Creation timestamp in ISO 8601 format
10465
+ */
10466
+ createdAt: string;
10467
+
10468
+ /**
10469
+ * A simulation environment: the ambient conditions a customer flow variant runs
10470
+ * under. The list includes both your own and the ones Roark curates for every
10471
+ * project.
10472
+ */
10473
+ environment: EdgeCase.Environment | null;
10474
+
10475
+ isGenerated: boolean;
10476
+
10477
+ /**
10478
+ * The persona this runs as instead of the happy path's. Null means it inherits.
10479
+ */
10480
+ personaOverride: EdgeCase.PersonaOverride | null;
10481
+
10482
+ precededByCustomerFlowId: string | null;
10483
+
10484
+ precededByCustomerFlowVariantId: string | null;
10485
+
10486
+ title: string;
10487
+
10488
+ type: 'IMPROV';
10489
+
10490
+ /**
10491
+ * Last update timestamp in ISO 8601 format
10492
+ */
10493
+ updatedAt: string;
10494
+
10495
+ /**
10496
+ * The brief the simulated customer improvises from.
10497
+ */
10498
+ prompt?: string | null;
10499
+
10500
+ systemKey?: string | null;
10501
+ }
10502
+
10503
+ export namespace EdgeCase {
10504
+ /**
10505
+ * One thing the agent under test is graded against.
10506
+ */
10507
+ export interface AdditionalExpectation {
10508
+ id: string;
10509
+
10510
+ /**
10511
+ * What the agent under test is graded against.
10512
+ */
10513
+ prompt: string;
10514
+ }
10515
+
10516
+ /**
10517
+ * A simulation environment: the ambient conditions a customer flow variant runs
10518
+ * under. The list includes both your own and the ones Roark curates for every
10519
+ * project.
10520
+ */
10521
+ export interface Environment {
10522
+ id: string;
10523
+
10524
+ backgroundNoise:
10525
+ | 'NONE'
10526
+ | 'AIRPORT'
10527
+ | 'CHILDREN_PLAYING'
10528
+ | 'CITY'
10529
+ | 'COFFEE_SHOP'
10530
+ | 'DRIVING'
10531
+ | 'OFFICE'
10532
+ | 'THUNDERSTORM';
10533
+
10534
+ backgroundNoiseVolume: number;
10535
+
10536
+ /**
10537
+ * Creation timestamp in ISO 8601 format
10538
+ */
10539
+ createdAt: string;
10540
+
10541
+ name: string;
10542
+
10543
+ /**
10544
+ * Last update timestamp in ISO 8601 format
10545
+ */
10546
+ updatedAt: string;
10547
+
10548
+ description?: string | null;
10549
+ }
10550
+
10551
+ /**
10552
+ * The persona this runs as instead of the happy path's. Null means it inherits.
10553
+ */
10554
+ export interface PersonaOverride {
10555
+ /**
10556
+ * Unique identifier of the persona
10557
+ */
10558
+ id: string;
10559
+
10560
+ /**
10561
+ * Accent of the persona, defined using ISO 3166-1 alpha-2 country codes with
10562
+ * optional variants
10563
+ */
10564
+ accent:
10565
+ | 'US'
10566
+ | 'US_X_SOUTH'
10567
+ | 'GB'
10568
+ | 'ES'
10569
+ | 'DE'
10570
+ | 'IN'
10571
+ | 'FR'
10572
+ | 'NL'
10573
+ | 'SA'
10574
+ | 'GR'
10575
+ | 'AU'
10576
+ | 'IT'
10577
+ | 'ID'
10578
+ | 'TH'
10579
+ | 'JP'
10580
+ | 'NZ'
10581
+ | 'PH'
10582
+ | 'SG'
10583
+ | 'MY'
10584
+ | 'HK'
10585
+ | 'TR'
10586
+ | 'PT'
10587
+ | 'IL';
10588
+
10589
+ /**
10590
+ * How old the caller sounds and behaves. Only ages the persona's accent has a
10591
+ * voice for are accepted; defaults to ADULT, which every accent supports.
10592
+ */
10593
+ age: 'CHILD' | 'TEENAGER' | 'ADULT' | 'ELDERLY';
10594
+
10595
+ /**
10596
+ * Background noise setting
10597
+ */
10598
+ backgroundNoise:
10599
+ | 'NONE'
10600
+ | 'AIRPORT'
10601
+ | 'CHILDREN_PLAYING'
10602
+ | 'CITY'
10603
+ | 'COFFEE_SHOP'
10604
+ | 'DRIVING'
10605
+ | 'OFFICE'
10606
+ | 'THUNDERSTORM';
10607
+
10608
+ /**
10609
+ * Base emotional state of the persona
10610
+ */
10611
+ baseEmotion:
10612
+ | 'NEUTRAL'
10613
+ | 'CHEERFUL'
10614
+ | 'CONFUSED'
10615
+ | 'FRUSTRATED'
10616
+ | 'SKEPTICAL'
10617
+ | 'RUSHED'
10618
+ | 'DISTRACTED'
10619
+ | 'ANGRY'
10620
+ | 'ANXIOUS'
10621
+ | 'SAD';
10622
+
10623
+ /**
10624
+ * How the persona confirms information
10625
+ */
10626
+ confirmationStyle: 'EXPLICIT' | 'VAGUE';
10627
+
10628
+ /**
10629
+ * Creation timestamp
10630
+ */
10631
+ createdAt: string;
10632
+
10633
+ /**
10634
+ * Gender of the persona
10635
+ */
10636
+ gender: 'MALE' | 'FEMALE';
10637
+
10638
+ /**
10639
+ * Whether the persona uses filler words like "um" and "uh"
10640
+ */
10641
+ hasDisfluencies: boolean;
10642
+
10643
+ /**
10644
+ * Maximum number of idle messages the persona will send before giving up
10645
+ */
10646
+ idleMessageMaxSpokenCount: number;
10647
+
10648
+ /**
10649
+ * Whether the idle message counter resets when the agent speaks
10650
+ */
10651
+ idleMessageResetCountOnUserSpeechEnabled: boolean;
10652
+
10653
+ /**
10654
+ * Messages the persona will say when the agent goes silent during a call. null =
10655
+ * "Automatic": language-appropriate defaults are used at call time.
10656
+ */
10657
+ idleMessages: Array<string> | null;
10658
+
10659
+ /**
10660
+ * Seconds of silence before the persona sends an idle message
10661
+ */
10662
+ idleTimeoutSeconds: number;
10663
+
10664
+ /**
10665
+ * How clearly the persona expresses their intentions
10666
+ */
10667
+ intentClarity: 'CLEAR' | 'INDIRECT' | 'VAGUE';
10668
+
10669
+ /**
10670
+ * Primary language ISO 639-1 code for the persona
10671
+ */
10672
+ language:
10673
+ | 'EN'
10674
+ | 'ES'
10675
+ | 'DE'
10676
+ | 'HI'
10677
+ | 'FR'
10678
+ | 'NL'
10679
+ | 'AR'
10680
+ | 'EL'
10681
+ | 'IT'
10682
+ | 'ID'
10683
+ | 'TH'
10684
+ | 'JA'
10685
+ | 'TL'
10686
+ | 'MS'
10687
+ | 'ZH'
10688
+ | 'TR'
10689
+ | 'PT'
10690
+ | 'HE';
10691
+
10692
+ /**
10693
+ * How reliable the persona's memory is
10694
+ */
10695
+ memoryReliability: 'HIGH' | 'LOW';
10696
+
10697
+ /**
10698
+ * The name the agent will identify as during conversations
10699
+ */
10700
+ name: string;
10701
+
10702
+ /**
10703
+ * Additional custom properties about the persona
10704
+ */
10705
+ properties: { [key: string]: unknown };
10706
+
10707
+ /**
10708
+ * Controls how quickly the persona responds to pauses in conversation (QUICK,
10709
+ * NORMAL, RELAXED)
10710
+ */
10711
+ responseTiming: 'RELAXED' | 'NORMAL' | 'QUICK';
10712
+
10713
+ /**
10714
+ * Speech clarity of the persona
10715
+ */
10716
+ speechClarity: 'CLEAR' | 'VAGUE' | 'RAMBLING';
10717
+
10718
+ /**
10719
+ * Speech pace of the persona
10720
+ */
10721
+ speechPace: 'SUPER_SLOW' | 'SLOW' | 'NORMAL' | 'FAST' | 'SUPER_FAST';
10722
+
10723
+ /**
10724
+ * Languages the persona can understand. Multilingual combinations are limited by
10725
+ * multilingual speech recognition support.
10726
+ */
10727
+ understoodLanguages: Array<
10728
+ | 'EN'
10729
+ | 'ES'
10730
+ | 'DE'
10731
+ | 'HI'
10732
+ | 'FR'
10733
+ | 'NL'
10734
+ | 'AR'
10735
+ | 'EL'
10736
+ | 'IT'
10737
+ | 'ID'
10738
+ | 'TH'
10739
+ | 'JA'
10740
+ | 'TL'
10741
+ | 'MS'
10742
+ | 'ZH'
10743
+ | 'TR'
10744
+ | 'PT'
10745
+ | 'HE'
10746
+ >;
10747
+
10748
+ /**
10749
+ * Last update timestamp
10750
+ */
10751
+ updatedAt: string;
10752
+
10753
+ /**
10754
+ * Background story and behavioral patterns for the persona
10755
+ */
10756
+ backstoryPrompt?: string | null;
10757
+
10758
+ /**
10759
+ * Human-readable description of the persona
10760
+ */
10761
+ description?: string | null;
10762
+
10763
+ /**
10764
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
10765
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
10766
+ * or set null to display the name itself.
10767
+ */
10768
+ displayName?: string | null;
10769
+
10770
+ /**
10771
+ * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
10772
+ */
10773
+ secondaryLanguage?: 'EN' | null;
10774
+ }
10775
+ }
10776
+
10777
+ /**
10778
+ * One brief to run an improv flow with.
10779
+ */
10780
+ export interface HappyPath {
10781
+ id: string;
10782
+
10783
+ /**
10784
+ * Graded on top of the flow's own expectations, for this variant only.
10785
+ */
10786
+ additionalExpectations: Array<HappyPath.AdditionalExpectation>;
10787
+
10788
+ /**
10789
+ * Creation timestamp in ISO 8601 format
10790
+ */
10791
+ createdAt: string;
10792
+
10793
+ /**
10794
+ * A simulation environment: the ambient conditions a customer flow variant runs
10795
+ * under. The list includes both your own and the ones Roark curates for every
10796
+ * project.
10797
+ */
10798
+ environment: HappyPath.Environment | null;
10799
+
10800
+ isGenerated: boolean;
10801
+
10802
+ /**
10803
+ * The persona this runs as instead of the happy path's. Null means it inherits.
10804
+ */
10805
+ personaOverride: HappyPath.PersonaOverride | null;
10806
+
10807
+ precededByCustomerFlowId: string | null;
10808
+
10809
+ precededByCustomerFlowVariantId: string | null;
10810
+
10811
+ title: string;
10812
+
10813
+ type: 'IMPROV';
10814
+
10815
+ /**
10816
+ * Last update timestamp in ISO 8601 format
10817
+ */
10818
+ updatedAt: string;
10819
+
10820
+ /**
10821
+ * The brief the simulated customer improvises from.
10822
+ */
10823
+ prompt?: string | null;
10824
+
10825
+ systemKey?: string | null;
10826
+ }
10827
+
10828
+ export namespace HappyPath {
10829
+ /**
10830
+ * One thing the agent under test is graded against.
10831
+ */
10832
+ export interface AdditionalExpectation {
10833
+ id: string;
10834
+
10835
+ /**
10836
+ * What the agent under test is graded against.
10837
+ */
10838
+ prompt: string;
10839
+ }
10840
+
10841
+ /**
10842
+ * A simulation environment: the ambient conditions a customer flow variant runs
10843
+ * under. The list includes both your own and the ones Roark curates for every
10844
+ * project.
10845
+ */
10846
+ export interface Environment {
10847
+ id: string;
10848
+
10849
+ backgroundNoise:
10850
+ | 'NONE'
10851
+ | 'AIRPORT'
10852
+ | 'CHILDREN_PLAYING'
10853
+ | 'CITY'
10854
+ | 'COFFEE_SHOP'
10855
+ | 'DRIVING'
10856
+ | 'OFFICE'
10857
+ | 'THUNDERSTORM';
10858
+
10859
+ backgroundNoiseVolume: number;
10860
+
10861
+ /**
10862
+ * Creation timestamp in ISO 8601 format
10863
+ */
10864
+ createdAt: string;
10865
+
10866
+ name: string;
10867
+
10868
+ /**
10869
+ * Last update timestamp in ISO 8601 format
10870
+ */
10871
+ updatedAt: string;
10872
+
10873
+ description?: string | null;
10874
+ }
10875
+
10876
+ /**
10877
+ * The persona this runs as instead of the happy path's. Null means it inherits.
10878
+ */
10879
+ export interface PersonaOverride {
10880
+ /**
10881
+ * Unique identifier of the persona
10882
+ */
10883
+ id: string;
10884
+
10885
+ /**
10886
+ * Accent of the persona, defined using ISO 3166-1 alpha-2 country codes with
10887
+ * optional variants
10888
+ */
10889
+ accent:
10890
+ | 'US'
10891
+ | 'US_X_SOUTH'
10892
+ | 'GB'
10893
+ | 'ES'
10894
+ | 'DE'
10895
+ | 'IN'
10896
+ | 'FR'
10897
+ | 'NL'
10898
+ | 'SA'
10899
+ | 'GR'
10900
+ | 'AU'
10901
+ | 'IT'
10902
+ | 'ID'
10903
+ | 'TH'
10904
+ | 'JP'
10905
+ | 'NZ'
10906
+ | 'PH'
10907
+ | 'SG'
10908
+ | 'MY'
10909
+ | 'HK'
10910
+ | 'TR'
10911
+ | 'PT'
10912
+ | 'IL';
10913
+
10914
+ /**
10915
+ * How old the caller sounds and behaves. Only ages the persona's accent has a
10916
+ * voice for are accepted; defaults to ADULT, which every accent supports.
10917
+ */
10918
+ age: 'CHILD' | 'TEENAGER' | 'ADULT' | 'ELDERLY';
10919
+
10920
+ /**
10921
+ * Background noise setting
10922
+ */
10923
+ backgroundNoise:
10924
+ | 'NONE'
10925
+ | 'AIRPORT'
10926
+ | 'CHILDREN_PLAYING'
10927
+ | 'CITY'
10928
+ | 'COFFEE_SHOP'
10929
+ | 'DRIVING'
10930
+ | 'OFFICE'
10931
+ | 'THUNDERSTORM';
10932
+
10933
+ /**
10934
+ * Base emotional state of the persona
10935
+ */
10936
+ baseEmotion:
10937
+ | 'NEUTRAL'
10938
+ | 'CHEERFUL'
10939
+ | 'CONFUSED'
10940
+ | 'FRUSTRATED'
10941
+ | 'SKEPTICAL'
10942
+ | 'RUSHED'
10943
+ | 'DISTRACTED'
10944
+ | 'ANGRY'
10945
+ | 'ANXIOUS'
10946
+ | 'SAD';
10947
+
10948
+ /**
10949
+ * How the persona confirms information
10950
+ */
10951
+ confirmationStyle: 'EXPLICIT' | 'VAGUE';
10952
+
10953
+ /**
10954
+ * Creation timestamp
10955
+ */
10956
+ createdAt: string;
10957
+
10958
+ /**
10959
+ * Gender of the persona
10960
+ */
10961
+ gender: 'MALE' | 'FEMALE';
10962
+
10963
+ /**
10964
+ * Whether the persona uses filler words like "um" and "uh"
10965
+ */
10966
+ hasDisfluencies: boolean;
10967
+
10968
+ /**
10969
+ * Maximum number of idle messages the persona will send before giving up
10970
+ */
10971
+ idleMessageMaxSpokenCount: number;
10972
+
10973
+ /**
10974
+ * Whether the idle message counter resets when the agent speaks
10975
+ */
10976
+ idleMessageResetCountOnUserSpeechEnabled: boolean;
10977
+
10978
+ /**
10979
+ * Messages the persona will say when the agent goes silent during a call. null =
10980
+ * "Automatic": language-appropriate defaults are used at call time.
10981
+ */
10982
+ idleMessages: Array<string> | null;
10983
+
10984
+ /**
10985
+ * Seconds of silence before the persona sends an idle message
10986
+ */
10987
+ idleTimeoutSeconds: number;
10988
+
10989
+ /**
10990
+ * How clearly the persona expresses their intentions
10991
+ */
10992
+ intentClarity: 'CLEAR' | 'INDIRECT' | 'VAGUE';
10993
+
10994
+ /**
10995
+ * Primary language ISO 639-1 code for the persona
10996
+ */
10997
+ language:
10998
+ | 'EN'
10999
+ | 'ES'
11000
+ | 'DE'
11001
+ | 'HI'
11002
+ | 'FR'
11003
+ | 'NL'
11004
+ | 'AR'
11005
+ | 'EL'
11006
+ | 'IT'
11007
+ | 'ID'
11008
+ | 'TH'
11009
+ | 'JA'
11010
+ | 'TL'
11011
+ | 'MS'
11012
+ | 'ZH'
11013
+ | 'TR'
11014
+ | 'PT'
11015
+ | 'HE';
11016
+
11017
+ /**
11018
+ * How reliable the persona's memory is
11019
+ */
11020
+ memoryReliability: 'HIGH' | 'LOW';
11021
+
11022
+ /**
11023
+ * The name the agent will identify as during conversations
11024
+ */
11025
+ name: string;
11026
+
11027
+ /**
11028
+ * Additional custom properties about the persona
11029
+ */
11030
+ properties: { [key: string]: unknown };
11031
+
11032
+ /**
11033
+ * Controls how quickly the persona responds to pauses in conversation (QUICK,
11034
+ * NORMAL, RELAXED)
11035
+ */
11036
+ responseTiming: 'RELAXED' | 'NORMAL' | 'QUICK';
11037
+
11038
+ /**
11039
+ * Speech clarity of the persona
11040
+ */
11041
+ speechClarity: 'CLEAR' | 'VAGUE' | 'RAMBLING';
11042
+
11043
+ /**
11044
+ * Speech pace of the persona
11045
+ */
11046
+ speechPace: 'SUPER_SLOW' | 'SLOW' | 'NORMAL' | 'FAST' | 'SUPER_FAST';
11047
+
11048
+ /**
11049
+ * Languages the persona can understand. Multilingual combinations are limited by
11050
+ * multilingual speech recognition support.
11051
+ */
11052
+ understoodLanguages: Array<
11053
+ | 'EN'
11054
+ | 'ES'
11055
+ | 'DE'
11056
+ | 'HI'
11057
+ | 'FR'
11058
+ | 'NL'
11059
+ | 'AR'
11060
+ | 'EL'
11061
+ | 'IT'
11062
+ | 'ID'
11063
+ | 'TH'
11064
+ | 'JA'
11065
+ | 'TL'
11066
+ | 'MS'
11067
+ | 'ZH'
11068
+ | 'TR'
11069
+ | 'PT'
11070
+ | 'HE'
11071
+ >;
11072
+
11073
+ /**
11074
+ * Last update timestamp
11075
+ */
11076
+ updatedAt: string;
11077
+
11078
+ /**
11079
+ * Background story and behavioral patterns for the persona
11080
+ */
11081
+ backstoryPrompt?: string | null;
11082
+
11083
+ /**
11084
+ * Human-readable description of the persona
11085
+ */
11086
+ description?: string | null;
11087
+
11088
+ /**
11089
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
11090
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
11091
+ * or set null to display the name itself.
11092
+ */
11093
+ displayName?: string | null;
11094
+
11095
+ /**
11096
+ * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
11097
+ */
11098
+ secondaryLanguage?: 'EN' | null;
11099
+ }
11100
+ }
11101
+ }
11102
+
11103
+ /**
11104
+ * A flow that leaves a voicemail. Curated by Roark, read-only.
11105
+ */
11106
+ export interface VoicemailCustomerFlow {
11107
+ id: string;
11108
+
11109
+ agentExpectations: Array<VoicemailCustomerFlow.AgentExpectation>;
11110
+
11111
+ /**
11112
+ * The agents this flow is run against.
11113
+ */
11114
+ agents: Array<VoicemailCustomerFlow.Agent>;
11115
+
11116
+ /**
11117
+ * Creation timestamp in ISO 8601 format
11118
+ */
11119
+ createdAt: string;
11120
+
11121
+ /**
11122
+ * Every other way of running this flow.
11123
+ */
11124
+ edgeCases: Array<VoicemailCustomerFlow.EdgeCase>;
11125
+
11126
+ /**
11127
+ * One voicemail greeting.
11128
+ */
11129
+ happyPath: VoicemailCustomerFlow.HappyPath | null;
11130
+
11131
+ source: 'SYSTEM' | 'CUSTOM';
11132
+
11133
+ title: string;
11134
+
11135
+ type: 'VOICEMAIL';
11136
+
11137
+ /**
11138
+ * Last update timestamp in ISO 8601 format
11139
+ */
11140
+ updatedAt: string;
11141
+
11142
+ description?: string | null;
11143
+ }
11144
+
11145
+ export namespace VoicemailCustomerFlow {
11146
+ /**
11147
+ * One thing the agent under test is graded against.
11148
+ */
11149
+ export interface AgentExpectation {
11150
+ id: string;
11151
+
11152
+ /**
11153
+ * What the agent under test is graded against.
11154
+ */
11155
+ prompt: string;
11156
+ }
11157
+
11158
+ export interface Agent {
11159
+ /**
11160
+ * Unique identifier of the agent
11161
+ */
11162
+ id: string;
11163
+
11164
+ /**
11165
+ * Creation timestamp in ISO 8601 format
11166
+ */
11167
+ createdAt: string;
11168
+
11169
+ /**
11170
+ * Custom identifier for the agent
11171
+ */
11172
+ customId: string | null;
11173
+
11174
+ /**
11175
+ * Description of the agent
11176
+ */
11177
+ description: string | null;
11178
+
11179
+ /**
11180
+ * Name of the agent
11181
+ */
11182
+ name: string;
11183
+
11184
+ /**
11185
+ * Last update timestamp in ISO 8601 format
11186
+ */
11187
+ updatedAt: string;
11188
+ }
11189
+
11190
+ /**
11191
+ * One voicemail greeting.
11192
+ */
11193
+ export interface EdgeCase {
11194
+ id: string;
11195
+
11196
+ /**
11197
+ * Graded on top of the flow's own expectations, for this variant only.
11198
+ */
11199
+ additionalExpectations: Array<EdgeCase.AdditionalExpectation>;
11200
+
11201
+ /**
11202
+ * Creation timestamp in ISO 8601 format
11203
+ */
11204
+ createdAt: string;
11205
+
11206
+ /**
11207
+ * A simulation environment: the ambient conditions a customer flow variant runs
11208
+ * under. The list includes both your own and the ones Roark curates for every
11209
+ * project.
11210
+ */
11211
+ environment: EdgeCase.Environment | null;
11212
+
11213
+ isGenerated: boolean;
11214
+
11215
+ /**
11216
+ * The persona this runs as instead of the happy path's. Null means it inherits.
11217
+ */
11218
+ personaOverride: EdgeCase.PersonaOverride | null;
11219
+
11220
+ precededByCustomerFlowId: string | null;
11221
+
11222
+ precededByCustomerFlowVariantId: string | null;
11223
+
11224
+ title: string;
11225
+
11226
+ type: 'VOICEMAIL';
11227
+
11228
+ /**
11229
+ * Last update timestamp in ISO 8601 format
11230
+ */
11231
+ updatedAt: string;
11232
+
11233
+ systemKey?: string | null;
11234
+ }
11235
+
11236
+ export namespace EdgeCase {
11237
+ /**
11238
+ * One thing the agent under test is graded against.
11239
+ */
11240
+ export interface AdditionalExpectation {
11241
+ id: string;
11242
+
11243
+ /**
11244
+ * What the agent under test is graded against.
11245
+ */
11246
+ prompt: string;
11247
+ }
11248
+
11249
+ /**
11250
+ * A simulation environment: the ambient conditions a customer flow variant runs
11251
+ * under. The list includes both your own and the ones Roark curates for every
11252
+ * project.
11253
+ */
11254
+ export interface Environment {
11255
+ id: string;
11256
+
11257
+ backgroundNoise:
11258
+ | 'NONE'
11259
+ | 'AIRPORT'
11260
+ | 'CHILDREN_PLAYING'
11261
+ | 'CITY'
11262
+ | 'COFFEE_SHOP'
11263
+ | 'DRIVING'
11264
+ | 'OFFICE'
11265
+ | 'THUNDERSTORM';
11266
+
11267
+ backgroundNoiseVolume: number;
11268
+
11269
+ /**
11270
+ * Creation timestamp in ISO 8601 format
11271
+ */
11272
+ createdAt: string;
11273
+
11274
+ name: string;
11275
+
11276
+ /**
11277
+ * Last update timestamp in ISO 8601 format
11278
+ */
11279
+ updatedAt: string;
11280
+
11281
+ description?: string | null;
11282
+ }
11283
+
11284
+ /**
11285
+ * The persona this runs as instead of the happy path's. Null means it inherits.
11286
+ */
11287
+ export interface PersonaOverride {
11288
+ /**
11289
+ * Unique identifier of the persona
11290
+ */
11291
+ id: string;
11292
+
11293
+ /**
11294
+ * Accent of the persona, defined using ISO 3166-1 alpha-2 country codes with
11295
+ * optional variants
11296
+ */
11297
+ accent:
11298
+ | 'US'
11299
+ | 'US_X_SOUTH'
11300
+ | 'GB'
11301
+ | 'ES'
11302
+ | 'DE'
11303
+ | 'IN'
11304
+ | 'FR'
11305
+ | 'NL'
11306
+ | 'SA'
11307
+ | 'GR'
11308
+ | 'AU'
11309
+ | 'IT'
11310
+ | 'ID'
11311
+ | 'TH'
11312
+ | 'JP'
11313
+ | 'NZ'
11314
+ | 'PH'
11315
+ | 'SG'
11316
+ | 'MY'
11317
+ | 'HK'
11318
+ | 'TR'
11319
+ | 'PT'
11320
+ | 'IL';
11321
+
11322
+ /**
11323
+ * How old the caller sounds and behaves. Only ages the persona's accent has a
11324
+ * voice for are accepted; defaults to ADULT, which every accent supports.
11325
+ */
11326
+ age: 'CHILD' | 'TEENAGER' | 'ADULT' | 'ELDERLY';
11327
+
11328
+ /**
11329
+ * Background noise setting
11330
+ */
11331
+ backgroundNoise:
11332
+ | 'NONE'
11333
+ | 'AIRPORT'
11334
+ | 'CHILDREN_PLAYING'
11335
+ | 'CITY'
11336
+ | 'COFFEE_SHOP'
11337
+ | 'DRIVING'
11338
+ | 'OFFICE'
11339
+ | 'THUNDERSTORM';
11340
+
11341
+ /**
11342
+ * Base emotional state of the persona
11343
+ */
11344
+ baseEmotion:
11345
+ | 'NEUTRAL'
11346
+ | 'CHEERFUL'
11347
+ | 'CONFUSED'
11348
+ | 'FRUSTRATED'
11349
+ | 'SKEPTICAL'
11350
+ | 'RUSHED'
11351
+ | 'DISTRACTED'
11352
+ | 'ANGRY'
11353
+ | 'ANXIOUS'
11354
+ | 'SAD';
11355
+
11356
+ /**
11357
+ * How the persona confirms information
11358
+ */
11359
+ confirmationStyle: 'EXPLICIT' | 'VAGUE';
11360
+
11361
+ /**
11362
+ * Creation timestamp
11363
+ */
11364
+ createdAt: string;
11365
+
11366
+ /**
11367
+ * Gender of the persona
11368
+ */
11369
+ gender: 'MALE' | 'FEMALE';
11370
+
11371
+ /**
11372
+ * Whether the persona uses filler words like "um" and "uh"
11373
+ */
11374
+ hasDisfluencies: boolean;
11375
+
11376
+ /**
11377
+ * Maximum number of idle messages the persona will send before giving up
11378
+ */
11379
+ idleMessageMaxSpokenCount: number;
11380
+
11381
+ /**
11382
+ * Whether the idle message counter resets when the agent speaks
11383
+ */
11384
+ idleMessageResetCountOnUserSpeechEnabled: boolean;
11385
+
11386
+ /**
11387
+ * Messages the persona will say when the agent goes silent during a call. null =
11388
+ * "Automatic": language-appropriate defaults are used at call time.
11389
+ */
11390
+ idleMessages: Array<string> | null;
11391
+
11392
+ /**
11393
+ * Seconds of silence before the persona sends an idle message
11394
+ */
11395
+ idleTimeoutSeconds: number;
11396
+
11397
+ /**
11398
+ * How clearly the persona expresses their intentions
11399
+ */
11400
+ intentClarity: 'CLEAR' | 'INDIRECT' | 'VAGUE';
11401
+
11402
+ /**
11403
+ * Primary language ISO 639-1 code for the persona
11404
+ */
11405
+ language:
11406
+ | 'EN'
11407
+ | 'ES'
11408
+ | 'DE'
11409
+ | 'HI'
11410
+ | 'FR'
11411
+ | 'NL'
11412
+ | 'AR'
11413
+ | 'EL'
11414
+ | 'IT'
11415
+ | 'ID'
11416
+ | 'TH'
11417
+ | 'JA'
11418
+ | 'TL'
11419
+ | 'MS'
11420
+ | 'ZH'
11421
+ | 'TR'
11422
+ | 'PT'
11423
+ | 'HE';
11424
+
11425
+ /**
11426
+ * How reliable the persona's memory is
11427
+ */
11428
+ memoryReliability: 'HIGH' | 'LOW';
11429
+
11430
+ /**
11431
+ * The name the agent will identify as during conversations
11432
+ */
11433
+ name: string;
11434
+
11435
+ /**
11436
+ * Additional custom properties about the persona
11437
+ */
11438
+ properties: { [key: string]: unknown };
11439
+
11440
+ /**
11441
+ * Controls how quickly the persona responds to pauses in conversation (QUICK,
11442
+ * NORMAL, RELAXED)
11443
+ */
11444
+ responseTiming: 'RELAXED' | 'NORMAL' | 'QUICK';
11445
+
11446
+ /**
11447
+ * Speech clarity of the persona
11448
+ */
11449
+ speechClarity: 'CLEAR' | 'VAGUE' | 'RAMBLING';
11450
+
11451
+ /**
11452
+ * Speech pace of the persona
11453
+ */
11454
+ speechPace: 'SUPER_SLOW' | 'SLOW' | 'NORMAL' | 'FAST' | 'SUPER_FAST';
11455
+
11456
+ /**
11457
+ * Languages the persona can understand. Multilingual combinations are limited by
11458
+ * multilingual speech recognition support.
11459
+ */
11460
+ understoodLanguages: Array<
11461
+ | 'EN'
11462
+ | 'ES'
11463
+ | 'DE'
11464
+ | 'HI'
11465
+ | 'FR'
11466
+ | 'NL'
11467
+ | 'AR'
11468
+ | 'EL'
11469
+ | 'IT'
11470
+ | 'ID'
11471
+ | 'TH'
11472
+ | 'JA'
11473
+ | 'TL'
11474
+ | 'MS'
11475
+ | 'ZH'
11476
+ | 'TR'
11477
+ | 'PT'
11478
+ | 'HE'
11479
+ >;
11480
+
11481
+ /**
11482
+ * Last update timestamp
11483
+ */
11484
+ updatedAt: string;
11485
+
11486
+ /**
11487
+ * Background story and behavioral patterns for the persona
11488
+ */
11489
+ backstoryPrompt?: string | null;
11490
+
11491
+ /**
11492
+ * Human-readable description of the persona
11493
+ */
11494
+ description?: string | null;
11495
+
11496
+ /**
11497
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
11498
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
11499
+ * or set null to display the name itself.
11500
+ */
11501
+ displayName?: string | null;
11502
+
11503
+ /**
11504
+ * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
11505
+ */
11506
+ secondaryLanguage?: 'EN' | null;
11507
+ }
11508
+ }
11509
+
11510
+ /**
11511
+ * One voicemail greeting.
11512
+ */
11513
+ export interface HappyPath {
11514
+ id: string;
11515
+
11516
+ /**
11517
+ * Graded on top of the flow's own expectations, for this variant only.
11518
+ */
11519
+ additionalExpectations: Array<HappyPath.AdditionalExpectation>;
11520
+
11521
+ /**
11522
+ * Creation timestamp in ISO 8601 format
11523
+ */
11524
+ createdAt: string;
11525
+
11526
+ /**
11527
+ * A simulation environment: the ambient conditions a customer flow variant runs
11528
+ * under. The list includes both your own and the ones Roark curates for every
11529
+ * project.
11530
+ */
11531
+ environment: HappyPath.Environment | null;
11532
+
11533
+ isGenerated: boolean;
11534
+
11535
+ /**
11536
+ * The persona this runs as instead of the happy path's. Null means it inherits.
11537
+ */
11538
+ personaOverride: HappyPath.PersonaOverride | null;
11539
+
11540
+ precededByCustomerFlowId: string | null;
11541
+
11542
+ precededByCustomerFlowVariantId: string | null;
11543
+
11544
+ title: string;
11545
+
11546
+ type: 'VOICEMAIL';
11547
+
11548
+ /**
11549
+ * Last update timestamp in ISO 8601 format
11550
+ */
11551
+ updatedAt: string;
11552
+
11553
+ systemKey?: string | null;
11554
+ }
11555
+
11556
+ export namespace HappyPath {
11557
+ /**
11558
+ * One thing the agent under test is graded against.
11559
+ */
11560
+ export interface AdditionalExpectation {
11561
+ id: string;
11562
+
11563
+ /**
11564
+ * What the agent under test is graded against.
11565
+ */
11566
+ prompt: string;
11567
+ }
11568
+
11569
+ /**
11570
+ * A simulation environment: the ambient conditions a customer flow variant runs
11571
+ * under. The list includes both your own and the ones Roark curates for every
11572
+ * project.
11573
+ */
11574
+ export interface Environment {
11575
+ id: string;
11576
+
11577
+ backgroundNoise:
11578
+ | 'NONE'
11579
+ | 'AIRPORT'
11580
+ | 'CHILDREN_PLAYING'
11581
+ | 'CITY'
11582
+ | 'COFFEE_SHOP'
11583
+ | 'DRIVING'
11584
+ | 'OFFICE'
11585
+ | 'THUNDERSTORM';
11586
+
11587
+ backgroundNoiseVolume: number;
11588
+
11589
+ /**
11590
+ * Creation timestamp in ISO 8601 format
11591
+ */
11592
+ createdAt: string;
11593
+
11594
+ name: string;
11595
+
11596
+ /**
11597
+ * Last update timestamp in ISO 8601 format
11598
+ */
11599
+ updatedAt: string;
11600
+
11601
+ description?: string | null;
11602
+ }
11603
+
11604
+ /**
11605
+ * The persona this runs as instead of the happy path's. Null means it inherits.
11606
+ */
11607
+ export interface PersonaOverride {
11608
+ /**
11609
+ * Unique identifier of the persona
11610
+ */
11611
+ id: string;
11612
+
11613
+ /**
11614
+ * Accent of the persona, defined using ISO 3166-1 alpha-2 country codes with
11615
+ * optional variants
11616
+ */
11617
+ accent:
11618
+ | 'US'
11619
+ | 'US_X_SOUTH'
11620
+ | 'GB'
11621
+ | 'ES'
11622
+ | 'DE'
11623
+ | 'IN'
11624
+ | 'FR'
11625
+ | 'NL'
11626
+ | 'SA'
11627
+ | 'GR'
11628
+ | 'AU'
11629
+ | 'IT'
11630
+ | 'ID'
11631
+ | 'TH'
11632
+ | 'JP'
11633
+ | 'NZ'
11634
+ | 'PH'
11635
+ | 'SG'
11636
+ | 'MY'
11637
+ | 'HK'
11638
+ | 'TR'
11639
+ | 'PT'
11640
+ | 'IL';
11641
+
11642
+ /**
11643
+ * How old the caller sounds and behaves. Only ages the persona's accent has a
11644
+ * voice for are accepted; defaults to ADULT, which every accent supports.
11645
+ */
11646
+ age: 'CHILD' | 'TEENAGER' | 'ADULT' | 'ELDERLY';
11647
+
11648
+ /**
11649
+ * Background noise setting
11650
+ */
11651
+ backgroundNoise:
11652
+ | 'NONE'
11653
+ | 'AIRPORT'
11654
+ | 'CHILDREN_PLAYING'
11655
+ | 'CITY'
11656
+ | 'COFFEE_SHOP'
11657
+ | 'DRIVING'
11658
+ | 'OFFICE'
11659
+ | 'THUNDERSTORM';
11660
+
11661
+ /**
11662
+ * Base emotional state of the persona
11663
+ */
11664
+ baseEmotion:
11665
+ | 'NEUTRAL'
11666
+ | 'CHEERFUL'
11667
+ | 'CONFUSED'
11668
+ | 'FRUSTRATED'
11669
+ | 'SKEPTICAL'
11670
+ | 'RUSHED'
11671
+ | 'DISTRACTED'
11672
+ | 'ANGRY'
11673
+ | 'ANXIOUS'
11674
+ | 'SAD';
11675
+
11676
+ /**
11677
+ * How the persona confirms information
11678
+ */
11679
+ confirmationStyle: 'EXPLICIT' | 'VAGUE';
11680
+
11681
+ /**
11682
+ * Creation timestamp
11683
+ */
11684
+ createdAt: string;
11685
+
11686
+ /**
11687
+ * Gender of the persona
11688
+ */
11689
+ gender: 'MALE' | 'FEMALE';
11690
+
11691
+ /**
11692
+ * Whether the persona uses filler words like "um" and "uh"
11693
+ */
11694
+ hasDisfluencies: boolean;
11695
+
11696
+ /**
11697
+ * Maximum number of idle messages the persona will send before giving up
11698
+ */
11699
+ idleMessageMaxSpokenCount: number;
11700
+
11701
+ /**
11702
+ * Whether the idle message counter resets when the agent speaks
11703
+ */
11704
+ idleMessageResetCountOnUserSpeechEnabled: boolean;
11705
+
11706
+ /**
11707
+ * Messages the persona will say when the agent goes silent during a call. null =
11708
+ * "Automatic": language-appropriate defaults are used at call time.
11709
+ */
11710
+ idleMessages: Array<string> | null;
11711
+
11712
+ /**
11713
+ * Seconds of silence before the persona sends an idle message
11714
+ */
11715
+ idleTimeoutSeconds: number;
11716
+
11717
+ /**
11718
+ * How clearly the persona expresses their intentions
11719
+ */
11720
+ intentClarity: 'CLEAR' | 'INDIRECT' | 'VAGUE';
11721
+
11722
+ /**
11723
+ * Primary language ISO 639-1 code for the persona
11724
+ */
11725
+ language:
11726
+ | 'EN'
11727
+ | 'ES'
11728
+ | 'DE'
11729
+ | 'HI'
11730
+ | 'FR'
11731
+ | 'NL'
11732
+ | 'AR'
11733
+ | 'EL'
11734
+ | 'IT'
11735
+ | 'ID'
11736
+ | 'TH'
11737
+ | 'JA'
11738
+ | 'TL'
11739
+ | 'MS'
11740
+ | 'ZH'
11741
+ | 'TR'
11742
+ | 'PT'
11743
+ | 'HE';
11744
+
11745
+ /**
11746
+ * How reliable the persona's memory is
11747
+ */
11748
+ memoryReliability: 'HIGH' | 'LOW';
11749
+
11750
+ /**
11751
+ * The name the agent will identify as during conversations
11752
+ */
11753
+ name: string;
11754
+
11755
+ /**
11756
+ * Additional custom properties about the persona
11757
+ */
11758
+ properties: { [key: string]: unknown };
11759
+
11760
+ /**
11761
+ * Controls how quickly the persona responds to pauses in conversation (QUICK,
11762
+ * NORMAL, RELAXED)
11763
+ */
11764
+ responseTiming: 'RELAXED' | 'NORMAL' | 'QUICK';
11765
+
11766
+ /**
11767
+ * Speech clarity of the persona
11768
+ */
11769
+ speechClarity: 'CLEAR' | 'VAGUE' | 'RAMBLING';
11770
+
11771
+ /**
11772
+ * Speech pace of the persona
11773
+ */
11774
+ speechPace: 'SUPER_SLOW' | 'SLOW' | 'NORMAL' | 'FAST' | 'SUPER_FAST';
11775
+
11776
+ /**
11777
+ * Languages the persona can understand. Multilingual combinations are limited by
11778
+ * multilingual speech recognition support.
11779
+ */
11780
+ understoodLanguages: Array<
11781
+ | 'EN'
11782
+ | 'ES'
11783
+ | 'DE'
11784
+ | 'HI'
11785
+ | 'FR'
11786
+ | 'NL'
11787
+ | 'AR'
11788
+ | 'EL'
11789
+ | 'IT'
11790
+ | 'ID'
11791
+ | 'TH'
11792
+ | 'JA'
11793
+ | 'TL'
11794
+ | 'MS'
11795
+ | 'ZH'
11796
+ | 'TR'
11797
+ | 'PT'
11798
+ | 'HE'
11799
+ >;
11800
+
11801
+ /**
11802
+ * Last update timestamp
11803
+ */
11804
+ updatedAt: string;
11805
+
11806
+ /**
11807
+ * Background story and behavioral patterns for the persona
11808
+ */
11809
+ backstoryPrompt?: string | null;
11810
+
11811
+ /**
11812
+ * Human-readable description of the persona
11813
+ */
11814
+ description?: string | null;
11815
+
11816
+ /**
11817
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
11818
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
11819
+ * or set null to display the name itself.
11820
+ */
11821
+ displayName?: string | null;
11822
+
11823
+ /**
11824
+ * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
11825
+ */
11826
+ secondaryLanguage?: 'EN' | null;
11827
+ }
11828
+ }
11829
+ }
11830
+ }
11831
+
11832
+ export interface CustomerFlowReplaceGraphResponse {
11833
+ data: CustomerFlowReplaceGraphResponse.Data;
11834
+ }
11835
+
11836
+ export namespace CustomerFlowReplaceGraphResponse {
11837
+ export interface Data {
11838
+ /**
11839
+ * The edge cases after the write.
11840
+ */
11841
+ edgeCases: Array<Data.ScriptedFlowVariant | Data.ImprovFlowVariant | Data.VoicemailFlowVariant>;
11842
+
11843
+ graph: Array<CustomerFlowAPI.FlowStep>;
11844
+
11845
+ /**
11846
+ * The way a customer flow is meant to go.
11847
+ */
11848
+ happyPath: Data.ScriptedFlowVariant | Data.ImprovFlowVariant | Data.VoicemailFlowVariant | null;
11849
+
11850
+ /**
11851
+ * True when the write changed the set of paths, so the flow's variants were
11852
+ * re-seeded and any variant id you were holding may no longer exist.
11853
+ */
11854
+ variantsReshaped: boolean;
11855
+
11856
+ warnings: Array<string>;
11857
+ }
11858
+
11859
+ export namespace Data {
11860
+ /**
11861
+ * One path through a scripted flow. The path engine owns which paths exist, so
11862
+ * editing the graph is what creates and removes these.
11863
+ */
11864
+ export interface ScriptedFlowVariant {
11865
+ id: string;
11866
+
11867
+ /**
11868
+ * Graded on top of the flow's own expectations, for this variant only.
11869
+ */
11870
+ additionalExpectations: Array<ScriptedFlowVariant.AdditionalExpectation>;
9039
11871
 
9040
11872
  /**
9041
11873
  * Creation timestamp in ISO 8601 format
@@ -9109,6 +11941,8 @@ export namespace CustomerFlowReplaceGraphResponse {
9109
11941
  | 'OFFICE'
9110
11942
  | 'THUNDERSTORM';
9111
11943
 
11944
+ backgroundNoiseVolume: number;
11945
+
9112
11946
  /**
9113
11947
  * Creation timestamp in ISO 8601 format
9114
11948
  */
@@ -9191,7 +12025,10 @@ export namespace CustomerFlowReplaceGraphResponse {
9191
12025
  | 'FRUSTRATED'
9192
12026
  | 'SKEPTICAL'
9193
12027
  | 'RUSHED'
9194
- | 'DISTRACTED';
12028
+ | 'DISTRACTED'
12029
+ | 'ANGRY'
12030
+ | 'ANXIOUS'
12031
+ | 'SAD';
9195
12032
 
9196
12033
  /**
9197
12034
  * How the persona confirms information
@@ -9333,6 +12170,13 @@ export namespace CustomerFlowReplaceGraphResponse {
9333
12170
  */
9334
12171
  description?: string | null;
9335
12172
 
12173
+ /**
12174
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
12175
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
12176
+ * or set null to display the name itself.
12177
+ */
12178
+ displayName?: string | null;
12179
+
9336
12180
  /**
9337
12181
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
9338
12182
  */
@@ -9422,6 +12266,8 @@ export namespace CustomerFlowReplaceGraphResponse {
9422
12266
  | 'OFFICE'
9423
12267
  | 'THUNDERSTORM';
9424
12268
 
12269
+ backgroundNoiseVolume: number;
12270
+
9425
12271
  /**
9426
12272
  * Creation timestamp in ISO 8601 format
9427
12273
  */
@@ -9504,7 +12350,10 @@ export namespace CustomerFlowReplaceGraphResponse {
9504
12350
  | 'FRUSTRATED'
9505
12351
  | 'SKEPTICAL'
9506
12352
  | 'RUSHED'
9507
- | 'DISTRACTED';
12353
+ | 'DISTRACTED'
12354
+ | 'ANGRY'
12355
+ | 'ANXIOUS'
12356
+ | 'SAD';
9508
12357
 
9509
12358
  /**
9510
12359
  * How the persona confirms information
@@ -9646,6 +12495,13 @@ export namespace CustomerFlowReplaceGraphResponse {
9646
12495
  */
9647
12496
  description?: string | null;
9648
12497
 
12498
+ /**
12499
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
12500
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
12501
+ * or set null to display the name itself.
12502
+ */
12503
+ displayName?: string | null;
12504
+
9649
12505
  /**
9650
12506
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
9651
12507
  */
@@ -9730,6 +12586,8 @@ export namespace CustomerFlowReplaceGraphResponse {
9730
12586
  | 'OFFICE'
9731
12587
  | 'THUNDERSTORM';
9732
12588
 
12589
+ backgroundNoiseVolume: number;
12590
+
9733
12591
  /**
9734
12592
  * Creation timestamp in ISO 8601 format
9735
12593
  */
@@ -9812,7 +12670,10 @@ export namespace CustomerFlowReplaceGraphResponse {
9812
12670
  | 'FRUSTRATED'
9813
12671
  | 'SKEPTICAL'
9814
12672
  | 'RUSHED'
9815
- | 'DISTRACTED';
12673
+ | 'DISTRACTED'
12674
+ | 'ANGRY'
12675
+ | 'ANXIOUS'
12676
+ | 'SAD';
9816
12677
 
9817
12678
  /**
9818
12679
  * How the persona confirms information
@@ -9954,6 +12815,13 @@ export namespace CustomerFlowReplaceGraphResponse {
9954
12815
  */
9955
12816
  description?: string | null;
9956
12817
 
12818
+ /**
12819
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
12820
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
12821
+ * or set null to display the name itself.
12822
+ */
12823
+ displayName?: string | null;
12824
+
9957
12825
  /**
9958
12826
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
9959
12827
  */
@@ -10058,6 +12926,8 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10058
12926
  | 'OFFICE'
10059
12927
  | 'THUNDERSTORM';
10060
12928
 
12929
+ backgroundNoiseVolume: number;
12930
+
10061
12931
  /**
10062
12932
  * Creation timestamp in ISO 8601 format
10063
12933
  */
@@ -10133,7 +13003,17 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10133
13003
  /**
10134
13004
  * Base emotional state of the persona
10135
13005
  */
10136
- baseEmotion: 'NEUTRAL' | 'CHEERFUL' | 'CONFUSED' | 'FRUSTRATED' | 'SKEPTICAL' | 'RUSHED' | 'DISTRACTED';
13006
+ baseEmotion:
13007
+ | 'NEUTRAL'
13008
+ | 'CHEERFUL'
13009
+ | 'CONFUSED'
13010
+ | 'FRUSTRATED'
13011
+ | 'SKEPTICAL'
13012
+ | 'RUSHED'
13013
+ | 'DISTRACTED'
13014
+ | 'ANGRY'
13015
+ | 'ANXIOUS'
13016
+ | 'SAD';
10137
13017
 
10138
13018
  /**
10139
13019
  * How the persona confirms information
@@ -10275,6 +13155,13 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10275
13155
  */
10276
13156
  description?: string | null;
10277
13157
 
13158
+ /**
13159
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
13160
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
13161
+ * or set null to display the name itself.
13162
+ */
13163
+ displayName?: string | null;
13164
+
10278
13165
  /**
10279
13166
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
10280
13167
  */
@@ -10364,6 +13251,8 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10364
13251
  | 'OFFICE'
10365
13252
  | 'THUNDERSTORM';
10366
13253
 
13254
+ backgroundNoiseVolume: number;
13255
+
10367
13256
  /**
10368
13257
  * Creation timestamp in ISO 8601 format
10369
13258
  */
@@ -10439,7 +13328,17 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10439
13328
  /**
10440
13329
  * Base emotional state of the persona
10441
13330
  */
10442
- baseEmotion: 'NEUTRAL' | 'CHEERFUL' | 'CONFUSED' | 'FRUSTRATED' | 'SKEPTICAL' | 'RUSHED' | 'DISTRACTED';
13331
+ baseEmotion:
13332
+ | 'NEUTRAL'
13333
+ | 'CHEERFUL'
13334
+ | 'CONFUSED'
13335
+ | 'FRUSTRATED'
13336
+ | 'SKEPTICAL'
13337
+ | 'RUSHED'
13338
+ | 'DISTRACTED'
13339
+ | 'ANGRY'
13340
+ | 'ANXIOUS'
13341
+ | 'SAD';
10443
13342
 
10444
13343
  /**
10445
13344
  * How the persona confirms information
@@ -10581,6 +13480,13 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10581
13480
  */
10582
13481
  description?: string | null;
10583
13482
 
13483
+ /**
13484
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
13485
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
13486
+ * or set null to display the name itself.
13487
+ */
13488
+ displayName?: string | null;
13489
+
10584
13490
  /**
10585
13491
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
10586
13492
  */
@@ -10665,6 +13571,8 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10665
13571
  | 'OFFICE'
10666
13572
  | 'THUNDERSTORM';
10667
13573
 
13574
+ backgroundNoiseVolume: number;
13575
+
10668
13576
  /**
10669
13577
  * Creation timestamp in ISO 8601 format
10670
13578
  */
@@ -10740,7 +13648,17 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10740
13648
  /**
10741
13649
  * Base emotional state of the persona
10742
13650
  */
10743
- baseEmotion: 'NEUTRAL' | 'CHEERFUL' | 'CONFUSED' | 'FRUSTRATED' | 'SKEPTICAL' | 'RUSHED' | 'DISTRACTED';
13651
+ baseEmotion:
13652
+ | 'NEUTRAL'
13653
+ | 'CHEERFUL'
13654
+ | 'CONFUSED'
13655
+ | 'FRUSTRATED'
13656
+ | 'SKEPTICAL'
13657
+ | 'RUSHED'
13658
+ | 'DISTRACTED'
13659
+ | 'ANGRY'
13660
+ | 'ANXIOUS'
13661
+ | 'SAD';
10744
13662
 
10745
13663
  /**
10746
13664
  * How the persona confirms information
@@ -10882,6 +13800,13 @@ export namespace CustomerFlowUpdateHappyPathResponse {
10882
13800
  */
10883
13801
  description?: string | null;
10884
13802
 
13803
+ /**
13804
+ * Label shown in place of the name across the dashboard (e.g. a short descriptor
13805
+ * like "Irate Escalator"). The persona still identifies as `name` on calls. Omit
13806
+ * or set null to display the name itself.
13807
+ */
13808
+ displayName?: string | null;
13809
+
10885
13810
  /**
10886
13811
  * Secondary language ISO 639-1 code for code-switching (e.g., Hinglish, Spanglish)
10887
13812
  */
@@ -10899,7 +13824,8 @@ export declare namespace CustomerFlowCreateParams {
10899
13824
  /**
10900
13825
  * The conversation, as a graph of steps. At most 100 steps across at most 25
10901
13826
  * paths. The variants come from the graph: one per path, so they are not sent
10902
- * here.
13827
+ * here. A CUSTOMER_TURN describes what the simulated customer says and the persona
13828
+ * phrases it; a CUSTOMER_VERBATIM_TURN is said word for word.
10903
13829
  */
10904
13830
  graph: Array<FlowStep>;
10905
13831
 
@@ -10925,6 +13851,31 @@ export declare namespace CustomerFlowCreateParams {
10925
13851
  branchingMode?: 'DETERMINISTIC' | 'ADAPTIVE';
10926
13852
 
10927
13853
  description?: string | null;
13854
+
13855
+ /**
13856
+ * STRICT only. What the simulated customer does when your agent does not say the
13857
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
13858
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
13859
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
13860
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
13861
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
13862
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
13863
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
13864
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
13865
+ * AGENT_TURN step can carry its own.
13866
+ */
13867
+ offScriptPolicy?: CreateScriptedCustomerFlowInput.OffScriptPolicy | null;
13868
+
13869
+ /**
13870
+ * How closely a run follows the script. LOOSE (default) hands the whole script to
13871
+ * the simulated customer as one prompt; it keeps the call moving whatever your
13872
+ * agent says. STRICT runs the script as a state machine on the agent service: at
13873
+ * every agent step the simulated customer waits, silent, until your agent has said
13874
+ * the expected line, and only then moves on. Scripted flows only; STRICT needs the
13875
+ * agent-service transport and is not available on realtime models. (LOOSE is the
13876
+ * default.)
13877
+ */
13878
+ scriptAdherence?: 'LOOSE' | 'STRICT';
10928
13879
  }
10929
13880
 
10930
13881
  export namespace CreateScriptedCustomerFlowInput {
@@ -10934,6 +13885,30 @@ export declare namespace CustomerFlowCreateParams {
10934
13885
  */
10935
13886
  prompt: string;
10936
13887
  }
13888
+
13889
+ /**
13890
+ * STRICT only. What the simulated customer does when your agent does not say the
13891
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
13892
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
13893
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
13894
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
13895
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
13896
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
13897
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
13898
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
13899
+ * AGENT_TURN step can carry its own.
13900
+ */
13901
+ export interface OffScriptPolicy {
13902
+ maxAttempts: number;
13903
+
13904
+ reaction: 'STAY_SILENT' | 'REPEAT' | 'RESPOND' | 'SAY';
13905
+
13906
+ then: 'HANG_UP' | 'MOVE_ON' | 'ADAPT' | 'HANG_UP_INVALIDATE';
13907
+
13908
+ sayLine?: string | null;
13909
+
13910
+ waitSeconds?: number | null;
13911
+ }
10937
13912
  }
10938
13913
 
10939
13914
  export interface CreateImprovCustomerFlowInput {
@@ -11037,6 +14012,31 @@ export interface CustomerFlowUpdateParams {
11037
14012
 
11038
14013
  description?: string | null;
11039
14014
 
14015
+ /**
14016
+ * STRICT only. What the simulated customer does when your agent does not say the
14017
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
14018
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
14019
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
14020
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
14021
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
14022
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
14023
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
14024
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
14025
+ * AGENT_TURN step can carry its own.
14026
+ */
14027
+ offScriptPolicy?: CustomerFlowUpdateParams.OffScriptPolicy | null;
14028
+
14029
+ /**
14030
+ * Scripted flows only. How closely a run follows the script. LOOSE (default) hands
14031
+ * the whole script to the simulated customer as one prompt; it keeps the call
14032
+ * moving whatever your agent says. STRICT runs the script as a state machine on
14033
+ * the agent service: at every agent step the simulated customer waits, silent,
14034
+ * until your agent has said the expected line, and only then moves on. Scripted
14035
+ * flows only; STRICT needs the agent-service transport and is not available on
14036
+ * realtime models.
14037
+ */
14038
+ scriptAdherence?: 'LOOSE' | 'STRICT';
14039
+
11040
14040
  title?: string;
11041
14041
  }
11042
14042
 
@@ -11047,6 +14047,30 @@ export namespace CustomerFlowUpdateParams {
11047
14047
  */
11048
14048
  prompt: string;
11049
14049
  }
14050
+
14051
+ /**
14052
+ * STRICT only. What the simulated customer does when your agent does not say the
14053
+ * expected line. Each unmatched agent utterance is an attempt: `reaction` runs per
14054
+ * attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character
14055
+ * without moving on, or SAY `sayLine`), and `then` runs when attempts reach
14056
+ * `maxAttempts` or your agent stays silent for `waitSeconds` (HANG_UP ends the
14057
+ * call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way
14058
+ * and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON
14059
+ * advances anyway, ADAPT hands the rest of the call to loose behaviour). Null:
14060
+ * stay silent, 3 attempts, hang up. The default for every agent step; an
14061
+ * AGENT_TURN step can carry its own.
14062
+ */
14063
+ export interface OffScriptPolicy {
14064
+ maxAttempts: number;
14065
+
14066
+ reaction: 'STAY_SILENT' | 'REPEAT' | 'RESPOND' | 'SAY';
14067
+
14068
+ then: 'HANG_UP' | 'MOVE_ON' | 'ADAPT' | 'HANG_UP_INVALIDATE';
14069
+
14070
+ sayLine?: string | null;
14071
+
14072
+ waitSeconds?: number | null;
14073
+ }
11050
14074
  }
11051
14075
 
11052
14076
  export interface CustomerFlowListParams {
@@ -11061,6 +14085,8 @@ export interface CustomerFlowListParams {
11061
14085
  type?: 'SCRIPTED' | 'IMPROV' | 'VOICEMAIL';
11062
14086
  }
11063
14087
 
14088
+ export interface CustomerFlowDuplicateParams {}
14089
+
11064
14090
  export interface CustomerFlowReplaceGraphParams {
11065
14091
  /**
11066
14092
  * The complete graph. This replaces the flow's existing steps rather than merging
@@ -11117,12 +14143,14 @@ export declare namespace CustomerFlow {
11117
14143
  type CustomerFlowUpdateResponse as CustomerFlowUpdateResponse,
11118
14144
  type CustomerFlowListResponse as CustomerFlowListResponse,
11119
14145
  type CustomerFlowDeleteResponse as CustomerFlowDeleteResponse,
14146
+ type CustomerFlowDuplicateResponse as CustomerFlowDuplicateResponse,
11120
14147
  type CustomerFlowGetByIDResponse as CustomerFlowGetByIDResponse,
11121
14148
  type CustomerFlowReplaceGraphResponse as CustomerFlowReplaceGraphResponse,
11122
14149
  type CustomerFlowUpdateHappyPathResponse as CustomerFlowUpdateHappyPathResponse,
11123
14150
  type CustomerFlowCreateParams as CustomerFlowCreateParams,
11124
14151
  type CustomerFlowUpdateParams as CustomerFlowUpdateParams,
11125
14152
  type CustomerFlowListParams as CustomerFlowListParams,
14153
+ type CustomerFlowDuplicateParams as CustomerFlowDuplicateParams,
11126
14154
  type CustomerFlowReplaceGraphParams as CustomerFlowReplaceGraphParams,
11127
14155
  type CustomerFlowUpdateHappyPathParams as CustomerFlowUpdateHappyPathParams,
11128
14156
  };