@shipfox/api-runners-dto 2.0.0 → 6.0.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 (73) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +30 -0
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/inter-module.d.ts +64 -0
  8. package/dist/inter-module.d.ts.map +1 -0
  9. package/dist/inter-module.js +57 -0
  10. package/dist/inter-module.js.map +1 -0
  11. package/dist/schemas/assign-capacity.d.ts +18 -0
  12. package/dist/schemas/assign-capacity.d.ts.map +1 -0
  13. package/dist/schemas/assign-capacity.js +19 -0
  14. package/dist/schemas/assign-capacity.js.map +1 -0
  15. package/dist/schemas/index.d.ts +5 -3
  16. package/dist/schemas/index.d.ts.map +1 -1
  17. package/dist/schemas/index.js +5 -3
  18. package/dist/schemas/index.js.map +1 -1
  19. package/dist/schemas/mint-registration-tokens.d.ts +7 -7
  20. package/dist/schemas/mint-registration-tokens.d.ts.map +1 -1
  21. package/dist/schemas/mint-registration-tokens.js +7 -7
  22. package/dist/schemas/mint-registration-tokens.js.map +1 -1
  23. package/dist/schemas/poll-demand.d.ts +5 -1
  24. package/dist/schemas/poll-demand.d.ts.map +1 -1
  25. package/dist/schemas/poll-demand.js +4 -2
  26. package/dist/schemas/poll-demand.js.map +1 -1
  27. package/dist/schemas/provisioner-token.d.ts +10 -2
  28. package/dist/schemas/provisioner-token.d.ts.map +1 -1
  29. package/dist/schemas/provisioner-token.js +15 -6
  30. package/dist/schemas/provisioner-token.js.map +1 -1
  31. package/dist/schemas/{reconcile-provisioned-runners.d.ts → reconcile-runner-instances.d.ts} +12 -12
  32. package/dist/schemas/reconcile-runner-instances.d.ts.map +1 -0
  33. package/dist/schemas/reconcile-runner-instances.js +36 -0
  34. package/dist/schemas/reconcile-runner-instances.js.map +1 -0
  35. package/dist/schemas/register.d.ts +1 -0
  36. package/dist/schemas/register.d.ts.map +1 -1
  37. package/dist/schemas/register.js +2 -1
  38. package/dist/schemas/register.js.map +1 -1
  39. package/dist/schemas/{report-provisioned-runners.d.ts → report-runner-instances.d.ts} +32 -15
  40. package/dist/schemas/report-runner-instances.d.ts.map +1 -0
  41. package/dist/schemas/{report-provisioned-runners.js → report-runner-instances.js} +25 -12
  42. package/dist/schemas/report-runner-instances.js.map +1 -0
  43. package/dist/schemas/runner-enrollment.d.ts +51 -0
  44. package/dist/schemas/runner-enrollment.d.ts.map +1 -0
  45. package/dist/schemas/runner-enrollment.js +40 -0
  46. package/dist/schemas/runner-enrollment.js.map +1 -0
  47. package/dist/tsconfig.test.tsbuildinfo +1 -1
  48. package/package.json +15 -20
  49. package/src/index.ts +44 -19
  50. package/src/inter-module.test.ts +40 -0
  51. package/src/inter-module.ts +51 -0
  52. package/src/schemas/assign-capacity.ts +22 -0
  53. package/src/schemas/index.ts +50 -21
  54. package/src/schemas/mint-registration-tokens.test.ts +7 -7
  55. package/src/schemas/mint-registration-tokens.ts +10 -18
  56. package/src/schemas/poll-demand.test.ts +1 -1
  57. package/src/schemas/poll-demand.ts +4 -2
  58. package/src/schemas/provisioner-token.test.ts +9 -0
  59. package/src/schemas/provisioner-token.ts +6 -4
  60. package/src/schemas/{reconcile-provisioned-runners.test.ts → reconcile-runner-instances.test.ts} +21 -21
  61. package/src/schemas/reconcile-runner-instances.ts +58 -0
  62. package/src/schemas/register.ts +1 -1
  63. package/src/schemas/{report-provisioned-runners.test.ts → report-runner-instances.test.ts} +16 -16
  64. package/src/schemas/report-runner-instances.ts +91 -0
  65. package/src/schemas/runner-enrollment.ts +49 -0
  66. package/tsconfig.build.tsbuildinfo +1 -1
  67. package/dist/schemas/reconcile-provisioned-runners.d.ts.map +0 -1
  68. package/dist/schemas/reconcile-provisioned-runners.js +0 -36
  69. package/dist/schemas/reconcile-provisioned-runners.js.map +0 -1
  70. package/dist/schemas/report-provisioned-runners.d.ts.map +0 -1
  71. package/dist/schemas/report-provisioned-runners.js.map +0 -1
  72. package/src/schemas/reconcile-provisioned-runners.ts +0 -61
  73. package/src/schemas/report-provisioned-runners.ts +0 -75
@@ -1,30 +1,30 @@
1
1
  import {
2
- MAX_OBSERVED_PROVISIONED_RUNNER_ID_LENGTH,
2
+ MAX_OBSERVED_PROVIDER_RUNNER_ID_LENGTH,
3
3
  MAX_RECONCILE_OBSERVED_RUNNERS,
4
- reconcileProvisionedRunnersBodySchema,
5
- reconcileProvisionedRunnersResponseSchema,
6
- } from './reconcile-provisioned-runners.js';
4
+ reconcileRunnerInstancesBodySchema,
5
+ reconcileRunnerInstancesResponseSchema,
6
+ } from './reconcile-runner-instances.js';
7
7
 
8
- describe('reconcileProvisionedRunnersBodySchema', () => {
8
+ describe('reconcileRunnerInstancesBodySchema', () => {
9
9
  it('accepts observed provisioned runner ids', () => {
10
- const result = reconcileProvisionedRunnersBodySchema.safeParse({
11
- observed_provisioned_runner_ids: ['01JPROVISIONEDRUNNER000001'],
10
+ const result = reconcileRunnerInstancesBodySchema.safeParse({
11
+ observed_provider_runner_ids: ['01JPROVISIONEDRUNNER000001'],
12
12
  });
13
13
 
14
14
  expect(result.success).toBe(true);
15
15
  });
16
16
 
17
17
  it('accepts an empty observed set', () => {
18
- const result = reconcileProvisionedRunnersBodySchema.safeParse({
19
- observed_provisioned_runner_ids: [],
18
+ const result = reconcileRunnerInstancesBodySchema.safeParse({
19
+ observed_provider_runner_ids: [],
20
20
  });
21
21
 
22
22
  expect(result.success).toBe(true);
23
23
  });
24
24
 
25
25
  it('rejects observed sets above the reconcile limit', () => {
26
- const result = reconcileProvisionedRunnersBodySchema.safeParse({
27
- observed_provisioned_runner_ids: Array.from(
26
+ const result = reconcileRunnerInstancesBodySchema.safeParse({
27
+ observed_provider_runner_ids: Array.from(
28
28
  {length: MAX_RECONCILE_OBSERVED_RUNNERS + 1},
29
29
  (_, index) => `runner-${index}`,
30
30
  ),
@@ -34,24 +34,24 @@ describe('reconcileProvisionedRunnersBodySchema', () => {
34
34
  });
35
35
 
36
36
  it('rejects over-length provisioned runner ids', () => {
37
- const result = reconcileProvisionedRunnersBodySchema.safeParse({
38
- observed_provisioned_runner_ids: ['a'.repeat(MAX_OBSERVED_PROVISIONED_RUNNER_ID_LENGTH + 1)],
37
+ const result = reconcileRunnerInstancesBodySchema.safeParse({
38
+ observed_provider_runner_ids: ['a'.repeat(MAX_OBSERVED_PROVIDER_RUNNER_ID_LENGTH + 1)],
39
39
  });
40
40
 
41
41
  expect(result.success).toBe(false);
42
42
  });
43
43
 
44
44
  it('rejects duplicate provisioned runner ids', () => {
45
- const result = reconcileProvisionedRunnersBodySchema.safeParse({
46
- observed_provisioned_runner_ids: ['provisioned-runner-1', 'provisioned-runner-1'],
45
+ const result = reconcileRunnerInstancesBodySchema.safeParse({
46
+ observed_provider_runner_ids: ['provisioned-runner-1', 'provisioned-runner-1'],
47
47
  });
48
48
 
49
49
  expect(result.success).toBe(false);
50
50
  });
51
51
 
52
52
  it('rejects extra fields', () => {
53
- const result = reconcileProvisionedRunnersBodySchema.safeParse({
54
- observed_provisioned_runner_ids: [],
53
+ const result = reconcileRunnerInstancesBodySchema.safeParse({
54
+ observed_provider_runner_ids: [],
55
55
  provisioner_hostname: 'worker-1',
56
56
  });
57
57
 
@@ -59,12 +59,12 @@ describe('reconcileProvisionedRunnersBodySchema', () => {
59
59
  });
60
60
  });
61
61
 
62
- describe('reconcileProvisionedRunnersResponseSchema', () => {
62
+ describe('reconcileRunnerInstancesResponseSchema', () => {
63
63
  it('parses reconciled provisioned runner responses', () => {
64
- const result = reconcileProvisionedRunnersResponseSchema.safeParse({
64
+ const result = reconcileRunnerInstancesResponseSchema.safeParse({
65
65
  runners: [
66
66
  {
67
- provisioned_runner_id: 'provisioned-runner-1',
67
+ provider_runner_id: 'provisioned-runner-1',
68
68
  state: 'running',
69
69
  reservation_id: crypto.randomUUID(),
70
70
  runner_session_id: crypto.randomUUID(),
@@ -77,7 +77,7 @@ describe('reconcileProvisionedRunnersResponseSchema', () => {
77
77
  desired_intent: 'keep',
78
78
  },
79
79
  ],
80
- terminated_absent_provisioned_runner_ids: ['provisioned-runner-2'],
80
+ terminated_absent_provider_runner_ids: ['provisioned-runner-2'],
81
81
  });
82
82
 
83
83
  expect(result.success).toBe(true);
@@ -0,0 +1,58 @@
1
+ import {z} from 'zod';
2
+ import {providerRunnerStateSchema} from './report-runner-instances.js';
3
+
4
+ export const MAX_RECONCILE_OBSERVED_RUNNERS = 5000;
5
+ export const MAX_OBSERVED_PROVIDER_RUNNER_ID_LENGTH = 255;
6
+
7
+ export const reconcileRunnerInstancesBodySchema = z
8
+ .object({
9
+ observed_provider_runner_ids: z
10
+ .array(z.string().min(1).max(MAX_OBSERVED_PROVIDER_RUNNER_ID_LENGTH))
11
+ .max(MAX_RECONCILE_OBSERVED_RUNNERS),
12
+ })
13
+ .strict()
14
+ .refine(
15
+ (body) =>
16
+ new Set(body.observed_provider_runner_ids).size === body.observed_provider_runner_ids.length,
17
+ {
18
+ message: 'observed_provider_runner_ids values must be unique',
19
+ path: ['observed_provider_runner_ids'],
20
+ },
21
+ );
22
+
23
+ export const reconcileDesiredIntentSchema = z.enum(['keep', 'terminate']);
24
+
25
+ export const reconciledBoundJobSchema = z
26
+ .object({
27
+ job_id: z.string().uuid(),
28
+ workflow_run_attempt_id: z.string().uuid(),
29
+ last_heartbeat_at: z.string().datetime(),
30
+ cancellation_requested_at: z.string().datetime().nullable(),
31
+ })
32
+ .strict();
33
+
34
+ export const reconciledRunnerInstanceSchema = z
35
+ .object({
36
+ provider_runner_id: z.string(),
37
+ state: providerRunnerStateSchema.nullable(),
38
+ reservation_id: z.string().uuid().nullable(),
39
+ runner_session_id: z.string().uuid().nullable(),
40
+ bound_job: reconciledBoundJobSchema.nullable(),
41
+ desired_intent: reconcileDesiredIntentSchema,
42
+ })
43
+ .strict();
44
+
45
+ export const reconcileRunnerInstancesResponseSchema = z
46
+ .object({
47
+ runners: z.array(reconciledRunnerInstanceSchema),
48
+ terminated_absent_provider_runner_ids: z.array(z.string()),
49
+ })
50
+ .strict();
51
+
52
+ export type ReconcileRunnerInstancesBodyDto = z.infer<typeof reconcileRunnerInstancesBodySchema>;
53
+ export type ReconcileDesiredIntentDto = z.infer<typeof reconcileDesiredIntentSchema>;
54
+ export type ReconciledBoundJobDto = z.infer<typeof reconciledBoundJobSchema>;
55
+ export type ReconciledRunnerInstanceDto = z.infer<typeof reconciledRunnerInstanceSchema>;
56
+ export type ReconcileRunnerInstancesResponseDto = z.infer<
57
+ typeof reconcileRunnerInstancesResponseSchema
58
+ >;
@@ -20,7 +20,7 @@ export const registerRunnerBodySchema = z.object({
20
20
  export const registerRunnerResponseSchema = z.object({
21
21
  session_token: z.string().min(1),
22
22
  session_id: z.string().uuid(),
23
- mode: z.enum(['manual', 'ephemeral']),
23
+ mode: z.enum(['manual', 'ephemeral', 'activation']),
24
24
  max_claims: z.number().int().positive().nullable(),
25
25
  });
26
26
 
@@ -1,13 +1,13 @@
1
1
  import {
2
- MAX_PROVISIONED_RUNNER_REPORT_EVENTS,
3
- provisionedRunnerReportEventSchema,
4
- reportProvisionedRunnersBodySchema,
5
- } from './report-provisioned-runners.js';
2
+ MAX_PROVIDER_RUNNER_REPORT_EVENTS,
3
+ providerRunnerReportEventSchema,
4
+ reportRunnerInstancesBodySchema,
5
+ } from './report-runner-instances.js';
6
6
 
7
- describe('provisionedRunnerReportEventSchema', () => {
7
+ describe('providerRunnerReportEventSchema', () => {
8
8
  it('accepts minimal provider-agnostic lifecycle events', () => {
9
- const result = provisionedRunnerReportEventSchema.safeParse({
10
- provisioned_runner_id: 'container-1',
9
+ const result = providerRunnerReportEventSchema.safeParse({
10
+ provider_runner_id: 'container-1',
11
11
  labels: ['linux'],
12
12
  state: 'starting',
13
13
  reported_at: new Date().toISOString(),
@@ -17,8 +17,8 @@ describe('provisionedRunnerReportEventSchema', () => {
17
17
  });
18
18
 
19
19
  it('accepts cleanup-confirmed terminated lifecycle events', () => {
20
- const result = provisionedRunnerReportEventSchema.safeParse({
21
- provisioned_runner_id: 'container-1',
20
+ const result = providerRunnerReportEventSchema.safeParse({
21
+ provider_runner_id: 'container-1',
22
22
  labels: ['linux'],
23
23
  state: 'terminated',
24
24
  reported_at: new Date().toISOString(),
@@ -28,8 +28,8 @@ describe('provisionedRunnerReportEventSchema', () => {
28
28
  });
29
29
 
30
30
  it('rejects provider-sensitive extra fields', () => {
31
- const result = provisionedRunnerReportEventSchema.safeParse({
32
- provisioned_runner_id: 'container-1',
31
+ const result = providerRunnerReportEventSchema.safeParse({
32
+ provider_runner_id: 'container-1',
33
33
  labels: ['linux'],
34
34
  state: 'running',
35
35
  reported_at: new Date().toISOString(),
@@ -40,19 +40,19 @@ describe('provisionedRunnerReportEventSchema', () => {
40
40
  });
41
41
  });
42
42
 
43
- describe('reportProvisionedRunnersBodySchema', () => {
43
+ describe('reportRunnerInstancesBodySchema', () => {
44
44
  it('enforces the batch size limit', () => {
45
45
  const event = {
46
- provisioned_runner_id: 'container-1',
46
+ provider_runner_id: 'container-1',
47
47
  labels: ['linux'],
48
48
  state: 'running',
49
49
  reported_at: new Date().toISOString(),
50
50
  };
51
51
 
52
- const result = reportProvisionedRunnersBodySchema.safeParse({
53
- events: Array.from({length: MAX_PROVISIONED_RUNNER_REPORT_EVENTS + 1}, (_, index) => ({
52
+ const result = reportRunnerInstancesBodySchema.safeParse({
53
+ events: Array.from({length: MAX_PROVIDER_RUNNER_REPORT_EVENTS + 1}, (_, index) => ({
54
54
  ...event,
55
- provisioned_runner_id: `container-${index}`,
55
+ provider_runner_id: `container-${index}`,
56
56
  })),
57
57
  });
58
58
 
@@ -0,0 +1,91 @@
1
+ import {MAX_RUNNER_LABELS} from '@shipfox/runner-labels';
2
+ import {z} from 'zod';
3
+ import {runnerLabelSchema} from './register.js';
4
+
5
+ export const MAX_PROVIDER_RUNNER_REPORT_EVENTS = 1000;
6
+ export const MAX_PROVIDER_RUNNER_REASON_LENGTH = 500;
7
+ export const MAX_PROVIDER_KIND_LENGTH = 64;
8
+
9
+ export const providerRunnerStateSchema = z.enum([
10
+ 'starting',
11
+ 'running',
12
+ 'stopping',
13
+ 'stopped',
14
+ 'failed',
15
+ 'terminated',
16
+ ]);
17
+
18
+ export const providerKindSchema = z.string().min(1).max(MAX_PROVIDER_KIND_LENGTH);
19
+
20
+ export const providerRunnerReportEventSchema = z
21
+ .object({
22
+ provider_runner_id: z.string().min(1).max(255),
23
+ reservation_id: z.string().uuid().optional(),
24
+ template_key: z.string().min(1).max(255).optional(),
25
+ labels: z.array(runnerLabelSchema).min(1).max(MAX_RUNNER_LABELS),
26
+ state: providerRunnerStateSchema,
27
+ reason: z.string().min(1).max(MAX_PROVIDER_RUNNER_REASON_LENGTH).optional(),
28
+ runner_session_id: z.string().uuid().optional(),
29
+ reported_at: z.string().datetime(),
30
+ provider_kind: providerKindSchema.optional(),
31
+ })
32
+ .strict();
33
+
34
+ export const reportRunnerInstancesBodySchema = z.object({
35
+ events: z.array(providerRunnerReportEventSchema).min(1).max(MAX_PROVIDER_RUNNER_REPORT_EVENTS),
36
+ });
37
+
38
+ export const reportRunnerInstancesResponseSchema = z.object({
39
+ accepted: z.number().int().min(0),
40
+ reservations_released: z.number().int().min(0),
41
+ });
42
+
43
+ export const createPlannedCapacityBodySchema = z
44
+ .object({
45
+ provider_kind: providerKindSchema.optional(),
46
+ template_key: z.string().min(1).max(255).optional(),
47
+ })
48
+ .strict();
49
+
50
+ export const createPlannedCapacityResponseSchema = z.object({
51
+ capacity_id: z.string().uuid(),
52
+ });
53
+
54
+ export const attachProviderRunnerBodySchema = z
55
+ .object({provider_runner_id: z.string().min(1).max(255)})
56
+ .strict();
57
+
58
+ export const attachProviderRunnerResponseSchema = z.object({attached: z.boolean()});
59
+
60
+ export const activeRunnerStateSchema = z.enum(['starting', 'running', 'stopping', 'busy']);
61
+
62
+ export const activeRunnerDtoSchema = z.object({
63
+ runner_session_id: z.string().uuid().nullable(),
64
+ provider_runner_id: z.string().nullable(),
65
+ provisioner_id: z.string().uuid().nullable(),
66
+ state: activeRunnerStateSchema,
67
+ labels: z.array(z.string()),
68
+ template_key: z.string().nullable(),
69
+ provider_kind: z.string().nullable(),
70
+ job_id: z.string().uuid().nullable(),
71
+ workflow_run_attempt_id: z.string().uuid().nullable(),
72
+ project_id: z.string().uuid().nullable(),
73
+ reported_at: z.string().nullable(),
74
+ last_heartbeat_at: z.string().nullable(),
75
+ });
76
+
77
+ export const activeRunnersResponseSchema = z.object({
78
+ runners: z.array(activeRunnerDtoSchema),
79
+ });
80
+
81
+ export type RunnerInstanceStateDto = z.infer<typeof providerRunnerStateSchema>;
82
+ export type RunnerInstanceReportEventDto = z.infer<typeof providerRunnerReportEventSchema>;
83
+ export type ReportRunnerInstancesBodyDto = z.infer<typeof reportRunnerInstancesBodySchema>;
84
+ export type ReportRunnerInstancesResponseDto = z.infer<typeof reportRunnerInstancesResponseSchema>;
85
+ export type CreatePlannedCapacityBodyDto = z.infer<typeof createPlannedCapacityBodySchema>;
86
+ export type CreatePlannedCapacityResponseDto = z.infer<typeof createPlannedCapacityResponseSchema>;
87
+ export type AttachProviderRunnerBodyDto = z.infer<typeof attachProviderRunnerBodySchema>;
88
+ export type AttachProviderRunnerResponseDto = z.infer<typeof attachProviderRunnerResponseSchema>;
89
+ export type ActiveRunnerStateDto = z.infer<typeof activeRunnerStateSchema>;
90
+ export type ActiveRunnerDto = z.infer<typeof activeRunnerDtoSchema>;
91
+ export type ActiveRunnersResponseDto = z.infer<typeof activeRunnersResponseSchema>;
@@ -0,0 +1,49 @@
1
+ import {z} from 'zod';
2
+ import {runnerLabelSchema} from './register.js';
3
+ import {runnerToolCapabilitiesSchema} from './tool-capabilities.js';
4
+
5
+ export const runnerBootstrapExchangeBodySchema = z
6
+ .object({bootstrap_token: z.string().min(1)})
7
+ .strict();
8
+ export const createRunnerInstancesBodySchema = z
9
+ .object({
10
+ provider_kind: z.string().min(1).max(64).optional(),
11
+ runner_instances: z
12
+ .array(z.object({template_key: z.string().min(1).max(255).optional()}).strict())
13
+ .min(1)
14
+ .max(500),
15
+ })
16
+ .strict();
17
+ export const createRunnerInstancesResponseSchema = z.object({
18
+ runner_instances: z.array(
19
+ z.object({runner_instance_id: z.string().uuid(), bootstrap_token: z.string().min(1)}),
20
+ ),
21
+ });
22
+ export const runnerBootstrapExchangeResponseSchema = z.object({
23
+ runner_instance_id: z.string().uuid(),
24
+ control_session_token: z.string().min(1),
25
+ expires_at: z.string().datetime(),
26
+ });
27
+ export const runnerEnrollmentBodySchema = z
28
+ .object({
29
+ labels: z.array(runnerLabelSchema).min(1).max(100),
30
+ capabilities: runnerToolCapabilitiesSchema.optional(),
31
+ provider_kind: z.string().min(1).max(64),
32
+ protocol_version: z.string().min(1).max(64),
33
+ })
34
+ .strict();
35
+ export const attachRunnerControlProviderIdBodySchema = z
36
+ .object({provider_runner_id: z.string().min(1).max(255)})
37
+ .strict();
38
+ export const runnerControlHeartbeatResponseSchema = z.object({ok: z.literal(true)});
39
+ export const runnerAssignmentPollResponseSchema = z.object({
40
+ activation_token: z.string().min(1).nullable(),
41
+ });
42
+
43
+ export type RunnerBootstrapExchangeBodyDto = z.infer<typeof runnerBootstrapExchangeBodySchema>;
44
+ export type CreateRunnerInstancesBodyDto = z.infer<typeof createRunnerInstancesBodySchema>;
45
+ export type CreateRunnerInstancesResponseDto = z.infer<typeof createRunnerInstancesResponseSchema>;
46
+ export type RunnerBootstrapExchangeResponseDto = z.infer<
47
+ typeof runnerBootstrapExchangeResponseSchema
48
+ >;
49
+ export type RunnerEnrollmentBodyDto = z.infer<typeof runnerEnrollmentBodySchema>;