@elevasis/core 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -2
- package/dist/organization-model/index.d.ts +1 -1
- package/dist/organization-model/index.js +9 -2
- package/dist/test-utils/index.d.ts +463 -377
- package/dist/test-utils/index.js +9 -2
- package/package.json +1 -1
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +2324 -0
- package/src/business/acquisition/activity-events.test.ts +250 -0
- package/src/business/acquisition/activity-events.ts +7 -65
- package/src/business/acquisition/api-schemas.test.ts +1180 -0
- package/src/business/acquisition/api-schemas.ts +1075 -859
- package/src/business/acquisition/crm-state-actions.test.ts +160 -0
- package/src/business/acquisition/derive-actions.test.ts +518 -0
- package/src/business/acquisition/derive-actions.ts +103 -90
- package/src/business/acquisition/index.ts +149 -111
- package/src/business/acquisition/stateful.ts +30 -0
- package/src/business/acquisition/types.ts +44 -77
- package/src/execution/engine/index.ts +437 -434
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +363 -360
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +162 -186
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +316 -338
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +204 -210
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.test.ts +88 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +141 -134
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +76 -75
- package/src/execution/engine/tools/integration/service.test.ts +34 -9
- package/src/execution/engine/tools/integration/service.ts +6 -3
- package/src/execution/engine/tools/lead-service-types.ts +945 -888
- package/src/execution/engine/tools/platform/acquisition/types.ts +266 -260
- package/src/execution/engine/tools/registry.ts +701 -699
- package/src/execution/engine/tools/tool-maps.ts +816 -791
- package/src/execution/engine/workflow/types.ts +11 -0
- package/src/organization-model/contracts.ts +4 -4
- package/src/organization-model/domains/navigation.ts +62 -62
- package/src/organization-model/domains/sales.ts +272 -0
- package/src/organization-model/published.ts +21 -21
- package/src/organization-model/resolve.ts +21 -8
- package/src/platform/constants/versions.ts +1 -1
- package/src/reference/_generated/contracts.md +2324 -0
- package/src/supabase/database.types.ts +2958 -2886
|
@@ -1,859 +1,1075 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
import { UuidSchema } from '../../platform/utils/validation'
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
export const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
export const
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
export const
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Single
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
organizationId: z.string(),
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
export type
|
|
300
|
-
export type
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
export
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
export const
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
export const
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
export const
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
.
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
.
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
})
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
export const
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
export const
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
batchId: z.string().trim().min(1).max(255).optional(),
|
|
613
|
-
status: AcqCompanyStatusSchema.optional(),
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
.
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
data.
|
|
673
|
-
data.
|
|
674
|
-
data.
|
|
675
|
-
data.
|
|
676
|
-
data.
|
|
677
|
-
data.
|
|
678
|
-
data.
|
|
679
|
-
data.
|
|
680
|
-
data.
|
|
681
|
-
data.pipelineStatus !== undefined ||
|
|
682
|
-
data.enrichmentData !== undefined ||
|
|
683
|
-
data.
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
linkedinUrl: z.string().nullable(),
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
export
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
export
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
export
|
|
859
|
-
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { UuidSchema, NonEmptyStringSchema } from '../../platform/utils/validation'
|
|
3
|
+
import { LEAD_GEN_STAGE_CATALOG } from '../../organization-model/domains/sales'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Deal Management API Schemas
|
|
7
|
+
*
|
|
8
|
+
* Request/response validation for /api/deals surface.
|
|
9
|
+
* Used by both the API route handlers and the frontend hooks.
|
|
10
|
+
*
|
|
11
|
+
* Table mapping:
|
|
12
|
+
* acq_deals -> DealSchemas (list/detail)
|
|
13
|
+
* acq_deal_notes -> DealSchemas (note shapes)
|
|
14
|
+
* acq_deal_tasks -> DealSchemas (task shapes)
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Enum literals (must match DB CHECK constraints exactly)
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
export const DealStageSchema = z.enum(['interested', 'proposal', 'closing', 'closed_won', 'closed_lost', 'nurturing'])
|
|
22
|
+
|
|
23
|
+
export const AcqDealTaskKindSchema = z.enum(['call', 'email', 'meeting', 'other'])
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Params
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
export const DealIdParamsSchema = z.object({
|
|
30
|
+
dealId: UuidSchema
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
export const DealTaskIdParamsSchema = z.object({
|
|
34
|
+
dealId: UuidSchema,
|
|
35
|
+
taskId: UuidSchema
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Query schemas (coerce strings from query params)
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
|
|
42
|
+
export const ListDealsQuerySchema = z
|
|
43
|
+
.object({
|
|
44
|
+
stage: DealStageSchema.optional(),
|
|
45
|
+
search: z.string().optional(),
|
|
46
|
+
limit: z.coerce.number().int().positive().default(50),
|
|
47
|
+
offset: z.coerce.number().int().min(0).default(0)
|
|
48
|
+
})
|
|
49
|
+
.strict()
|
|
50
|
+
|
|
51
|
+
export const DealLookupQuerySchema = z
|
|
52
|
+
.object({
|
|
53
|
+
search: z.string().trim().min(1).max(200).optional(),
|
|
54
|
+
limit: z.coerce.number().int().min(1).max(25).default(10)
|
|
55
|
+
})
|
|
56
|
+
.strict()
|
|
57
|
+
|
|
58
|
+
export const ListDealTasksDueQuerySchema = z
|
|
59
|
+
.object({
|
|
60
|
+
window: z.enum(['overdue', 'today', 'today_and_overdue', 'upcoming']).optional(),
|
|
61
|
+
assigneeUserId: UuidSchema.optional()
|
|
62
|
+
})
|
|
63
|
+
.strict()
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Request body schemas (all use .strict() — rejects unknown fields)
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
export const CreateDealNoteRequestSchema = z
|
|
70
|
+
.object({
|
|
71
|
+
body: z.string().trim().min(1).max(10000)
|
|
72
|
+
})
|
|
73
|
+
.strict()
|
|
74
|
+
|
|
75
|
+
export const CreateDealTaskRequestSchema = z
|
|
76
|
+
.object({
|
|
77
|
+
title: z.string().trim().min(1).max(255),
|
|
78
|
+
description: z.string().nullable().optional(),
|
|
79
|
+
kind: AcqDealTaskKindSchema.optional(),
|
|
80
|
+
dueAt: z.string().datetime().nullable().optional(),
|
|
81
|
+
assigneeUserId: UuidSchema.nullable().optional()
|
|
82
|
+
})
|
|
83
|
+
.strict()
|
|
84
|
+
|
|
85
|
+
export const TransitionItemRequestSchema = z
|
|
86
|
+
.object({
|
|
87
|
+
pipelineKey: z.string().min(1),
|
|
88
|
+
stageKey: z.string().min(1),
|
|
89
|
+
stateKey: z.string().nullable().optional(),
|
|
90
|
+
reason: z.string().optional(),
|
|
91
|
+
expectedUpdatedAt: z.string().datetime().optional()
|
|
92
|
+
})
|
|
93
|
+
.strict()
|
|
94
|
+
|
|
95
|
+
export const ExecuteActionParamsSchema = z
|
|
96
|
+
.object({
|
|
97
|
+
dealId: UuidSchema,
|
|
98
|
+
actionKey: NonEmptyStringSchema
|
|
99
|
+
})
|
|
100
|
+
.strict()
|
|
101
|
+
|
|
102
|
+
export const ExecuteActionRequestSchema = z
|
|
103
|
+
.object({
|
|
104
|
+
payload: z.record(z.string(), z.unknown()).optional()
|
|
105
|
+
})
|
|
106
|
+
.strict()
|
|
107
|
+
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Response schemas (no .strict() — allows forward-compatible additions)
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Contact summary nested inside DealListItem / DealDetailResponse.
|
|
114
|
+
* Matches the joined shape returned by useDeals / useDealDetail Supabase queries.
|
|
115
|
+
*/
|
|
116
|
+
export const DealContactSummarySchema = z.object({
|
|
117
|
+
id: z.string(),
|
|
118
|
+
first_name: z.string().nullable(),
|
|
119
|
+
last_name: z.string().nullable(),
|
|
120
|
+
email: z.string(),
|
|
121
|
+
title: z.string().nullable(),
|
|
122
|
+
headline: z.string().nullable(),
|
|
123
|
+
linkedin_url: z.string().nullable(),
|
|
124
|
+
pipeline_status: z.record(z.string(), z.unknown()).nullable(),
|
|
125
|
+
enrichment_data: z.record(z.string(), z.unknown()).nullable(),
|
|
126
|
+
company: z
|
|
127
|
+
.object({
|
|
128
|
+
id: z.string(),
|
|
129
|
+
name: z.string(),
|
|
130
|
+
domain: z.string().nullable(),
|
|
131
|
+
website: z.string().nullable(),
|
|
132
|
+
linkedin_url: z.string().nullable(),
|
|
133
|
+
segment: z.string().nullable(),
|
|
134
|
+
category: z.string().nullable(),
|
|
135
|
+
num_employees: z.number().nullable()
|
|
136
|
+
})
|
|
137
|
+
.nullable()
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Deal list item with joined contact (and company via contact).
|
|
142
|
+
* Matches DealListItem from @repo/core types.
|
|
143
|
+
*/
|
|
144
|
+
export const DealListItemSchema = z.object({
|
|
145
|
+
// acq_deals columns
|
|
146
|
+
id: z.string(),
|
|
147
|
+
organization_id: z.string(),
|
|
148
|
+
contact_id: z.string().nullable(),
|
|
149
|
+
contact_email: z.string(),
|
|
150
|
+
pipeline_key: z.string(),
|
|
151
|
+
stage_key: z.string().nullable(),
|
|
152
|
+
state_key: z.string().nullable(),
|
|
153
|
+
activity_log: z.unknown(),
|
|
154
|
+
discovery_data: z.unknown().nullable(),
|
|
155
|
+
discovery_submitted_at: z.string().nullable(),
|
|
156
|
+
discovery_submitted_by: z.string().nullable(),
|
|
157
|
+
proposal_data: z.unknown().nullable(),
|
|
158
|
+
proposal_sent_at: z.string().nullable(),
|
|
159
|
+
proposal_pdf_url: z.string().nullable(),
|
|
160
|
+
signature_envelope_id: z.string().nullable(),
|
|
161
|
+
source_list_id: z.string().nullable(),
|
|
162
|
+
source_type: z.string().nullable(),
|
|
163
|
+
initial_fee: z.number().nullable(),
|
|
164
|
+
monthly_fee: z.number().nullable(),
|
|
165
|
+
closed_lost_at: z.string().nullable(),
|
|
166
|
+
closed_lost_reason: z.string().nullable(),
|
|
167
|
+
created_at: z.string(),
|
|
168
|
+
updated_at: z.string(),
|
|
169
|
+
// joined relation
|
|
170
|
+
contact: DealContactSummarySchema.nullable()
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
export const DealListResponseSchema = z.object({
|
|
174
|
+
data: z.array(DealListItemSchema),
|
|
175
|
+
total: z.number().int(),
|
|
176
|
+
limit: z.number().int(),
|
|
177
|
+
offset: z.number().int()
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
export const DealStageSummarySchema = z.object({
|
|
181
|
+
stage: z.string(),
|
|
182
|
+
count: z.number().int(),
|
|
183
|
+
totalValue: z.number(),
|
|
184
|
+
oldestUpdatedAt: z.string().nullable(),
|
|
185
|
+
newestUpdatedAt: z.string().nullable()
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
export const StaleDealSummarySchema = z.object({
|
|
189
|
+
id: z.string(),
|
|
190
|
+
contactEmail: z.string(),
|
|
191
|
+
stageKey: z.string(),
|
|
192
|
+
updatedAt: z.string(),
|
|
193
|
+
daysStale: z.number().int()
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
export const DealSummaryResponseSchema = z.object({
|
|
197
|
+
totalDeals: z.number().int(),
|
|
198
|
+
openDeals: z.number().int(),
|
|
199
|
+
wonDeals: z.number().int(),
|
|
200
|
+
lostDeals: z.number().int(),
|
|
201
|
+
winRate: z.number(),
|
|
202
|
+
avgDealSize: z.number(),
|
|
203
|
+
totalPipelineValue: z.number(),
|
|
204
|
+
stageSummary: z.array(DealStageSummarySchema),
|
|
205
|
+
staleDeals: z.array(StaleDealSummarySchema)
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
export const DealLookupItemSchema = z.object({
|
|
209
|
+
id: z.string(),
|
|
210
|
+
contactEmail: z.string(),
|
|
211
|
+
stageKey: z.string().nullable(),
|
|
212
|
+
updatedAt: z.string(),
|
|
213
|
+
contactName: z.string().nullable(),
|
|
214
|
+
companyName: z.string().nullable(),
|
|
215
|
+
displayLabel: z.string()
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
export const DealLookupResponseSchema = z.array(DealLookupItemSchema)
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Deal detail shape — currently the same as a list item (full joined record).
|
|
222
|
+
* useDealDetail returns DealDetail which is typed as DealListItem.
|
|
223
|
+
*/
|
|
224
|
+
export const DealDetailResponseSchema = DealListItemSchema
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Single acq_deal_notes row (camelCase API representation).
|
|
228
|
+
*/
|
|
229
|
+
export const DealNoteResponseSchema = z.object({
|
|
230
|
+
id: z.string(),
|
|
231
|
+
dealId: z.string(),
|
|
232
|
+
organizationId: z.string(),
|
|
233
|
+
authorUserId: z.string().nullable(),
|
|
234
|
+
body: z.string(),
|
|
235
|
+
createdAt: z.string(),
|
|
236
|
+
updatedAt: z.string()
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
export const DealNoteListResponseSchema = z.array(DealNoteResponseSchema)
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Single acq_deal_tasks row (camelCase API representation).
|
|
243
|
+
* Matches AcqDealTask domain type from types.ts.
|
|
244
|
+
*/
|
|
245
|
+
export const DealTaskResponseSchema = z.object({
|
|
246
|
+
id: z.string(),
|
|
247
|
+
organizationId: z.string(),
|
|
248
|
+
dealId: z.string(),
|
|
249
|
+
title: z.string(),
|
|
250
|
+
description: z.string().nullable(),
|
|
251
|
+
kind: AcqDealTaskKindSchema,
|
|
252
|
+
dueAt: z.string().nullable(),
|
|
253
|
+
assigneeUserId: z.string().nullable(),
|
|
254
|
+
completedAt: z.string().nullable(),
|
|
255
|
+
completedByUserId: z.string().nullable(),
|
|
256
|
+
createdAt: z.string(),
|
|
257
|
+
updatedAt: z.string(),
|
|
258
|
+
createdByUserId: z.string().nullable()
|
|
259
|
+
})
|
|
260
|
+
|
|
261
|
+
export const DealTaskListResponseSchema = z.array(DealTaskResponseSchema)
|
|
262
|
+
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
// Bundled export
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
|
|
267
|
+
export const DealSchemas = {
|
|
268
|
+
// Params
|
|
269
|
+
DealIdParams: DealIdParamsSchema,
|
|
270
|
+
DealTaskIdParams: DealTaskIdParamsSchema,
|
|
271
|
+
|
|
272
|
+
// Queries
|
|
273
|
+
ListDealsQuery: ListDealsQuerySchema,
|
|
274
|
+
DealLookupQuery: DealLookupQuerySchema,
|
|
275
|
+
ListDealTasksDueQuery: ListDealTasksDueQuerySchema,
|
|
276
|
+
|
|
277
|
+
// Request bodies
|
|
278
|
+
CreateDealNoteRequest: CreateDealNoteRequestSchema,
|
|
279
|
+
CreateDealTaskRequest: CreateDealTaskRequestSchema,
|
|
280
|
+
TransitionItemRequest: TransitionItemRequestSchema,
|
|
281
|
+
ExecuteActionParams: ExecuteActionParamsSchema,
|
|
282
|
+
ExecuteActionRequest: ExecuteActionRequestSchema,
|
|
283
|
+
|
|
284
|
+
// Responses
|
|
285
|
+
DealListResponse: DealListResponseSchema,
|
|
286
|
+
DealSummaryResponse: DealSummaryResponseSchema,
|
|
287
|
+
DealLookupResponse: DealLookupResponseSchema,
|
|
288
|
+
DealDetailResponse: DealDetailResponseSchema,
|
|
289
|
+
DealNoteResponse: DealNoteResponseSchema,
|
|
290
|
+
DealNoteListResponse: DealNoteListResponseSchema,
|
|
291
|
+
DealTaskResponse: DealTaskResponseSchema,
|
|
292
|
+
DealTaskListResponse: DealTaskListResponseSchema
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// ---------------------------------------------------------------------------
|
|
296
|
+
// Inferred types
|
|
297
|
+
// ---------------------------------------------------------------------------
|
|
298
|
+
|
|
299
|
+
export type DealStage = z.infer<typeof DealStageSchema>
|
|
300
|
+
export type AcqDealTaskKind = z.infer<typeof AcqDealTaskKindSchema>
|
|
301
|
+
export type DealIdParams = z.infer<typeof DealIdParamsSchema>
|
|
302
|
+
export type DealTaskIdParams = z.infer<typeof DealTaskIdParamsSchema>
|
|
303
|
+
export type ListDealsQuery = z.infer<typeof ListDealsQuerySchema>
|
|
304
|
+
export type DealLookupQuery = z.infer<typeof DealLookupQuerySchema>
|
|
305
|
+
export type ListDealTasksDueQuery = z.infer<typeof ListDealTasksDueQuerySchema>
|
|
306
|
+
export type CreateDealNoteRequest = z.infer<typeof CreateDealNoteRequestSchema>
|
|
307
|
+
export type CreateDealTaskRequest = z.infer<typeof CreateDealTaskRequestSchema>
|
|
308
|
+
export type TransitionItemRequest = z.infer<typeof TransitionItemRequestSchema>
|
|
309
|
+
export type ExecuteActionParams = z.infer<typeof ExecuteActionParamsSchema>
|
|
310
|
+
export type ExecuteActionRequest = z.infer<typeof ExecuteActionRequestSchema>
|
|
311
|
+
export type DealListResponse = z.infer<typeof DealListResponseSchema>
|
|
312
|
+
export type DealSummaryResponse = z.infer<typeof DealSummaryResponseSchema>
|
|
313
|
+
export type DealLookupItem = z.infer<typeof DealLookupItemSchema>
|
|
314
|
+
export type DealLookupResponse = z.infer<typeof DealLookupResponseSchema>
|
|
315
|
+
export type DealDetailResponse = z.infer<typeof DealDetailResponseSchema>
|
|
316
|
+
export type DealNoteResponse = z.infer<typeof DealNoteResponseSchema>
|
|
317
|
+
export type DealNoteListResponse = z.infer<typeof DealNoteListResponseSchema>
|
|
318
|
+
export type DealTaskResponse = z.infer<typeof DealTaskResponseSchema>
|
|
319
|
+
export type DealTaskListResponse = z.infer<typeof DealTaskListResponseSchema>
|
|
320
|
+
|
|
321
|
+
// ---------------------------------------------------------------------------
|
|
322
|
+
// List Management API Schemas
|
|
323
|
+
//
|
|
324
|
+
// Request/response validation for /api/acquisition/lists surface.
|
|
325
|
+
// Used by both the API route handlers and the frontend hooks.
|
|
326
|
+
//
|
|
327
|
+
// Table mapping:
|
|
328
|
+
// acq_lists -> AcqListSchemas (list/detail/progress)
|
|
329
|
+
// acq_list_companies -> AcqListSchemas (add/remove company membership)
|
|
330
|
+
// acq_list_contacts -> AcqListSchemas (add/remove contact membership)
|
|
331
|
+
// acq_list_executions -> AcqListSchemas (execution history)
|
|
332
|
+
// ---------------------------------------------------------------------------
|
|
333
|
+
|
|
334
|
+
// ---------------------------------------------------------------------------
|
|
335
|
+
// Primitives — list status enum + jsonb config schemas
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Lifecycle status enum for `acq_lists.status` (mirrors DB CHECK constraint
|
|
340
|
+
* from migration 20260428000003_lead_gen_acq_lists_status_and_config.sql).
|
|
341
|
+
*/
|
|
342
|
+
export const ListStatusSchema = z.enum(['draft', 'enriching', 'launched', 'closing', 'archived'])
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Scraping criteria stored in `acq_lists.scraping_config` jsonb.
|
|
346
|
+
* Edited via the UI; consumed by lgn-01 prospecting workflows (Apify input shape,
|
|
347
|
+
* geography, vertical, size). All fields are optional — empty config is valid.
|
|
348
|
+
*/
|
|
349
|
+
export const ScrapingConfigSchema = z.object({
|
|
350
|
+
vertical: z.string().trim().max(255).optional(),
|
|
351
|
+
geography: z.string().trim().max(500).optional(),
|
|
352
|
+
size: z.string().trim().max(255).optional(),
|
|
353
|
+
apifyInput: z.record(z.string(), z.unknown()).optional()
|
|
354
|
+
})
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* ICP / qualification rubric stored in `acq_lists.icp` jsonb.
|
|
358
|
+
* Replaces the legacy `config.qualification` blob. Consumed by the
|
|
359
|
+
* company-qualification workflow.
|
|
360
|
+
*/
|
|
361
|
+
export const IcpRubricSchema = z.object({
|
|
362
|
+
qualificationRubricKey: z.string().trim().max(255).nullish(),
|
|
363
|
+
targetDescription: z.string().optional(),
|
|
364
|
+
minReviewCount: z.number().int().min(0).optional(),
|
|
365
|
+
minRating: z.number().min(0).max(5).optional(),
|
|
366
|
+
excludeFranchises: z.boolean().optional(),
|
|
367
|
+
customRules: z.string().optional()
|
|
368
|
+
})
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* One stage entry in a list's `pipeline_config.stages[]`. The `key` is
|
|
372
|
+
* validated against `LEAD_GEN_STAGE_CATALOG` so list pipeline definitions
|
|
373
|
+
* stay aligned with the org-os semantic layer.
|
|
374
|
+
*/
|
|
375
|
+
export const PipelineStageSchema = z.object({
|
|
376
|
+
key: z.string().refine((value) => Object.prototype.hasOwnProperty.call(LEAD_GEN_STAGE_CATALOG, value), {
|
|
377
|
+
message: 'pipeline stage key must match LEAD_GEN_STAGE_CATALOG'
|
|
378
|
+
}),
|
|
379
|
+
label: z.string().optional(),
|
|
380
|
+
enabled: z.boolean().optional(),
|
|
381
|
+
order: z.number().int().optional()
|
|
382
|
+
})
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Pipeline presentation contract stored in `acq_lists.pipeline_config` jsonb.
|
|
386
|
+
* `stages[].key` validates against the catalog; the rest is presentation only.
|
|
387
|
+
*/
|
|
388
|
+
export const PipelineConfigSchema = z.object({
|
|
389
|
+
stages: z.array(PipelineStageSchema).optional()
|
|
390
|
+
})
|
|
391
|
+
|
|
392
|
+
// ---------------------------------------------------------------------------
|
|
393
|
+
// List telemetry / progress schemas
|
|
394
|
+
// ---------------------------------------------------------------------------
|
|
395
|
+
|
|
396
|
+
export const ListStageCountsSchema = z.object({
|
|
397
|
+
stageCounts: z.object({
|
|
398
|
+
populated: z.number().int(),
|
|
399
|
+
extracted: z.number().int(),
|
|
400
|
+
qualified: z.number().int(),
|
|
401
|
+
discovered: z.number().int(),
|
|
402
|
+
verified: z.number().int(),
|
|
403
|
+
personalized: z.number().int(),
|
|
404
|
+
uploaded: z.number().int()
|
|
405
|
+
}),
|
|
406
|
+
deliverability: z.object({
|
|
407
|
+
valid: z.number().int(),
|
|
408
|
+
risky: z.number().int(),
|
|
409
|
+
invalid: z.number().int(),
|
|
410
|
+
unknown: z.number().int(),
|
|
411
|
+
bounced: z.number().int()
|
|
412
|
+
})
|
|
413
|
+
})
|
|
414
|
+
|
|
415
|
+
export const ListTelemetrySchema = z.object({
|
|
416
|
+
listId: UuidSchema,
|
|
417
|
+
totalCompanies: z.number().int(),
|
|
418
|
+
totalContacts: z.number().int(),
|
|
419
|
+
stageCounts: ListStageCountsSchema.shape.stageCounts,
|
|
420
|
+
deliverability: ListStageCountsSchema.shape.deliverability,
|
|
421
|
+
activeWorkflows: z.array(z.string()).optional()
|
|
422
|
+
})
|
|
423
|
+
|
|
424
|
+
// ---------------------------------------------------------------------------
|
|
425
|
+
// Params
|
|
426
|
+
// ---------------------------------------------------------------------------
|
|
427
|
+
|
|
428
|
+
export const ListIdParamsSchema = z.object({
|
|
429
|
+
listId: UuidSchema
|
|
430
|
+
})
|
|
431
|
+
|
|
432
|
+
// ---------------------------------------------------------------------------
|
|
433
|
+
// Request body schemas (all use .strict() — rejects unknown fields)
|
|
434
|
+
// ---------------------------------------------------------------------------
|
|
435
|
+
|
|
436
|
+
export const CreateListRequestSchema = z
|
|
437
|
+
.object({
|
|
438
|
+
name: z.string().trim().min(1).max(255),
|
|
439
|
+
description: z.string().trim().nullable().optional(),
|
|
440
|
+
status: ListStatusSchema.optional(),
|
|
441
|
+
scrapingConfig: ScrapingConfigSchema.optional(),
|
|
442
|
+
icp: IcpRubricSchema.optional(),
|
|
443
|
+
pipelineConfig: PipelineConfigSchema.optional()
|
|
444
|
+
})
|
|
445
|
+
.strict()
|
|
446
|
+
|
|
447
|
+
export const UpdateListRequestSchema = z
|
|
448
|
+
.object({
|
|
449
|
+
name: z.string().trim().min(1).max(255).optional(),
|
|
450
|
+
description: z.string().trim().nullable().optional(),
|
|
451
|
+
batchIds: z.array(z.string()).optional()
|
|
452
|
+
})
|
|
453
|
+
.strict()
|
|
454
|
+
.refine((data) => data.name !== undefined || data.description !== undefined || data.batchIds !== undefined, {
|
|
455
|
+
message: 'At least one field (name, description, or batchIds) must be provided'
|
|
456
|
+
})
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Status-only PATCH body for `/acquisition/lists/:listId/status`.
|
|
460
|
+
* Replaces the previous `transitionList` flow.
|
|
461
|
+
*/
|
|
462
|
+
export const UpdateListStatusRequestSchema = z
|
|
463
|
+
.object({
|
|
464
|
+
status: ListStatusSchema
|
|
465
|
+
})
|
|
466
|
+
.strict()
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Partial patch for the three jsonb config columns. UI sends only the edited
|
|
470
|
+
* subtree; server writes the field as-is (no deep merge — each column is
|
|
471
|
+
* replaced atomically when present in the patch).
|
|
472
|
+
*/
|
|
473
|
+
export const UpdateListConfigRequestSchema = z
|
|
474
|
+
.object({
|
|
475
|
+
scrapingConfig: ScrapingConfigSchema.partial().optional(),
|
|
476
|
+
icp: IcpRubricSchema.partial().optional(),
|
|
477
|
+
pipelineConfig: PipelineConfigSchema.partial().optional()
|
|
478
|
+
})
|
|
479
|
+
.strict()
|
|
480
|
+
.refine((data) => data.scrapingConfig !== undefined || data.icp !== undefined || data.pipelineConfig !== undefined, {
|
|
481
|
+
message: 'At least one of scrapingConfig, icp, or pipelineConfig must be provided'
|
|
482
|
+
})
|
|
483
|
+
|
|
484
|
+
export const AddCompaniesToListRequestSchema = z
|
|
485
|
+
.object({
|
|
486
|
+
companyIds: z.array(UuidSchema).min(1).max(1000)
|
|
487
|
+
})
|
|
488
|
+
.strict()
|
|
489
|
+
|
|
490
|
+
export const RemoveCompaniesFromListRequestSchema = z
|
|
491
|
+
.object({
|
|
492
|
+
companyIds: z.array(UuidSchema).min(1).max(1000)
|
|
493
|
+
})
|
|
494
|
+
.strict()
|
|
495
|
+
|
|
496
|
+
export const AddContactsToListRequestSchema = z
|
|
497
|
+
.object({
|
|
498
|
+
contactIds: z.array(UuidSchema).min(1).max(1000)
|
|
499
|
+
})
|
|
500
|
+
.strict()
|
|
501
|
+
|
|
502
|
+
export const RecordListExecutionRequestSchema = z
|
|
503
|
+
.object({
|
|
504
|
+
executionId: UuidSchema,
|
|
505
|
+
configSnapshot: z.record(z.string(), z.unknown()).optional()
|
|
506
|
+
})
|
|
507
|
+
.strict()
|
|
508
|
+
|
|
509
|
+
// ---------------------------------------------------------------------------
|
|
510
|
+
// Response schemas (no .strict() — allows forward-compatible additions)
|
|
511
|
+
// ---------------------------------------------------------------------------
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Single list as returned by /api/acquisition/lists/:id etc.
|
|
515
|
+
* Camel-cased domain shape matching AcqList in types.ts.
|
|
516
|
+
*/
|
|
517
|
+
export const AcqListResponseSchema = z.object({
|
|
518
|
+
id: z.string(),
|
|
519
|
+
organizationId: z.string(),
|
|
520
|
+
name: z.string(),
|
|
521
|
+
description: z.string().nullable(),
|
|
522
|
+
type: z.string(),
|
|
523
|
+
batchIds: z.array(z.string()),
|
|
524
|
+
instantlyCampaignId: z.string().nullable(),
|
|
525
|
+
/** Lifecycle status (draft | enriching | launched | closing | archived). */
|
|
526
|
+
status: ListStatusSchema,
|
|
527
|
+
metadata: z.record(z.string(), z.unknown()),
|
|
528
|
+
launchedAt: z.string().nullable(),
|
|
529
|
+
completedAt: z.string().nullable(),
|
|
530
|
+
createdAt: z.string(),
|
|
531
|
+
/** Scraping criteria stored as jsonb on the row. */
|
|
532
|
+
scrapingConfig: ScrapingConfigSchema,
|
|
533
|
+
/** ICP / qualification rubric stored as jsonb on the row. */
|
|
534
|
+
icp: IcpRubricSchema,
|
|
535
|
+
/** Pipeline presentation contract stored as jsonb on the row. */
|
|
536
|
+
pipelineConfig: PipelineConfigSchema
|
|
537
|
+
})
|
|
538
|
+
|
|
539
|
+
export const AcqListListResponseSchema = z.array(AcqListResponseSchema)
|
|
540
|
+
|
|
541
|
+
export const ListTelemetryResponseSchema = ListTelemetrySchema
|
|
542
|
+
|
|
543
|
+
export const ListTelemetryListResponseSchema = z.array(ListTelemetrySchema)
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Per-stage progress aggregate for a single pipeline stage.
|
|
547
|
+
* `done` = count of members/companies where `(processing_state->>'<key>')::boolean` is true.
|
|
548
|
+
* `total` = total member/company count for the list.
|
|
549
|
+
*/
|
|
550
|
+
export const ListStageProgressSchema = z.object({
|
|
551
|
+
done: z.number().int().min(0),
|
|
552
|
+
total: z.number().int().min(0)
|
|
553
|
+
})
|
|
554
|
+
|
|
555
|
+
/**
|
|
556
|
+
* Progress response for GET /acquisition/lists/:listId/progress.
|
|
557
|
+
* Aggregated on-demand via COUNT(*) FILTER over processing_state flags (Decision #4).
|
|
558
|
+
* `byStage` keys are driven by the list's pipeline_config.stages[].key.
|
|
559
|
+
*/
|
|
560
|
+
export const ListProgressResponseSchema = z.object({
|
|
561
|
+
totalMembers: z.number().int().min(0),
|
|
562
|
+
totalCompanies: z.number().int().min(0),
|
|
563
|
+
byCompanyStage: z.record(z.string(), ListStageProgressSchema),
|
|
564
|
+
byContactStage: z.record(z.string(), ListStageProgressSchema)
|
|
565
|
+
})
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Row from acq_list_executions joined with the execution summary,
|
|
569
|
+
* shaped for the /lists/:id/executions response.
|
|
570
|
+
*/
|
|
571
|
+
export const ListExecutionSummarySchema = z.object({
|
|
572
|
+
executionId: z.string(),
|
|
573
|
+
resourceId: z.string(),
|
|
574
|
+
status: z.string(),
|
|
575
|
+
createdAt: z.string(),
|
|
576
|
+
completedAt: z.string().nullable(),
|
|
577
|
+
durationMs: z.number().int().nullable()
|
|
578
|
+
})
|
|
579
|
+
|
|
580
|
+
export const ListExecutionsResponseSchema = z.array(ListExecutionSummarySchema)
|
|
581
|
+
|
|
582
|
+
// ---------------------------------------------------------------------------
|
|
583
|
+
// Company / Contact API Schemas
|
|
584
|
+
// ---------------------------------------------------------------------------
|
|
585
|
+
|
|
586
|
+
const QueryBooleanSchema = z.preprocess((value) => {
|
|
587
|
+
if (value === 'true' || value === '1' || value === true) return true
|
|
588
|
+
if (value === 'false' || value === '0' || value === false) return false
|
|
589
|
+
return value
|
|
590
|
+
}, z.boolean())
|
|
591
|
+
|
|
592
|
+
export const AcqCompanyStatusSchema = z.enum(['active', 'invalid'])
|
|
593
|
+
export const AcqContactStatusSchema = z.enum(['active', 'invalid'])
|
|
594
|
+
export const AcqEmailValidSchema = z.enum(['VALID', 'INVALID', 'RISKY', 'UNKNOWN'])
|
|
595
|
+
|
|
596
|
+
export const CompanyIdParamsSchema = z.object({
|
|
597
|
+
companyId: UuidSchema
|
|
598
|
+
})
|
|
599
|
+
|
|
600
|
+
export const ContactIdParamsSchema = z.object({
|
|
601
|
+
contactId: UuidSchema
|
|
602
|
+
})
|
|
603
|
+
|
|
604
|
+
export const ListCompaniesQuerySchema = z
|
|
605
|
+
.object({
|
|
606
|
+
search: z.string().trim().min(1).max(200).optional(),
|
|
607
|
+
listId: UuidSchema.optional(),
|
|
608
|
+
domain: z.string().trim().min(1).max(255).optional(),
|
|
609
|
+
website: z.string().trim().min(1).max(2048).optional(),
|
|
610
|
+
segment: z.string().trim().min(1).max(255).optional(),
|
|
611
|
+
category: z.string().trim().min(1).max(255).optional(),
|
|
612
|
+
batchId: z.string().trim().min(1).max(255).optional(),
|
|
613
|
+
status: AcqCompanyStatusSchema.optional(),
|
|
614
|
+
includeAll: QueryBooleanSchema.optional(),
|
|
615
|
+
limit: z.coerce.number().int().min(1).max(5000).default(50),
|
|
616
|
+
offset: z.coerce.number().int().min(0).default(0)
|
|
617
|
+
})
|
|
618
|
+
.strict()
|
|
619
|
+
|
|
620
|
+
export const ListContactsQuerySchema = z
|
|
621
|
+
.object({
|
|
622
|
+
search: z.string().trim().min(1).max(200).optional(),
|
|
623
|
+
listId: UuidSchema.optional(),
|
|
624
|
+
openingLineIsNull: QueryBooleanSchema.optional(),
|
|
625
|
+
batchId: z.string().trim().min(1).max(255).optional(),
|
|
626
|
+
contactStatus: AcqContactStatusSchema.optional(),
|
|
627
|
+
limit: z.coerce.number().int().min(1).max(5000).default(5000),
|
|
628
|
+
offset: z.coerce.number().int().min(0).default(0)
|
|
629
|
+
})
|
|
630
|
+
.strict()
|
|
631
|
+
|
|
632
|
+
export const CreateCompanyRequestSchema = z
|
|
633
|
+
.object({
|
|
634
|
+
name: z.string().trim().min(1).max(255),
|
|
635
|
+
domain: z.string().trim().min(1).max(255).optional(),
|
|
636
|
+
linkedinUrl: z.string().trim().url().optional(),
|
|
637
|
+
website: z.string().trim().url().optional(),
|
|
638
|
+
numEmployees: z.number().int().min(0).optional(),
|
|
639
|
+
foundedYear: z.number().int().optional(),
|
|
640
|
+
locationCity: z.string().trim().min(1).max(255).optional(),
|
|
641
|
+
locationState: z.string().trim().min(1).max(255).optional(),
|
|
642
|
+
category: z.string().trim().min(1).max(255).optional(),
|
|
643
|
+
source: z.string().trim().min(1).max(255).optional(),
|
|
644
|
+
batchId: z.string().trim().min(1).max(255).optional(),
|
|
645
|
+
verticalResearch: z.string().trim().min(1).max(5000).optional()
|
|
646
|
+
})
|
|
647
|
+
.strict()
|
|
648
|
+
|
|
649
|
+
export const UpdateCompanyRequestSchema = z
|
|
650
|
+
.object({
|
|
651
|
+
name: z.string().trim().min(1).max(255).optional(),
|
|
652
|
+
domain: z.string().trim().min(1).max(255).optional(),
|
|
653
|
+
linkedinUrl: z.string().trim().url().optional(),
|
|
654
|
+
website: z.string().trim().url().optional(),
|
|
655
|
+
numEmployees: z.number().int().min(0).optional(),
|
|
656
|
+
foundedYear: z.number().int().optional(),
|
|
657
|
+
locationCity: z.string().trim().min(1).max(255).optional(),
|
|
658
|
+
locationState: z.string().trim().min(1).max(255).optional(),
|
|
659
|
+
category: z.string().trim().min(1).max(255).optional(),
|
|
660
|
+
segment: z.string().trim().min(1).max(255).optional(),
|
|
661
|
+
pipelineStatus: z.record(z.string(), z.unknown()).optional(),
|
|
662
|
+
enrichmentData: z.record(z.string(), z.unknown()).optional(),
|
|
663
|
+
source: z.string().trim().min(1).max(255).optional(),
|
|
664
|
+
batchId: z.string().trim().min(1).max(255).optional(),
|
|
665
|
+
status: AcqCompanyStatusSchema.optional(),
|
|
666
|
+
verticalResearch: z.string().trim().min(1).max(5000).nullable().optional()
|
|
667
|
+
})
|
|
668
|
+
.strict()
|
|
669
|
+
.refine(
|
|
670
|
+
(data) =>
|
|
671
|
+
data.name !== undefined ||
|
|
672
|
+
data.domain !== undefined ||
|
|
673
|
+
data.linkedinUrl !== undefined ||
|
|
674
|
+
data.website !== undefined ||
|
|
675
|
+
data.numEmployees !== undefined ||
|
|
676
|
+
data.foundedYear !== undefined ||
|
|
677
|
+
data.locationCity !== undefined ||
|
|
678
|
+
data.locationState !== undefined ||
|
|
679
|
+
data.category !== undefined ||
|
|
680
|
+
data.segment !== undefined ||
|
|
681
|
+
data.pipelineStatus !== undefined ||
|
|
682
|
+
data.enrichmentData !== undefined ||
|
|
683
|
+
data.source !== undefined ||
|
|
684
|
+
data.batchId !== undefined ||
|
|
685
|
+
data.status !== undefined ||
|
|
686
|
+
data.verticalResearch !== undefined,
|
|
687
|
+
{
|
|
688
|
+
message: 'At least one field must be provided'
|
|
689
|
+
}
|
|
690
|
+
)
|
|
691
|
+
|
|
692
|
+
export const CreateContactRequestSchema = z
|
|
693
|
+
.object({
|
|
694
|
+
email: z.string().trim().email(),
|
|
695
|
+
companyId: UuidSchema.optional(),
|
|
696
|
+
firstName: z.string().trim().min(1).max(255).optional(),
|
|
697
|
+
lastName: z.string().trim().min(1).max(255).optional(),
|
|
698
|
+
linkedinUrl: z.string().trim().url().optional(),
|
|
699
|
+
title: z.string().trim().min(1).max(255).optional(),
|
|
700
|
+
source: z.string().trim().min(1).max(255).optional(),
|
|
701
|
+
sourceId: z.string().trim().min(1).max(255).optional(),
|
|
702
|
+
batchId: z.string().trim().min(1).max(255).optional()
|
|
703
|
+
})
|
|
704
|
+
.strict()
|
|
705
|
+
|
|
706
|
+
export const UpdateContactRequestSchema = z
|
|
707
|
+
.object({
|
|
708
|
+
companyId: UuidSchema.optional(),
|
|
709
|
+
emailValid: AcqEmailValidSchema.optional(),
|
|
710
|
+
firstName: z.string().trim().min(1).max(255).optional(),
|
|
711
|
+
lastName: z.string().trim().min(1).max(255).optional(),
|
|
712
|
+
linkedinUrl: z.string().trim().url().optional(),
|
|
713
|
+
title: z.string().trim().min(1).max(255).optional(),
|
|
714
|
+
headline: z.string().trim().min(1).max(5000).optional(),
|
|
715
|
+
filterReason: z.string().trim().min(1).max(5000).optional(),
|
|
716
|
+
openingLine: z.string().trim().min(1).max(5000).optional(),
|
|
717
|
+
pipelineStatus: z.record(z.string(), z.unknown()).optional(),
|
|
718
|
+
enrichmentData: z.record(z.string(), z.unknown()).optional(),
|
|
719
|
+
status: AcqContactStatusSchema.optional()
|
|
720
|
+
})
|
|
721
|
+
.strict()
|
|
722
|
+
.refine(
|
|
723
|
+
(data) =>
|
|
724
|
+
data.companyId !== undefined ||
|
|
725
|
+
data.emailValid !== undefined ||
|
|
726
|
+
data.firstName !== undefined ||
|
|
727
|
+
data.lastName !== undefined ||
|
|
728
|
+
data.linkedinUrl !== undefined ||
|
|
729
|
+
data.title !== undefined ||
|
|
730
|
+
data.headline !== undefined ||
|
|
731
|
+
data.filterReason !== undefined ||
|
|
732
|
+
data.openingLine !== undefined ||
|
|
733
|
+
data.pipelineStatus !== undefined ||
|
|
734
|
+
data.enrichmentData !== undefined ||
|
|
735
|
+
data.status !== undefined,
|
|
736
|
+
{
|
|
737
|
+
message: 'At least one field must be provided'
|
|
738
|
+
}
|
|
739
|
+
)
|
|
740
|
+
|
|
741
|
+
export const AcqCompanyResponseSchema = z.object({
|
|
742
|
+
id: z.string(),
|
|
743
|
+
organizationId: z.string(),
|
|
744
|
+
name: z.string(),
|
|
745
|
+
domain: z.string().nullable(),
|
|
746
|
+
linkedinUrl: z.string().nullable(),
|
|
747
|
+
website: z.string().nullable(),
|
|
748
|
+
numEmployees: z.number().nullable(),
|
|
749
|
+
foundedYear: z.number().nullable(),
|
|
750
|
+
locationCity: z.string().nullable(),
|
|
751
|
+
locationState: z.string().nullable(),
|
|
752
|
+
category: z.string().nullable(),
|
|
753
|
+
categoryPain: z.string().nullable(),
|
|
754
|
+
segment: z.string().nullable(),
|
|
755
|
+
pipelineStatus: z.record(z.string(), z.unknown()).nullable(),
|
|
756
|
+
enrichmentData: z.record(z.string(), z.unknown()).nullable(),
|
|
757
|
+
source: z.string().nullable(),
|
|
758
|
+
batchId: z.string().nullable(),
|
|
759
|
+
status: AcqCompanyStatusSchema,
|
|
760
|
+
contactCount: z.number().int().min(0),
|
|
761
|
+
verticalResearch: z.string().nullable(),
|
|
762
|
+
createdAt: z.string(),
|
|
763
|
+
updatedAt: z.string()
|
|
764
|
+
})
|
|
765
|
+
|
|
766
|
+
export const AcqCompanyListResponseSchema = z.object({
|
|
767
|
+
data: z.array(AcqCompanyResponseSchema),
|
|
768
|
+
total: z.number().int(),
|
|
769
|
+
limit: z.number().int(),
|
|
770
|
+
offset: z.number().int()
|
|
771
|
+
})
|
|
772
|
+
|
|
773
|
+
export const AcqCompanyFacetsResponseSchema = z.object({
|
|
774
|
+
segments: z.array(z.string()),
|
|
775
|
+
categories: z.array(z.string()),
|
|
776
|
+
statuses: z.array(AcqCompanyStatusSchema)
|
|
777
|
+
})
|
|
778
|
+
|
|
779
|
+
export const AcqContactCompanySummarySchema = z.object({
|
|
780
|
+
id: z.string(),
|
|
781
|
+
name: z.string(),
|
|
782
|
+
domain: z.string().nullable(),
|
|
783
|
+
website: z.string().nullable(),
|
|
784
|
+
linkedinUrl: z.string().nullable(),
|
|
785
|
+
segment: z.string().nullable(),
|
|
786
|
+
category: z.string().nullable(),
|
|
787
|
+
status: AcqCompanyStatusSchema
|
|
788
|
+
})
|
|
789
|
+
|
|
790
|
+
export const AcqContactResponseSchema = z.object({
|
|
791
|
+
id: z.string(),
|
|
792
|
+
organizationId: z.string(),
|
|
793
|
+
companyId: z.string().nullable(),
|
|
794
|
+
email: z.string(),
|
|
795
|
+
emailValid: AcqEmailValidSchema.nullable(),
|
|
796
|
+
firstName: z.string().nullable(),
|
|
797
|
+
lastName: z.string().nullable(),
|
|
798
|
+
linkedinUrl: z.string().nullable(),
|
|
799
|
+
title: z.string().nullable(),
|
|
800
|
+
headline: z.string().nullable(),
|
|
801
|
+
filterReason: z.string().nullable(),
|
|
802
|
+
openingLine: z.string().nullable(),
|
|
803
|
+
source: z.string().nullable(),
|
|
804
|
+
sourceId: z.string().nullable(),
|
|
805
|
+
pipelineStatus: z.record(z.string(), z.unknown()).nullable(),
|
|
806
|
+
enrichmentData: z.record(z.string(), z.unknown()).nullable(),
|
|
807
|
+
attioPersonId: z.string().nullable(),
|
|
808
|
+
batchId: z.string().nullable(),
|
|
809
|
+
status: AcqContactStatusSchema,
|
|
810
|
+
company: AcqContactCompanySummarySchema.nullable().optional(),
|
|
811
|
+
createdAt: z.string(),
|
|
812
|
+
updatedAt: z.string()
|
|
813
|
+
})
|
|
814
|
+
|
|
815
|
+
export const AcqContactListResponseSchema = z.object({
|
|
816
|
+
data: z.array(AcqContactResponseSchema),
|
|
817
|
+
total: z.number().int(),
|
|
818
|
+
limit: z.number().int(),
|
|
819
|
+
offset: z.number().int()
|
|
820
|
+
})
|
|
821
|
+
|
|
822
|
+
// ---------------------------------------------------------------------------
|
|
823
|
+
// Track A: Artifacts API Schemas
|
|
824
|
+
// ---------------------------------------------------------------------------
|
|
825
|
+
|
|
826
|
+
export const AcqArtifactOwnerKindSchema = z.enum(['company', 'contact', 'deal', 'list', 'list_member'])
|
|
827
|
+
|
|
828
|
+
export const ListArtifactsQuerySchema = z
|
|
829
|
+
.object({
|
|
830
|
+
ownerKind: AcqArtifactOwnerKindSchema,
|
|
831
|
+
ownerId: UuidSchema
|
|
832
|
+
})
|
|
833
|
+
.strict()
|
|
834
|
+
|
|
835
|
+
export const CreateArtifactRequestSchema = z
|
|
836
|
+
.object({
|
|
837
|
+
ownerKind: AcqArtifactOwnerKindSchema,
|
|
838
|
+
ownerId: UuidSchema,
|
|
839
|
+
kind: z.string().trim().min(1).max(255),
|
|
840
|
+
content: z.record(z.string(), z.unknown()),
|
|
841
|
+
sourceExecutionId: UuidSchema.optional()
|
|
842
|
+
})
|
|
843
|
+
.strict()
|
|
844
|
+
|
|
845
|
+
export const AcqArtifactResponseSchema = z.object({
|
|
846
|
+
id: z.string(),
|
|
847
|
+
organizationId: z.string(),
|
|
848
|
+
ownerKind: z.string(),
|
|
849
|
+
ownerId: z.string(),
|
|
850
|
+
kind: z.string(),
|
|
851
|
+
content: z.record(z.string(), z.unknown()),
|
|
852
|
+
sourceExecutionId: z.string().nullable(),
|
|
853
|
+
createdBy: z.string().nullable(),
|
|
854
|
+
createdAt: z.string(),
|
|
855
|
+
version: z.number().int()
|
|
856
|
+
})
|
|
857
|
+
|
|
858
|
+
export const AcqArtifactListResponseSchema = z.object({
|
|
859
|
+
artifacts: z.array(AcqArtifactResponseSchema)
|
|
860
|
+
})
|
|
861
|
+
|
|
862
|
+
// ---------------------------------------------------------------------------
|
|
863
|
+
// Track B: List Members API Schemas
|
|
864
|
+
// ---------------------------------------------------------------------------
|
|
865
|
+
|
|
866
|
+
export const ListMembersQuerySchema = z
|
|
867
|
+
.object({
|
|
868
|
+
limit: z.coerce.number().int().min(1).max(500).default(50),
|
|
869
|
+
offset: z.coerce.number().int().min(0).default(0)
|
|
870
|
+
})
|
|
871
|
+
.strict()
|
|
872
|
+
|
|
873
|
+
export const MemberIdParamsSchema = z.object({
|
|
874
|
+
memberId: UuidSchema
|
|
875
|
+
})
|
|
876
|
+
|
|
877
|
+
export const AcqListMemberContactSummarySchema = z.object({
|
|
878
|
+
id: z.string(),
|
|
879
|
+
email: z.string(),
|
|
880
|
+
firstName: z.string().nullable(),
|
|
881
|
+
lastName: z.string().nullable(),
|
|
882
|
+
title: z.string().nullable(),
|
|
883
|
+
linkedinUrl: z.string().nullable(),
|
|
884
|
+
companyId: z.string().nullable()
|
|
885
|
+
})
|
|
886
|
+
|
|
887
|
+
export const AcqListMemberResponseSchema = z.object({
|
|
888
|
+
id: z.string(),
|
|
889
|
+
listId: z.string(),
|
|
890
|
+
contactId: z.string(),
|
|
891
|
+
pipelineKey: z.string(),
|
|
892
|
+
stageKey: z.string(),
|
|
893
|
+
stateKey: z.string(),
|
|
894
|
+
activityLog: z.unknown(),
|
|
895
|
+
addedAt: z.string(),
|
|
896
|
+
addedBy: z.string().nullable(),
|
|
897
|
+
sourceExecutionId: z.string().nullable(),
|
|
898
|
+
contact: AcqListMemberContactSummarySchema.nullable()
|
|
899
|
+
})
|
|
900
|
+
|
|
901
|
+
export const AcqListMembersResponseSchema = z.object({
|
|
902
|
+
members: z.array(AcqListMemberResponseSchema)
|
|
903
|
+
})
|
|
904
|
+
|
|
905
|
+
// ---------------------------------------------------------------------------
|
|
906
|
+
// Track B: List Companies API Schemas
|
|
907
|
+
// ---------------------------------------------------------------------------
|
|
908
|
+
|
|
909
|
+
export const ListCompanyIdParamsSchema = z.object({
|
|
910
|
+
listCompanyId: UuidSchema
|
|
911
|
+
})
|
|
912
|
+
|
|
913
|
+
export const AcqListCompanyResponseSchema = z.object({
|
|
914
|
+
id: z.string(),
|
|
915
|
+
listId: z.string(),
|
|
916
|
+
companyId: z.string(),
|
|
917
|
+
pipelineKey: z.string(),
|
|
918
|
+
stageKey: z.string(),
|
|
919
|
+
stateKey: z.string(),
|
|
920
|
+
activityLog: z.unknown(),
|
|
921
|
+
addedAt: z.string(),
|
|
922
|
+
addedBy: z.string().nullable(),
|
|
923
|
+
sourceExecutionId: z.string().nullable()
|
|
924
|
+
})
|
|
925
|
+
|
|
926
|
+
// ---------------------------------------------------------------------------
|
|
927
|
+
// Track B: Transition Request (shared by list, list-member, list-company)
|
|
928
|
+
// TransitionItemRequestSchema already exists above (for deals) — reuse it.
|
|
929
|
+
// ---------------------------------------------------------------------------
|
|
930
|
+
|
|
931
|
+
export const AcqCompanySchemas = {
|
|
932
|
+
CompanyIdParams: CompanyIdParamsSchema,
|
|
933
|
+
ListCompaniesQuery: ListCompaniesQuerySchema,
|
|
934
|
+
CreateCompanyRequest: CreateCompanyRequestSchema,
|
|
935
|
+
UpdateCompanyRequest: UpdateCompanyRequestSchema,
|
|
936
|
+
AcqCompanyResponse: AcqCompanyResponseSchema,
|
|
937
|
+
AcqCompanyListResponse: AcqCompanyListResponseSchema,
|
|
938
|
+
AcqCompanyFacetsResponse: AcqCompanyFacetsResponseSchema
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
export const AcqContactSchemas = {
|
|
942
|
+
ContactIdParams: ContactIdParamsSchema,
|
|
943
|
+
ListContactsQuery: ListContactsQuerySchema,
|
|
944
|
+
CreateContactRequest: CreateContactRequestSchema,
|
|
945
|
+
UpdateContactRequest: UpdateContactRequestSchema,
|
|
946
|
+
AcqContactResponse: AcqContactResponseSchema,
|
|
947
|
+
AcqContactListResponse: AcqContactListResponseSchema
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
export type AcqCompanyStatus = z.infer<typeof AcqCompanyStatusSchema>
|
|
951
|
+
export type AcqContactStatus = z.infer<typeof AcqContactStatusSchema>
|
|
952
|
+
export type AcqEmailValid = z.infer<typeof AcqEmailValidSchema>
|
|
953
|
+
export type CompanyIdParams = z.infer<typeof CompanyIdParamsSchema>
|
|
954
|
+
export type ContactIdParams = z.infer<typeof ContactIdParamsSchema>
|
|
955
|
+
export type ListCompaniesQuery = z.infer<typeof ListCompaniesQuerySchema>
|
|
956
|
+
export type ListContactsQuery = z.infer<typeof ListContactsQuerySchema>
|
|
957
|
+
export type CreateCompanyRequest = z.infer<typeof CreateCompanyRequestSchema>
|
|
958
|
+
export type UpdateCompanyRequest = z.infer<typeof UpdateCompanyRequestSchema>
|
|
959
|
+
export type CreateContactRequest = z.infer<typeof CreateContactRequestSchema>
|
|
960
|
+
export type UpdateContactRequest = z.infer<typeof UpdateContactRequestSchema>
|
|
961
|
+
export type AcqCompanyResponse = z.infer<typeof AcqCompanyResponseSchema>
|
|
962
|
+
export type AcqCompanyListResponse = z.infer<typeof AcqCompanyListResponseSchema>
|
|
963
|
+
export type AcqCompanyFacetsResponse = z.infer<typeof AcqCompanyFacetsResponseSchema>
|
|
964
|
+
export type AcqContactCompanySummary = z.infer<typeof AcqContactCompanySummarySchema>
|
|
965
|
+
export type AcqContactResponse = z.infer<typeof AcqContactResponseSchema>
|
|
966
|
+
export type AcqContactListResponse = z.infer<typeof AcqContactListResponseSchema>
|
|
967
|
+
|
|
968
|
+
// ---------------------------------------------------------------------------
|
|
969
|
+
// Bundled export
|
|
970
|
+
// ---------------------------------------------------------------------------
|
|
971
|
+
|
|
972
|
+
export const AcqListSchemas = {
|
|
973
|
+
// Params
|
|
974
|
+
ListIdParams: ListIdParamsSchema,
|
|
975
|
+
|
|
976
|
+
// Primitives (for UI / tests)
|
|
977
|
+
ListStatus: ListStatusSchema,
|
|
978
|
+
ScrapingConfig: ScrapingConfigSchema,
|
|
979
|
+
IcpRubric: IcpRubricSchema,
|
|
980
|
+
PipelineConfig: PipelineConfigSchema,
|
|
981
|
+
PipelineStage: PipelineStageSchema,
|
|
982
|
+
ListStageCounts: ListStageCountsSchema,
|
|
983
|
+
ListTelemetry: ListTelemetrySchema,
|
|
984
|
+
|
|
985
|
+
// Requests
|
|
986
|
+
CreateListRequest: CreateListRequestSchema,
|
|
987
|
+
UpdateListRequest: UpdateListRequestSchema,
|
|
988
|
+
UpdateListStatusRequest: UpdateListStatusRequestSchema,
|
|
989
|
+
UpdateListConfigRequest: UpdateListConfigRequestSchema,
|
|
990
|
+
AddCompaniesToListRequest: AddCompaniesToListRequestSchema,
|
|
991
|
+
RemoveCompaniesFromListRequest: RemoveCompaniesFromListRequestSchema,
|
|
992
|
+
AddContactsToListRequest: AddContactsToListRequestSchema,
|
|
993
|
+
RecordListExecutionRequest: RecordListExecutionRequestSchema,
|
|
994
|
+
|
|
995
|
+
// Responses
|
|
996
|
+
AcqListResponse: AcqListResponseSchema,
|
|
997
|
+
AcqListListResponse: AcqListListResponseSchema,
|
|
998
|
+
ListTelemetryResponse: ListTelemetryResponseSchema,
|
|
999
|
+
ListTelemetryListResponse: ListTelemetryListResponseSchema,
|
|
1000
|
+
ListExecutionsResponse: ListExecutionsResponseSchema,
|
|
1001
|
+
ListProgressResponse: ListProgressResponseSchema
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
// ---------------------------------------------------------------------------
|
|
1005
|
+
// Track A/B bundled schemas
|
|
1006
|
+
// ---------------------------------------------------------------------------
|
|
1007
|
+
|
|
1008
|
+
export const AcqSubstrateSchemas = {
|
|
1009
|
+
// Artifacts
|
|
1010
|
+
ListArtifactsQuery: ListArtifactsQuerySchema,
|
|
1011
|
+
CreateArtifactRequest: CreateArtifactRequestSchema,
|
|
1012
|
+
AcqArtifactResponse: AcqArtifactResponseSchema,
|
|
1013
|
+
AcqArtifactListResponse: AcqArtifactListResponseSchema,
|
|
1014
|
+
|
|
1015
|
+
// List members
|
|
1016
|
+
ListMembersQuery: ListMembersQuerySchema,
|
|
1017
|
+
MemberIdParams: MemberIdParamsSchema,
|
|
1018
|
+
AcqListMemberResponse: AcqListMemberResponseSchema,
|
|
1019
|
+
AcqListMembersResponse: AcqListMembersResponseSchema,
|
|
1020
|
+
|
|
1021
|
+
// List companies
|
|
1022
|
+
ListCompanyIdParams: ListCompanyIdParamsSchema,
|
|
1023
|
+
AcqListCompanyResponse: AcqListCompanyResponseSchema,
|
|
1024
|
+
|
|
1025
|
+
// Transition (shared with deals — TransitionItemRequestSchema)
|
|
1026
|
+
TransitionItemRequest: TransitionItemRequestSchema
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
// ---------------------------------------------------------------------------
|
|
1030
|
+
// Inferred types
|
|
1031
|
+
// ---------------------------------------------------------------------------
|
|
1032
|
+
|
|
1033
|
+
// ---------------------------------------------------------------------------
|
|
1034
|
+
// Inferred types — Track A/B substrate
|
|
1035
|
+
// ---------------------------------------------------------------------------
|
|
1036
|
+
|
|
1037
|
+
export type AcqArtifactOwnerKind = z.infer<typeof AcqArtifactOwnerKindSchema>
|
|
1038
|
+
export type ListArtifactsQuery = z.infer<typeof ListArtifactsQuerySchema>
|
|
1039
|
+
export type CreateArtifactRequest = z.infer<typeof CreateArtifactRequestSchema>
|
|
1040
|
+
export type AcqArtifactResponse = z.infer<typeof AcqArtifactResponseSchema>
|
|
1041
|
+
export type AcqArtifactListResponse = z.infer<typeof AcqArtifactListResponseSchema>
|
|
1042
|
+
export type ListMembersQuery = z.infer<typeof ListMembersQuerySchema>
|
|
1043
|
+
export type MemberIdParams = z.infer<typeof MemberIdParamsSchema>
|
|
1044
|
+
export type AcqListMemberContactSummary = z.infer<typeof AcqListMemberContactSummarySchema>
|
|
1045
|
+
export type AcqListMemberResponse = z.infer<typeof AcqListMemberResponseSchema>
|
|
1046
|
+
export type AcqListMembersResponse = z.infer<typeof AcqListMembersResponseSchema>
|
|
1047
|
+
export type ListCompanyIdParams = z.infer<typeof ListCompanyIdParamsSchema>
|
|
1048
|
+
export type AcqListCompanyResponse = z.infer<typeof AcqListCompanyResponseSchema>
|
|
1049
|
+
|
|
1050
|
+
// ---------------------------------------------------------------------------
|
|
1051
|
+
|
|
1052
|
+
export type ListStatus = z.infer<typeof ListStatusSchema>
|
|
1053
|
+
export type ScrapingConfig = z.infer<typeof ScrapingConfigSchema>
|
|
1054
|
+
export type IcpRubric = z.infer<typeof IcpRubricSchema>
|
|
1055
|
+
export type PipelineStage = z.infer<typeof PipelineStageSchema>
|
|
1056
|
+
export type PipelineConfig = z.infer<typeof PipelineConfigSchema>
|
|
1057
|
+
export type ListStageCountsInput = z.infer<typeof ListStageCountsSchema>['stageCounts']
|
|
1058
|
+
export type ListTelemetryInput = z.infer<typeof ListTelemetrySchema>
|
|
1059
|
+
export type ListIdParams = z.infer<typeof ListIdParamsSchema>
|
|
1060
|
+
export type CreateListRequest = z.infer<typeof CreateListRequestSchema>
|
|
1061
|
+
export type UpdateListRequest = z.infer<typeof UpdateListRequestSchema>
|
|
1062
|
+
export type UpdateListStatusRequest = z.infer<typeof UpdateListStatusRequestSchema>
|
|
1063
|
+
export type UpdateListConfigRequest = z.infer<typeof UpdateListConfigRequestSchema>
|
|
1064
|
+
export type AddCompaniesToListRequest = z.infer<typeof AddCompaniesToListRequestSchema>
|
|
1065
|
+
export type RemoveCompaniesFromListRequest = z.infer<typeof RemoveCompaniesFromListRequestSchema>
|
|
1066
|
+
export type AddContactsToListRequest = z.infer<typeof AddContactsToListRequestSchema>
|
|
1067
|
+
export type RecordListExecutionRequest = z.infer<typeof RecordListExecutionRequestSchema>
|
|
1068
|
+
export type AcqListResponse = z.infer<typeof AcqListResponseSchema>
|
|
1069
|
+
export type AcqListListResponse = z.infer<typeof AcqListListResponseSchema>
|
|
1070
|
+
export type ListTelemetryResponse = z.infer<typeof ListTelemetryResponseSchema>
|
|
1071
|
+
export type ListTelemetryListResponse = z.infer<typeof ListTelemetryListResponseSchema>
|
|
1072
|
+
export type ListExecutionSummaryInput = z.infer<typeof ListExecutionSummarySchema>
|
|
1073
|
+
export type ListExecutionsResponse = z.infer<typeof ListExecutionsResponseSchema>
|
|
1074
|
+
export type ListStageProgress = z.infer<typeof ListStageProgressSchema>
|
|
1075
|
+
export type ListProgress = z.infer<typeof ListProgressResponseSchema>
|