@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.
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offices.contract.d.ts","sourceRoot":"","sources":["../../contracts/offices/offices.contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"offices.contract.d.ts","sourceRoot":"","sources":["../../contracts/offices/offices.contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIvB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;EAKM,CAAC;AAEtC,eAAO,MAAM,kBAAkB;;;;;;;;;EAWM,CAAC;AAEtC,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAEM,CAAC;AAGrC,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAClD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAG9D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoE3B,CAAC"}
|
|
@@ -6,19 +6,33 @@ const zod_1 = require("zod");
|
|
|
6
6
|
const error_schemas_1 = require("../common/error-schemas");
|
|
7
7
|
const c = (0, core_1.initContract)();
|
|
8
8
|
// --- Schemas ---
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
/** Inline to avoid circular dependency with users.contract (which imports OfficeSchema). */
|
|
10
|
+
const OfficeManagerSchema = zod_1.z.object({
|
|
11
|
+
id: zod_1.z.string().describe('The unique identifier of the user.'),
|
|
12
|
+
firstName: zod_1.z.string().describe('The first name of the user.'),
|
|
13
|
+
lastName: zod_1.z.string().describe('The last name of the user.'),
|
|
14
|
+
});
|
|
15
|
+
exports.OfficeSchema = zod_1.z.object({
|
|
11
16
|
id: zod_1.z.string().uuid().describe('Unique identifier for the office'),
|
|
12
17
|
name: zod_1.z.string().describe('Name of the office'),
|
|
18
|
+
managers: zod_1.z.array(OfficeManagerSchema).optional(),
|
|
13
19
|
});
|
|
14
20
|
exports.CreateOfficeSchema = zod_1.z
|
|
15
21
|
.object({
|
|
16
|
-
name: zod_1.z.string().min(1).max(255).describe('Name of the office'),
|
|
22
|
+
name: zod_1.z.string().trim().min(1).max(255).describe('Name of the office'),
|
|
23
|
+
managerIds: zod_1.z.array(zod_1.z.string().uuid()).optional(),
|
|
17
24
|
})
|
|
18
25
|
.openapi({ title: 'CreateOffice' });
|
|
19
26
|
exports.UpdateOfficeSchema = zod_1.z
|
|
20
27
|
.object({
|
|
21
|
-
name: zod_1.z
|
|
28
|
+
name: zod_1.z
|
|
29
|
+
.string()
|
|
30
|
+
.trim()
|
|
31
|
+
.min(1)
|
|
32
|
+
.max(255)
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Name of the office'),
|
|
35
|
+
managerIds: zod_1.z.array(zod_1.z.string().uuid()).optional(),
|
|
22
36
|
})
|
|
23
37
|
.openapi({ title: 'UpdateOffice' });
|
|
24
38
|
exports.OfficeArraySchema = zod_1.z
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outreach-claim.test.d.ts","sourceRoot":"","sources":["../../../contracts/outreach/__tests__/outreach-claim.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const outreach_contract_1 = require("../outreach.contract");
|
|
8
|
+
// --- request ---------------------------------------------------------------
|
|
9
|
+
node_assert_1.default.ok(outreach_contract_1.ClaimNextOutreachBodySchema.safeParse({ deviceId: 'rack-01' }).success);
|
|
10
|
+
// Eligibility is server-side policy and takes no parameters. A caller able to
|
|
11
|
+
// widen its own commute budget is a caller able to message someone the policy
|
|
12
|
+
// excluded, so unknown keys must not survive into the parsed body.
|
|
13
|
+
const widened = outreach_contract_1.ClaimNextOutreachBodySchema.safeParse({
|
|
14
|
+
deviceId: 'rack-01',
|
|
15
|
+
maxCommuteMinutes: 240,
|
|
16
|
+
});
|
|
17
|
+
node_assert_1.default.ok(widened.success);
|
|
18
|
+
node_assert_1.default.equal(Object.prototype.hasOwnProperty.call(widened.data, 'maxCommuteMinutes'), false);
|
|
19
|
+
node_assert_1.default.ok(!outreach_contract_1.ClaimNextOutreachBodySchema.safeParse({}).success);
|
|
20
|
+
// --- TTL -------------------------------------------------------------------
|
|
21
|
+
node_assert_1.default.equal(outreach_contract_1.OUTREACH_LEASE_TTL_MINUTES, 15);
|
|
22
|
+
// --- CLAIMED ---------------------------------------------------------------
|
|
23
|
+
const CLAIMED_PAYLOAD = {
|
|
24
|
+
status: 'CLAIMED',
|
|
25
|
+
lease: {
|
|
26
|
+
leaseId: '3f2504e0-4f89-41d3-9a0c-0305e82c3301',
|
|
27
|
+
expiresAt: '2026-07-28T10:15:00.000Z',
|
|
28
|
+
},
|
|
29
|
+
candidate: {
|
|
30
|
+
subjectKind: 'CURATED',
|
|
31
|
+
subjectId: '9c858901-8a57-4791-81fe-4c455b099bc9',
|
|
32
|
+
canonicalKind: 'CURATED_WORKER',
|
|
33
|
+
canonicalId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
|
|
34
|
+
name: 'Adam Kowalski',
|
|
35
|
+
phoneNumber: '+447700900123',
|
|
36
|
+
commuteMinutes: 45,
|
|
37
|
+
transportMode: 'PUBLIC_TRANSPORT',
|
|
38
|
+
},
|
|
39
|
+
job: {
|
|
40
|
+
title: 'Carpenter needed',
|
|
41
|
+
trade: 'CARPENTER',
|
|
42
|
+
payText: '£180/day',
|
|
43
|
+
locationText: 'Croydon, CR0',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
const claimed = outreach_contract_1.ClaimNextOutreachResponseSchema.safeParse(CLAIMED_PAYLOAD);
|
|
47
|
+
node_assert_1.default.ok(claimed.success);
|
|
48
|
+
node_assert_1.default.equal(claimed.data.status, 'CLAIMED');
|
|
49
|
+
// A CLAIMED response missing a required branch member is rejected.
|
|
50
|
+
const { job: _omittedJob, ...claimedWithoutJob } = CLAIMED_PAYLOAD;
|
|
51
|
+
node_assert_1.default.ok(!outreach_contract_1.ClaimNextOutreachResponseSchema.safeParse(claimedWithoutJob).success);
|
|
52
|
+
// --- POOL_EMPTY ------------------------------------------------------------
|
|
53
|
+
// An empty pool is a 200, not an error: the caller winds the campaign down
|
|
54
|
+
// rather than backing off, and must not have to parse an error string.
|
|
55
|
+
const empty = outreach_contract_1.ClaimNextOutreachResponseSchema.safeParse({
|
|
56
|
+
status: 'POOL_EMPTY',
|
|
57
|
+
});
|
|
58
|
+
node_assert_1.default.ok(empty.success);
|
|
59
|
+
node_assert_1.default.equal(empty.data.status, 'POOL_EMPTY');
|
|
60
|
+
// Both are instances of the SAME 200 schema.
|
|
61
|
+
node_assert_1.default.ok(claimed.success && empty.success, 'CLAIMED and POOL_EMPTY are both valid 200 bodies');
|
|
62
|
+
// POOL_EMPTY carries none of the CLAIMED members.
|
|
63
|
+
const pollutedEmpty = outreach_contract_1.ClaimNextOutreachResponseSchema.safeParse({
|
|
64
|
+
status: 'POOL_EMPTY',
|
|
65
|
+
candidate: CLAIMED_PAYLOAD.candidate,
|
|
66
|
+
});
|
|
67
|
+
node_assert_1.default.ok(pollutedEmpty.success);
|
|
68
|
+
node_assert_1.default.equal(Object.prototype.hasOwnProperty.call(pollutedEmpty.data, 'candidate'), false);
|
|
69
|
+
// An unrecognised discriminant is rejected outright.
|
|
70
|
+
node_assert_1.default.ok(!outreach_contract_1.ClaimNextOutreachResponseSchema.safeParse({ status: 'ERROR' }).success);
|
|
71
|
+
// --- compile-time discrimination -------------------------------------------
|
|
72
|
+
// These probes are never called at runtime. They exist so `tsc` (run by
|
|
73
|
+
// `bun run build`) fails if the union stops discriminating: an unsatisfied
|
|
74
|
+
// `@ts-expect-error` is itself a compile error.
|
|
75
|
+
function renderClaim(res) {
|
|
76
|
+
if (res.status === 'POOL_EMPTY')
|
|
77
|
+
return 'idle';
|
|
78
|
+
return `${res.candidate.name} -> ${res.job.title}`;
|
|
79
|
+
}
|
|
80
|
+
function _unguardedAccessMustNotTypecheck(res) {
|
|
81
|
+
// @ts-expect-error `candidate` exists only on the CLAIMED member.
|
|
82
|
+
void res.candidate;
|
|
83
|
+
}
|
|
84
|
+
void _unguardedAccessMustNotTypecheck;
|
|
85
|
+
function _partialHandlingMustNotTypecheck(res) {
|
|
86
|
+
if (res.status === 'CLAIMED')
|
|
87
|
+
return res.candidate.name;
|
|
88
|
+
// POOL_EMPTY is unhandled, so `res` is not narrowed to `never` here.
|
|
89
|
+
// @ts-expect-error a consumer that handles only one branch fails to typecheck.
|
|
90
|
+
const exhaustive = res;
|
|
91
|
+
return exhaustive;
|
|
92
|
+
}
|
|
93
|
+
void _partialHandlingMustNotTypecheck;
|
|
94
|
+
// The narrowing path does work.
|
|
95
|
+
node_assert_1.default.equal(renderClaim(claimed.data), 'Adam Kowalski -> Carpenter needed');
|
|
96
|
+
node_assert_1.default.equal(renderClaim(empty.data), 'idle');
|
|
97
|
+
console.log('outreach claim contract OK');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outreach-confirm-release.test.d.ts","sourceRoot":"","sources":["../../../contracts/outreach/__tests__/outreach-confirm-release.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const outreach_contract_1 = require("../outreach.contract");
|
|
8
|
+
const BASE_SENT = {
|
|
9
|
+
deviceId: 'rack-01',
|
|
10
|
+
variantKey: 'greeting_v2',
|
|
11
|
+
deliveryVerified: true,
|
|
12
|
+
sentAt: '2026-07-28T10:07:31.000Z',
|
|
13
|
+
};
|
|
14
|
+
// --- sent: required shape --------------------------------------------------
|
|
15
|
+
const sent = outreach_contract_1.ConfirmOutreachSentBodySchema.safeParse(BASE_SENT);
|
|
16
|
+
node_assert_1.default.ok(sent.success);
|
|
17
|
+
node_assert_1.default.equal(sent.data.deliveryVerified, true);
|
|
18
|
+
node_assert_1.default.equal(sent.data.metadata, undefined);
|
|
19
|
+
// deliveryVerified distinguishes a send whose bubble was SEEN from one that was
|
|
20
|
+
// tapped but never confirmed. Both count as contacted, so `false` is valid.
|
|
21
|
+
const unverified = outreach_contract_1.ConfirmOutreachSentBodySchema.safeParse({
|
|
22
|
+
...BASE_SENT,
|
|
23
|
+
deliveryVerified: false,
|
|
24
|
+
});
|
|
25
|
+
node_assert_1.default.ok(unverified.success);
|
|
26
|
+
// Missing required fields are rejected, one at a time.
|
|
27
|
+
for (const key of ['deviceId', 'variantKey', 'deliveryVerified', 'sentAt']) {
|
|
28
|
+
const partial = { ...BASE_SENT };
|
|
29
|
+
delete partial[key];
|
|
30
|
+
node_assert_1.default.ok(!outreach_contract_1.ConfirmOutreachSentBodySchema.safeParse(partial).success, `${key} must be required`);
|
|
31
|
+
}
|
|
32
|
+
// sentAt must be an instant, not a free string.
|
|
33
|
+
node_assert_1.default.ok(!outreach_contract_1.ConfirmOutreachSentBodySchema.safeParse({ ...BASE_SENT, sentAt: 'now' })
|
|
34
|
+
.success);
|
|
35
|
+
// --- deviceId is opaque ----------------------------------------------------
|
|
36
|
+
// It is a correlation key, not a parsed identifier. Anything non-empty goes,
|
|
37
|
+
// including values that look nothing like an ADB serial.
|
|
38
|
+
for (const deviceId of [
|
|
39
|
+
'emulator-5554',
|
|
40
|
+
'RF8N20XXXXX',
|
|
41
|
+
'shelf-3/slot-2 (spare)',
|
|
42
|
+
'urn:relay-lab:device:7',
|
|
43
|
+
'中文设备',
|
|
44
|
+
'x'.repeat(200),
|
|
45
|
+
]) {
|
|
46
|
+
node_assert_1.default.ok(outreach_contract_1.ConfirmOutreachSentBodySchema.safeParse({ ...BASE_SENT, deviceId }).success, `deviceId ${deviceId} must be accepted`);
|
|
47
|
+
}
|
|
48
|
+
node_assert_1.default.ok(!outreach_contract_1.ConfirmOutreachSentBodySchema.safeParse({ ...BASE_SENT, deviceId: '' })
|
|
49
|
+
.success);
|
|
50
|
+
// --- metadata round-trips an arbitrary nested object -----------------------
|
|
51
|
+
const metadata = {
|
|
52
|
+
attempt: 2,
|
|
53
|
+
bubbles: ['hi', 'details', 'cta'],
|
|
54
|
+
timings: { openMs: 812, sendMs: 1503, nested: { deep: { flag: true } } },
|
|
55
|
+
note: null,
|
|
56
|
+
};
|
|
57
|
+
const withMeta = outreach_contract_1.ConfirmOutreachSentBodySchema.safeParse({
|
|
58
|
+
...BASE_SENT,
|
|
59
|
+
metadata,
|
|
60
|
+
});
|
|
61
|
+
node_assert_1.default.ok(withMeta.success);
|
|
62
|
+
node_assert_1.default.deepStrictEqual(withMeta.data.metadata, metadata);
|
|
63
|
+
// --- sent: response --------------------------------------------------------
|
|
64
|
+
// Confirming against an expired lease still succeeds — the message really was
|
|
65
|
+
// sent, and refusing to record it is how a worker gets messaged twice.
|
|
66
|
+
const late = outreach_contract_1.ConfirmOutreachSentResponseSchema.safeParse({
|
|
67
|
+
recorded: true,
|
|
68
|
+
lateConfirm: true,
|
|
69
|
+
});
|
|
70
|
+
node_assert_1.default.ok(late.success);
|
|
71
|
+
node_assert_1.default.equal(late.data.lateConfirm, true);
|
|
72
|
+
node_assert_1.default.ok(outreach_contract_1.ConfirmOutreachSentResponseSchema.safeParse({
|
|
73
|
+
recorded: true,
|
|
74
|
+
lateConfirm: false,
|
|
75
|
+
}).success);
|
|
76
|
+
node_assert_1.default.ok(!outreach_contract_1.ConfirmOutreachSentResponseSchema.safeParse({ recorded: true }).success);
|
|
77
|
+
// --- release ---------------------------------------------------------------
|
|
78
|
+
const released = outreach_contract_1.ReleaseOutreachLeaseBodySchema.safeParse({
|
|
79
|
+
deviceId: 'rack-01',
|
|
80
|
+
reason: 'CHAT_OPEN_FAILED',
|
|
81
|
+
});
|
|
82
|
+
node_assert_1.default.ok(released.success);
|
|
83
|
+
node_assert_1.default.equal(released.data.detail, undefined);
|
|
84
|
+
node_assert_1.default.ok(outreach_contract_1.ReleaseOutreachLeaseBodySchema.safeParse({
|
|
85
|
+
deviceId: 'rack-01',
|
|
86
|
+
reason: 'OTHER',
|
|
87
|
+
detail: 'accessibility service restarted mid-compose',
|
|
88
|
+
}).success);
|
|
89
|
+
// Release is for failures BEFORE the send button is tapped, never after: there
|
|
90
|
+
// is no "already sent" reason.
|
|
91
|
+
node_assert_1.default.ok(!outreach_contract_1.ReleaseOutreachLeaseBodySchema.safeParse({
|
|
92
|
+
deviceId: 'rack-01',
|
|
93
|
+
reason: 'ALREADY_SENT',
|
|
94
|
+
}).success);
|
|
95
|
+
node_assert_1.default.ok(!outreach_contract_1.ReleaseOutreachLeaseBodySchema.safeParse({ deviceId: 'rack-01' }).success);
|
|
96
|
+
node_assert_1.default.ok(outreach_contract_1.ReleaseOutreachLeaseResponseSchema.safeParse({ released: true }).success);
|
|
97
|
+
node_assert_1.default.ok(!outreach_contract_1.ReleaseOutreachLeaseResponseSchema.safeParse({ released: false }).success);
|
|
98
|
+
console.log('outreach confirm/release contract OK');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outreach-routes.test.d.ts","sourceRoot":"","sources":["../../../contracts/outreach/__tests__/outreach-routes.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const index_1 = require("../../index");
|
|
8
|
+
const outreach_contract_1 = require("../outreach.contract");
|
|
9
|
+
// `pathPrefix: '/v2'` is applied by c.router, so the runtime paths are absolute.
|
|
10
|
+
node_assert_1.default.equal(outreach_contract_1.outreachContract.claimNext.method, 'POST');
|
|
11
|
+
node_assert_1.default.equal(outreach_contract_1.outreachContract.claimNext.path, '/v2/outreach/jobs/:jobId/claim-next');
|
|
12
|
+
node_assert_1.default.equal(outreach_contract_1.outreachContract.confirmSent.method, 'POST');
|
|
13
|
+
node_assert_1.default.equal(outreach_contract_1.outreachContract.confirmSent.path, '/v2/outreach/leases/:leaseId/sent');
|
|
14
|
+
node_assert_1.default.equal(outreach_contract_1.outreachContract.release.method, 'POST');
|
|
15
|
+
node_assert_1.default.equal(outreach_contract_1.outreachContract.release.path, '/v2/outreach/leases/:leaseId/release');
|
|
16
|
+
// Error taxonomy. Exhaustion is a 200, so claim-next declares no 404, and
|
|
17
|
+
// 410 is not used anywhere: a late confirm succeeds. `commonResponses` are
|
|
18
|
+
// merged into every route's `responses` by c.router, so 400, 401, 403 and 500
|
|
19
|
+
// appear here.
|
|
20
|
+
const declared = (route) => Object.keys(route.responses).map(Number).sort((a, b) => a - b);
|
|
21
|
+
node_assert_1.default.deepStrictEqual(declared(outreach_contract_1.outreachContract.claimNext), [200, 400, 401, 403, 409, 500]);
|
|
22
|
+
node_assert_1.default.deepStrictEqual(declared(outreach_contract_1.outreachContract.confirmSent), [200, 400, 401, 403, 404, 500]);
|
|
23
|
+
node_assert_1.default.deepStrictEqual(declared(outreach_contract_1.outreachContract.release), [200, 400, 401, 403, 404, 500]);
|
|
24
|
+
for (const route of [
|
|
25
|
+
outreach_contract_1.outreachContract.claimNext,
|
|
26
|
+
outreach_contract_1.outreachContract.confirmSent,
|
|
27
|
+
outreach_contract_1.outreachContract.release,
|
|
28
|
+
]) {
|
|
29
|
+
node_assert_1.default.ok(!Object.prototype.hasOwnProperty.call(route.responses, '410'), '410 is not used: an expired lease that is confirmed late succeeds');
|
|
30
|
+
}
|
|
31
|
+
// Path params are validated as uuids.
|
|
32
|
+
node_assert_1.default.ok(outreach_contract_1.outreachContract.claimNext.pathParams.safeParse({
|
|
33
|
+
jobId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
|
|
34
|
+
}).success);
|
|
35
|
+
node_assert_1.default.ok(!outreach_contract_1.outreachContract.claimNext.pathParams.safeParse({ jobId: 'nope' }).success);
|
|
36
|
+
node_assert_1.default.ok(outreach_contract_1.outreachContract.confirmSent.pathParams.safeParse({
|
|
37
|
+
leaseId: '3f2504e0-4f89-41d3-9a0c-0305e82c3301',
|
|
38
|
+
}).success);
|
|
39
|
+
// Following the codebase convention, no route declares headers: the Bearer
|
|
40
|
+
// token rides the existing `authorization` header and is documented in the
|
|
41
|
+
// module header, not typed here. `c.router`'s zodMerge(baseHeaders, headers)
|
|
42
|
+
// falls back to `Object.assign({}, undefined, undefined)` when neither side
|
|
43
|
+
// is a strict zod object, so an undeclared `headers` comes out as `{}` at
|
|
44
|
+
// runtime, not `undefined` — verified against the pre-existing
|
|
45
|
+
// `healthContract.check` route, which also declares no headers.
|
|
46
|
+
const headersOf = (route) => route.headers;
|
|
47
|
+
for (const route of [
|
|
48
|
+
outreach_contract_1.outreachContract.claimNext,
|
|
49
|
+
outreach_contract_1.outreachContract.confirmSent,
|
|
50
|
+
outreach_contract_1.outreachContract.release,
|
|
51
|
+
]) {
|
|
52
|
+
node_assert_1.default.deepStrictEqual(headersOf(route), {});
|
|
53
|
+
}
|
|
54
|
+
// Reachable from the aggregate router, which is what spec 2's controllers use.
|
|
55
|
+
node_assert_1.default.equal(index_1.apiContractRouter.Outreach.claimNext.method, 'POST');
|
|
56
|
+
node_assert_1.default.equal(index_1.apiContractRouter.Outreach.release.path, '/v2/outreach/leases/:leaseId/release');
|
|
57
|
+
console.log('outreach routes OK');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outreach.schemas.test.d.ts","sourceRoot":"","sources":["../../../contracts/outreach/__tests__/outreach.schemas.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const outreach_schemas_1 = require("../outreach.schemas");
|
|
8
|
+
// --- enums -----------------------------------------------------------------
|
|
9
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachSubjectKindSchema.safeParse('OWNED').success);
|
|
10
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachSubjectKindSchema.safeParse('CURATED').success);
|
|
11
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachSubjectKindSchema.safeParse('WORKER').success);
|
|
12
|
+
// The mode is the mode the commute figure was MEASURED against, not the
|
|
13
|
+
// worker's saved transportation method, so the six-value method enum is
|
|
14
|
+
// deliberately not reused here.
|
|
15
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachTransportModeSchema.safeParse('DRIVE').success);
|
|
16
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachTransportModeSchema.safeParse('PUBLIC_TRANSPORT').success);
|
|
17
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachTransportModeSchema.safeParse('OWN_VAN').success);
|
|
18
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachReleaseReasonSchema.safeParse('CONTACT_SAVE_FAILED').success);
|
|
19
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachReleaseReasonSchema.safeParse('CHAT_OPEN_FAILED').success);
|
|
20
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachReleaseReasonSchema.safeParse('COMPOSE_FAILED').success);
|
|
21
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachReleaseReasonSchema.safeParse('OTHER').success);
|
|
22
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachReleaseReasonSchema.safeParse('SENT').success);
|
|
23
|
+
// canonicalKind is a separate axis from subjectKind: an OWNED subject can
|
|
24
|
+
// legitimately carry canonicalKind CURATED_WORKER (see the candidate tests
|
|
25
|
+
// below), so both values must parse regardless of lane.
|
|
26
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachCanonicalKindSchema.safeParse('WORKER').success);
|
|
27
|
+
node_assert_1.default.ok(outreach_schemas_1.OutreachCanonicalKindSchema.safeParse('CURATED_WORKER').success);
|
|
28
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachCanonicalKindSchema.safeParse('OWNED').success);
|
|
29
|
+
// --- lease -----------------------------------------------------------------
|
|
30
|
+
const lease = outreach_schemas_1.OutreachLeaseSchema.safeParse({
|
|
31
|
+
leaseId: '3f2504e0-4f89-41d3-9a0c-0305e82c3301',
|
|
32
|
+
expiresAt: '2026-07-28T10:15:00.000Z',
|
|
33
|
+
});
|
|
34
|
+
node_assert_1.default.ok(lease.success);
|
|
35
|
+
node_assert_1.default.equal(lease.data.expiresAt, '2026-07-28T10:15:00.000Z');
|
|
36
|
+
// A missing required field is rejected.
|
|
37
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachLeaseSchema.safeParse({
|
|
38
|
+
leaseId: '3f2504e0-4f89-41d3-9a0c-0305e82c3301',
|
|
39
|
+
}).success);
|
|
40
|
+
// --- candidate -------------------------------------------------------------
|
|
41
|
+
const candidate = outreach_schemas_1.OutreachCandidateSchema.safeParse({
|
|
42
|
+
subjectKind: 'CURATED',
|
|
43
|
+
subjectId: '9c858901-8a57-4791-81fe-4c455b099bc9',
|
|
44
|
+
canonicalKind: 'CURATED_WORKER',
|
|
45
|
+
canonicalId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
|
|
46
|
+
name: 'Adam Kowalski',
|
|
47
|
+
phoneNumber: '+447700900123',
|
|
48
|
+
commuteMinutes: 45,
|
|
49
|
+
transportMode: 'PUBLIC_TRANSPORT',
|
|
50
|
+
});
|
|
51
|
+
node_assert_1.default.ok(candidate.success);
|
|
52
|
+
node_assert_1.default.equal(candidate.data.commuteMinutes, 45);
|
|
53
|
+
// commuteMinutes is a plain number, not an integer: the source proximity
|
|
54
|
+
// columns (drive_minutes / transit_minutes) are `real`, so a fractional
|
|
55
|
+
// figure must parse — an .int() constraint here would make a well-behaved
|
|
56
|
+
// server response fail client-side validation on a successful claim.
|
|
57
|
+
const fractionalCandidate = outreach_schemas_1.OutreachCandidateSchema.safeParse({
|
|
58
|
+
subjectKind: 'CURATED',
|
|
59
|
+
subjectId: '9c858901-8a57-4791-81fe-4c455b099bc9',
|
|
60
|
+
canonicalKind: 'CURATED_WORKER',
|
|
61
|
+
canonicalId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
|
|
62
|
+
name: 'Adam Kowalski',
|
|
63
|
+
phoneNumber: '+447700900123',
|
|
64
|
+
commuteMinutes: 44.3,
|
|
65
|
+
transportMode: 'DRIVE',
|
|
66
|
+
});
|
|
67
|
+
node_assert_1.default.ok(fractionalCandidate.success);
|
|
68
|
+
node_assert_1.default.equal(fractionalCandidate.data.commuteMinutes, 44.3);
|
|
69
|
+
// commuteMinutes is NOT nullable: eligibility is strict on nulls, so a
|
|
70
|
+
// claimed candidate always has a known figure for its resolved mode.
|
|
71
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachCandidateSchema.safeParse({
|
|
72
|
+
subjectKind: 'CURATED',
|
|
73
|
+
subjectId: '9c858901-8a57-4791-81fe-4c455b099bc9',
|
|
74
|
+
canonicalKind: 'CURATED_WORKER',
|
|
75
|
+
canonicalId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
|
|
76
|
+
name: 'Adam Kowalski',
|
|
77
|
+
phoneNumber: '+447700900123',
|
|
78
|
+
commuteMinutes: null,
|
|
79
|
+
transportMode: 'PUBLIC_TRANSPORT',
|
|
80
|
+
}).success);
|
|
81
|
+
// transportMode is resolved server-side AFTER the fallback, so it is never null.
|
|
82
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachCandidateSchema.safeParse({
|
|
83
|
+
subjectKind: 'OWNED',
|
|
84
|
+
subjectId: '9c858901-8a57-4791-81fe-4c455b099bc9',
|
|
85
|
+
canonicalKind: 'WORKER',
|
|
86
|
+
canonicalId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
|
|
87
|
+
name: 'Adam Kowalski',
|
|
88
|
+
phoneNumber: '+447700900123',
|
|
89
|
+
commuteMinutes: 20,
|
|
90
|
+
transportMode: null,
|
|
91
|
+
}).success);
|
|
92
|
+
// canonicalKind is required: a candidate carrying only canonicalId cannot be
|
|
93
|
+
// correlated against the ledger, which keys canonical identity on the pair.
|
|
94
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachCandidateSchema.safeParse({
|
|
95
|
+
subjectKind: 'OWNED',
|
|
96
|
+
subjectId: '9c858901-8a57-4791-81fe-4c455b099bc9',
|
|
97
|
+
canonicalId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
|
|
98
|
+
name: 'Adam Kowalski',
|
|
99
|
+
phoneNumber: '+447700900123',
|
|
100
|
+
commuteMinutes: 20,
|
|
101
|
+
transportMode: 'DRIVE',
|
|
102
|
+
}).success);
|
|
103
|
+
// canonicalKind is NOT derivable from subjectKind: an OWNED subject backed by
|
|
104
|
+
// a linked curated_workers row resolves to canonicalKind CURATED_WORKER, per
|
|
105
|
+
// apps/api's candidate-eligibility.util.ts. This is the case the field
|
|
106
|
+
// exists for, so it must parse cleanly.
|
|
107
|
+
const ownedWithCuratedCanonical = outreach_schemas_1.OutreachCandidateSchema.safeParse({
|
|
108
|
+
subjectKind: 'OWNED',
|
|
109
|
+
subjectId: '9c858901-8a57-4791-81fe-4c455b099bc9',
|
|
110
|
+
canonicalKind: 'CURATED_WORKER',
|
|
111
|
+
canonicalId: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
|
|
112
|
+
name: 'Adam Kowalski',
|
|
113
|
+
phoneNumber: '+447700900123',
|
|
114
|
+
commuteMinutes: 20,
|
|
115
|
+
transportMode: 'DRIVE',
|
|
116
|
+
});
|
|
117
|
+
node_assert_1.default.ok(ownedWithCuratedCanonical.success);
|
|
118
|
+
// --- job -------------------------------------------------------------------
|
|
119
|
+
const job = outreach_schemas_1.OutreachJobSchema.safeParse({
|
|
120
|
+
title: 'Carpenter needed',
|
|
121
|
+
trade: 'CARPENTER',
|
|
122
|
+
payText: '£180/day',
|
|
123
|
+
locationText: 'Croydon, CR0',
|
|
124
|
+
});
|
|
125
|
+
node_assert_1.default.ok(job.success);
|
|
126
|
+
// Real jobs routinely lack pay or trade text; those fields are nullable.
|
|
127
|
+
const sparseJob = outreach_schemas_1.OutreachJobSchema.safeParse({
|
|
128
|
+
title: 'Carpenter needed',
|
|
129
|
+
trade: null,
|
|
130
|
+
payText: null,
|
|
131
|
+
locationText: null,
|
|
132
|
+
});
|
|
133
|
+
node_assert_1.default.ok(sparseJob.success);
|
|
134
|
+
// title is not.
|
|
135
|
+
node_assert_1.default.ok(!outreach_schemas_1.OutreachJobSchema.safeParse({
|
|
136
|
+
trade: null,
|
|
137
|
+
payText: null,
|
|
138
|
+
locationText: null,
|
|
139
|
+
}).success);
|
|
140
|
+
console.log('outreach.schemas OK');
|