@dakkitor/api-contracts 1.1.154 → 1.4.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 (340) hide show
  1. package/dist/abilities/abilities.contract.d.ts +53 -1
  2. package/dist/abilities/abilities.contract.d.ts.map +1 -1
  3. package/dist/abilities/abilities.contract.js +92 -1
  4. package/dist/abilities/abilities.contract.spec.d.ts +2 -0
  5. package/dist/abilities/abilities.contract.spec.d.ts.map +1 -0
  6. package/dist/abilities/abilities.contract.spec.js +145 -0
  7. package/dist/abilities/admin-dashboard.abilities.test.d.ts +2 -0
  8. package/dist/abilities/admin-dashboard.abilities.test.d.ts.map +1 -0
  9. package/dist/abilities/admin-dashboard.abilities.test.js +33 -0
  10. package/dist/abilities/admin.abilities.json +19 -0
  11. package/dist/abilities/bot.abilities.json +13 -4
  12. package/dist/abilities/first-agent.abilities.json +317 -70
  13. package/dist/abilities/interconnection.abilities.json +75 -0
  14. package/dist/abilities/kpi.abilities.json +68 -0
  15. package/dist/abilities/office-manager.abilities.json +111 -0
  16. package/dist/abilities/second-agent.abilities.json +417 -43
  17. package/dist/abilities/team-leads.json +71 -6
  18. package/dist/abilities/worker-curator.abilities.json +233 -0
  19. package/dist/actives/actives.contract.d.ts +19379 -23651
  20. package/dist/actives/actives.contract.d.ts.map +1 -1
  21. package/dist/actives/actives.contract.js +517 -114
  22. package/dist/agent-client-links/agent-client-links.contract.d.ts +1431 -291
  23. package/dist/agent-client-links/agent-client-links.contract.d.ts.map +1 -1
  24. package/dist/auth/auth.contract.d.ts +1050 -81
  25. package/dist/auth/auth.contract.d.ts.map +1 -1
  26. package/dist/auth/auth.contract.js +115 -3
  27. package/dist/bookings/booking-worker-summary.spec.d.ts +2 -0
  28. package/dist/bookings/booking-worker-summary.spec.d.ts.map +1 -0
  29. package/dist/bookings/booking-worker-summary.spec.js +25 -0
  30. package/dist/bookings/bookings.contract.d.ts +20643 -26117
  31. package/dist/bookings/bookings.contract.d.ts.map +1 -1
  32. package/dist/bookings/bookings.contract.js +383 -91
  33. package/dist/bookings/bookings.contract.spec.d.ts +2 -0
  34. package/dist/bookings/bookings.contract.spec.d.ts.map +1 -0
  35. package/dist/bookings/bookings.contract.spec.js +11 -0
  36. package/dist/bookings/job-lock.spec.d.ts +2 -0
  37. package/dist/bookings/job-lock.spec.d.ts.map +1 -0
  38. package/dist/bookings/job-lock.spec.js +56 -0
  39. package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts +232 -0
  40. package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts.map +1 -0
  41. package/dist/bot-parse-cache/bot-parse-cache.contract.js +64 -0
  42. package/dist/call-history/call-history.contract.d.ts +1336 -767
  43. package/dist/call-history/call-history.contract.d.ts.map +1 -1
  44. package/dist/call-history/call-history.contract.js +86 -10
  45. package/dist/calls-feed/calls-feed.contract.d.ts +417 -0
  46. package/dist/calls-feed/calls-feed.contract.d.ts.map +1 -0
  47. package/dist/calls-feed/calls-feed.contract.js +32 -0
  48. package/dist/client-contacts/client-contacts.contract.d.ts +410 -226
  49. package/dist/client-contacts/client-contacts.contract.d.ts.map +1 -1
  50. package/dist/client-contacts/client-contacts.contract.js +35 -4
  51. package/dist/clients/clients.contract.d.ts +227 -73
  52. package/dist/clients/clients.contract.d.ts.map +1 -1
  53. package/dist/clients/clients.contract.js +45 -21
  54. package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts +2908 -1834
  55. package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts.map +1 -1
  56. package/dist/collaboration-checkings/collaboration-checkings.contract.js +14 -9
  57. package/dist/collaborations/collaborations.contract.d.ts +2676 -1409
  58. package/dist/collaborations/collaborations.contract.d.ts.map +1 -1
  59. package/dist/collaborations/collaborations.contract.js +33 -9
  60. package/dist/common/call-rating.schema.d.ts.map +1 -1
  61. package/dist/common/call-rating.schema.js +4 -2
  62. package/dist/common/common-schemas.d.ts +59 -11
  63. package/dist/common/common-schemas.d.ts.map +1 -1
  64. package/dist/common/common-schemas.js +55 -29
  65. package/dist/common/error-schemas.d.ts +2 -2
  66. package/dist/common/pagination-query.schema.d.ts +13 -2
  67. package/dist/common/pagination-query.schema.d.ts.map +1 -1
  68. package/dist/common/pagination-query.schema.js +21 -2
  69. package/dist/common/pagination-query.schema.spec.d.ts +2 -0
  70. package/dist/common/pagination-query.schema.spec.d.ts.map +1 -0
  71. package/dist/common/pagination-query.schema.spec.js +53 -0
  72. package/dist/companies/companies.contract.d.ts +53 -28
  73. package/dist/companies/companies.contract.d.ts.map +1 -1
  74. package/dist/companies/companies.contract.js +11 -10
  75. package/dist/crews/crews.contract.d.ts +1010 -196
  76. package/dist/crews/crews.contract.d.ts.map +1 -1
  77. package/dist/crews/crews.contract.js +98 -17
  78. package/dist/crews/crews.contract.spec.d.ts +2 -0
  79. package/dist/crews/crews.contract.spec.d.ts.map +1 -0
  80. package/dist/crews/crews.contract.spec.js +67 -0
  81. package/dist/cron-executions/cron-executions.contract.d.ts +988 -59
  82. package/dist/cron-executions/cron-executions.contract.d.ts.map +1 -1
  83. package/dist/cron-executions/cron-executions.contract.js +127 -7
  84. package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts +2 -0
  85. package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts.map +1 -0
  86. package/dist/curated-worker-leads/__tests__/disposition-reason.spec.js +40 -0
  87. package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts +2 -0
  88. package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts.map +1 -0
  89. package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.js +16 -0
  90. package/dist/curated-worker-leads/candidate-coordination.contract.d.ts +21650 -0
  91. package/dist/curated-worker-leads/candidate-coordination.contract.d.ts.map +1 -0
  92. package/dist/curated-worker-leads/candidate-coordination.contract.js +921 -0
  93. package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts +2 -0
  94. package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts.map +1 -0
  95. package/dist/curated-worker-leads/candidate-coordination.contract.spec.js +51 -0
  96. package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts +2364 -0
  97. package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts.map +1 -0
  98. package/dist/curated-worker-leads/candidate-edit-session.contract.js +173 -0
  99. package/dist/curated-worker-leads/consent-queue.contract.d.ts +4497 -0
  100. package/dist/curated-worker-leads/consent-queue.contract.d.ts.map +1 -0
  101. package/dist/curated-worker-leads/consent-queue.contract.js +201 -0
  102. package/dist/curated-worker-leads/contact-history.spec.d.ts +2 -0
  103. package/dist/curated-worker-leads/contact-history.spec.d.ts.map +1 -0
  104. package/dist/curated-worker-leads/contact-history.spec.js +88 -0
  105. package/dist/curated-worker-leads/contact-session.contract.spec.d.ts +2 -0
  106. package/dist/curated-worker-leads/contact-session.contract.spec.d.ts.map +1 -0
  107. package/dist/curated-worker-leads/contact-session.contract.spec.js +315 -0
  108. package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts +489 -0
  109. package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts.map +1 -0
  110. package/dist/curated-worker-leads/curated-worker-lead-config.contract.js +88 -0
  111. package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts +135 -0
  112. package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts.map +1 -0
  113. package/dist/curated-worker-leads/curated-worker-leads.contract.js +32 -0
  114. package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts +2 -0
  115. package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts.map +1 -0
  116. package/dist/curated-worker-leads/job-candidate-cards.spec.js +157 -0
  117. package/dist/curated-worker-leads/job-candidates.spec.d.ts +2 -0
  118. package/dist/curated-worker-leads/job-candidates.spec.d.ts.map +1 -0
  119. package/dist/curated-worker-leads/job-candidates.spec.js +140 -0
  120. package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts +2 -0
  121. package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts.map +1 -0
  122. package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.js +19 -0
  123. package/dist/curated-worker-leads/jobs-tab.contract.d.ts +18365 -0
  124. package/dist/curated-worker-leads/jobs-tab.contract.d.ts.map +1 -0
  125. package/dist/curated-worker-leads/jobs-tab.contract.js +642 -0
  126. package/dist/curated-worker-leads/lead-agent-area.contract.d.ts +348 -0
  127. package/dist/curated-worker-leads/lead-agent-area.contract.d.ts.map +1 -0
  128. package/dist/curated-worker-leads/lead-agent-area.contract.js +51 -0
  129. package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts +1116 -0
  130. package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts.map +1 -0
  131. package/dist/curated-worker-leads/owned-jobs-tab.contract.js +93 -0
  132. package/dist/curated-workers/curated-filter-additions.spec.d.ts +2 -0
  133. package/dist/curated-workers/curated-filter-additions.spec.d.ts.map +1 -0
  134. package/dist/curated-workers/curated-filter-additions.spec.js +17 -0
  135. package/dist/curated-workers/curated-job-seeking.spec.d.ts +2 -0
  136. package/dist/curated-workers/curated-job-seeking.spec.d.ts.map +1 -0
  137. package/dist/curated-workers/curated-job-seeking.spec.js +53 -0
  138. package/dist/curated-workers/curated-workers-id-documents.spec.d.ts +2 -0
  139. package/dist/curated-workers/curated-workers-id-documents.spec.d.ts.map +1 -0
  140. package/dist/curated-workers/curated-workers-id-documents.spec.js +38 -0
  141. package/dist/curated-workers/curated-workers.contract.d.ts +6160 -1906
  142. package/dist/curated-workers/curated-workers.contract.d.ts.map +1 -1
  143. package/dist/curated-workers/curated-workers.contract.js +333 -51
  144. package/dist/dashboards/agent-daily-metrics.contract.d.ts +10 -10
  145. package/dist/dashboards/agent-daily-metrics.contract.js +1 -1
  146. package/dist/dashboards/dashboard-widgets.contract.d.ts +3800 -496
  147. package/dist/dashboards/dashboard-widgets.contract.d.ts.map +1 -1
  148. package/dist/dashboards/dashboard-widgets.contract.js +527 -29
  149. package/dist/dashboards/dashboard.contract.d.ts +8 -8
  150. package/dist/document-intake/document-intake.contract.d.ts +3132 -0
  151. package/dist/document-intake/document-intake.contract.d.ts.map +1 -0
  152. package/dist/document-intake/document-intake.contract.js +418 -0
  153. package/dist/export-jobs/export-jobs.contract.d.ts +3918 -0
  154. package/dist/export-jobs/export-jobs.contract.d.ts.map +1 -0
  155. package/dist/export-jobs/export-jobs.contract.js +240 -0
  156. package/dist/exports-events/exports-events.schemas.d.ts +90 -0
  157. package/dist/exports-events/exports-events.schemas.d.ts.map +1 -0
  158. package/dist/exports-events/exports-events.schemas.js +56 -0
  159. package/dist/files/files.contract.d.ts +133 -126
  160. package/dist/files/files.contract.d.ts.map +1 -1
  161. package/dist/files/files.contract.js +8 -0
  162. package/dist/health/health.contract.d.ts +4 -4
  163. package/dist/index.d.ts +82 -0
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +87 -1
  166. package/dist/interactions/interactions.contract.d.ts +162 -0
  167. package/dist/interactions/interactions.contract.d.ts.map +1 -0
  168. package/dist/interactions/interactions.contract.js +42 -0
  169. package/dist/job-clusters/job-clusters.contract.d.ts +1584 -0
  170. package/dist/job-clusters/job-clusters.contract.d.ts.map +1 -0
  171. package/dist/job-clusters/job-clusters.contract.js +133 -0
  172. package/dist/jobs/jobs.contract.d.ts +16517 -8495
  173. package/dist/jobs/jobs.contract.d.ts.map +1 -1
  174. package/dist/jobs/jobs.contract.js +394 -190
  175. package/dist/jobs/jobs.contract.spec.d.ts +2 -0
  176. package/dist/jobs/jobs.contract.spec.d.ts.map +1 -0
  177. package/dist/jobs/jobs.contract.spec.js +70 -0
  178. package/dist/kpi-impersonation/kpi-impersonation.contract.d.ts +75 -75
  179. package/dist/lead-assignments/lead-assignments.contract.d.ts +2933 -1122
  180. package/dist/lead-assignments/lead-assignments.contract.d.ts.map +1 -1
  181. package/dist/lead-assignments/lead-assignments.contract.js +29 -7
  182. package/dist/lead-distribution/agent-lead-distribution.contract.d.ts +328 -64
  183. package/dist/lead-distribution/agent-lead-distribution.contract.d.ts.map +1 -1
  184. package/dist/lead-distribution/agent-lead-distribution.contract.js +1 -1
  185. package/dist/lead-distribution/lead-distribution-config.contract.d.ts +31 -31
  186. package/dist/leads/leads.contract.d.ts +830 -368
  187. package/dist/leads/leads.contract.d.ts.map +1 -1
  188. package/dist/leads/leads.contract.js +106 -26
  189. package/dist/locations/locations.contract.d.ts +36 -36
  190. package/dist/notifications/notifications.contract.d.ts +1039 -0
  191. package/dist/notifications/notifications.contract.d.ts.map +1 -0
  192. package/dist/notifications/notifications.contract.js +110 -0
  193. package/dist/offices/offices.contract.d.ts +210 -60
  194. package/dist/offices/offices.contract.d.ts.map +1 -1
  195. package/dist/offices/offices.contract.js +18 -4
  196. package/dist/outreach/__tests__/outreach-claim.test.d.ts +2 -0
  197. package/dist/outreach/__tests__/outreach-claim.test.d.ts.map +1 -0
  198. package/dist/outreach/__tests__/outreach-claim.test.js +97 -0
  199. package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts +2 -0
  200. package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts.map +1 -0
  201. package/dist/outreach/__tests__/outreach-confirm-release.test.js +98 -0
  202. package/dist/outreach/__tests__/outreach-routes.test.d.ts +2 -0
  203. package/dist/outreach/__tests__/outreach-routes.test.d.ts.map +1 -0
  204. package/dist/outreach/__tests__/outreach-routes.test.js +57 -0
  205. package/dist/outreach/__tests__/outreach.schemas.test.d.ts +2 -0
  206. package/dist/outreach/__tests__/outreach.schemas.test.d.ts.map +1 -0
  207. package/dist/outreach/__tests__/outreach.schemas.test.js +140 -0
  208. package/dist/outreach/outreach.contract.d.ts +809 -0
  209. package/dist/outreach/outreach.contract.d.ts.map +1 -0
  210. package/dist/outreach/outreach.contract.js +195 -0
  211. package/dist/outreach/outreach.schemas.d.ts +113 -0
  212. package/dist/outreach/outreach.schemas.d.ts.map +1 -0
  213. package/dist/outreach/outreach.schemas.js +132 -0
  214. package/dist/own-research/own-research.contract.d.ts +1356 -552
  215. package/dist/own-research/own-research.contract.d.ts.map +1 -1
  216. package/dist/own-research/own-research.contract.js +14 -3
  217. package/dist/postcodes/postcodes.contract.d.ts +16 -16
  218. package/dist/proofs/proof-category.enum.d.ts +4 -0
  219. package/dist/proofs/proof-category.enum.d.ts.map +1 -0
  220. package/dist/proofs/proof-category.enum.js +5 -0
  221. package/dist/proofs/proof-entity-type.enum.d.ts +4 -0
  222. package/dist/proofs/proof-entity-type.enum.d.ts.map +1 -0
  223. package/dist/proofs/proof-entity-type.enum.js +5 -0
  224. package/dist/proofs/proof-type.enum.d.ts +28 -0
  225. package/dist/proofs/proof-type.enum.d.ts.map +1 -0
  226. package/dist/proofs/proof-type.enum.js +14 -0
  227. package/dist/proofs/proofs.contract.d.ts +3009 -0
  228. package/dist/proofs/proofs.contract.d.ts.map +1 -0
  229. package/dist/proofs/proofs.contract.js +92 -0
  230. package/dist/proofs/proofs.dtos.d.ts +1319 -0
  231. package/dist/proofs/proofs.dtos.d.ts.map +1 -0
  232. package/dist/proofs/proofs.dtos.js +178 -0
  233. package/dist/qualifications/qualifications.contract.d.ts +94 -94
  234. package/dist/realtime/data-changed.d.ts +21 -0
  235. package/dist/realtime/data-changed.d.ts.map +1 -0
  236. package/dist/realtime/data-changed.js +37 -0
  237. package/dist/shared/booking-history.schema.d.ts +27 -0
  238. package/dist/shared/booking-history.schema.d.ts.map +1 -0
  239. package/dist/shared/booking-history.schema.js +22 -0
  240. package/dist/shared/booking-history.spec.d.ts +2 -0
  241. package/dist/shared/booking-history.spec.d.ts.map +1 -0
  242. package/dist/shared/booking-history.spec.js +44 -0
  243. package/dist/shared/contact-suppressions.contract.d.ts +22 -0
  244. package/dist/shared/contact-suppressions.contract.d.ts.map +1 -0
  245. package/dist/shared/contact-suppressions.contract.js +13 -0
  246. package/dist/shared/live-booking.schema.d.ts +57 -0
  247. package/dist/shared/live-booking.schema.d.ts.map +1 -0
  248. package/dist/shared/live-booking.schema.js +34 -0
  249. package/dist/shared/summary-schemas.d.ts +218 -0
  250. package/dist/shared/summary-schemas.d.ts.map +1 -0
  251. package/dist/shared/summary-schemas.js +56 -0
  252. package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts +2 -0
  253. package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts.map +1 -0
  254. package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.js +20 -0
  255. package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts +2 -0
  256. package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts.map +1 -0
  257. package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.js +41 -0
  258. package/dist/sheets-sync/sheets-sync-events.schemas.d.ts +43 -0
  259. package/dist/sheets-sync/sheets-sync-events.schemas.d.ts.map +1 -0
  260. package/dist/sheets-sync/sheets-sync-events.schemas.js +29 -0
  261. package/dist/sheets-sync/sheets-sync.contract.d.ts +7258 -0
  262. package/dist/sheets-sync/sheets-sync.contract.d.ts.map +1 -0
  263. package/dist/sheets-sync/sheets-sync.contract.js +323 -0
  264. package/dist/telegram/telegram.contract.d.ts +727 -0
  265. package/dist/telegram/telegram.contract.d.ts.map +1 -0
  266. package/dist/telegram/telegram.contract.js +75 -0
  267. package/dist/trades/trade-rate-assessment.d.ts +18 -0
  268. package/dist/trades/trade-rate-assessment.d.ts.map +1 -0
  269. package/dist/trades/trade-rate-assessment.js +46 -0
  270. package/dist/trades/trade-rate-assessment.spec.d.ts +2 -0
  271. package/dist/trades/trade-rate-assessment.spec.d.ts.map +1 -0
  272. package/dist/trades/trade-rate-assessment.spec.js +223 -0
  273. package/dist/trades/trades.contract.d.ts +111 -0
  274. package/dist/trades/trades.contract.d.ts.map +1 -1
  275. package/dist/trades/trades.contract.js +49 -1
  276. package/dist/trades/trades.contract.spec.d.ts +2 -0
  277. package/dist/trades/trades.contract.spec.d.ts.map +1 -0
  278. package/dist/trades/trades.contract.spec.js +173 -0
  279. package/dist/user-access-grants/build-user-access-grant-rules.d.ts +10 -0
  280. package/dist/user-access-grants/build-user-access-grant-rules.d.ts.map +1 -0
  281. package/dist/user-access-grants/build-user-access-grant-rules.js +69 -0
  282. package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts +2 -0
  283. package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts.map +1 -0
  284. package/dist/user-access-grants/build-user-access-grant-rules.spec.js +77 -0
  285. package/dist/user-access-grants/user-access-grant-templates.json +454 -0
  286. package/dist/user-access-grants/user-access-grants.contract.d.ts +3886 -0
  287. package/dist/user-access-grants/user-access-grants.contract.d.ts.map +1 -0
  288. package/dist/user-access-grants/user-access-grants.contract.js +189 -0
  289. package/dist/user-access-grants/user-access-grants.contract.spec.d.ts +2 -0
  290. package/dist/user-access-grants/user-access-grants.contract.spec.d.ts.map +1 -0
  291. package/dist/user-access-grants/user-access-grants.contract.spec.js +149 -0
  292. package/dist/users/users.contract.d.ts +1959 -349
  293. package/dist/users/users.contract.d.ts.map +1 -1
  294. package/dist/users/users.contract.js +222 -37
  295. package/dist/users/users.contract.spec.d.ts +2 -0
  296. package/dist/users/users.contract.spec.d.ts.map +1 -0
  297. package/dist/users/users.contract.spec.js +103 -0
  298. package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts +4609 -0
  299. package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts.map +1 -0
  300. package/dist/worker-identity-cases/worker-identity-cases.contract.js +409 -0
  301. package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts +1511 -0
  302. package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts.map +1 -0
  303. package/dist/worker-merge-proposals/worker-merge-proposals.contract.js +150 -0
  304. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts +1106 -0
  305. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts.map +1 -0
  306. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.js +85 -0
  307. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts +2 -0
  308. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts.map +1 -0
  309. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.js +216 -0
  310. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts +453 -0
  311. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts.map +1 -0
  312. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.js +109 -0
  313. package/dist/workers/do-not-contact.contract.d.ts +46 -0
  314. package/dist/workers/do-not-contact.contract.d.ts.map +1 -0
  315. package/dist/workers/do-not-contact.contract.js +41 -0
  316. package/dist/workers/do-not-contact.contract.spec.d.ts +2 -0
  317. package/dist/workers/do-not-contact.contract.spec.d.ts.map +1 -0
  318. package/dist/workers/do-not-contact.contract.spec.js +47 -0
  319. package/dist/workers/duplicate-group-worker.spec.d.ts +2 -0
  320. package/dist/workers/duplicate-group-worker.spec.d.ts.map +1 -0
  321. package/dist/workers/duplicate-group-worker.spec.js +34 -0
  322. package/dist/workers/filter-exact-flags.spec.d.ts +2 -0
  323. package/dist/workers/filter-exact-flags.spec.d.ts.map +1 -0
  324. package/dist/workers/filter-exact-flags.spec.js +37 -0
  325. package/dist/workers/worker-source-attribution.contract.spec.d.ts +2 -0
  326. package/dist/workers/worker-source-attribution.contract.spec.d.ts.map +1 -0
  327. package/dist/workers/worker-source-attribution.contract.spec.js +442 -0
  328. package/dist/workers/worker-source.spec.d.ts +2 -0
  329. package/dist/workers/worker-source.spec.d.ts.map +1 -0
  330. package/dist/workers/worker-source.spec.js +13 -0
  331. package/dist/workers/worker-status-facets.spec.d.ts +2 -0
  332. package/dist/workers/worker-status-facets.spec.d.ts.map +1 -0
  333. package/dist/workers/worker-status-facets.spec.js +34 -0
  334. package/dist/workers/workers.contract.d.ts +19534 -5969
  335. package/dist/workers/workers.contract.d.ts.map +1 -1
  336. package/dist/workers/workers.contract.js +1096 -113
  337. package/dist/workers/workers.contract.spec.d.ts +2 -0
  338. package/dist/workers/workers.contract.spec.d.ts.map +1 -0
  339. package/dist/workers/workers.contract.spec.js +31 -0
  340. package/package.json +5 -4
@@ -0,0 +1,642 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jobsTabContract = exports.JobCandidatesResponseSchema = exports.CandidateCardsBodySchema = exports.OwnedJobMatchWorkerCardSchema = exports.CuratedJobMatchWorkerCardSchema = exports.OwnedCandidateCardSchema = exports.JobCandidateCardSchema = exports.OwnedCandidateCrewSchema = exports.CandidateLocationSchema = exports.OwnedCandidateQualificationSchema = exports.JobCandidateQualificationSchema = exports.CandidateRowSchema = exports.CandidateOfferChannelSchema = exports.ConvertToWorkerResponseSchema = exports.BookCandidateWithDetailsResponseSchema = exports.BookCandidateWithDetailsBodySchema = exports.CandidateBookingFieldsSchema = exports.BookJobMatchResponseSchema = exports.BookJobMatchBodySchema = exports.DispositionBatchSchema = exports.DispositionJobMatchSchema = exports.NotInterestedReasonSchema = exports.JobFeedMatchCountBatchItemSchema = exports.JobFeedMatchCountSchema = exports.JobsTabResponseSchema = exports.WorkerJobGroupSchema = exports.WorkerJobMatchItemSchema = exports.MatchTupleSchema = exports.OfferChannelSchema = exports.WorkerJobMatchStatusSchema = exports.SubjectKindSchema = void 0;
4
+ const zod_openapi_1 = require("@anatine/zod-openapi");
5
+ const core_1 = require("@ts-rest/core");
6
+ const zod_1 = require("zod");
7
+ const error_schemas_1 = require("../common/error-schemas");
8
+ const crews_contract_1 = require("../crews/crews.contract");
9
+ const booking_history_schema_1 = require("../shared/booking-history.schema");
10
+ const live_booking_schema_1 = require("../shared/live-booking.schema");
11
+ const bookings_contract_1 = require("../bookings/bookings.contract");
12
+ const jobs_contract_1 = require("../jobs/jobs.contract");
13
+ const workers_contract_1 = require("../workers/workers.contract");
14
+ const curated_workers_contract_1 = require("../curated-workers/curated-workers.contract");
15
+ const do_not_contact_contract_1 = require("../workers/do-not-contact.contract");
16
+ const common_schemas_1 = require("../common/common-schemas");
17
+ const workers_contract_2 = require("../workers/workers.contract");
18
+ const candidate_coordination_contract_1 = require("./candidate-coordination.contract");
19
+ (0, zod_openapi_1.extendZodWithOpenApi)(zod_1.z);
20
+ const c = (0, core_1.initContract)();
21
+ exports.SubjectKindSchema = zod_1.z
22
+ .enum(['OWNED', 'CURATED'])
23
+ .openapi({ title: 'SubjectKind' });
24
+ exports.WorkerJobMatchStatusSchema = zod_1.z
25
+ .enum(['NEW', 'TOO_FAR', 'NOT_INTERESTED', 'OFFER_SENT', 'BOOKED'])
26
+ .openapi({ title: 'WorkerJobMatchStatus' });
27
+ exports.OfferChannelSchema = zod_1.z
28
+ .enum(['WHATSAPP', 'PHONE'])
29
+ .openapi({ title: 'OfferChannel' });
30
+ exports.MatchTupleSchema = zod_1.z
31
+ .object({
32
+ subjectKind: exports.SubjectKindSchema,
33
+ subjectId: zod_1.z.string().uuid(),
34
+ jobId: zod_1.z.string().uuid(),
35
+ })
36
+ .openapi({ title: 'MatchTuple' });
37
+ exports.WorkerJobMatchItemSchema = zod_1.z
38
+ .object({
39
+ subjectKind: exports.SubjectKindSchema,
40
+ subjectId: zod_1.z.string().uuid(),
41
+ jobId: zod_1.z.string().uuid(),
42
+ distanceKm: zod_1.z.number().nullable(),
43
+ driveMinutes: zod_1.z.number().nullable(),
44
+ transitMinutes: zod_1.z.number().nullable(),
45
+ status: exports.WorkerJobMatchStatusSchema,
46
+ statusUpdatedAt: zod_1.z.string().datetime().nullable(),
47
+ })
48
+ .openapi({ title: 'WorkerJobMatchItem' });
49
+ exports.WorkerJobGroupSchema = zod_1.z
50
+ .object({
51
+ source: zod_1.z.enum(['OWN', 'CURATED']),
52
+ curatedWorkerId: zod_1.z.string().uuid().nullable(),
53
+ workerId: zod_1.z.string().uuid().nullable(),
54
+ /** Live booking on this worker's identity (see LiveBookingSummary); null/absent = not booked. */
55
+ liveBooking: live_booking_schema_1.LiveBookingSummarySchema.nullable().optional(),
56
+ matches: zod_1.z.array(exports.WorkerJobMatchItemSchema),
57
+ })
58
+ .openapi({ title: 'WorkerJobGroup' });
59
+ exports.JobsTabResponseSchema = zod_1.z
60
+ .object({
61
+ groups: zod_1.z.array(exports.WorkerJobGroupSchema),
62
+ hasMore: zod_1.z.boolean(),
63
+ })
64
+ .openapi({ title: 'JobsTabResponse' });
65
+ exports.JobFeedMatchCountSchema = zod_1.z.object({
66
+ owned: zod_1.z.number().int().min(0),
67
+ curated: zod_1.z.number().int().min(0),
68
+ /** Distinct workers this viewer contacted for this job. */
69
+ workersContactedByViewerCount: zod_1.z.number().int().min(0),
70
+ /** Distinct workers contacted for this job by users other than the viewer. */
71
+ workersContactedByOthersCount: zod_1.z.number().int().min(0),
72
+ /** Rows awaiting travel-time enrichment, viewer-scoped. */
73
+ pendingEnrichmentCount: zod_1.z.number().int().min(0),
74
+ /** Presence is delivered separately today; retained for response compatibility. */
75
+ activeAgentCount: zod_1.z.number().int().min(0).optional(),
76
+ });
77
+ exports.JobFeedMatchCountBatchItemSchema = exports.JobFeedMatchCountSchema.extend({
78
+ jobId: zod_1.z.string().uuid(),
79
+ });
80
+ const CommaSeparatedJobIdsSchema = zod_1.z
81
+ .string()
82
+ .min(1)
83
+ .superRefine((value, ctx) => {
84
+ const ids = value.split(',').map((id) => id.trim());
85
+ if (ids.length > 200) {
86
+ ctx.addIssue({
87
+ code: zod_1.z.ZodIssueCode.too_big,
88
+ maximum: 200,
89
+ type: 'array',
90
+ inclusive: true,
91
+ message: 'At most 200 job IDs may be requested',
92
+ });
93
+ }
94
+ if (ids.some((id) => !zod_1.z.string().uuid().safeParse(id).success)) {
95
+ ctx.addIssue({
96
+ code: zod_1.z.ZodIssueCode.custom,
97
+ message: 'jobIds must be a comma-separated list of UUIDs',
98
+ });
99
+ }
100
+ });
101
+ var candidate_coordination_contract_2 = require("./candidate-coordination.contract");
102
+ Object.defineProperty(exports, "NotInterestedReasonSchema", { enumerable: true, get: function () { return candidate_coordination_contract_2.NotInterestedReasonSchema; } });
103
+ /** NOT_INTERESTED requires a reason; reason OTHER requires a non-empty comment. */
104
+ const requireReasonAndComment = (data, ctx) => {
105
+ if (data.status === 'NOT_INTERESTED' && !data.reason) {
106
+ ctx.addIssue({
107
+ code: zod_1.z.ZodIssueCode.custom,
108
+ path: ['reason'],
109
+ message: 'A reason is required for Not interested',
110
+ });
111
+ }
112
+ if (data.reason === 'OTHER' && !data.comment?.trim()) {
113
+ ctx.addIssue({
114
+ code: zod_1.z.ZodIssueCode.custom,
115
+ path: ['comment'],
116
+ message: 'A comment is required when the reason is Other',
117
+ });
118
+ }
119
+ };
120
+ exports.DispositionJobMatchSchema = zod_1.z
121
+ .object({
122
+ tuple: exports.MatchTupleSchema,
123
+ status: zod_1.z.enum(['NOT_INTERESTED', 'OFFER_SENT']),
124
+ channel: exports.OfferChannelSchema.optional(),
125
+ /**
126
+ * How the agent reached the worker before a NOT_INTERESTED decline — one
127
+ * or both channels. Each is recorded as a contact event so a decline is
128
+ * never on record without a preceding contact. Ignored for OFFER_SENT
129
+ * (that path uses `channel`).
130
+ */
131
+ contactChannels: zod_1.z.array(exports.OfferChannelSchema).min(1).max(2).optional(),
132
+ reason: candidate_coordination_contract_1.NotInterestedReasonSchema.optional(),
133
+ comment: zod_1.z.string().trim().max(500).optional(),
134
+ })
135
+ .superRefine(requireReasonAndComment)
136
+ .openapi({ title: 'DispositionJobMatch' });
137
+ exports.DispositionBatchSchema = zod_1.z
138
+ .object({
139
+ tuples: zod_1.z.array(exports.MatchTupleSchema).min(1).max(50),
140
+ status: zod_1.z.enum(['NOT_INTERESTED', 'OFFER_SENT']),
141
+ channel: exports.OfferChannelSchema.optional(),
142
+ reason: candidate_coordination_contract_1.NotInterestedReasonSchema.optional(),
143
+ comment: zod_1.z.string().trim().max(500).optional(),
144
+ })
145
+ .superRefine(requireReasonAndComment)
146
+ .openapi({ title: 'DispositionBatch' });
147
+ exports.BookJobMatchBodySchema = zod_1.z
148
+ .object({ tuple: exports.MatchTupleSchema })
149
+ .openapi({ title: 'BookJobMatchBody' });
150
+ exports.BookJobMatchResponseSchema = zod_1.z
151
+ .object({ bookingId: zod_1.z.string().uuid() })
152
+ .openapi({ title: 'BookJobMatchResponse' });
153
+ exports.CandidateBookingFieldsSchema = zod_1.z
154
+ .object({
155
+ startDate: zod_1.z.string(),
156
+ endDate: zod_1.z.string().nullable().optional(),
157
+ expectedEndDate: zod_1.z.string().nullable().optional(),
158
+ pay: bookings_contract_1.BookingPaySchema.optional(),
159
+ status: bookings_contract_1.BookingStatusSchema.optional(),
160
+ comment: zod_1.z.string().optional(),
161
+ workingDays: bookings_contract_1.WorkingDaysSchema.optional(),
162
+ })
163
+ .strict()
164
+ .superRefine(bookings_contract_1.bookingItemCrossFieldRules)
165
+ .openapi({ title: 'CandidateBookingFields' });
166
+ exports.BookCandidateWithDetailsBodySchema = zod_1.z
167
+ .object({
168
+ tuple: exports.MatchTupleSchema.extend({ subjectKind: zod_1.z.literal('CURATED') }),
169
+ /** Client-generated UUID, stable across retries of the same submission. */
170
+ submissionId: zod_1.z.string().uuid(),
171
+ booking: exports.CandidateBookingFieldsSchema,
172
+ })
173
+ .openapi({ title: 'BookCandidateWithDetailsBody' });
174
+ exports.BookCandidateWithDetailsResponseSchema = zod_1.z
175
+ .object({
176
+ bookingId: zod_1.z.string().uuid(),
177
+ workerId: zod_1.z.string().uuid(),
178
+ reusedWorker: zod_1.z.boolean(),
179
+ })
180
+ .openapi({ title: 'BookCandidateWithDetailsResponse' });
181
+ exports.ConvertToWorkerResponseSchema = zod_1.z
182
+ .object({ workerId: zod_1.z.string().uuid() })
183
+ .openapi({ title: 'ConvertToWorkerResponse' });
184
+ exports.CandidateOfferChannelSchema = zod_1.z.enum(['WHATSAPP', 'PHONE']);
185
+ exports.CandidateRowSchema = zod_1.z
186
+ .object({
187
+ subjectKind: exports.SubjectKindSchema,
188
+ subjectId: zod_1.z.string().uuid(),
189
+ canonicalWorker: candidate_coordination_contract_1.CandidateCoordinationStateSchema.shape.canonicalWorker.optional(),
190
+ distanceKm: zod_1.z.number().nullable(),
191
+ driveMinutes: zod_1.z.number().nullable(),
192
+ transitMinutes: zod_1.z.number().nullable(),
193
+ /** This agent's disposition for THIS job; null = never dispositioned. */
194
+ disposition: zod_1.z
195
+ .object({
196
+ status: exports.WorkerJobMatchStatusSchema,
197
+ channel: exports.OfferChannelSchema.nullable(),
198
+ dispositionAt: zod_1.z.string().datetime().nullable(),
199
+ reason: candidate_coordination_contract_1.NotInterestedReasonSchema.nullable(),
200
+ comment: zod_1.z.string().nullable(),
201
+ /** Job's top offerable rate at RATE-decline time (COALESCE(payRateMax, payRate)). */
202
+ declinedRate: zod_1.z.number().nullable(),
203
+ declinedRateUnit: zod_1.z.enum(['DAILY', 'HOURLY']).nullable(),
204
+ })
205
+ .nullable(),
206
+ /** Latest lead_activity_events row for this subject across ALL jobs. */
207
+ lastActivityAt: zod_1.z.string().datetime().nullable(),
208
+ /** This viewer has logged contact with this candidate for THIS job. */
209
+ contactedByViewer: zod_1.z.boolean().optional(),
210
+ /**
211
+ * The team's one WhatsApp outreach for this candidate identity and job.
212
+ * Null means WhatsApp is still available; phone calls remain independent.
213
+ */
214
+ whatsappContact: zod_1.z
215
+ .object({
216
+ agent: candidate_coordination_contract_1.CoordinationUserSummarySchema,
217
+ contactedAt: zod_1.z.string().datetime(),
218
+ })
219
+ .nullable()
220
+ .optional(),
221
+ offerChannels: zod_1.z.array(exports.CandidateOfferChannelSchema).optional(),
222
+ offerContactedAt: zod_1.z.string().datetime().nullable().optional(),
223
+ /**
224
+ * Booking track record over the candidate's linked identity (all worker
225
+ * copies of the curated worker when a curated link exists, else just this
226
+ * record). worked = status_category IN_PROGRESS/FINISHED_THE_JOB; noShow =
227
+ * status_type DIDNT_START_BECAUSE_OF_WORKER. byMe = subset booked by the
228
+ * viewing user. Optional so cached pre-field payloads still parse.
229
+ */
230
+ bookingHistory: booking_history_schema_1.BookingHistorySchema.optional(),
231
+ /** Live booking on this candidate's identity; null/absent = not booked. */
232
+ liveBooking: live_booking_schema_1.LiveBookingSummarySchema.nullable().optional(),
233
+ /** True when at least one usable number may be revealed on demand. */
234
+ hasPhoneNumber: zod_1.z.boolean().optional(),
235
+ /** Live call/edit/ownership state. Phone values are never included here. */
236
+ coordination: candidate_coordination_contract_1.CandidateCoordinationStateSchema.optional(),
237
+ })
238
+ .openapi({ title: 'JobCandidateRow' });
239
+ /** Qualification details rendered on a candidate card, excluding proof files. */
240
+ exports.JobCandidateQualificationSchema = zod_1.z.object({
241
+ id: curated_workers_contract_1.CuratedWorkerQualificationResponseSchema.shape.id,
242
+ qualificationId: curated_workers_contract_1.CuratedWorkerQualificationResponseSchema.shape.qualificationId,
243
+ qualificationTypeId: curated_workers_contract_1.CuratedWorkerQualificationResponseSchema.shape.qualificationTypeId,
244
+ issueDate: curated_workers_contract_1.CuratedWorkerQualificationResponseSchema.shape.issueDate,
245
+ expiryDate: curated_workers_contract_1.CuratedWorkerQualificationResponseSchema.shape.expiryDate,
246
+ referenceNumber: curated_workers_contract_1.CuratedWorkerQualificationResponseSchema.shape.referenceNumber,
247
+ });
248
+ /** Owned-lane equivalent of the candidate-safe qualification projection. */
249
+ exports.OwnedCandidateQualificationSchema = zod_1.z.object({
250
+ id: workers_contract_1.WorkerQualificationSchema.shape.id,
251
+ qualificationId: workers_contract_1.WorkerQualificationSchema.shape.qualificationId,
252
+ qualificationTypeId: workers_contract_1.WorkerQualificationSchema.shape.qualificationTypeId,
253
+ issueDate: workers_contract_1.WorkerQualificationSchema.shape.issueDate,
254
+ expiryDate: workers_contract_1.WorkerQualificationSchema.shape.expiryDate,
255
+ referenceNumber: workers_contract_1.WorkerQualificationSchema.shape.referenceNumber,
256
+ });
257
+ /** Display location used by candidate-card headers and directions links. */
258
+ exports.CandidateLocationSchema = zod_1.z.object({
259
+ postcode: common_schemas_1.LocationDetailsSchema.shape.postcode,
260
+ postTown: common_schemas_1.LocationDetailsSchema.shape.postTown,
261
+ adminDistrict: common_schemas_1.LocationDetailsSchema.shape.adminDistrict,
262
+ builtUpArea: common_schemas_1.LocationDetailsSchema.shape.builtUpArea,
263
+ areaCovered: common_schemas_1.LocationDetailsSchema.shape.areaCovered,
264
+ });
265
+ /** Crew badge/link only; candidate hydration never returns crew contact data. */
266
+ exports.OwnedCandidateCrewSchema = zod_1.z.object({
267
+ id: crews_contract_1.CrewSummarySchema.shape.id,
268
+ name: crews_contract_1.CrewSummarySchema.shape.name,
269
+ });
270
+ /**
271
+ * Candidate-card projections contain only fields rendered by the job-scoped
272
+ * Candidates workflow. Phone values and other sensitive identity/source data
273
+ * are deliberately absent; unknown input keys are stripped by Zod.
274
+ */
275
+ exports.JobCandidateCardSchema = curated_workers_contract_1.CuratedWorkerResponseSchema.pick({
276
+ id: true,
277
+ firstName: true,
278
+ lastName: true,
279
+ dateOfBirth: true,
280
+ bio: true,
281
+ englishLevel: true,
282
+ nationality: true,
283
+ hasTools: true,
284
+ hasPpe: true,
285
+ bookingHistory: true,
286
+ transportation: true,
287
+ location: true,
288
+ offerOpenness: true,
289
+ offerOpennessSetAt: true,
290
+ offerNote: true,
291
+ offerNoteUpdatedAt: true,
292
+ offerSignalUpdatedById: true,
293
+ offerSignalUpdatedByName: true,
294
+ liveStatus: true,
295
+ distanceKm: true,
296
+ workingUntil: true,
297
+ createdAt: true,
298
+ updatedAt: true,
299
+ trades: true,
300
+ qualifications: true,
301
+ })
302
+ .extend({
303
+ /** True when at least one usable number may be revealed on demand. */
304
+ hasPhoneNumber: zod_1.z.boolean(),
305
+ location: exports.CandidateLocationSchema.nullable().optional(),
306
+ qualifications: zod_1.z
307
+ .array(exports.JobCandidateQualificationSchema)
308
+ .nullable()
309
+ .optional(),
310
+ })
311
+ .openapi({ title: 'JobCandidateCard' });
312
+ exports.OwnedCandidateCardSchema = workers_contract_1.WorkerListItemSchema.pick({
313
+ id: true,
314
+ firstName: true,
315
+ lastName: true,
316
+ dateOfBirth: true,
317
+ bio: true,
318
+ trades: true,
319
+ qualifications: true,
320
+ englishLevel: true,
321
+ nationality: true,
322
+ hasTools: true,
323
+ hasPpe: true,
324
+ transportation: true,
325
+ location: true,
326
+ liveStatus: true,
327
+ offerOpenness: true,
328
+ offerOpennessSetAt: true,
329
+ offerNote: true,
330
+ offerNoteUpdatedAt: true,
331
+ distanceKm: true,
332
+ driveMinutes: true,
333
+ transitMinutes: true,
334
+ travelTimeEnriched: true,
335
+ bookingHistory: true,
336
+ crew: true,
337
+ createdAt: true,
338
+ updatedAt: true,
339
+ })
340
+ .extend({
341
+ /** True when at least one usable number may be revealed on demand. */
342
+ hasPhoneNumber: zod_1.z.boolean(),
343
+ location: exports.CandidateLocationSchema.nullable().optional(),
344
+ qualifications: zod_1.z.array(exports.OwnedCandidateQualificationSchema).optional(),
345
+ crew: exports.OwnedCandidateCrewSchema.nullable().optional(),
346
+ })
347
+ .openapi({ title: 'OwnedCandidateCard' });
348
+ /**
349
+ * Worker-first Job Matches cards reuse only the explicitly allowlisted,
350
+ * phone-free candidate-card fields and add their live coordination overlay.
351
+ */
352
+ exports.CuratedJobMatchWorkerCardSchema = exports.JobCandidateCardSchema.extend({
353
+ coordination: candidate_coordination_contract_1.CandidateCoordinationStateSchema.optional(),
354
+ }).openapi({ title: 'CuratedJobMatchWorkerCard' });
355
+ exports.OwnedJobMatchWorkerCardSchema = exports.OwnedCandidateCardSchema.extend({
356
+ coordination: candidate_coordination_contract_1.CandidateCoordinationStateSchema.optional(),
357
+ }).openapi({ title: 'OwnedJobMatchWorkerCard' });
358
+ exports.CandidateCardsBodySchema = zod_1.z.object({
359
+ own: zod_1.z.array(exports.OwnedCandidateCardSchema),
360
+ curated: zod_1.z.array(exports.JobCandidateCardSchema),
361
+ });
362
+ exports.JobCandidatesResponseSchema = zod_1.z
363
+ .object({
364
+ owned: zod_1.z.array(exports.CandidateRowSchema),
365
+ curated: zod_1.z.array(exports.CandidateRowSchema),
366
+ cards: exports.CandidateCardsBodySchema,
367
+ totalOwned: zod_1.z.number().int().min(0),
368
+ totalCurated: zod_1.z.number().int().min(0),
369
+ page: zod_1.z.number().int().min(1),
370
+ pageSize: zod_1.z.number().int().min(1),
371
+ totalPages: zod_1.z.number().int().min(0),
372
+ pendingEnrichmentCount: zod_1.z.number().int().min(0),
373
+ /** Distinct workers this viewer contacted for THIS job. Event-log based, so it survives later status changes. */
374
+ workersContactedByViewerCount: zod_1.z.number().int().min(0),
375
+ /** Distinct workers contacted for THIS job by users other than the viewer. */
376
+ workersContactedByOthersCount: zod_1.z.number().int().min(0),
377
+ /** This agent's non-resurfaced NOT_INTERESTED rows, both lanes, disposition_at DESC, cap 50. Also includes consent-written TOO_FAR rows (shown as reason Distance). */
378
+ dismissed: zod_1.z.array(exports.CandidateRowSchema),
379
+ })
380
+ .openapi({ title: 'JobCandidatesResponse' });
381
+ exports.jobsTabContract = c.router({
382
+ listGroupedByWorker: {
383
+ method: 'GET',
384
+ path: '/curated-worker-leads/jobs-tab',
385
+ query: zod_1.z.object({
386
+ page: zod_1.z.coerce.number().int().min(0).optional(),
387
+ lane: zod_1.z.enum(['OWN', 'CURATED']).optional(),
388
+ tradeIds: zod_1.z.string().optional(),
389
+ maxCommuteMinutes: zod_1.z.coerce.number().int().min(1).optional(),
390
+ workerName: zod_1.z
391
+ .object({
392
+ value: zod_1.z.string().optional(),
393
+ exact: zod_1.z.coerce.boolean().optional(),
394
+ })
395
+ .optional(),
396
+ workerPhone: zod_1.z.string().optional(),
397
+ hideBooked: zod_1.z.coerce.boolean().optional(),
398
+ }),
399
+ responses: { 200: exports.JobsTabResponseSchema, 403: error_schemas_1.ErrorResponseSchema },
400
+ summary: 'Consented + owned workers (for this agent) with live matching jobs, grouped by worker',
401
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
402
+ },
403
+ disposition: {
404
+ method: 'POST',
405
+ path: '/curated-worker-leads/job-matches/disposition',
406
+ body: exports.DispositionJobMatchSchema,
407
+ responses: {
408
+ 200: exports.WorkerJobMatchItemSchema,
409
+ 403: error_schemas_1.ErrorResponseSchema,
410
+ 404: error_schemas_1.ErrorResponseSchema,
411
+ },
412
+ summary: 'Disposition a job match (too far / not interested / offer sent)',
413
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
414
+ },
415
+ dispositionBatch: {
416
+ method: 'POST',
417
+ path: '/curated-worker-leads/job-matches/disposition-batch',
418
+ body: exports.DispositionBatchSchema,
419
+ responses: {
420
+ 200: zod_1.z.array(exports.WorkerJobMatchItemSchema),
421
+ 403: error_schemas_1.ErrorResponseSchema,
422
+ 404: error_schemas_1.ErrorResponseSchema,
423
+ },
424
+ summary: 'Disposition multiple job matches at once (e.g. a multi-job offer sent)',
425
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
426
+ },
427
+ reconsider: {
428
+ method: 'POST',
429
+ path: '/curated-worker-leads/job-matches/reconsider',
430
+ body: zod_1.z.object({ tuple: exports.MatchTupleSchema }),
431
+ responses: {
432
+ 200: zod_1.z.object({ ok: zod_1.z.literal(true) }),
433
+ 403: error_schemas_1.ErrorResponseSchema,
434
+ 404: error_schemas_1.ErrorResponseSchema,
435
+ },
436
+ summary: 'Clear a NOT_INTERESTED disposition so the worker rejoins the candidates list',
437
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
438
+ },
439
+ book: {
440
+ method: 'POST',
441
+ path: '/curated-worker-leads/job-matches/book',
442
+ body: exports.BookJobMatchBodySchema,
443
+ responses: {
444
+ 201: exports.BookJobMatchResponseSchema,
445
+ 403: error_schemas_1.ErrorResponseSchema,
446
+ 404: error_schemas_1.ErrorResponseSchema,
447
+ 409: error_schemas_1.ErrorResponseSchema,
448
+ },
449
+ summary: 'Book the worker for this matched job',
450
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
451
+ },
452
+ convertToWorker: {
453
+ method: 'POST',
454
+ path: '/curated-worker-leads/job-matches/convert-to-worker',
455
+ body: exports.BookJobMatchBodySchema,
456
+ responses: {
457
+ 200: exports.ConvertToWorkerResponseSchema,
458
+ 403: error_schemas_1.ErrorResponseSchema,
459
+ 404: error_schemas_1.ErrorResponseSchema,
460
+ 409: error_schemas_1.ErrorResponseSchema,
461
+ },
462
+ summary: 'Resolve a curated match to an agent-owned Worker copy (copy-on-book), without creating a booking — used to open the pre-filled bookings form',
463
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
464
+ },
465
+ bookWithDetails: {
466
+ method: 'POST',
467
+ path: '/curated-worker-leads/job-matches/book-with-details',
468
+ body: exports.BookCandidateWithDetailsBodySchema,
469
+ responses: {
470
+ 201: exports.BookCandidateWithDetailsResponseSchema,
471
+ 400: error_schemas_1.ErrorResponseSchema,
472
+ 403: error_schemas_1.ErrorResponseSchema,
473
+ 404: error_schemas_1.ErrorResponseSchema,
474
+ 409: error_schemas_1.ErrorResponseSchema,
475
+ },
476
+ summary: 'Create the owned Worker copy (if needed) and the Booking for a curated candidate atomically',
477
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
478
+ },
479
+ candidateBookingConflicts: {
480
+ method: 'GET',
481
+ path: '/curated-worker-leads/jobs/:jobId/candidates/:subjectKind/:subjectId/booking-conflicts',
482
+ pathParams: zod_1.z.object({
483
+ jobId: zod_1.z.string().uuid(),
484
+ subjectKind: exports.SubjectKindSchema,
485
+ subjectId: zod_1.z.string().uuid(),
486
+ }),
487
+ responses: {
488
+ 200: bookings_contract_1.BookingConflictsResponseSchema,
489
+ 403: error_schemas_1.ErrorResponseSchema,
490
+ 404: error_schemas_1.ErrorResponseSchema,
491
+ },
492
+ summary: 'Advisory booking-conflict preflight over the canonical identity; creates no Worker or claim',
493
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
494
+ },
495
+ setDoNotContact: {
496
+ method: 'POST',
497
+ path: '/curated-worker-leads/job-matches/worker/:curatedWorkerId/do-not-contact',
498
+ pathParams: zod_1.z.object({ curatedWorkerId: zod_1.z.string().uuid() }),
499
+ body: do_not_contact_contract_1.SetDoNotContactSchema.and(zod_1.z.object({
500
+ /**
501
+ * Job context for tuple authorization. Required for candidate-only
502
+ * curated viewers; optional for other roles during rollout.
503
+ */
504
+ jobId: zod_1.z.string().uuid().optional(),
505
+ })).openapi({ title: 'SetCuratedDoNotContact' }),
506
+ responses: {
507
+ 200: zod_1.z.object({ ok: zod_1.z.literal(true) }),
508
+ 403: error_schemas_1.ErrorResponseSchema,
509
+ 404: error_schemas_1.ErrorResponseSchema,
510
+ },
511
+ summary: 'Set/extend a curated worker do-not-contact window (reason + 1-90 days) for this agent',
512
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
513
+ },
514
+ clearDoNotContact: {
515
+ method: 'POST',
516
+ path: '/curated-worker-leads/job-matches/worker/:curatedWorkerId/do-not-contact/clear',
517
+ pathParams: zod_1.z.object({ curatedWorkerId: zod_1.z.string().uuid() }),
518
+ body: zod_1.z
519
+ .object({
520
+ /**
521
+ * Job context for tuple authorization, mirroring setDoNotContact:
522
+ * required for candidate-only curated viewers, optional for other
523
+ * roles. Clearing a DNC is the inverse of setting one, so it is
524
+ * authorized the same way rather than through the consent queue's
525
+ * parked-lead route (which requires a worker_lead_profiles row a
526
+ * DNC-only worker never has).
527
+ */
528
+ jobId: zod_1.z.string().uuid().optional(),
529
+ })
530
+ .strict()
531
+ .openapi({ title: 'ClearCuratedDoNotContact' }),
532
+ responses: {
533
+ 200: zod_1.z.object({ ok: zod_1.z.literal(true) }),
534
+ 403: error_schemas_1.ErrorResponseSchema,
535
+ 404: error_schemas_1.ErrorResponseSchema,
536
+ },
537
+ summary: 'Clear a curated worker do-not-contact window (bring back into contact)',
538
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
539
+ },
540
+ participation: {
541
+ method: 'GET',
542
+ path: '/curated-worker-leads/participation',
543
+ responses: { 200: zod_1.z.object({ isCuratedLaneParticipant: zod_1.z.boolean() }) },
544
+ summary: 'Whether the user participates in the cross-agent (curated) lane',
545
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
546
+ },
547
+ getJobCards: {
548
+ method: 'GET',
549
+ path: '/curated-worker-leads/job-cards',
550
+ query: zod_1.z.object({ jobIds: zod_1.z.string().min(1) }),
551
+ responses: { 200: zod_1.z.array(jobs_contract_1.JobListItemSchema), 403: error_schemas_1.ErrorResponseSchema },
552
+ summary: "Full job-card data (pay/hours/positions/qualifications/first-agent) for the agent's matched jobs",
553
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
554
+ },
555
+ getWorkerCards: {
556
+ method: 'GET',
557
+ path: '/curated-worker-leads/worker-cards',
558
+ query: zod_1.z.object({
559
+ ownIds: zod_1.z.string().optional(),
560
+ curatedIds: zod_1.z.string().optional(),
561
+ }),
562
+ responses: {
563
+ 200: zod_1.z.object({
564
+ own: zod_1.z.array(exports.OwnedJobMatchWorkerCardSchema),
565
+ curated: zod_1.z.array(exports.CuratedJobMatchWorkerCardSchema),
566
+ }),
567
+ 403: error_schemas_1.ErrorResponseSchema,
568
+ },
569
+ summary: "Full worker-card data for the agent's matched workers, both lanes",
570
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
571
+ },
572
+ getCandidateCards: {
573
+ method: 'GET',
574
+ path: '/curated-worker-leads/jobs/:jobId/candidate-cards',
575
+ pathParams: zod_1.z.object({ jobId: zod_1.z.string().uuid() }),
576
+ query: zod_1.z.object({
577
+ ownedIds: zod_1.z.string().optional(),
578
+ curatedIds: zod_1.z.string().optional(),
579
+ }),
580
+ responses: {
581
+ 200: exports.CandidateCardsBodySchema,
582
+ 403: error_schemas_1.ErrorResponseSchema,
583
+ },
584
+ summary: "Job-scoped candidate-card hydration. IDs outside the job's canonical eligible set are omitted and counted. Max 200 IDs across both lanes; malformed IDs are rejected. Response is viewer-scoped and must not be shared-cacheable.",
585
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
586
+ },
587
+ matchCount: {
588
+ method: 'GET',
589
+ path: '/curated-worker-leads/jobs/:jobId/match-count',
590
+ pathParams: zod_1.z.object({ jobId: zod_1.z.string().uuid() }),
591
+ responses: {
592
+ 200: exports.JobFeedMatchCountSchema,
593
+ 403: error_schemas_1.ErrorResponseSchema,
594
+ },
595
+ summary: 'Role-scoped worker-match counts for a job feed card (owned + curated) from the proximity tables',
596
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
597
+ },
598
+ matchCounts: {
599
+ method: 'GET',
600
+ path: '/curated-worker-leads/jobs/match-counts',
601
+ query: zod_1.z.object({ jobIds: CommaSeparatedJobIdsSchema }),
602
+ responses: {
603
+ 200: zod_1.z.object({ items: zod_1.z.array(exports.JobFeedMatchCountBatchItemSchema) }),
604
+ 403: error_schemas_1.ErrorResponseSchema,
605
+ },
606
+ summary: 'Role-scoped worker-match counts for up to 200 job feed cards in one request',
607
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
608
+ },
609
+ candidates: {
610
+ method: 'GET',
611
+ path: '/curated-worker-leads/jobs/:jobId/candidates',
612
+ pathParams: zod_1.z.object({ jobId: zod_1.z.string().uuid() }),
613
+ query: zod_1.z.object({
614
+ page: zod_1.z.coerce.number().int().min(1).max(100).optional(),
615
+ maxCommuteMinutes: zod_1.z.coerce.number().int().min(1).optional(),
616
+ nationality: common_schemas_1.NationalitySchema.optional(),
617
+ englishLevels: zod_1.z.array(common_schemas_1.EnglishLevelSchema).optional(),
618
+ transportationMethods: zod_1.z.array(common_schemas_1.TransportationMethodSchema).optional(),
619
+ hasTools: workers_contract_2.BooleanFilterSchema.optional(),
620
+ hasPpe: workers_contract_2.BooleanFilterSchema.optional(),
621
+ workedBefore: workers_contract_2.BooleanFilterSchema.optional(),
622
+ noShows: workers_contract_2.BooleanFilterSchema.optional(),
623
+ offerOpenness: zod_1.z.array(workers_contract_2.OfferOpennessSchema).optional(),
624
+ name: common_schemas_1.NameFilterSchema.optional(),
625
+ phone: zod_1.z.string().optional(),
626
+ qualificationFilters: zod_1.z.array(common_schemas_1.QualificationFilterSchema).optional(),
627
+ lane: zod_1.z.enum(['OWNED', 'CURATED']).optional(),
628
+ hideBooked: zod_1.z.coerce.boolean().optional(),
629
+ }),
630
+ responses: { 200: exports.JobCandidatesResponseSchema, 403: error_schemas_1.ErrorResponseSchema },
631
+ summary: 'Paginated, globally commute-ranked candidate workers for one job — owned lane always (CASL-scoped), curated lane for global curated viewers. OFFER_SENT rows retain their rank; NOT_INTERESTED/TOO_FAR/DNC rows are hidden from the main page; live owned bookings are flagged (hideBooked=true excludes them).',
632
+ metadata: { tags: ['Curated Worker Lead Jobs'] },
633
+ },
634
+ }, {
635
+ pathPrefix: '/v2',
636
+ commonResponses: {
637
+ 400: error_schemas_1.ErrorResponseSchema,
638
+ 401: error_schemas_1.ErrorResponseSchema,
639
+ 403: error_schemas_1.ErrorResponseSchema,
640
+ 500: error_schemas_1.ErrorResponseSchema,
641
+ },
642
+ });