@dakkitor/api-contracts 1.1.153 → 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.
- package/dist/abilities/abilities.contract.d.ts +53 -1
- package/dist/abilities/abilities.contract.d.ts.map +1 -1
- package/dist/abilities/abilities.contract.js +92 -1
- package/dist/abilities/abilities.contract.spec.d.ts +2 -0
- package/dist/abilities/abilities.contract.spec.d.ts.map +1 -0
- package/dist/abilities/abilities.contract.spec.js +145 -0
- package/dist/abilities/admin-dashboard.abilities.test.d.ts +2 -0
- package/dist/abilities/admin-dashboard.abilities.test.d.ts.map +1 -0
- package/dist/abilities/admin-dashboard.abilities.test.js +33 -0
- package/dist/abilities/admin.abilities.json +19 -0
- package/dist/abilities/bot.abilities.json +13 -4
- package/dist/abilities/first-agent.abilities.json +317 -70
- package/dist/abilities/interconnection.abilities.json +75 -0
- package/dist/abilities/kpi.abilities.json +68 -0
- package/dist/abilities/office-manager.abilities.json +111 -0
- package/dist/abilities/second-agent.abilities.json +417 -43
- package/dist/abilities/team-leads.json +71 -6
- package/dist/abilities/worker-curator.abilities.json +233 -0
- package/dist/actives/actives.contract.d.ts +19379 -23651
- package/dist/actives/actives.contract.d.ts.map +1 -1
- package/dist/actives/actives.contract.js +517 -114
- package/dist/agent-client-links/agent-client-links.contract.d.ts +1431 -291
- package/dist/agent-client-links/agent-client-links.contract.d.ts.map +1 -1
- package/dist/auth/auth.contract.d.ts +1050 -81
- package/dist/auth/auth.contract.d.ts.map +1 -1
- package/dist/auth/auth.contract.js +115 -3
- package/dist/bookings/booking-worker-summary.spec.d.ts +2 -0
- package/dist/bookings/booking-worker-summary.spec.d.ts.map +1 -0
- package/dist/bookings/booking-worker-summary.spec.js +25 -0
- package/dist/bookings/bookings.contract.d.ts +20643 -26117
- package/dist/bookings/bookings.contract.d.ts.map +1 -1
- package/dist/bookings/bookings.contract.js +383 -91
- package/dist/bookings/bookings.contract.spec.d.ts +2 -0
- package/dist/bookings/bookings.contract.spec.d.ts.map +1 -0
- package/dist/bookings/bookings.contract.spec.js +11 -0
- package/dist/bookings/job-lock.spec.d.ts +2 -0
- package/dist/bookings/job-lock.spec.d.ts.map +1 -0
- package/dist/bookings/job-lock.spec.js +56 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts +232 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts.map +1 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.js +64 -0
- package/dist/call-history/call-history.contract.d.ts +1336 -767
- package/dist/call-history/call-history.contract.d.ts.map +1 -1
- package/dist/call-history/call-history.contract.js +86 -10
- package/dist/calls-feed/calls-feed.contract.d.ts +417 -0
- package/dist/calls-feed/calls-feed.contract.d.ts.map +1 -0
- package/dist/calls-feed/calls-feed.contract.js +32 -0
- package/dist/client-contacts/client-contacts.contract.d.ts +410 -226
- package/dist/client-contacts/client-contacts.contract.d.ts.map +1 -1
- package/dist/client-contacts/client-contacts.contract.js +35 -4
- package/dist/clients/clients.contract.d.ts +227 -73
- package/dist/clients/clients.contract.d.ts.map +1 -1
- package/dist/clients/clients.contract.js +45 -21
- package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts +2908 -1834
- package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts.map +1 -1
- package/dist/collaboration-checkings/collaboration-checkings.contract.js +14 -9
- package/dist/collaborations/collaborations.contract.d.ts +2676 -1409
- package/dist/collaborations/collaborations.contract.d.ts.map +1 -1
- package/dist/collaborations/collaborations.contract.js +33 -9
- package/dist/common/call-rating.schema.d.ts.map +1 -1
- package/dist/common/call-rating.schema.js +4 -2
- package/dist/common/common-schemas.d.ts +59 -11
- package/dist/common/common-schemas.d.ts.map +1 -1
- package/dist/common/common-schemas.js +55 -29
- package/dist/common/error-schemas.d.ts +2 -2
- package/dist/common/pagination-query.schema.d.ts +13 -2
- package/dist/common/pagination-query.schema.d.ts.map +1 -1
- package/dist/common/pagination-query.schema.js +21 -2
- package/dist/common/pagination-query.schema.spec.d.ts +2 -0
- package/dist/common/pagination-query.schema.spec.d.ts.map +1 -0
- package/dist/common/pagination-query.schema.spec.js +53 -0
- package/dist/companies/companies.contract.d.ts +53 -28
- package/dist/companies/companies.contract.d.ts.map +1 -1
- package/dist/companies/companies.contract.js +11 -10
- package/dist/crews/crews.contract.d.ts +1010 -196
- package/dist/crews/crews.contract.d.ts.map +1 -1
- package/dist/crews/crews.contract.js +98 -17
- package/dist/crews/crews.contract.spec.d.ts +2 -0
- package/dist/crews/crews.contract.spec.d.ts.map +1 -0
- package/dist/crews/crews.contract.spec.js +67 -0
- package/dist/cron-executions/cron-executions.contract.d.ts +988 -59
- package/dist/cron-executions/cron-executions.contract.d.ts.map +1 -1
- package/dist/cron-executions/cron-executions.contract.js +127 -7
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts +2 -0
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.js +40 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts +2 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.js +16 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.d.ts +21650 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.js +921 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.js +51 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts +2364 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.js +173 -0
- package/dist/curated-worker-leads/consent-queue.contract.d.ts +4497 -0
- package/dist/curated-worker-leads/consent-queue.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/consent-queue.contract.js +201 -0
- package/dist/curated-worker-leads/contact-history.spec.d.ts +2 -0
- package/dist/curated-worker-leads/contact-history.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/contact-history.spec.js +88 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.js +315 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts +489 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.js +88 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts +135 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.js +32 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.js +157 -0
- package/dist/curated-worker-leads/job-candidates.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-candidates.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-candidates.spec.js +140 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.js +19 -0
- package/dist/curated-worker-leads/jobs-tab.contract.d.ts +18365 -0
- package/dist/curated-worker-leads/jobs-tab.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/jobs-tab.contract.js +642 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.d.ts +348 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.js +51 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts +1116 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.js +93 -0
- package/dist/curated-workers/curated-filter-additions.spec.d.ts +2 -0
- package/dist/curated-workers/curated-filter-additions.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-filter-additions.spec.js +17 -0
- package/dist/curated-workers/curated-job-seeking.spec.d.ts +2 -0
- package/dist/curated-workers/curated-job-seeking.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-job-seeking.spec.js +53 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.d.ts +2 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.js +38 -0
- package/dist/curated-workers/curated-workers.contract.d.ts +6160 -1906
- package/dist/curated-workers/curated-workers.contract.d.ts.map +1 -1
- package/dist/curated-workers/curated-workers.contract.js +333 -51
- package/dist/dashboards/agent-daily-metrics.contract.d.ts +10 -10
- package/dist/dashboards/agent-daily-metrics.contract.js +1 -1
- package/dist/dashboards/dashboard-widgets.contract.d.ts +3800 -496
- package/dist/dashboards/dashboard-widgets.contract.d.ts.map +1 -1
- package/dist/dashboards/dashboard-widgets.contract.js +527 -29
- package/dist/dashboards/dashboard.contract.d.ts +8 -8
- package/dist/document-intake/document-intake.contract.d.ts +3132 -0
- package/dist/document-intake/document-intake.contract.d.ts.map +1 -0
- package/dist/document-intake/document-intake.contract.js +418 -0
- package/dist/export-jobs/export-jobs.contract.d.ts +3918 -0
- package/dist/export-jobs/export-jobs.contract.d.ts.map +1 -0
- package/dist/export-jobs/export-jobs.contract.js +240 -0
- package/dist/exports-events/exports-events.schemas.d.ts +90 -0
- package/dist/exports-events/exports-events.schemas.d.ts.map +1 -0
- package/dist/exports-events/exports-events.schemas.js +56 -0
- package/dist/files/files.contract.d.ts +133 -126
- package/dist/files/files.contract.d.ts.map +1 -1
- package/dist/files/files.contract.js +8 -0
- package/dist/health/health.contract.d.ts +4 -4
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -1
- package/dist/interactions/interactions.contract.d.ts +162 -0
- package/dist/interactions/interactions.contract.d.ts.map +1 -0
- package/dist/interactions/interactions.contract.js +42 -0
- package/dist/job-clusters/job-clusters.contract.d.ts +1584 -0
- package/dist/job-clusters/job-clusters.contract.d.ts.map +1 -0
- package/dist/job-clusters/job-clusters.contract.js +133 -0
- package/dist/jobs/jobs.contract.d.ts +16517 -8495
- package/dist/jobs/jobs.contract.d.ts.map +1 -1
- package/dist/jobs/jobs.contract.js +394 -190
- package/dist/jobs/jobs.contract.spec.d.ts +2 -0
- package/dist/jobs/jobs.contract.spec.d.ts.map +1 -0
- package/dist/jobs/jobs.contract.spec.js +70 -0
- package/dist/kpi-impersonation/kpi-impersonation.contract.d.ts +75 -75
- package/dist/lead-assignments/lead-assignments.contract.d.ts +2933 -1122
- package/dist/lead-assignments/lead-assignments.contract.d.ts.map +1 -1
- package/dist/lead-assignments/lead-assignments.contract.js +29 -7
- package/dist/lead-distribution/agent-lead-distribution.contract.d.ts +328 -64
- package/dist/lead-distribution/agent-lead-distribution.contract.d.ts.map +1 -1
- package/dist/lead-distribution/agent-lead-distribution.contract.js +1 -1
- package/dist/lead-distribution/lead-distribution-config.contract.d.ts +31 -31
- package/dist/leads/leads.contract.d.ts +830 -368
- package/dist/leads/leads.contract.d.ts.map +1 -1
- package/dist/leads/leads.contract.js +106 -26
- package/dist/locations/locations.contract.d.ts +36 -36
- package/dist/notifications/notifications.contract.d.ts +1039 -0
- package/dist/notifications/notifications.contract.d.ts.map +1 -0
- package/dist/notifications/notifications.contract.js +110 -0
- package/dist/offices/offices.contract.d.ts +210 -60
- package/dist/offices/offices.contract.d.ts.map +1 -1
- package/dist/offices/offices.contract.js +18 -4
- package/dist/outreach/__tests__/outreach-claim.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-claim.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-claim.test.js +97 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.js +98 -0
- package/dist/outreach/__tests__/outreach-routes.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-routes.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-routes.test.js +57 -0
- package/dist/outreach/__tests__/outreach.schemas.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach.schemas.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach.schemas.test.js +140 -0
- package/dist/outreach/outreach.contract.d.ts +809 -0
- package/dist/outreach/outreach.contract.d.ts.map +1 -0
- package/dist/outreach/outreach.contract.js +195 -0
- package/dist/outreach/outreach.schemas.d.ts +113 -0
- package/dist/outreach/outreach.schemas.d.ts.map +1 -0
- package/dist/outreach/outreach.schemas.js +132 -0
- package/dist/own-research/own-research.contract.d.ts +1356 -552
- package/dist/own-research/own-research.contract.d.ts.map +1 -1
- package/dist/own-research/own-research.contract.js +14 -3
- package/dist/postcodes/postcodes.contract.d.ts +16 -16
- package/dist/proofs/proof-category.enum.d.ts +4 -0
- package/dist/proofs/proof-category.enum.d.ts.map +1 -0
- package/dist/proofs/proof-category.enum.js +5 -0
- package/dist/proofs/proof-entity-type.enum.d.ts +4 -0
- package/dist/proofs/proof-entity-type.enum.d.ts.map +1 -0
- package/dist/proofs/proof-entity-type.enum.js +5 -0
- package/dist/proofs/proof-type.enum.d.ts +28 -0
- package/dist/proofs/proof-type.enum.d.ts.map +1 -0
- package/dist/proofs/proof-type.enum.js +14 -0
- package/dist/proofs/proofs.contract.d.ts +3009 -0
- package/dist/proofs/proofs.contract.d.ts.map +1 -0
- package/dist/proofs/proofs.contract.js +92 -0
- package/dist/proofs/proofs.dtos.d.ts +1319 -0
- package/dist/proofs/proofs.dtos.d.ts.map +1 -0
- package/dist/proofs/proofs.dtos.js +178 -0
- package/dist/qualifications/qualifications.contract.d.ts +94 -94
- package/dist/realtime/data-changed.d.ts +21 -0
- package/dist/realtime/data-changed.d.ts.map +1 -0
- package/dist/realtime/data-changed.js +37 -0
- package/dist/shared/booking-history.schema.d.ts +27 -0
- package/dist/shared/booking-history.schema.d.ts.map +1 -0
- package/dist/shared/booking-history.schema.js +22 -0
- package/dist/shared/booking-history.spec.d.ts +2 -0
- package/dist/shared/booking-history.spec.d.ts.map +1 -0
- package/dist/shared/booking-history.spec.js +44 -0
- package/dist/shared/contact-suppressions.contract.d.ts +22 -0
- package/dist/shared/contact-suppressions.contract.d.ts.map +1 -0
- package/dist/shared/contact-suppressions.contract.js +13 -0
- package/dist/shared/live-booking.schema.d.ts +57 -0
- package/dist/shared/live-booking.schema.d.ts.map +1 -0
- package/dist/shared/live-booking.schema.js +34 -0
- package/dist/shared/summary-schemas.d.ts +218 -0
- package/dist/shared/summary-schemas.d.ts.map +1 -0
- package/dist/shared/summary-schemas.js +56 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts +2 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts.map +1 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.js +20 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts +2 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts.map +1 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.js +41 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.d.ts +43 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.d.ts.map +1 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.js +29 -0
- package/dist/sheets-sync/sheets-sync.contract.d.ts +7258 -0
- package/dist/sheets-sync/sheets-sync.contract.d.ts.map +1 -0
- package/dist/sheets-sync/sheets-sync.contract.js +323 -0
- package/dist/telegram/telegram.contract.d.ts +727 -0
- package/dist/telegram/telegram.contract.d.ts.map +1 -0
- package/dist/telegram/telegram.contract.js +75 -0
- package/dist/trades/trade-rate-assessment.d.ts +18 -0
- package/dist/trades/trade-rate-assessment.d.ts.map +1 -0
- package/dist/trades/trade-rate-assessment.js +46 -0
- package/dist/trades/trade-rate-assessment.spec.d.ts +2 -0
- package/dist/trades/trade-rate-assessment.spec.d.ts.map +1 -0
- package/dist/trades/trade-rate-assessment.spec.js +223 -0
- package/dist/trades/trades.contract.d.ts +111 -0
- package/dist/trades/trades.contract.d.ts.map +1 -1
- package/dist/trades/trades.contract.js +49 -1
- package/dist/trades/trades.contract.spec.d.ts +2 -0
- package/dist/trades/trades.contract.spec.d.ts.map +1 -0
- package/dist/trades/trades.contract.spec.js +173 -0
- package/dist/user-access-grants/build-user-access-grant-rules.d.ts +10 -0
- package/dist/user-access-grants/build-user-access-grant-rules.d.ts.map +1 -0
- package/dist/user-access-grants/build-user-access-grant-rules.js +69 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts +2 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts.map +1 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.js +77 -0
- package/dist/user-access-grants/user-access-grant-templates.json +454 -0
- package/dist/user-access-grants/user-access-grants.contract.d.ts +3886 -0
- package/dist/user-access-grants/user-access-grants.contract.d.ts.map +1 -0
- package/dist/user-access-grants/user-access-grants.contract.js +189 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.d.ts +2 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.d.ts.map +1 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.js +149 -0
- package/dist/users/users.contract.d.ts +1959 -349
- package/dist/users/users.contract.d.ts.map +1 -1
- package/dist/users/users.contract.js +222 -37
- package/dist/users/users.contract.spec.d.ts +2 -0
- package/dist/users/users.contract.spec.d.ts.map +1 -0
- package/dist/users/users.contract.spec.js +103 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts +4609 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts.map +1 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.js +409 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts +1511 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts.map +1 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.js +150 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts +1106 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.js +85 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts +2 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.js +216 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts +453 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.js +109 -0
- package/dist/workers/do-not-contact.contract.d.ts +46 -0
- package/dist/workers/do-not-contact.contract.d.ts.map +1 -0
- package/dist/workers/do-not-contact.contract.js +41 -0
- package/dist/workers/do-not-contact.contract.spec.d.ts +2 -0
- package/dist/workers/do-not-contact.contract.spec.d.ts.map +1 -0
- package/dist/workers/do-not-contact.contract.spec.js +47 -0
- package/dist/workers/duplicate-group-worker.spec.d.ts +2 -0
- package/dist/workers/duplicate-group-worker.spec.d.ts.map +1 -0
- package/dist/workers/duplicate-group-worker.spec.js +34 -0
- package/dist/workers/filter-exact-flags.spec.d.ts +2 -0
- package/dist/workers/filter-exact-flags.spec.d.ts.map +1 -0
- package/dist/workers/filter-exact-flags.spec.js +37 -0
- package/dist/workers/worker-source-attribution.contract.spec.d.ts +2 -0
- package/dist/workers/worker-source-attribution.contract.spec.d.ts.map +1 -0
- package/dist/workers/worker-source-attribution.contract.spec.js +442 -0
- package/dist/workers/worker-source.spec.d.ts +2 -0
- package/dist/workers/worker-source.spec.d.ts.map +1 -0
- package/dist/workers/worker-source.spec.js +13 -0
- package/dist/workers/worker-status-facets.spec.d.ts +2 -0
- package/dist/workers/worker-status-facets.spec.d.ts.map +1 -0
- package/dist/workers/worker-status-facets.spec.js +34 -0
- package/dist/workers/workers.contract.d.ts +19534 -5969
- package/dist/workers/workers.contract.d.ts.map +1 -1
- package/dist/workers/workers.contract.js +1096 -113
- package/dist/workers/workers.contract.spec.d.ts +2 -0
- package/dist/workers/workers.contract.spec.d.ts.map +1 -0
- package/dist/workers/workers.contract.spec.js +31 -0
- 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' });
|