@dakkitor/api-contracts 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/abilities/abilities.contract.spec.js +39 -19
  2. package/dist/abilities/interconnection.abilities.json +6 -0
  3. package/dist/abilities/outreach.abilities.json +0 -7
  4. package/dist/abilities/second-agent.abilities.json +2 -91
  5. package/dist/abilities/team-leads.json +1 -0
  6. package/dist/abilities/worker-curator.abilities.json +2 -0
  7. package/dist/actives/actives.contract.d.ts +2562 -2515
  8. package/dist/actives/actives.contract.d.ts.map +1 -1
  9. package/dist/agent-client-links/agent-client-links.contract.d.ts +908 -908
  10. package/dist/auth/auth.contract.d.ts +50 -44
  11. package/dist/auth/auth.contract.d.ts.map +1 -1
  12. package/dist/auth/auth.contract.js +1 -0
  13. package/dist/bookings/backdate-guard.spec.d.ts +2 -0
  14. package/dist/bookings/backdate-guard.spec.d.ts.map +1 -0
  15. package/dist/bookings/backdate-guard.spec.js +80 -0
  16. package/dist/bookings/bookings.contract.d.ts +4918 -4824
  17. package/dist/bookings/bookings.contract.d.ts.map +1 -1
  18. package/dist/bookings/bookings.contract.js +26 -2
  19. package/dist/call-history/call-history.contract.d.ts +434 -434
  20. package/dist/calls-feed/calls-feed.contract.d.ts +70 -70
  21. package/dist/client-contacts/client-contacts.contract.d.ts +290 -290
  22. package/dist/clients/clients.contract.d.ts +110 -110
  23. package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts +1412 -1412
  24. package/dist/collaborations/collaborations.contract.d.ts +1278 -1278
  25. package/dist/common/common-schemas.d.ts +13 -13
  26. package/dist/common/common-schemas.d.ts.map +1 -1
  27. package/dist/common/common-schemas.js +1 -0
  28. package/dist/common/nino.d.ts +8 -0
  29. package/dist/common/nino.d.ts.map +1 -0
  30. package/dist/common/nino.js +26 -0
  31. package/dist/common/nino.spec.d.ts +2 -0
  32. package/dist/common/nino.spec.d.ts.map +1 -0
  33. package/dist/common/nino.spec.js +32 -0
  34. package/dist/companies/companies.contract.d.ts +30 -30
  35. package/dist/crews/crews.contract.d.ts +300 -300
  36. package/dist/cron-executions/cron-executions.contract.d.ts +19 -6
  37. package/dist/cron-executions/cron-executions.contract.d.ts.map +1 -1
  38. package/dist/cron-executions/cron-executions.contract.js +1 -0
  39. package/dist/cron-executions/cron-executions.contract.spec.d.ts +2 -0
  40. package/dist/cron-executions/cron-executions.contract.spec.d.ts.map +1 -0
  41. package/dist/cron-executions/cron-executions.contract.spec.js +27 -0
  42. package/dist/curated-worker-leads/candidate-booking-date-fields.spec.d.ts +2 -0
  43. package/dist/curated-worker-leads/candidate-booking-date-fields.spec.d.ts.map +1 -0
  44. package/dist/curated-worker-leads/candidate-booking-date-fields.spec.js +59 -0
  45. package/dist/curated-worker-leads/candidate-coordination.contract.d.ts +1255 -1188
  46. package/dist/curated-worker-leads/candidate-coordination.contract.d.ts.map +1 -1
  47. package/dist/curated-worker-leads/candidate-coordination.contract.js +22 -6
  48. package/dist/curated-worker-leads/candidate-coordination.contract.spec.js +11 -0
  49. package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts +347 -304
  50. package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts.map +1 -1
  51. package/dist/curated-worker-leads/contact-history.spec.js +1 -0
  52. package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts +2 -85
  53. package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts.map +1 -1
  54. package/dist/curated-worker-leads/curated-worker-lead-config.contract.js +17 -41
  55. package/dist/curated-worker-leads/curated-worker-lead-config.contract.spec.d.ts +2 -0
  56. package/dist/curated-worker-leads/curated-worker-lead-config.contract.spec.d.ts.map +1 -0
  57. package/dist/curated-worker-leads/curated-worker-lead-config.contract.spec.js +30 -0
  58. package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.js +30 -0
  59. package/dist/curated-worker-leads/jobs-tab.contract.d.ts +6058 -5381
  60. package/dist/curated-worker-leads/jobs-tab.contract.d.ts.map +1 -1
  61. package/dist/curated-worker-leads/jobs-tab.contract.js +64 -12
  62. package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts +88 -88
  63. package/dist/curated-workers/curated-workers.contract.d.ts +1173 -962
  64. package/dist/curated-workers/curated-workers.contract.d.ts.map +1 -1
  65. package/dist/curated-workers/curated-workers.contract.js +37 -6
  66. package/dist/dashboards/dashboard-widgets.contract.d.ts +43 -73
  67. package/dist/dashboards/dashboard-widgets.contract.d.ts.map +1 -1
  68. package/dist/dashboards/dashboard-widgets.contract.js +1 -11
  69. package/dist/dashboards/dashboard-widgets.retirement.spec.d.ts +2 -0
  70. package/dist/dashboards/dashboard-widgets.retirement.spec.d.ts.map +1 -0
  71. package/dist/dashboards/dashboard-widgets.retirement.spec.js +22 -0
  72. package/dist/document-intake/document-intake.automation.spec.d.ts +2 -0
  73. package/dist/document-intake/document-intake.automation.spec.d.ts.map +1 -0
  74. package/dist/document-intake/document-intake.automation.spec.js +469 -0
  75. package/dist/document-intake/document-intake.card-side.spec.d.ts +2 -0
  76. package/dist/document-intake/document-intake.card-side.spec.d.ts.map +1 -0
  77. package/dist/document-intake/document-intake.card-side.spec.js +51 -0
  78. package/dist/document-intake/document-intake.contract.d.ts +9421 -1071
  79. package/dist/document-intake/document-intake.contract.d.ts.map +1 -1
  80. package/dist/document-intake/document-intake.contract.js +219 -5
  81. package/dist/document-intake/document-intake.contract.spec.d.ts +2 -0
  82. package/dist/document-intake/document-intake.contract.spec.d.ts.map +1 -0
  83. package/dist/document-intake/document-intake.contract.spec.js +37 -0
  84. package/dist/document-intake/document-intake.nino.spec.d.ts +2 -0
  85. package/dist/document-intake/document-intake.nino.spec.d.ts.map +1 -0
  86. package/dist/document-intake/document-intake.nino.spec.js +42 -0
  87. package/dist/export-jobs/export-jobs.contract.d.ts +426 -426
  88. package/dist/files/files.contract.d.ts +36 -36
  89. package/dist/index.d.ts +17 -9
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +17 -9
  92. package/dist/job-clusters/job-clusters.contract.d.ts +52 -52
  93. package/dist/jobs/jobs.contract.d.ts +3610 -3610
  94. package/dist/kpi-impersonation/kpi-impersonation.contract.d.ts +56 -56
  95. package/dist/lead-assignments/lead-assignments.contract.d.ts +706 -706
  96. package/dist/lead-distribution/agent-lead-distribution.contract.d.ts +220 -220
  97. package/dist/lead-distribution/lead-distribution-config.contract.d.ts +10 -10
  98. package/dist/leads/leads.contract.d.ts +86 -86
  99. package/dist/locations/locations.contract.d.ts +46 -46
  100. package/dist/notifications/notifications.contract.d.ts +18 -18
  101. package/dist/offices/offices.contract.d.ts +24 -24
  102. package/dist/outreach/__tests__/outreach-contract-additions.spec.js +27 -0
  103. package/dist/outreach/lab-outreach.contract.d.ts +48 -48
  104. package/dist/outreach/outreach-requests.contract.d.ts +272 -272
  105. package/dist/outreach/outreach-requests.schemas.d.ts +14 -14
  106. package/dist/outreach/outreach.contract.d.ts +12 -12
  107. package/dist/outreach/outreach.schemas.d.ts +2 -2
  108. package/dist/outreach/relay-hub-outreach.contract.d.ts +1156 -0
  109. package/dist/outreach/relay-hub-outreach.contract.d.ts.map +1 -0
  110. package/dist/outreach/relay-hub-outreach.contract.js +103 -0
  111. package/dist/outreach/relay-hub-outreach.contract.spec.d.ts +2 -0
  112. package/dist/outreach/relay-hub-outreach.contract.spec.d.ts.map +1 -0
  113. package/dist/outreach/relay-hub-outreach.contract.spec.js +119 -0
  114. package/dist/own-research/own-research.contract.d.ts +708 -708
  115. package/dist/proofs/proofs.contract.d.ts +196 -196
  116. package/dist/proofs/proofs.dtos.d.ts +104 -104
  117. package/dist/qualifications/qualifications.contract.d.ts +22 -22
  118. package/dist/realtime/realtime-telemetry.contract.d.ts +181 -0
  119. package/dist/realtime/realtime-telemetry.contract.d.ts.map +1 -0
  120. package/dist/realtime/realtime-telemetry.contract.js +81 -0
  121. package/dist/realtime/realtime-telemetry.contract.spec.d.ts +2 -0
  122. package/dist/realtime/realtime-telemetry.contract.spec.d.ts.map +1 -0
  123. package/dist/realtime/realtime-telemetry.contract.spec.js +41 -0
  124. package/dist/relay-pods/build-relay-pod-membership-rules.d.ts +9 -0
  125. package/dist/relay-pods/build-relay-pod-membership-rules.d.ts.map +1 -0
  126. package/dist/relay-pods/build-relay-pod-membership-rules.js +17 -0
  127. package/dist/relay-pods/build-relay-pod-membership-rules.spec.d.ts +2 -0
  128. package/dist/relay-pods/build-relay-pod-membership-rules.spec.d.ts.map +1 -0
  129. package/dist/relay-pods/build-relay-pod-membership-rules.spec.js +20 -0
  130. package/dist/relay-pods/relay-hub.contract.d.ts +1463 -0
  131. package/dist/relay-pods/relay-hub.contract.d.ts.map +1 -0
  132. package/dist/relay-pods/relay-hub.contract.js +140 -0
  133. package/dist/relay-pods/relay-hub.contract.spec.d.ts +2 -0
  134. package/dist/relay-pods/relay-hub.contract.spec.d.ts.map +1 -0
  135. package/dist/relay-pods/relay-hub.contract.spec.js +180 -0
  136. package/dist/relay-pods/relay-hub.schemas.d.ts +577 -0
  137. package/dist/relay-pods/relay-hub.schemas.d.ts.map +1 -0
  138. package/dist/relay-pods/relay-hub.schemas.js +158 -0
  139. package/dist/relay-pods/relay-lab-fleet.contract.d.ts +115 -86
  140. package/dist/relay-pods/relay-lab-fleet.contract.d.ts.map +1 -1
  141. package/dist/relay-pods/relay-lab-fleet.contract.spec.js +16 -0
  142. package/dist/relay-pods/relay-lab-fleet.schemas.d.ts +87 -58
  143. package/dist/relay-pods/relay-lab-fleet.schemas.d.ts.map +1 -1
  144. package/dist/relay-pods/relay-lab-fleet.schemas.js +22 -5
  145. package/dist/{curated-worker-leads/lead-agent-area.contract.d.ts → relay-pods/relay-pod-members.contract.d.ts} +233 -126
  146. package/dist/relay-pods/relay-pod-members.contract.d.ts.map +1 -0
  147. package/dist/relay-pods/relay-pod-members.contract.js +73 -0
  148. package/dist/relay-pods/relay-pod-sessions.contract.d.ts +58 -58
  149. package/dist/relay-pods/relay-pods.contract.d.ts +169 -169
  150. package/dist/relay-pods/relay-pods.schemas.d.ts +46 -46
  151. package/dist/shared/summary-schemas.d.ts +10 -10
  152. package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.js +22 -2
  153. package/dist/sheets-sync/sheets-sync-events.schemas.d.ts +30 -0
  154. package/dist/sheets-sync/sheets-sync-events.schemas.d.ts.map +1 -1
  155. package/dist/sheets-sync/sheets-sync-events.schemas.js +16 -1
  156. package/dist/sheets-sync/sheets-sync.contract.d.ts +829 -262
  157. package/dist/sheets-sync/sheets-sync.contract.d.ts.map +1 -1
  158. package/dist/sheets-sync/sheets-sync.contract.js +156 -34
  159. package/dist/telegram/telegram.contract.d.ts +12 -12
  160. package/dist/trades/trades.contract.d.ts +16 -16
  161. package/dist/user-access-grants/user-access-grants.contract.d.ts +226 -226
  162. package/dist/users/__tests__/assignable-roles.spec.js +1 -1
  163. package/dist/users/users.contract.d.ts +327 -325
  164. package/dist/users/users.contract.d.ts.map +1 -1
  165. package/dist/users/users.contract.js +10 -7
  166. package/dist/users/users.contract.spec.js +15 -0
  167. package/dist/voice-screener/voice-screener.contract.d.ts +237 -0
  168. package/dist/voice-screener/voice-screener.contract.d.ts.map +1 -0
  169. package/dist/voice-screener/voice-screener.contract.js +89 -0
  170. package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts +500 -260
  171. package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts.map +1 -1
  172. package/dist/worker-identity-cases/worker-identity-cases.contract.js +17 -1
  173. package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts +130 -130
  174. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts +35 -35
  175. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts +15 -15
  176. package/dist/workers/do-not-contact.contract.d.ts +4 -4
  177. package/dist/workers/qualification-back-proof.spec.d.ts +2 -0
  178. package/dist/workers/qualification-back-proof.spec.d.ts.map +1 -0
  179. package/dist/workers/qualification-back-proof.spec.js +39 -0
  180. package/dist/workers/workers.contract.d.ts +1969 -1775
  181. package/dist/workers/workers.contract.d.ts.map +1 -1
  182. package/dist/workers/workers.contract.js +5 -0
  183. package/package.json +1 -1
  184. package/dist/curated-worker-leads/consent-queue.contract.d.ts +0 -4527
  185. package/dist/curated-worker-leads/consent-queue.contract.d.ts.map +0 -1
  186. package/dist/curated-worker-leads/consent-queue.contract.js +0 -201
  187. package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts +0 -135
  188. package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts.map +0 -1
  189. package/dist/curated-worker-leads/curated-worker-leads.contract.js +0 -32
  190. package/dist/curated-worker-leads/lead-agent-area.contract.d.ts.map +0 -1
  191. package/dist/curated-worker-leads/lead-agent-area.contract.js +0 -51
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-hub.contract.d.ts","sourceRoot":"","sources":["../../contracts/relay-pods/relay-hub.contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,cAAc,qBAAqB,CAAC;AAqCpC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0F5B,CAAC"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.relayHubContract = void 0;
18
+ const core_1 = require("@ts-rest/core");
19
+ const zod_1 = require("zod");
20
+ const error_schemas_1 = require("../common/error-schemas");
21
+ const relay_hub_schemas_1 = require("./relay-hub.schemas");
22
+ __exportStar(require("./relay-hub.schemas"), exports);
23
+ const c = (0, core_1.initContract)();
24
+ const RelayHubSsoCodeIssueBodySchema = zod_1.z
25
+ .object({
26
+ state: zod_1.z.string().min(1),
27
+ nonce: zod_1.z.string().min(1),
28
+ redirectUri: zod_1.z.string().url(),
29
+ returnPath: zod_1.z.string().regex(/^\/(?!\/)/),
30
+ })
31
+ .strict();
32
+ const RelayHubSsoCodeIssueResponseSchema = zod_1.z
33
+ .object({
34
+ redirectUrl: zod_1.z.string().url(),
35
+ })
36
+ .strict();
37
+ const RelayHubSsoCodeExchangeBodySchema = zod_1.z
38
+ .object({
39
+ code: zod_1.z.string().min(1),
40
+ })
41
+ .strict();
42
+ const RelayHubSsoSessionPathParamsSchema = zod_1.z
43
+ .object({
44
+ id: zod_1.z.string().uuid(),
45
+ })
46
+ .strict();
47
+ // Machine credentials are deliberately absent from this router: no controller
48
+ // implements them in this release, and an advertised route that answers 404 is
49
+ // worse than no route at all. Credentials are issued out of band through
50
+ // RelayHubMachineCredentialService (see its bootstrapping note). The credential
51
+ // schemas stay exported from relay-hub.schemas.ts because they describe that
52
+ // service's payloads.
53
+ exports.relayHubContract = c.router({
54
+ issueAuthorizationCode: {
55
+ method: 'POST',
56
+ path: '/sso/codes',
57
+ body: RelayHubSsoCodeIssueBodySchema,
58
+ responses: {
59
+ 200: RelayHubSsoCodeIssueResponseSchema,
60
+ },
61
+ summary: 'Start a Relay Hub authorization-code exchange',
62
+ metadata: { tags: ['Relay Hub'] },
63
+ },
64
+ exchangeAuthorizationCode: {
65
+ method: 'POST',
66
+ path: '/sso/exchange',
67
+ body: RelayHubSsoCodeExchangeBodySchema,
68
+ responses: {
69
+ 200: relay_hub_schemas_1.RelayHubAuthorizationProjectionSchema,
70
+ 404: error_schemas_1.ErrorResponseSchema,
71
+ },
72
+ summary: 'Exchange a one-time Relay Hub authorization code',
73
+ metadata: { tags: ['Relay Hub'] },
74
+ },
75
+ refreshAuthorization: {
76
+ method: 'POST',
77
+ path: '/sso/sessions/:id/refresh',
78
+ pathParams: RelayHubSsoSessionPathParamsSchema,
79
+ body: zod_1.z.object({}).strict(),
80
+ responses: {
81
+ 200: relay_hub_schemas_1.RelayHubAuthorizationProjectionSchema,
82
+ 404: error_schemas_1.ErrorResponseSchema,
83
+ },
84
+ summary: 'Refresh a Relay Hub authorization projection',
85
+ metadata: { tags: ['Relay Hub'] },
86
+ },
87
+ revokeAuthorization: {
88
+ method: 'POST',
89
+ path: '/sso/sessions/:id/revoke',
90
+ pathParams: RelayHubSsoSessionPathParamsSchema,
91
+ body: zod_1.z.object({}).strict(),
92
+ responses: {
93
+ 200: zod_1.z.object({ revoked: zod_1.z.literal(true) }).strict(),
94
+ 404: error_schemas_1.ErrorResponseSchema,
95
+ },
96
+ summary: 'Revoke a Relay Hub authorization session',
97
+ metadata: { tags: ['Relay Hub'] },
98
+ },
99
+ listPods: {
100
+ method: 'GET',
101
+ path: '/pods',
102
+ responses: {
103
+ 200: zod_1.z.array(relay_hub_schemas_1.RelayHubHumanPodProjectionSchema),
104
+ },
105
+ summary: 'List Relay Hub pod projections',
106
+ metadata: { tags: ['Relay Hub'] },
107
+ },
108
+ upsertPodProjection: {
109
+ method: 'PUT',
110
+ path: '/pods/:id',
111
+ pathParams: zod_1.z.object({ id: zod_1.z.string().uuid() }).strict(),
112
+ body: relay_hub_schemas_1.RelayHubPodProjectionMutationSchema,
113
+ responses: {
114
+ 200: relay_hub_schemas_1.RelayHubPodProjectionSchema,
115
+ 404: error_schemas_1.ErrorResponseSchema,
116
+ 409: error_schemas_1.ErrorResponseSchema,
117
+ },
118
+ summary: 'Upsert a Relay Hub pod projection',
119
+ metadata: { tags: ['Relay Hub'] },
120
+ },
121
+ publishFleet: {
122
+ method: 'PUT',
123
+ path: '/lab-fleet',
124
+ body: relay_hub_schemas_1.RelayHubFleetProjectionMutationSchema,
125
+ responses: {
126
+ 200: relay_hub_schemas_1.RelayHubFleetProjectionMutationSchema,
127
+ 409: error_schemas_1.ErrorResponseSchema,
128
+ },
129
+ summary: 'Publish Relay Hub fleet projections',
130
+ metadata: { tags: ['Relay Hub'] },
131
+ },
132
+ }, {
133
+ pathPrefix: '/v3/relay-hub',
134
+ commonResponses: {
135
+ 400: error_schemas_1.ErrorResponseSchema,
136
+ 401: error_schemas_1.ErrorResponseSchema,
137
+ 403: error_schemas_1.ErrorResponseSchema,
138
+ 500: error_schemas_1.ErrorResponseSchema,
139
+ },
140
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=relay-hub.contract.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-hub.contract.spec.d.ts","sourceRoot":"","sources":["../../contracts/relay-pods/relay-hub.contract.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const bun_test_1 = require("bun:test");
4
+ const index_1 = require("../index");
5
+ const relay_pod_sessions_contract_1 = require("./relay-pod-sessions.contract");
6
+ const relay_pods_contract_1 = require("./relay-pods.contract");
7
+ const relay_hub_schemas_1 = require("./relay-hub.schemas");
8
+ const relay_hub_contract_1 = require("./relay-hub.contract");
9
+ const relay_pods_schemas_1 = require("./relay-pods.schemas");
10
+ const podId = '11111111-1111-4111-8111-111111111111';
11
+ const userId = '22222222-2222-4222-8222-222222222222';
12
+ const sessionId = '33333333-3333-4333-8333-333333333333';
13
+ const assertionId = '44444444-4444-4444-8444-444444444444';
14
+ const mutationId = '55555555-5555-4555-8555-555555555555';
15
+ const correlationId = '66666666-6666-4666-8666-666666666666';
16
+ const observedAt = '2026-08-16T10:00:00.000Z';
17
+ const podProjection = {
18
+ id: podId,
19
+ slug: 'pod-12',
20
+ displayName: 'Pod 12',
21
+ integrationMode: 'HUB',
22
+ migrationState: 'SHADOW',
23
+ operationalState: 'OFFLINE',
24
+ projectionVersion: 1,
25
+ publicBaseUrl: null,
26
+ members: [],
27
+ observedAt,
28
+ };
29
+ const fleetProjection = {
30
+ fleetVersion: 1,
31
+ observedAt,
32
+ devices: [],
33
+ };
34
+ const mutationMetadata = {
35
+ idempotencyKey: mutationId,
36
+ correlationId,
37
+ expectedVersion: 0,
38
+ };
39
+ (0, bun_test_1.describe)('Relay Hub V3 schemas', () => {
40
+ (0, bun_test_1.it)('preserves unknown legacy operational facts in the human list without weakening machine projections', () => {
41
+ (0, bun_test_1.expect)(relay_hub_schemas_1.RelayHubHumanPodProjectionSchema.parse({
42
+ ...podProjection,
43
+ integrationMode: 'LEGACY',
44
+ migrationState: 'LEGACY',
45
+ operationalState: null,
46
+ observedAt: null,
47
+ })).toMatchObject({ operationalState: null, observedAt: null });
48
+ (0, bun_test_1.expect)(relay_hub_schemas_1.RelayHubPodProjectionSchema.safeParse({
49
+ ...podProjection,
50
+ operationalState: null,
51
+ observedAt: null,
52
+ }).success).toBe(false);
53
+ });
54
+ (0, bun_test_1.it)('accepts an unassigned Hub pod without weakening the V2 pod summary', () => {
55
+ const pod = relay_hub_schemas_1.RelayHubPodProjectionSchema.parse(podProjection);
56
+ (0, bun_test_1.expect)(pod.members).toEqual([]);
57
+ const legacyPod = {
58
+ id: podId,
59
+ slug: 'pod-12',
60
+ displayName: 'Pod 12',
61
+ ownerUserId: userId,
62
+ ownerName: null,
63
+ publicBaseUrl: 'https://pod-12.test',
64
+ status: 'ACTIVE',
65
+ };
66
+ (0, bun_test_1.expect)(relay_pods_schemas_1.RelayPodSummarySchema.parse(legacyPod).ownerUserId).toBe(userId);
67
+ (0, bun_test_1.expect)(relay_pods_schemas_1.RelayPodSummarySchema.safeParse({
68
+ ...legacyPod,
69
+ publicBaseUrl: null,
70
+ }).success).toBe(false);
71
+ (0, bun_test_1.expect)(relay_pods_schemas_1.RelayPodSummarySchema.safeParse({
72
+ id: legacyPod.id,
73
+ slug: legacyPod.slug,
74
+ displayName: legacyPod.displayName,
75
+ ownerName: legacyPod.ownerName,
76
+ publicBaseUrl: legacyPod.publicBaseUrl,
77
+ status: legacyPod.status,
78
+ }).success).toBe(false);
79
+ (0, bun_test_1.expect)(relay_pods_schemas_1.RelayPodSummarySchema.safeParse({
80
+ ...legacyPod,
81
+ integrationMode: 'LEGACY',
82
+ }).success).toBe(false);
83
+ });
84
+ (0, bun_test_1.it)('publishes a complete, expiring authorization projection', () => {
85
+ (0, bun_test_1.expect)(relay_hub_schemas_1.RelayHubAuthorizationProjectionSchema.parse({
86
+ sessionId,
87
+ assertionId,
88
+ user: {
89
+ id: userId,
90
+ email: 'operator@example.com',
91
+ displayName: 'Operator',
92
+ },
93
+ impersonatedBy: null,
94
+ isAdmin: false,
95
+ assignedPodIds: [podId],
96
+ rules: [{ action: 'manage', subject: 'RelayPod' }],
97
+ permissionProjectionVersion: 4,
98
+ issuedAt: observedAt,
99
+ expiresAt: '2026-08-16T11:00:00.000Z',
100
+ }).assignedPodIds).toEqual([podId]);
101
+ });
102
+ (0, bun_test_1.it)('composes all mutation metadata into pod and fleet projection request schemas', () => {
103
+ (0, bun_test_1.expect)(relay_hub_schemas_1.RelayHubFleetProjectionSchema.parse(fleetProjection).devices).toEqual([]);
104
+ for (const [schema, projection] of [
105
+ [relay_hub_schemas_1.RelayHubPodProjectionMutationSchema, podProjection],
106
+ [relay_hub_schemas_1.RelayHubFleetProjectionMutationSchema, fleetProjection],
107
+ ]) {
108
+ (0, bun_test_1.expect)(schema.safeParse({ ...projection, ...mutationMetadata }).success).toBe(true);
109
+ (0, bun_test_1.expect)(schema.safeParse({
110
+ ...projection,
111
+ correlationId,
112
+ expectedVersion: 0,
113
+ }).success).toBe(false);
114
+ (0, bun_test_1.expect)(schema.safeParse({
115
+ ...projection,
116
+ idempotencyKey: mutationId,
117
+ expectedVersion: 0,
118
+ }).success).toBe(false);
119
+ (0, bun_test_1.expect)(schema.safeParse({
120
+ ...projection,
121
+ idempotencyKey: mutationId,
122
+ correlationId,
123
+ }).success).toBe(false);
124
+ (0, bun_test_1.expect)(schema.safeParse({
125
+ ...projection,
126
+ ...mutationMetadata,
127
+ expectedVersion: -1,
128
+ }).success).toBe(false);
129
+ }
130
+ });
131
+ });
132
+ (0, bun_test_1.describe)('relayHubContract routes', () => {
133
+ (0, bun_test_1.it)('publishes the Hub SSO, projection, and fleet routes under /v3', () => {
134
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract.issueAuthorizationCode).toMatchObject({
135
+ method: 'POST',
136
+ path: '/v3/relay-hub/sso/codes',
137
+ });
138
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract.exchangeAuthorizationCode).toMatchObject({
139
+ method: 'POST',
140
+ path: '/v3/relay-hub/sso/exchange',
141
+ });
142
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract.refreshAuthorization).toMatchObject({
143
+ method: 'POST',
144
+ path: '/v3/relay-hub/sso/sessions/:id/refresh',
145
+ });
146
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract.revokeAuthorization).toMatchObject({
147
+ method: 'POST',
148
+ path: '/v3/relay-hub/sso/sessions/:id/revoke',
149
+ });
150
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract.listPods).toMatchObject({
151
+ method: 'GET',
152
+ path: '/v3/relay-hub/pods',
153
+ });
154
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract.upsertPodProjection).toMatchObject({
155
+ method: 'PUT',
156
+ path: '/v3/relay-hub/pods/:id',
157
+ });
158
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract.publishFleet).toMatchObject({
159
+ method: 'PUT',
160
+ path: '/v3/relay-hub/lab-fleet',
161
+ });
162
+ (0, bun_test_1.expect)(index_1.apiContractRouter.RelayHub.listPods.path).toBe('/v3/relay-hub/pods');
163
+ });
164
+ // Machine credentials have no implementing controller in this release, so the
165
+ // contract must not advertise routes that would answer 404. They are issued
166
+ // out of band (see RelayHubMachineCredentialService) until a controller ships.
167
+ (0, bun_test_1.it)('advertises no machine credential routes while none are implemented', () => {
168
+ const paths = Object.values(relay_hub_contract_1.relayHubContract)
169
+ .map((route) => route.path)
170
+ .filter((path) => typeof path === 'string');
171
+ (0, bun_test_1.expect)(paths).not.toContain('/v3/relay-hub/credentials');
172
+ (0, bun_test_1.expect)(paths.some((path) => path.startsWith('/v3/relay-hub/credentials'))).toBe(false);
173
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract).not.toHaveProperty('createMachineCredential');
174
+ (0, bun_test_1.expect)(relay_hub_contract_1.relayHubContract).not.toHaveProperty('revokeMachineCredential');
175
+ });
176
+ (0, bun_test_1.it)('leaves the deployed pod and session routers under /v2', () => {
177
+ (0, bun_test_1.expect)(relay_pods_contract_1.relayPodsContract.me.path).toBe('/v2/relay-pods/me');
178
+ (0, bun_test_1.expect)(relay_pod_sessions_contract_1.relayPodSessionsContract.exchange.path).toBe('/v2/relay-pod-sessions/exchange');
179
+ });
180
+ });