@dakkitor/api-contracts 1.4.0 → 1.6.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 (139) hide show
  1. package/dist/abilities/abilities.contract.d.ts +8 -2
  2. package/dist/abilities/abilities.contract.d.ts.map +1 -1
  3. package/dist/abilities/abilities.contract.js +48 -1
  4. package/dist/abilities/abilities.contract.spec.js +98 -0
  5. package/dist/abilities/first-agent.abilities.json +9 -2
  6. package/dist/abilities/outreach-service.abilities.json +14 -0
  7. package/dist/abilities/outreach.abilities.json +25 -0
  8. package/dist/abilities/second-agent.abilities.json +5 -1
  9. package/dist/actives/actives.contract.d.ts +7160 -7021
  10. package/dist/actives/actives.contract.d.ts.map +1 -1
  11. package/dist/actives/actives.contract.js +2 -0
  12. package/dist/actives/actives.contract.spec.d.ts +2 -0
  13. package/dist/actives/actives.contract.spec.d.ts.map +1 -0
  14. package/dist/actives/actives.contract.spec.js +35 -0
  15. package/dist/agent-client-links/agent-client-links.contract.d.ts +1087 -1087
  16. package/dist/auth/auth.contract.d.ts +108 -108
  17. package/dist/bookings/bookings.contract.d.ts +10131 -9939
  18. package/dist/bookings/bookings.contract.d.ts.map +1 -1
  19. package/dist/call-history/call-history.contract.d.ts +718 -718
  20. package/dist/calls-feed/calls-feed.contract.d.ts +86 -86
  21. package/dist/client-contacts/client-contacts.contract.d.ts +469 -469
  22. package/dist/clients/clients.contract.d.ts +203 -203
  23. package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts +2713 -2713
  24. package/dist/collaborations/collaborations.contract.d.ts +2270 -2270
  25. package/dist/common/common-schemas.d.ts +12 -12
  26. package/dist/companies/companies.contract.d.ts +74 -74
  27. package/dist/crews/crews.contract.d.ts +253 -253
  28. package/dist/cron-executions/cron-executions.contract.d.ts +182 -182
  29. package/dist/curated-worker-leads/candidate-coordination.contract.d.ts +3353 -3353
  30. package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts +20 -20
  31. package/dist/curated-worker-leads/consent-queue.contract.d.ts +196 -166
  32. package/dist/curated-worker-leads/consent-queue.contract.d.ts.map +1 -1
  33. package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts +16 -16
  34. package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts +2 -2
  35. package/dist/curated-worker-leads/jobs-tab.contract.d.ts +1192 -564
  36. package/dist/curated-worker-leads/jobs-tab.contract.d.ts.map +1 -1
  37. package/dist/curated-worker-leads/jobs-tab.contract.js +65 -2
  38. package/dist/curated-worker-leads/lead-agent-area.contract.d.ts +4 -4
  39. package/dist/curated-worker-leads/outreach-pool-summary.contract.spec.d.ts +2 -0
  40. package/dist/curated-worker-leads/outreach-pool-summary.contract.spec.d.ts.map +1 -0
  41. package/dist/curated-worker-leads/outreach-pool-summary.contract.spec.js +39 -0
  42. package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts +46 -46
  43. package/dist/curated-workers/curated-workers.contract.d.ts +789 -789
  44. package/dist/dashboards/agent-daily-metrics.contract.d.ts +2 -2
  45. package/dist/dashboards/dashboard-widgets.contract.d.ts +292 -292
  46. package/dist/dashboards/dashboard.contract.d.ts +12 -12
  47. package/dist/document-intake/document-intake.contract.d.ts +601 -601
  48. package/dist/export-jobs/export-jobs.contract.d.ts +572 -562
  49. package/dist/export-jobs/export-jobs.contract.d.ts.map +1 -1
  50. package/dist/exports-events/exports-events.schemas.d.ts +6 -6
  51. package/dist/files/files.contract.d.ts +74 -74
  52. package/dist/index.d.ts +10 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +10 -0
  55. package/dist/interactions/interactions.contract.d.ts +6 -6
  56. package/dist/job-clusters/job-clusters.contract.d.ts +112 -112
  57. package/dist/jobs/job-moderation-fields.spec.d.ts +2 -0
  58. package/dist/jobs/job-moderation-fields.spec.d.ts.map +1 -0
  59. package/dist/jobs/job-moderation-fields.spec.js +72 -0
  60. package/dist/jobs/jobs.contract.d.ts +7734 -7474
  61. package/dist/jobs/jobs.contract.d.ts.map +1 -1
  62. package/dist/jobs/jobs.contract.js +57 -0
  63. package/dist/kpi-impersonation/kpi-impersonation.contract.d.ts +141 -141
  64. package/dist/lead-assignments/lead-assignments.contract.d.ts +911 -911
  65. package/dist/lead-distribution/agent-lead-distribution.contract.d.ts +209 -209
  66. package/dist/lead-distribution/lead-distribution-config.contract.d.ts +77 -77
  67. package/dist/leads/leads.contract.d.ts +283 -283
  68. package/dist/locations/locations.contract.d.ts +49 -49
  69. package/dist/notifications/notifications.contract.d.ts +49 -49
  70. package/dist/offices/offices.contract.d.ts +34 -34
  71. package/dist/outreach/__tests__/outreach-claim.test.js +1 -0
  72. package/dist/outreach/__tests__/outreach-contract-additions.spec.d.ts +2 -0
  73. package/dist/outreach/__tests__/outreach-contract-additions.spec.d.ts.map +1 -0
  74. package/dist/outreach/__tests__/outreach-contract-additions.spec.js +89 -0
  75. package/dist/outreach/__tests__/outreach-requests.contract.spec.d.ts +2 -0
  76. package/dist/outreach/__tests__/outreach-requests.contract.spec.d.ts.map +1 -0
  77. package/dist/outreach/__tests__/outreach-requests.contract.spec.js +77 -0
  78. package/dist/outreach/__tests__/outreach-routes.test.js +14 -3
  79. package/dist/outreach/__tests__/outreach.schemas.test.js +5 -1
  80. package/dist/outreach/outreach-requests.contract.d.ts +1753 -0
  81. package/dist/outreach/outreach-requests.contract.d.ts.map +1 -0
  82. package/dist/outreach/outreach-requests.contract.js +154 -0
  83. package/dist/outreach/outreach-requests.schemas.d.ts +95 -0
  84. package/dist/outreach/outreach-requests.schemas.d.ts.map +1 -0
  85. package/dist/outreach/outreach-requests.schemas.js +63 -0
  86. package/dist/outreach/outreach.contract.d.ts +373 -101
  87. package/dist/outreach/outreach.contract.d.ts.map +1 -1
  88. package/dist/outreach/outreach.contract.js +18 -0
  89. package/dist/outreach/outreach.contract.spec.d.ts +2 -0
  90. package/dist/outreach/outreach.contract.spec.d.ts.map +1 -0
  91. package/dist/outreach/outreach.contract.spec.js +54 -0
  92. package/dist/outreach/outreach.schemas.d.ts +15 -10
  93. package/dist/outreach/outreach.schemas.d.ts.map +1 -1
  94. package/dist/outreach/outreach.schemas.js +5 -2
  95. package/dist/own-research/own-research.contract.d.ts +775 -775
  96. package/dist/postcodes/postcodes.contract.d.ts +24 -24
  97. package/dist/proofs/proof-type.enum.d.ts +4 -4
  98. package/dist/proofs/proofs.contract.d.ts +363 -363
  99. package/dist/proofs/proofs.dtos.d.ts +124 -124
  100. package/dist/qualifications/qualifications.contract.d.ts +38 -38
  101. package/dist/relay-pods/relay-pod-sessions.contract.d.ts +680 -0
  102. package/dist/relay-pods/relay-pod-sessions.contract.d.ts.map +1 -0
  103. package/dist/relay-pods/relay-pod-sessions.contract.js +67 -0
  104. package/dist/relay-pods/relay-pod-sessions.contract.spec.d.ts +2 -0
  105. package/dist/relay-pods/relay-pod-sessions.contract.spec.d.ts.map +1 -0
  106. package/dist/relay-pods/relay-pod-sessions.contract.spec.js +129 -0
  107. package/dist/relay-pods/relay-pods.contract.d.ts +1569 -0
  108. package/dist/relay-pods/relay-pods.contract.d.ts.map +1 -0
  109. package/dist/relay-pods/relay-pods.contract.js +188 -0
  110. package/dist/relay-pods/relay-pods.contract.spec.d.ts +2 -0
  111. package/dist/relay-pods/relay-pods.contract.spec.d.ts.map +1 -0
  112. package/dist/relay-pods/relay-pods.contract.spec.js +141 -0
  113. package/dist/relay-pods/relay-pods.schemas.d.ts +415 -0
  114. package/dist/relay-pods/relay-pods.schemas.d.ts.map +1 -0
  115. package/dist/relay-pods/relay-pods.schemas.js +112 -0
  116. package/dist/shared/live-booking.schema.d.ts +4 -4
  117. package/dist/shared/summary-schemas.d.ts +6 -6
  118. package/dist/sheets-sync/sheets-sync.contract.d.ts +939 -939
  119. package/dist/telegram/telegram.contract.d.ts +22 -22
  120. package/dist/trades/trades.contract.d.ts +90 -90
  121. package/dist/user-access-grants/user-access-grants.contract.d.ts +165 -165
  122. package/dist/users/__tests__/assignable-roles.spec.d.ts +2 -0
  123. package/dist/users/__tests__/assignable-roles.spec.d.ts.map +1 -0
  124. package/dist/users/__tests__/assignable-roles.spec.js +41 -0
  125. package/dist/users/users.contract.d.ts +399 -393
  126. package/dist/users/users.contract.d.ts.map +1 -1
  127. package/dist/users/users.contract.js +11 -0
  128. package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts +585 -527
  129. package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts.map +1 -1
  130. package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts +278 -236
  131. package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts.map +1 -1
  132. package/dist/worker-merge-proposals/worker-merge-proposals.contract.js +1 -0
  133. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts +153 -153
  134. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts +59 -59
  135. package/dist/workers/workers.contract.d.ts +2919 -2919
  136. package/package.json +1 -1
  137. package/dist/bookings/bookings.contract.spec.d.ts +0 -2
  138. package/dist/bookings/bookings.contract.spec.d.ts.map +0 -1
  139. package/dist/bookings/bookings.contract.spec.js +0 -11
@@ -8,28 +8,28 @@ export declare const OfficeSchema: z.ZodObject<{
8
8
  lastName: z.ZodString;
9
9
  }, "strip", z.ZodTypeAny, {
10
10
  id: string;
11
- lastName: string;
12
11
  firstName: string;
12
+ lastName: string;
13
13
  }, {
14
14
  id: string;
15
- lastName: string;
16
15
  firstName: string;
16
+ lastName: string;
17
17
  }>, "many">>;
18
18
  }, "strip", z.ZodTypeAny, {
19
19
  id: string;
20
20
  name: string;
21
21
  managers?: {
22
22
  id: string;
23
- lastName: string;
24
23
  firstName: string;
24
+ lastName: string;
25
25
  }[] | undefined;
26
26
  }, {
27
27
  id: string;
28
28
  name: string;
29
29
  managers?: {
30
30
  id: string;
31
- lastName: string;
32
31
  firstName: string;
32
+ lastName: string;
33
33
  }[] | undefined;
34
34
  }>;
35
35
  export declare const CreateOfficeSchema: z.ZodObject<{
@@ -61,28 +61,28 @@ export declare const OfficeArraySchema: z.ZodArray<z.ZodObject<{
61
61
  lastName: z.ZodString;
62
62
  }, "strip", z.ZodTypeAny, {
63
63
  id: string;
64
- lastName: string;
65
64
  firstName: string;
65
+ lastName: string;
66
66
  }, {
67
67
  id: string;
68
- lastName: string;
69
68
  firstName: string;
69
+ lastName: string;
70
70
  }>, "many">>;
71
71
  }, "strip", z.ZodTypeAny, {
72
72
  id: string;
73
73
  name: string;
74
74
  managers?: {
75
75
  id: string;
76
- lastName: string;
77
76
  firstName: string;
77
+ lastName: string;
78
78
  }[] | undefined;
79
79
  }, {
80
80
  id: string;
81
81
  name: string;
82
82
  managers?: {
83
83
  id: string;
84
- lastName: string;
85
84
  firstName: string;
85
+ lastName: string;
86
86
  }[] | undefined;
87
87
  }>, "many">;
88
88
  export type Office = z.infer<typeof OfficeSchema>;
@@ -108,7 +108,7 @@ export declare const officesContract: {
108
108
  }>;
109
109
  path: "/v2/offices";
110
110
  responses: {
111
- 401: z.ZodObject<{
111
+ 400: z.ZodObject<{
112
112
  statusCode: z.ZodNumber;
113
113
  message: z.ZodString;
114
114
  code: z.ZodString;
@@ -133,7 +133,7 @@ export declare const officesContract: {
133
133
  details?: unknown;
134
134
  correlationId?: string | undefined;
135
135
  }>;
136
- 400: z.ZodObject<{
136
+ 401: z.ZodObject<{
137
137
  statusCode: z.ZodNumber;
138
138
  message: z.ZodString;
139
139
  code: z.ZodString;
@@ -217,28 +217,28 @@ export declare const officesContract: {
217
217
  lastName: z.ZodString;
218
218
  }, "strip", z.ZodTypeAny, {
219
219
  id: string;
220
- lastName: string;
221
220
  firstName: string;
221
+ lastName: string;
222
222
  }, {
223
223
  id: string;
224
- lastName: string;
225
224
  firstName: string;
225
+ lastName: string;
226
226
  }>, "many">>;
227
227
  }, "strip", z.ZodTypeAny, {
228
228
  id: string;
229
229
  name: string;
230
230
  managers?: {
231
231
  id: string;
232
- lastName: string;
233
232
  firstName: string;
233
+ lastName: string;
234
234
  }[] | undefined;
235
235
  }, {
236
236
  id: string;
237
237
  name: string;
238
238
  managers?: {
239
239
  id: string;
240
- lastName: string;
241
240
  firstName: string;
241
+ lastName: string;
242
242
  }[] | undefined;
243
243
  }>;
244
244
  409: z.ZodObject<{
@@ -276,7 +276,7 @@ export declare const officesContract: {
276
276
  method: "GET";
277
277
  path: "/v2/offices";
278
278
  responses: {
279
- 401: z.ZodObject<{
279
+ 400: z.ZodObject<{
280
280
  statusCode: z.ZodNumber;
281
281
  message: z.ZodString;
282
282
  code: z.ZodString;
@@ -301,7 +301,7 @@ export declare const officesContract: {
301
301
  details?: unknown;
302
302
  correlationId?: string | undefined;
303
303
  }>;
304
- 400: z.ZodObject<{
304
+ 401: z.ZodObject<{
305
305
  statusCode: z.ZodNumber;
306
306
  message: z.ZodString;
307
307
  code: z.ZodString;
@@ -385,28 +385,28 @@ export declare const officesContract: {
385
385
  lastName: z.ZodString;
386
386
  }, "strip", z.ZodTypeAny, {
387
387
  id: string;
388
- lastName: string;
389
388
  firstName: string;
389
+ lastName: string;
390
390
  }, {
391
391
  id: string;
392
- lastName: string;
393
392
  firstName: string;
393
+ lastName: string;
394
394
  }>, "many">>;
395
395
  }, "strip", z.ZodTypeAny, {
396
396
  id: string;
397
397
  name: string;
398
398
  managers?: {
399
399
  id: string;
400
- lastName: string;
401
400
  firstName: string;
401
+ lastName: string;
402
402
  }[] | undefined;
403
403
  }, {
404
404
  id: string;
405
405
  name: string;
406
406
  managers?: {
407
407
  id: string;
408
- lastName: string;
409
408
  firstName: string;
409
+ lastName: string;
410
410
  }[] | undefined;
411
411
  }>, "many">;
412
412
  };
@@ -426,7 +426,7 @@ export declare const officesContract: {
426
426
  method: "GET";
427
427
  path: "/v2/offices/:id";
428
428
  responses: {
429
- 401: z.ZodObject<{
429
+ 400: z.ZodObject<{
430
430
  statusCode: z.ZodNumber;
431
431
  message: z.ZodString;
432
432
  code: z.ZodString;
@@ -451,7 +451,7 @@ export declare const officesContract: {
451
451
  details?: unknown;
452
452
  correlationId?: string | undefined;
453
453
  }>;
454
- 400: z.ZodObject<{
454
+ 401: z.ZodObject<{
455
455
  statusCode: z.ZodNumber;
456
456
  message: z.ZodString;
457
457
  code: z.ZodString;
@@ -535,28 +535,28 @@ export declare const officesContract: {
535
535
  lastName: z.ZodString;
536
536
  }, "strip", z.ZodTypeAny, {
537
537
  id: string;
538
- lastName: string;
539
538
  firstName: string;
539
+ lastName: string;
540
540
  }, {
541
541
  id: string;
542
- lastName: string;
543
542
  firstName: string;
543
+ lastName: string;
544
544
  }>, "many">>;
545
545
  }, "strip", z.ZodTypeAny, {
546
546
  id: string;
547
547
  name: string;
548
548
  managers?: {
549
549
  id: string;
550
- lastName: string;
551
550
  firstName: string;
551
+ lastName: string;
552
552
  }[] | undefined;
553
553
  }, {
554
554
  id: string;
555
555
  name: string;
556
556
  managers?: {
557
557
  id: string;
558
- lastName: string;
559
558
  firstName: string;
559
+ lastName: string;
560
560
  }[] | undefined;
561
561
  }>;
562
562
  404: z.ZodObject<{
@@ -611,7 +611,7 @@ export declare const officesContract: {
611
611
  }>;
612
612
  path: "/v2/offices/:id";
613
613
  responses: {
614
- 401: z.ZodObject<{
614
+ 400: z.ZodObject<{
615
615
  statusCode: z.ZodNumber;
616
616
  message: z.ZodString;
617
617
  code: z.ZodString;
@@ -636,7 +636,7 @@ export declare const officesContract: {
636
636
  details?: unknown;
637
637
  correlationId?: string | undefined;
638
638
  }>;
639
- 400: z.ZodObject<{
639
+ 401: z.ZodObject<{
640
640
  statusCode: z.ZodNumber;
641
641
  message: z.ZodString;
642
642
  code: z.ZodString;
@@ -720,28 +720,28 @@ export declare const officesContract: {
720
720
  lastName: z.ZodString;
721
721
  }, "strip", z.ZodTypeAny, {
722
722
  id: string;
723
- lastName: string;
724
723
  firstName: string;
724
+ lastName: string;
725
725
  }, {
726
726
  id: string;
727
- lastName: string;
728
727
  firstName: string;
728
+ lastName: string;
729
729
  }>, "many">>;
730
730
  }, "strip", z.ZodTypeAny, {
731
731
  id: string;
732
732
  name: string;
733
733
  managers?: {
734
734
  id: string;
735
- lastName: string;
736
735
  firstName: string;
736
+ lastName: string;
737
737
  }[] | undefined;
738
738
  }, {
739
739
  id: string;
740
740
  name: string;
741
741
  managers?: {
742
742
  id: string;
743
- lastName: string;
744
743
  firstName: string;
744
+ lastName: string;
745
745
  }[] | undefined;
746
746
  }>;
747
747
  404: z.ZodObject<{
@@ -787,7 +787,7 @@ export declare const officesContract: {
787
787
  body: typeof import("@ts-rest/core").ContractNoBody;
788
788
  path: "/v2/offices/:id";
789
789
  responses: {
790
- 401: z.ZodObject<{
790
+ 400: z.ZodObject<{
791
791
  statusCode: z.ZodNumber;
792
792
  message: z.ZodString;
793
793
  code: z.ZodString;
@@ -812,7 +812,7 @@ export declare const officesContract: {
812
812
  details?: unknown;
813
813
  correlationId?: string | undefined;
814
814
  }>;
815
- 400: z.ZodObject<{
815
+ 401: z.ZodObject<{
816
816
  statusCode: z.ZodNumber;
817
817
  message: z.ZodString;
818
818
  code: z.ZodString;
@@ -41,6 +41,7 @@ const CLAIMED_PAYLOAD = {
41
41
  trade: 'CARPENTER',
42
42
  payText: '£180/day',
43
43
  locationText: 'Croydon, CR0',
44
+ createdByName: 'Sam Okoro',
44
45
  },
45
46
  };
46
47
  const claimed = outreach_contract_1.ClaimNextOutreachResponseSchema.safeParse(CLAIMED_PAYLOAD);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=outreach-contract-additions.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outreach-contract-additions.spec.d.ts","sourceRoot":"","sources":["../../../contracts/outreach/__tests__/outreach-contract-additions.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const bun_test_1 = require("bun:test");
4
+ const outreach_schemas_1 = require("../outreach.schemas");
5
+ const jobs_tab_contract_1 = require("../../curated-worker-leads/jobs-tab.contract");
6
+ (0, bun_test_1.describe)('1.5.0 additions stay backward compatible', () => {
7
+ (0, bun_test_1.it)('OutreachJobSchema carries createdByName, nullable', () => {
8
+ (0, bun_test_1.expect)(outreach_schemas_1.OutreachJobSchema.parse({
9
+ title: 'Need 1 x bricklayer',
10
+ trade: 'Bricklayer',
11
+ payText: null,
12
+ locationText: 'SW1A 1AA',
13
+ createdByName: null,
14
+ }).createdByName).toBeNull();
15
+ });
16
+ (0, bun_test_1.it)('JobFeedMatchCountSchema still parses a 1.4.0-shaped payload', () => {
17
+ // The whole point of `.optional()`: an API that has not deployed the new
18
+ // CTE yet, and a 1.4.0 consumer, both keep working.
19
+ const parsed = jobs_tab_contract_1.JobFeedMatchCountSchema.parse({
20
+ owned: 3,
21
+ curated: 4,
22
+ workersContactedByViewerCount: 1,
23
+ workersContactedByOthersCount: 2,
24
+ pendingEnrichmentCount: 0,
25
+ });
26
+ (0, bun_test_1.expect)(parsed.outreachRequest).toBeUndefined();
27
+ });
28
+ (0, bun_test_1.it)('JobFeedMatchCountSchema carries an outreach request when there is one', () => {
29
+ const parsed = jobs_tab_contract_1.JobFeedMatchCountSchema.parse({
30
+ owned: 3,
31
+ curated: 4,
32
+ workersContactedByViewerCount: 1,
33
+ workersContactedByOthersCount: 2,
34
+ pendingEnrichmentCount: 0,
35
+ outreachRequest: {
36
+ id: '22222222-2222-4222-8222-222222222222',
37
+ status: 'RUNNING',
38
+ requestedByUserId: '33333333-3333-4333-8333-333333333333',
39
+ requestedByName: 'Priya Shah',
40
+ contactedCount: 142,
41
+ assignedPod: {
42
+ id: '44444444-4444-4444-8444-444444444444',
43
+ slug: 'north-pod',
44
+ displayName: 'North Pod',
45
+ ownerUserId: '55555555-5555-4555-8555-555555555555',
46
+ ownerName: 'Relay Owner',
47
+ publicBaseUrl: 'https://north.example.test',
48
+ status: 'ACTIVE',
49
+ },
50
+ },
51
+ });
52
+ (0, bun_test_1.expect)(parsed.outreachRequest?.contactedCount).toBe(142);
53
+ (0, bun_test_1.expect)(parsed.outreachRequest?.id).toBe('22222222-2222-4222-8222-222222222222');
54
+ (0, bun_test_1.expect)(parsed.outreachRequest?.requestedByUserId).toBe('33333333-3333-4333-8333-333333333333');
55
+ });
56
+ (0, bun_test_1.it)('rejects an open request without an id', () => {
57
+ // The id is REQUIRED inside the object (the object itself stays nullable
58
+ // and optional). It is the only route a browser has to the request id:
59
+ // cancel is agent-lane while the queue list route is service-key only, so
60
+ // omitting it would leave the cancel route unreachable.
61
+ (0, bun_test_1.expect)(() => jobs_tab_contract_1.JobFeedMatchCountSchema.parse({
62
+ owned: 0,
63
+ curated: 0,
64
+ workersContactedByViewerCount: 0,
65
+ workersContactedByOthersCount: 0,
66
+ pendingEnrichmentCount: 0,
67
+ outreachRequest: {
68
+ status: 'PENDING',
69
+ requestedByName: null,
70
+ contactedCount: 0,
71
+ },
72
+ })).toThrow();
73
+ });
74
+ (0, bun_test_1.it)('null means "no open request", distinct from "not computed"', () => {
75
+ (0, bun_test_1.expect)(jobs_tab_contract_1.JobFeedMatchCountSchema.parse({
76
+ owned: 0,
77
+ curated: 0,
78
+ workersContactedByViewerCount: 0,
79
+ workersContactedByOthersCount: 0,
80
+ pendingEnrichmentCount: 0,
81
+ outreachRequest: null,
82
+ }).outreachRequest).toBeNull();
83
+ });
84
+ (0, bun_test_1.it)('the candidates query takes outreachEligible as a coerced boolean', () => {
85
+ const query = jobs_tab_contract_1.jobsTabContract.candidates.query;
86
+ (0, bun_test_1.expect)(query.parse({ outreachEligible: 'true' }).outreachEligible).toBe(true);
87
+ (0, bun_test_1.expect)(query.parse({}).outreachEligible).toBeUndefined();
88
+ });
89
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=outreach-requests.contract.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outreach-requests.contract.spec.d.ts","sourceRoot":"","sources":["../../../contracts/outreach/__tests__/outreach-requests.contract.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const bun_test_1 = require("bun:test");
4
+ const outreach_requests_contract_1 = require("../outreach-requests.contract");
5
+ (0, bun_test_1.describe)('outreachRequestsContract', () => {
6
+ (0, bun_test_1.it)('enumerates exactly the four request states', () => {
7
+ (0, bun_test_1.expect)(outreach_requests_contract_1.OutreachRequestStatusSchema.options).toEqual([
8
+ 'PENDING',
9
+ 'RUNNING',
10
+ 'COMPLETED',
11
+ 'CANCELLED',
12
+ ]);
13
+ });
14
+ (0, bun_test_1.it)('parses a request row', () => {
15
+ const parsed = outreach_requests_contract_1.OutreachRequestSchema.parse({
16
+ id: '11111111-1111-4111-8111-111111111111',
17
+ jobId: '22222222-2222-4222-8222-222222222222',
18
+ requestedByUserId: '33333333-3333-4333-8333-333333333333',
19
+ status: 'PENDING',
20
+ eligibleAtRequest: 214,
21
+ requestedByName: 'Priya Shah',
22
+ contactedCount: 0,
23
+ createdAt: '2026-07-29T09:00:00.000Z',
24
+ startedAt: null,
25
+ completedAt: null,
26
+ assignedPod: null,
27
+ });
28
+ (0, bun_test_1.expect)(parsed.status).toBe('PENDING');
29
+ (0, bun_test_1.expect)(parsed.requestedByUserId).toBe('33333333-3333-4333-8333-333333333333');
30
+ });
31
+ (0, bun_test_1.it)('carries job facts on a queue item so the rack can label a campaign', () => {
32
+ const item = outreach_requests_contract_1.OutreachRequestQueueItemSchema.parse({
33
+ id: '11111111-1111-4111-8111-111111111111',
34
+ jobId: '22222222-2222-4222-8222-222222222222',
35
+ requestedByUserId: '33333333-3333-4333-8333-333333333333',
36
+ status: 'RUNNING',
37
+ eligibleAtRequest: 12,
38
+ requestedByName: null,
39
+ contactedCount: 3,
40
+ createdAt: '2026-07-29T09:00:00.000Z',
41
+ startedAt: '2026-07-29T09:05:00.000Z',
42
+ completedAt: null,
43
+ assignedPod: {
44
+ id: '33333333-3333-4333-8333-333333333333',
45
+ slug: 'pod-01',
46
+ displayName: 'Pod 01',
47
+ ownerUserId: '44444444-4444-4444-8444-444444444444',
48
+ ownerName: 'Relay Owner',
49
+ publicBaseUrl: 'https://pod.test',
50
+ status: 'ACTIVE',
51
+ },
52
+ job: {
53
+ title: 'Need 1 x bricklayer',
54
+ trade: 'Bricklayer',
55
+ payText: '£20 per hour',
56
+ locationText: 'SW1A 1AA',
57
+ createdByName: 'Sam Okoro',
58
+ },
59
+ });
60
+ // `trade` is the label Relay Lab shows: `title` is j.description, the raw
61
+ // ad text. `locationText` is the job postcode, carried since 1.4.0.
62
+ (0, bun_test_1.expect)(item.job.trade).toBe('Bricklayer');
63
+ (0, bun_test_1.expect)(item.job.locationText).toBe('SW1A 1AA');
64
+ });
65
+ (0, bun_test_1.it)('routes both lanes under /v2', () => {
66
+ (0, bun_test_1.expect)(outreach_requests_contract_1.outreachRequestsContract.create.path).toBe('/v2/outreach/requests');
67
+ (0, bun_test_1.expect)(outreach_requests_contract_1.outreachRequestsContract.list.path).toBe('/v2/outreach/requests');
68
+ (0, bun_test_1.expect)(outreach_requests_contract_1.outreachRequestsContract.list.method).toBe('GET');
69
+ (0, bun_test_1.expect)(outreach_requests_contract_1.outreachRequestsContract.cancel.path).toBe('/v2/outreach/requests/:id/cancel');
70
+ (0, bun_test_1.expect)(outreach_requests_contract_1.outreachRequestsContract.start.path).toBe('/v2/outreach/requests/:id/start');
71
+ (0, bun_test_1.expect)(outreach_requests_contract_1.outreachRequestsContract.complete.path).toBe('/v2/outreach/requests/:id/complete');
72
+ });
73
+ (0, bun_test_1.it)('declares 200 on create, because a second click returns the open request', () => {
74
+ (0, bun_test_1.expect)(Object.keys(outreach_requests_contract_1.outreachRequestsContract.create.responses)).toContain('200');
75
+ (0, bun_test_1.expect)(Object.keys(outreach_requests_contract_1.outreachRequestsContract.create.responses)).not.toContain('409');
76
+ });
77
+ });
@@ -8,7 +8,9 @@ const index_1 = require("../../index");
8
8
  const outreach_contract_1 = require("../outreach.contract");
9
9
  // `pathPrefix: '/v2'` is applied by c.router, so the runtime paths are absolute.
10
10
  node_assert_1.default.equal(outreach_contract_1.outreachContract.claimNext.method, 'POST');
11
- node_assert_1.default.equal(outreach_contract_1.outreachContract.claimNext.path, '/v2/outreach/jobs/:jobId/claim-next');
11
+ node_assert_1.default.equal(outreach_contract_1.outreachContract.claimNext.path, '/v2/outreach/requests/:requestId/claim-next');
12
+ node_assert_1.default.equal(outreach_contract_1.outreachContract.claimNextLegacy.method, 'POST');
13
+ node_assert_1.default.equal(outreach_contract_1.outreachContract.claimNextLegacy.path, '/v2/outreach/jobs/:jobId/claim-next');
12
14
  node_assert_1.default.equal(outreach_contract_1.outreachContract.confirmSent.method, 'POST');
13
15
  node_assert_1.default.equal(outreach_contract_1.outreachContract.confirmSent.path, '/v2/outreach/leases/:leaseId/sent');
14
16
  node_assert_1.default.equal(outreach_contract_1.outreachContract.release.method, 'POST');
@@ -17,12 +19,16 @@ node_assert_1.default.equal(outreach_contract_1.outreachContract.release.path, '
17
19
  // 410 is not used anywhere: a late confirm succeeds. `commonResponses` are
18
20
  // merged into every route's `responses` by c.router, so 400, 401, 403 and 500
19
21
  // appear here.
20
- const declared = (route) => Object.keys(route.responses).map(Number).sort((a, b) => a - b);
22
+ const declared = (route) => Object.keys(route.responses)
23
+ .map(Number)
24
+ .sort((a, b) => a - b);
21
25
  node_assert_1.default.deepStrictEqual(declared(outreach_contract_1.outreachContract.claimNext), [200, 400, 401, 403, 409, 500]);
26
+ node_assert_1.default.deepStrictEqual(declared(outreach_contract_1.outreachContract.claimNextLegacy), [200, 400, 401, 403, 409, 500]);
22
27
  node_assert_1.default.deepStrictEqual(declared(outreach_contract_1.outreachContract.confirmSent), [200, 400, 401, 403, 404, 500]);
23
28
  node_assert_1.default.deepStrictEqual(declared(outreach_contract_1.outreachContract.release), [200, 400, 401, 403, 404, 500]);
24
29
  for (const route of [
25
30
  outreach_contract_1.outreachContract.claimNext,
31
+ outreach_contract_1.outreachContract.claimNextLegacy,
26
32
  outreach_contract_1.outreachContract.confirmSent,
27
33
  outreach_contract_1.outreachContract.release,
28
34
  ]) {
@@ -30,9 +36,13 @@ for (const route of [
30
36
  }
31
37
  // Path params are validated as uuids.
32
38
  node_assert_1.default.ok(outreach_contract_1.outreachContract.claimNext.pathParams.safeParse({
39
+ requestId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
40
+ }).success);
41
+ node_assert_1.default.ok(!outreach_contract_1.outreachContract.claimNext.pathParams.safeParse({ requestId: 'nope' })
42
+ .success);
43
+ node_assert_1.default.ok(outreach_contract_1.outreachContract.claimNextLegacy.pathParams.safeParse({
33
44
  jobId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
34
45
  }).success);
35
- node_assert_1.default.ok(!outreach_contract_1.outreachContract.claimNext.pathParams.safeParse({ jobId: 'nope' }).success);
36
46
  node_assert_1.default.ok(outreach_contract_1.outreachContract.confirmSent.pathParams.safeParse({
37
47
  leaseId: '3f2504e0-4f89-41d3-9a0c-0305e82c3301',
38
48
  }).success);
@@ -46,6 +56,7 @@ node_assert_1.default.ok(outreach_contract_1.outreachContract.confirmSent.pathPa
46
56
  const headersOf = (route) => route.headers;
47
57
  for (const route of [
48
58
  outreach_contract_1.outreachContract.claimNext,
59
+ outreach_contract_1.outreachContract.claimNextLegacy,
49
60
  outreach_contract_1.outreachContract.confirmSent,
50
61
  outreach_contract_1.outreachContract.release,
51
62
  ]) {
@@ -121,14 +121,17 @@ const job = outreach_schemas_1.OutreachJobSchema.safeParse({
121
121
  trade: 'CARPENTER',
122
122
  payText: '£180/day',
123
123
  locationText: 'Croydon, CR0',
124
+ createdByName: 'Sam Okoro',
124
125
  });
125
126
  node_assert_1.default.ok(job.success);
126
- // Real jobs routinely lack pay or trade text; those fields are nullable.
127
+ // Real jobs routinely lack pay, trade text, or a raising agent; those fields
128
+ // are nullable.
127
129
  const sparseJob = outreach_schemas_1.OutreachJobSchema.safeParse({
128
130
  title: 'Carpenter needed',
129
131
  trade: null,
130
132
  payText: null,
131
133
  locationText: null,
134
+ createdByName: null,
132
135
  });
133
136
  node_assert_1.default.ok(sparseJob.success);
134
137
  // title is not.
@@ -136,5 +139,6 @@ node_assert_1.default.ok(!outreach_schemas_1.OutreachJobSchema.safeParse({
136
139
  trade: null,
137
140
  payText: null,
138
141
  locationText: null,
142
+ createdByName: null,
139
143
  }).success);
140
144
  console.log('outreach.schemas OK');