@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 @@
1
+ {"version":3,"file":"outreach.contract.d.ts","sourceRoot":"","sources":["../../contracts/outreach/outreach.contract.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAG,EAAW,CAAC;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;;;EAIM,CAAC;AAE/C,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAYM,CAAC;AAEnD,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;EAoBM,CAAC;AAEjD,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAC3C,OAAO,6BAA6B,CACrC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC;;;;;;;;;EAOM,CAAC;AAErD,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAC/C,OAAO,iCAAiC,CACzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;EAUM,CAAC;AAElD,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAC5C,OAAO,8BAA8B,CACtC,CAAC;AAEF,eAAO,MAAM,kCAAkC;;;;;;EAIM,CAAC;AAEtD,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAChD,OAAO,kCAAkC,CAC1C,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsE5B,CAAC"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.outreachContract = exports.ReleaseOutreachLeaseResponseSchema = exports.ReleaseOutreachLeaseBodySchema = exports.ConfirmOutreachSentResponseSchema = exports.ConfirmOutreachSentBodySchema = exports.ClaimNextOutreachResponseSchema = exports.ClaimNextOutreachBodySchema = exports.OUTREACH_LEASE_TTL_MINUTES = void 0;
4
+ /**
5
+ * Project: Internal Recruitment Platform API
6
+ * File: outreach.contract.ts
7
+ *
8
+ * Description: The outreach claim contract — claim one candidate, confirm the
9
+ * send, or hand the candidate back unsent. Claiming one at a time (rather than
10
+ * exporting a list) means eligibility is evaluated at the moment of sending,
11
+ * reuses the existing one-active-reveal-per-worker lock so an automated send
12
+ * and a human agent contend for the same lock, and keeps one phone number in
13
+ * flight at a time.
14
+ *
15
+ * Auth: Bearer token in the `authorization` header, issued to a service
16
+ * account. Nothing in these routes' protection depends on the route being
17
+ * unknown — this package is published publicly.
18
+ */
19
+ const core_1 = require("@ts-rest/core");
20
+ const error_schemas_1 = require("../common/error-schemas");
21
+ const zod_1 = require("zod");
22
+ const outreach_schemas_1 = require("./outreach.schemas");
23
+ const c = (0, core_1.initContract)();
24
+ /**
25
+ * How long a lease is held before it lapses and the candidate returns to the
26
+ * pool. There is no renewal endpoint: a heartbeat is more machinery than this
27
+ * needs, and a send still running after this long has gone wrong.
28
+ *
29
+ * The value must comfortably exceed the send path — a contact save, a chat
30
+ * open, up to three bubbles with inter-bubble delays, and verification backoff
31
+ * — or an expired-then-reclaimed candidate is messaged twice by two handsets.
32
+ */
33
+ exports.OUTREACH_LEASE_TTL_MINUTES = 15;
34
+ /**
35
+ * Eligibility is server-side policy and takes NO parameters. The commute
36
+ * budget, the do-not-contact and cool-down suppressions, and the exclusion of
37
+ * booked or already-dispositioned candidates all live in the handler. No future
38
+ * revision should add a "max minutes" argument here.
39
+ */
40
+ exports.ClaimNextOutreachBodySchema = zod_1.z
41
+ .object({
42
+ deviceId: outreach_schemas_1.OutreachDeviceIdSchema,
43
+ })
44
+ .openapi({ title: 'ClaimNextOutreachBody' });
45
+ /**
46
+ * An empty pool is not an error. Both outcomes are 200, discriminated on
47
+ * `status`, because the caller does opposite things in the two cases — wind
48
+ * the campaign down versus back off and retry — and must be able to tell them
49
+ * apart without parsing an error string. The discriminated union guarantees
50
+ * `lease`, `candidate` and `job` are inaccessible without first narrowing on
51
+ * `status` — it does not force a consumer to handle every branch.
52
+ */
53
+ exports.ClaimNextOutreachResponseSchema = zod_1.z
54
+ .discriminatedUnion('status', [
55
+ zod_1.z.object({
56
+ status: zod_1.z.literal('CLAIMED'),
57
+ lease: outreach_schemas_1.OutreachLeaseSchema,
58
+ candidate: outreach_schemas_1.OutreachCandidateSchema,
59
+ job: outreach_schemas_1.OutreachJobSchema,
60
+ }),
61
+ zod_1.z.object({
62
+ status: zod_1.z.literal('POOL_EMPTY'),
63
+ }),
64
+ ])
65
+ .openapi({ title: 'ClaimNextOutreachResponse' });
66
+ /**
67
+ * `variantKey` and `metadata` are recorded but otherwise unused today. They
68
+ * exist now so the later message-variant experiment needs no contract change
69
+ * to become measurable.
70
+ *
71
+ * `deliveryVerified` distinguishes a send whose bubble was seen in the
72
+ * WhatsApp UI from one that was tapped but never confirmed. Both count as
73
+ * contacted. The flag exists so the second kind can be excluded from analysis
74
+ * and reviewed by a human — NOT so it can be retried.
75
+ */
76
+ exports.ConfirmOutreachSentBodySchema = zod_1.z
77
+ .object({
78
+ deviceId: outreach_schemas_1.OutreachDeviceIdSchema,
79
+ variantKey: zod_1.z
80
+ .string()
81
+ .min(1)
82
+ .max(100)
83
+ .describe('Which message variant was rendered'),
84
+ deliveryVerified: zod_1.z
85
+ .boolean()
86
+ .describe('True when the sent bubble was observed in the WhatsApp UI'),
87
+ sentAt: zod_1.z
88
+ .string()
89
+ .datetime()
90
+ .describe('ISO-8601 UTC instant the send was performed'),
91
+ metadata: zod_1.z
92
+ .record(zod_1.z.unknown())
93
+ .optional()
94
+ .describe('Free-form caller diagnostics. Recorded, never interpreted.'),
95
+ })
96
+ .openapi({ title: 'ConfirmOutreachSentBody' });
97
+ /**
98
+ * Confirming twice is a success, not a conflict, and confirming against an
99
+ * expired lease is recorded too — flagged via `lateConfirm`. The message really
100
+ * was sent; refusing to record it is how a worker gets messaged twice.
101
+ */
102
+ exports.ConfirmOutreachSentResponseSchema = zod_1.z
103
+ .object({
104
+ recorded: zod_1.z.literal(true),
105
+ lateConfirm: zod_1.z
106
+ .boolean()
107
+ .describe('True when the lease had already expired at confirm time'),
108
+ })
109
+ .openapi({ title: 'ConfirmOutreachSentResponse' });
110
+ /**
111
+ * Hands a candidate back to the pool unsent. For failures BEFORE the send
112
+ * button is tapped — a contact save that failed, a chat that would not open, a
113
+ * compose step that errored. Never after a send.
114
+ */
115
+ exports.ReleaseOutreachLeaseBodySchema = zod_1.z
116
+ .object({
117
+ deviceId: outreach_schemas_1.OutreachDeviceIdSchema,
118
+ reason: outreach_schemas_1.OutreachReleaseReasonSchema,
119
+ detail: zod_1.z
120
+ .string()
121
+ .max(500)
122
+ .optional()
123
+ .describe('Free-text elaboration, most useful alongside OTHER'),
124
+ })
125
+ .openapi({ title: 'ReleaseOutreachLeaseBody' });
126
+ exports.ReleaseOutreachLeaseResponseSchema = zod_1.z
127
+ .object({
128
+ released: zod_1.z.literal(true),
129
+ })
130
+ .openapi({ title: 'ReleaseOutreachLeaseResponse' });
131
+ exports.outreachContract = c.router({
132
+ claimNext: {
133
+ method: 'POST',
134
+ path: '/outreach/jobs/:jobId/claim-next',
135
+ pathParams: zod_1.z.object({
136
+ jobId: zod_1.z.string().uuid().describe('Job to claim a candidate for'),
137
+ }),
138
+ body: exports.ClaimNextOutreachBodySchema,
139
+ responses: {
140
+ // Exhaustion is a 200 with status POOL_EMPTY, never an error.
141
+ 200: exports.ClaimNextOutreachResponseSchema,
142
+ // A genuine conflict: the candidate was locked by someone else between
143
+ // selection and insert. The caller backs off and re-claims.
144
+ 409: error_schemas_1.ErrorResponseSchema,
145
+ },
146
+ summary: 'Claim the next eligible candidate for a job',
147
+ description: 'Idempotent per device: a device that already holds an active lease ' +
148
+ 'gets that lease back rather than an error, so a request that times ' +
149
+ 'out after the server created the lease is safe to retry. Eligibility ' +
150
+ 'is server-side policy and takes no parameters.',
151
+ metadata: { tags: ['Outreach'] },
152
+ },
153
+ confirmSent: {
154
+ method: 'POST',
155
+ path: '/outreach/leases/:leaseId/sent',
156
+ pathParams: zod_1.z.object({
157
+ leaseId: zod_1.z.string().uuid().describe('Lease being confirmed'),
158
+ }),
159
+ body: exports.ConfirmOutreachSentBodySchema,
160
+ responses: {
161
+ 200: exports.ConfirmOutreachSentResponseSchema,
162
+ // The lease was never issued, or has been swept.
163
+ 404: error_schemas_1.ErrorResponseSchema,
164
+ },
165
+ summary: 'Confirm that a message was sent under a lease',
166
+ description: 'Idempotent: confirming twice succeeds. An expired lease is accepted ' +
167
+ 'and recorded with lateConfirm=true — the message really was sent, ' +
168
+ 'and refusing to record it is how a worker gets messaged twice.',
169
+ metadata: { tags: ['Outreach'] },
170
+ },
171
+ release: {
172
+ method: 'POST',
173
+ path: '/outreach/leases/:leaseId/release',
174
+ pathParams: zod_1.z.object({
175
+ leaseId: zod_1.z.string().uuid().describe('Lease being released'),
176
+ }),
177
+ body: exports.ReleaseOutreachLeaseBodySchema,
178
+ responses: {
179
+ 200: exports.ReleaseOutreachLeaseResponseSchema,
180
+ 404: error_schemas_1.ErrorResponseSchema,
181
+ },
182
+ summary: 'Return a claimed candidate to the pool unsent',
183
+ description: 'For failures before the send button is tapped. Never after a send — ' +
184
+ 'a tapped send is confirmed, not released.',
185
+ metadata: { tags: ['Outreach'] },
186
+ },
187
+ }, {
188
+ pathPrefix: '/v2',
189
+ commonResponses: {
190
+ 400: error_schemas_1.ErrorResponseSchema,
191
+ 401: error_schemas_1.ErrorResponseSchema,
192
+ 403: error_schemas_1.ErrorResponseSchema,
193
+ 500: error_schemas_1.ErrorResponseSchema,
194
+ },
195
+ });
@@ -0,0 +1,113 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Which lane the claimed candidate lives in. `subjectId` is scoped by this:
4
+ * an OWNED subject is a `workers` row, a CURATED subject is a
5
+ * `curated_workers` row.
6
+ *
7
+ * `subjectKind` does NOT determine `canonicalKind`: an OWNED subject backed
8
+ * by a linked `curated_workers` row resolves to canonicalKind
9
+ * `CURATED_WORKER`, not `WORKER`. The pair `(canonicalKind, canonicalId)` —
10
+ * never `canonicalId` alone — is the canonical identity that spans both
11
+ * lanes.
12
+ */
13
+ export declare const OutreachSubjectKindSchema: z.ZodEnum<["OWNED", "CURATED"]>;
14
+ export type OutreachSubjectKind = z.infer<typeof OutreachSubjectKindSchema>;
15
+ /**
16
+ * The table `canonicalId` is a row id in: `WORKER` for `workers`,
17
+ * `CURATED_WORKER` for `curated_workers`. This is NOT derivable from
18
+ * `subjectKind` (see the note on that schema) — it must travel alongside
19
+ * `canonicalId` rather than be inferred from it, because the pair is what
20
+ * every ledger table keys canonical identity on.
21
+ */
22
+ export declare const OutreachCanonicalKindSchema: z.ZodEnum<["WORKER", "CURATED_WORKER"]>;
23
+ export type OutreachCanonicalKind = z.infer<typeof OutreachCanonicalKindSchema>;
24
+ /**
25
+ * The mode the returned `commuteMinutes` was MEASURED against, after the
26
+ * server-side fallback is applied — a candidate with no saved transportation
27
+ * method comes back as PUBLIC_TRANSPORT, never null.
28
+ *
29
+ * Only two values exist because proximity measures exactly two things:
30
+ * drive minutes and transit minutes. This is not the worker's saved
31
+ * transportation method (OWN_CAR / OWN_VAN / MOTORCYCLE / …) — reporting
32
+ * OWN_VAN would imply a measurement that does not exist. The consumer renders
33
+ * from this field and never re-derives it.
34
+ */
35
+ export declare const OutreachTransportModeSchema: z.ZodEnum<["DRIVE", "PUBLIC_TRANSPORT"]>;
36
+ export type OutreachTransportMode = z.infer<typeof OutreachTransportModeSchema>;
37
+ /**
38
+ * An opaque correlation key for the handset that produced an outcome. This API
39
+ * never parses it, never validates it against a registry, and stores no device
40
+ * table — the caller owns what a device is. The bounds exist only to keep a
41
+ * runaway value out of the database.
42
+ */
43
+ export declare const OutreachDeviceIdSchema: z.ZodString;
44
+ export type OutreachDeviceId = z.infer<typeof OutreachDeviceIdSchema>;
45
+ /**
46
+ * Why a lease was handed back unsent. Only for failures BEFORE the send button
47
+ * is tapped; a tapped send is confirmed, never released.
48
+ */
49
+ export declare const OutreachReleaseReasonSchema: z.ZodEnum<["CONTACT_SAVE_FAILED", "CHAT_OPEN_FAILED", "COMPOSE_FAILED", "OTHER"]>;
50
+ export type OutreachReleaseReason = z.infer<typeof OutreachReleaseReasonSchema>;
51
+ export declare const OutreachLeaseSchema: z.ZodObject<{
52
+ leaseId: z.ZodString;
53
+ expiresAt: z.ZodString;
54
+ }, "strip", z.ZodTypeAny, {
55
+ leaseId: string;
56
+ expiresAt: string;
57
+ }, {
58
+ leaseId: string;
59
+ expiresAt: string;
60
+ }>;
61
+ export type OutreachLease = z.infer<typeof OutreachLeaseSchema>;
62
+ export declare const OutreachCandidateSchema: z.ZodObject<{
63
+ subjectKind: z.ZodEnum<["OWNED", "CURATED"]>;
64
+ subjectId: z.ZodString;
65
+ canonicalKind: z.ZodEnum<["WORKER", "CURATED_WORKER"]>;
66
+ canonicalId: z.ZodString;
67
+ name: z.ZodString;
68
+ phoneNumber: z.ZodString;
69
+ commuteMinutes: z.ZodNumber;
70
+ transportMode: z.ZodEnum<["DRIVE", "PUBLIC_TRANSPORT"]>;
71
+ }, "strip", z.ZodTypeAny, {
72
+ subjectKind: "OWNED" | "CURATED";
73
+ subjectId: string;
74
+ canonicalKind: "WORKER" | "CURATED_WORKER";
75
+ canonicalId: string;
76
+ name: string;
77
+ phoneNumber: string;
78
+ commuteMinutes: number;
79
+ transportMode: "DRIVE" | "PUBLIC_TRANSPORT";
80
+ }, {
81
+ subjectKind: "OWNED" | "CURATED";
82
+ subjectId: string;
83
+ canonicalKind: "WORKER" | "CURATED_WORKER";
84
+ canonicalId: string;
85
+ name: string;
86
+ phoneNumber: string;
87
+ commuteMinutes: number;
88
+ transportMode: "DRIVE" | "PUBLIC_TRANSPORT";
89
+ }>;
90
+ export type OutreachCandidate = z.infer<typeof OutreachCandidateSchema>;
91
+ /**
92
+ * Enough of the job to compose a message. Everything but the title is nullable
93
+ * because real jobs routinely lack pay or trade text, and a missing field must
94
+ * not make a candidate unclaimable.
95
+ */
96
+ export declare const OutreachJobSchema: z.ZodObject<{
97
+ title: z.ZodString;
98
+ trade: z.ZodNullable<z.ZodString>;
99
+ payText: z.ZodNullable<z.ZodString>;
100
+ locationText: z.ZodNullable<z.ZodString>;
101
+ }, "strip", z.ZodTypeAny, {
102
+ title: string;
103
+ trade: string | null;
104
+ payText: string | null;
105
+ locationText: string | null;
106
+ }, {
107
+ title: string;
108
+ trade: string | null;
109
+ payText: string | null;
110
+ locationText: string | null;
111
+ }>;
112
+ export type OutreachJob = z.infer<typeof OutreachJobSchema>;
113
+ //# sourceMappingURL=outreach.schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outreach.schemas.d.ts","sourceRoot":"","sources":["../../contracts/outreach/outreach.schemas.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB,iCAEM,CAAC;AAE7C,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,yCAEM,CAAC;AAE/C,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,0CAEM,CAAC;AAE/C,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,aAIkC,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,2BAA2B,mFAEM,CAAC;AAE/C,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,mBAAmB;;;;;;;;;EAQM,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCM,CAAC;AAE3C,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;EAOM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OutreachJobSchema = exports.OutreachCandidateSchema = exports.OutreachLeaseSchema = exports.OutreachReleaseReasonSchema = exports.OutreachDeviceIdSchema = exports.OutreachTransportModeSchema = exports.OutreachCanonicalKindSchema = exports.OutreachSubjectKindSchema = void 0;
4
+ /**
5
+ * Project: Internal Recruitment Platform API
6
+ * File: outreach.schemas.ts
7
+ *
8
+ * Description: Primitive shapes for the outreach claim contract — the wire
9
+ * format between this API and Relay Lab, which drives owned Android handsets
10
+ * through the real WhatsApp UI.
11
+ *
12
+ * Auth: these routes use the platform's existing scheme, a Bearer token in the
13
+ * `authorization` header, issued to a service account. The header is not
14
+ * declared in the contract (no route in this package declares headers); it is
15
+ * documented here so an external consumer knows what to send.
16
+ *
17
+ * This module deliberately defines its own shapes rather than importing from
18
+ * `workers`, `jobs` or `curated-worker-leads`: those contracts are densely
19
+ * cross-linked, and a consumer outside this monorepo should not have to compile
20
+ * the booking, crew and qualification graph to claim a candidate.
21
+ */
22
+ const zod_openapi_1 = require("@anatine/zod-openapi");
23
+ const zod_1 = require("zod");
24
+ (0, zod_openapi_1.extendZodWithOpenApi)(zod_1.z);
25
+ /**
26
+ * Which lane the claimed candidate lives in. `subjectId` is scoped by this:
27
+ * an OWNED subject is a `workers` row, a CURATED subject is a
28
+ * `curated_workers` row.
29
+ *
30
+ * `subjectKind` does NOT determine `canonicalKind`: an OWNED subject backed
31
+ * by a linked `curated_workers` row resolves to canonicalKind
32
+ * `CURATED_WORKER`, not `WORKER`. The pair `(canonicalKind, canonicalId)` —
33
+ * never `canonicalId` alone — is the canonical identity that spans both
34
+ * lanes.
35
+ */
36
+ exports.OutreachSubjectKindSchema = zod_1.z
37
+ .enum(['OWNED', 'CURATED'])
38
+ .openapi({ title: 'OutreachSubjectKind' });
39
+ /**
40
+ * The table `canonicalId` is a row id in: `WORKER` for `workers`,
41
+ * `CURATED_WORKER` for `curated_workers`. This is NOT derivable from
42
+ * `subjectKind` (see the note on that schema) — it must travel alongside
43
+ * `canonicalId` rather than be inferred from it, because the pair is what
44
+ * every ledger table keys canonical identity on.
45
+ */
46
+ exports.OutreachCanonicalKindSchema = zod_1.z
47
+ .enum(['WORKER', 'CURATED_WORKER'])
48
+ .openapi({ title: 'OutreachCanonicalKind' });
49
+ /**
50
+ * The mode the returned `commuteMinutes` was MEASURED against, after the
51
+ * server-side fallback is applied — a candidate with no saved transportation
52
+ * method comes back as PUBLIC_TRANSPORT, never null.
53
+ *
54
+ * Only two values exist because proximity measures exactly two things:
55
+ * drive minutes and transit minutes. This is not the worker's saved
56
+ * transportation method (OWN_CAR / OWN_VAN / MOTORCYCLE / …) — reporting
57
+ * OWN_VAN would imply a measurement that does not exist. The consumer renders
58
+ * from this field and never re-derives it.
59
+ */
60
+ exports.OutreachTransportModeSchema = zod_1.z
61
+ .enum(['DRIVE', 'PUBLIC_TRANSPORT'])
62
+ .openapi({ title: 'OutreachTransportMode' });
63
+ /**
64
+ * An opaque correlation key for the handset that produced an outcome. This API
65
+ * never parses it, never validates it against a registry, and stores no device
66
+ * table — the caller owns what a device is. The bounds exist only to keep a
67
+ * runaway value out of the database.
68
+ */
69
+ exports.OutreachDeviceIdSchema = zod_1.z
70
+ .string()
71
+ .min(1)
72
+ .max(200)
73
+ .describe('Opaque, caller-owned handset identifier. Never parsed.');
74
+ /**
75
+ * Why a lease was handed back unsent. Only for failures BEFORE the send button
76
+ * is tapped; a tapped send is confirmed, never released.
77
+ */
78
+ exports.OutreachReleaseReasonSchema = zod_1.z
79
+ .enum(['CONTACT_SAVE_FAILED', 'CHAT_OPEN_FAILED', 'COMPOSE_FAILED', 'OTHER'])
80
+ .openapi({ title: 'OutreachReleaseReason' });
81
+ exports.OutreachLeaseSchema = zod_1.z
82
+ .object({
83
+ leaseId: zod_1.z.string().uuid().describe('Lease identifier'),
84
+ expiresAt: zod_1.z
85
+ .string()
86
+ .datetime()
87
+ .describe('ISO-8601 UTC instant the lease lapses'),
88
+ })
89
+ .openapi({ title: 'OutreachLease' });
90
+ exports.OutreachCandidateSchema = zod_1.z
91
+ .object({
92
+ subjectKind: exports.OutreachSubjectKindSchema,
93
+ subjectId: zod_1.z
94
+ .string()
95
+ .uuid()
96
+ .describe('Row id within the lane named by subjectKind'),
97
+ canonicalKind: exports.OutreachCanonicalKindSchema,
98
+ canonicalId: zod_1.z
99
+ .string()
100
+ .uuid()
101
+ .describe('Canonical worker row id. Not derivable from subjectKind: the pair ' +
102
+ '(canonicalKind, canonicalId) — not canonicalId alone — is the ' +
103
+ 'canonical identity that spans the owned and curated lanes.'),
104
+ name: zod_1.z.string().min(1).describe('Display name'),
105
+ phoneNumber: zod_1.z
106
+ .string()
107
+ .min(1)
108
+ .describe('E.164 phone number. Not re-validated on the way out: a real number ' +
109
+ 'that a validator dislikes must still be sendable.'),
110
+ commuteMinutes: zod_1.z
111
+ .number()
112
+ .nonnegative()
113
+ .describe('Door-to-door minutes for transportMode. Not necessarily a whole ' +
114
+ 'number: the source proximity columns are floats. Never null: ' +
115
+ 'eligibility is strict on unknown travel times, so a claimed ' +
116
+ 'candidate always has one.'),
117
+ transportMode: exports.OutreachTransportModeSchema,
118
+ })
119
+ .openapi({ title: 'OutreachCandidate' });
120
+ /**
121
+ * Enough of the job to compose a message. Everything but the title is nullable
122
+ * because real jobs routinely lack pay or trade text, and a missing field must
123
+ * not make a candidate unclaimable.
124
+ */
125
+ exports.OutreachJobSchema = zod_1.z
126
+ .object({
127
+ title: zod_1.z.string().min(1).describe('Job title'),
128
+ trade: zod_1.z.string().nullable().describe('Trade label, if known'),
129
+ payText: zod_1.z.string().nullable().describe('Pay as displayed, if known'),
130
+ locationText: zod_1.z.string().nullable().describe('Location as displayed'),
131
+ })
132
+ .openapi({ title: 'OutreachJob' });