@numa-tech/numa 1.13.1 → 1.13.2

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 (38) hide show
  1. package/README.md +59 -5
  2. package/dist/application-onboarding/client.d.ts +37 -3
  3. package/dist/application-onboarding/client.js +31 -2
  4. package/dist/application-onboarding/client.js.map +1 -1
  5. package/dist/application-onboarding/commands.d.ts +2 -0
  6. package/dist/application-onboarding/commands.js +202 -6
  7. package/dist/application-onboarding/commands.js.map +1 -1
  8. package/dist/application-onboarding/schemas.d.ts +772 -0
  9. package/dist/application-onboarding/schemas.js +315 -3
  10. package/dist/application-onboarding/schemas.js.map +1 -1
  11. package/dist/cli.js +6 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/command-catalog.js +154 -2
  14. package/dist/command-catalog.js.map +1 -1
  15. package/dist/gitops/schemas.js +2 -1
  16. package/dist/gitops/schemas.js.map +1 -1
  17. package/dist/jenkins-jobs/client.d.ts +319 -0
  18. package/dist/jenkins-jobs/client.js +136 -0
  19. package/dist/jenkins-jobs/client.js.map +1 -0
  20. package/dist/jenkins-jobs/commands.d.ts +6 -0
  21. package/dist/jenkins-jobs/commands.js +239 -0
  22. package/dist/jenkins-jobs/commands.js.map +1 -0
  23. package/dist/jenkins-jobs/schemas.d.ts +359 -0
  24. package/dist/jenkins-jobs/schemas.js +119 -0
  25. package/dist/jenkins-jobs/schemas.js.map +1 -0
  26. package/dist/publications/client.d.ts +181 -0
  27. package/dist/publications/client.js +147 -0
  28. package/dist/publications/client.js.map +1 -0
  29. package/dist/publications/commands.d.ts +8 -0
  30. package/dist/publications/commands.js +202 -0
  31. package/dist/publications/commands.js.map +1 -0
  32. package/dist/publications/scanner.d.ts +23 -0
  33. package/dist/publications/scanner.js +247 -0
  34. package/dist/publications/scanner.js.map +1 -0
  35. package/dist/publications/schemas.d.ts +164 -0
  36. package/dist/publications/schemas.js +90 -0
  37. package/dist/publications/schemas.js.map +1 -0
  38. package/package.json +4 -4
@@ -0,0 +1,319 @@
1
+ import type { AuthConfig } from "../config.js";
2
+ import { type KeycloakTokenProvider } from "../oauth.js";
3
+ import { type JenkinsJobPlanRequest } from "./schemas.js";
4
+ export declare const JENKINS_JOB_API_ROOT = "/api/v1/jenkins";
5
+ export declare const JENKINS_JOB_CONTRACT_VERSION = "v1";
6
+ interface JenkinsJobClientDependencies {
7
+ fetch?: typeof fetch;
8
+ tokenProvider?: KeycloakTokenProvider;
9
+ }
10
+ export declare class JenkinsJobClient {
11
+ private readonly config;
12
+ private readonly fetchImpl;
13
+ private readonly tokenProvider;
14
+ constructor(config: AuthConfig, dependencies?: JenkinsJobClientDependencies);
15
+ private authenticatedFetch;
16
+ private json;
17
+ createPlan(input: JenkinsJobPlanRequest): Promise<{
18
+ planNo: string;
19
+ operation: "CREATE_MULTIBRANCH" | "USE_EXISTING";
20
+ state: "BLOCKED" | "CONSUMED" | "EXPIRED" | "READY" | "SUPERSEDED";
21
+ planHash: string;
22
+ ownerTeamId: number;
23
+ consumerType: string;
24
+ consumerRef: string;
25
+ normalizedSpec: {
26
+ applicationId: number;
27
+ applicationCode: string;
28
+ instanceCode: string;
29
+ parentFullName: string | null;
30
+ jobName: string;
31
+ fullName: string;
32
+ repositoryKey: string;
33
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
34
+ defaultBranch: string;
35
+ jenkinsfilePath: string;
36
+ scanMode: "INDEX_ONLY" | "NONE";
37
+ expectedConfigDigest: string;
38
+ credentialReferenceDigest: string;
39
+ };
40
+ sideEffects: string[];
41
+ warnings: string[];
42
+ blockers: string[];
43
+ expiresAt?: string | null | undefined;
44
+ }>;
45
+ getPlan(planNo: string): Promise<{
46
+ planNo: string;
47
+ operation: "CREATE_MULTIBRANCH" | "USE_EXISTING";
48
+ state: "BLOCKED" | "CONSUMED" | "EXPIRED" | "READY" | "SUPERSEDED";
49
+ planHash: string;
50
+ ownerTeamId: number;
51
+ consumerType: string;
52
+ consumerRef: string;
53
+ normalizedSpec: {
54
+ applicationId: number;
55
+ applicationCode: string;
56
+ instanceCode: string;
57
+ parentFullName: string | null;
58
+ jobName: string;
59
+ fullName: string;
60
+ repositoryKey: string;
61
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
62
+ defaultBranch: string;
63
+ jenkinsfilePath: string;
64
+ scanMode: "INDEX_ONLY" | "NONE";
65
+ expectedConfigDigest: string;
66
+ credentialReferenceDigest: string;
67
+ };
68
+ sideEffects: string[];
69
+ warnings: string[];
70
+ blockers: string[];
71
+ expiresAt?: string | null | undefined;
72
+ }>;
73
+ createRun(input: {
74
+ planNo: string;
75
+ planHash: string;
76
+ clientRequestId: string;
77
+ }, idempotencyKey: string): Promise<{
78
+ runNo: string;
79
+ planNo: string;
80
+ state: "ACCEPTED" | "BINDING" | "CREATING_JOB" | "FAILED" | "NEEDS_ATTENTION" | "RECONCILING" | "SCANNING" | "SUCCEEDED" | "SYNCING_INVENTORY" | "VERIFYING_CONFIGURATION" | "WAITING_RETRY";
81
+ stepCode?: string | null | undefined;
82
+ job?: {
83
+ id: number;
84
+ instanceId: number;
85
+ instanceCode: string;
86
+ fullName: string;
87
+ displayName: string;
88
+ jobType: "BRANCH" | "FOLDER" | "FREESTYLE" | "MULTIBRANCH" | "OTHER" | "PIPELINE";
89
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
90
+ syncStatus: "CURRENT" | "ERROR" | "STALE";
91
+ inventoryGeneration: number;
92
+ configDigest: string;
93
+ managedByControlPlane: boolean;
94
+ lastSeenAt?: string | null | undefined;
95
+ } | undefined;
96
+ binding?: {
97
+ id: number;
98
+ applicationId: number;
99
+ applicationCode: string;
100
+ jobId: number;
101
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
102
+ confirmationStatus: "CANDIDATE" | "CONFIRMED" | "REJECTED";
103
+ productionLocked: boolean;
104
+ version: number;
105
+ } | undefined;
106
+ retryable: boolean;
107
+ errorCode?: string | null | undefined;
108
+ errorMessage?: string | null | undefined;
109
+ createdAt?: string | null | undefined;
110
+ startedAt?: string | null | undefined;
111
+ completedAt?: string | null | undefined;
112
+ }>;
113
+ listRuns(options?: {
114
+ state?: string;
115
+ consumerType?: string;
116
+ page?: number;
117
+ size?: number;
118
+ }): Promise<{
119
+ items: {
120
+ runNo: string;
121
+ planNo: string;
122
+ state: "ACCEPTED" | "BINDING" | "CREATING_JOB" | "FAILED" | "NEEDS_ATTENTION" | "RECONCILING" | "SCANNING" | "SUCCEEDED" | "SYNCING_INVENTORY" | "VERIFYING_CONFIGURATION" | "WAITING_RETRY";
123
+ stepCode?: string | null | undefined;
124
+ job?: {
125
+ id: number;
126
+ instanceId: number;
127
+ instanceCode: string;
128
+ fullName: string;
129
+ displayName: string;
130
+ jobType: "BRANCH" | "FOLDER" | "FREESTYLE" | "MULTIBRANCH" | "OTHER" | "PIPELINE";
131
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
132
+ syncStatus: "CURRENT" | "ERROR" | "STALE";
133
+ inventoryGeneration: number;
134
+ configDigest: string;
135
+ managedByControlPlane: boolean;
136
+ lastSeenAt?: string | null | undefined;
137
+ } | undefined;
138
+ binding?: {
139
+ id: number;
140
+ applicationId: number;
141
+ applicationCode: string;
142
+ jobId: number;
143
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
144
+ confirmationStatus: "CANDIDATE" | "CONFIRMED" | "REJECTED";
145
+ productionLocked: boolean;
146
+ version: number;
147
+ } | undefined;
148
+ retryable: boolean;
149
+ errorCode?: string | null | undefined;
150
+ errorMessage?: string | null | undefined;
151
+ createdAt?: string | null | undefined;
152
+ startedAt?: string | null | undefined;
153
+ completedAt?: string | null | undefined;
154
+ }[];
155
+ page: number;
156
+ size: number;
157
+ total: number;
158
+ totalPages: number;
159
+ }>;
160
+ getRun(runNo: string): Promise<{
161
+ runNo: string;
162
+ planNo: string;
163
+ state: "ACCEPTED" | "BINDING" | "CREATING_JOB" | "FAILED" | "NEEDS_ATTENTION" | "RECONCILING" | "SCANNING" | "SUCCEEDED" | "SYNCING_INVENTORY" | "VERIFYING_CONFIGURATION" | "WAITING_RETRY";
164
+ stepCode?: string | null | undefined;
165
+ job?: {
166
+ id: number;
167
+ instanceId: number;
168
+ instanceCode: string;
169
+ fullName: string;
170
+ displayName: string;
171
+ jobType: "BRANCH" | "FOLDER" | "FREESTYLE" | "MULTIBRANCH" | "OTHER" | "PIPELINE";
172
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
173
+ syncStatus: "CURRENT" | "ERROR" | "STALE";
174
+ inventoryGeneration: number;
175
+ configDigest: string;
176
+ managedByControlPlane: boolean;
177
+ lastSeenAt?: string | null | undefined;
178
+ } | undefined;
179
+ binding?: {
180
+ id: number;
181
+ applicationId: number;
182
+ applicationCode: string;
183
+ jobId: number;
184
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
185
+ confirmationStatus: "CANDIDATE" | "CONFIRMED" | "REJECTED";
186
+ productionLocked: boolean;
187
+ version: number;
188
+ } | undefined;
189
+ retryable: boolean;
190
+ errorCode?: string | null | undefined;
191
+ errorMessage?: string | null | undefined;
192
+ createdAt?: string | null | undefined;
193
+ startedAt?: string | null | undefined;
194
+ completedAt?: string | null | undefined;
195
+ }>;
196
+ resolveRun(clientRequestId: string): Promise<{
197
+ runNo: string;
198
+ planNo: string;
199
+ state: "ACCEPTED" | "BINDING" | "CREATING_JOB" | "FAILED" | "NEEDS_ATTENTION" | "RECONCILING" | "SCANNING" | "SUCCEEDED" | "SYNCING_INVENTORY" | "VERIFYING_CONFIGURATION" | "WAITING_RETRY";
200
+ stepCode?: string | null | undefined;
201
+ job?: {
202
+ id: number;
203
+ instanceId: number;
204
+ instanceCode: string;
205
+ fullName: string;
206
+ displayName: string;
207
+ jobType: "BRANCH" | "FOLDER" | "FREESTYLE" | "MULTIBRANCH" | "OTHER" | "PIPELINE";
208
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
209
+ syncStatus: "CURRENT" | "ERROR" | "STALE";
210
+ inventoryGeneration: number;
211
+ configDigest: string;
212
+ managedByControlPlane: boolean;
213
+ lastSeenAt?: string | null | undefined;
214
+ } | undefined;
215
+ binding?: {
216
+ id: number;
217
+ applicationId: number;
218
+ applicationCode: string;
219
+ jobId: number;
220
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
221
+ confirmationStatus: "CANDIDATE" | "CONFIRMED" | "REJECTED";
222
+ productionLocked: boolean;
223
+ version: number;
224
+ } | undefined;
225
+ retryable: boolean;
226
+ errorCode?: string | null | undefined;
227
+ errorMessage?: string | null | undefined;
228
+ createdAt?: string | null | undefined;
229
+ startedAt?: string | null | undefined;
230
+ completedAt?: string | null | undefined;
231
+ }>;
232
+ events(runNo: string, afterSequence?: number, limit?: number): Promise<{
233
+ items: {
234
+ sequenceNo: number;
235
+ eventType: string;
236
+ state?: string | null | undefined;
237
+ stepCode?: string | null | undefined;
238
+ message?: string | null | undefined;
239
+ errorCode?: string | null | undefined;
240
+ retryable?: boolean | undefined;
241
+ occurredAt?: string | null | undefined;
242
+ }[];
243
+ nextSequence: number | null;
244
+ }>;
245
+ retry(runNo: string, idempotencyKey: string): Promise<{
246
+ runNo: string;
247
+ planNo: string;
248
+ state: "ACCEPTED" | "BINDING" | "CREATING_JOB" | "FAILED" | "NEEDS_ATTENTION" | "RECONCILING" | "SCANNING" | "SUCCEEDED" | "SYNCING_INVENTORY" | "VERIFYING_CONFIGURATION" | "WAITING_RETRY";
249
+ stepCode?: string | null | undefined;
250
+ job?: {
251
+ id: number;
252
+ instanceId: number;
253
+ instanceCode: string;
254
+ fullName: string;
255
+ displayName: string;
256
+ jobType: "BRANCH" | "FOLDER" | "FREESTYLE" | "MULTIBRANCH" | "OTHER" | "PIPELINE";
257
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
258
+ syncStatus: "CURRENT" | "ERROR" | "STALE";
259
+ inventoryGeneration: number;
260
+ configDigest: string;
261
+ managedByControlPlane: boolean;
262
+ lastSeenAt?: string | null | undefined;
263
+ } | undefined;
264
+ binding?: {
265
+ id: number;
266
+ applicationId: number;
267
+ applicationCode: string;
268
+ jobId: number;
269
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
270
+ confirmationStatus: "CANDIDATE" | "CONFIRMED" | "REJECTED";
271
+ productionLocked: boolean;
272
+ version: number;
273
+ } | undefined;
274
+ retryable: boolean;
275
+ errorCode?: string | null | undefined;
276
+ errorMessage?: string | null | undefined;
277
+ createdAt?: string | null | undefined;
278
+ startedAt?: string | null | undefined;
279
+ completedAt?: string | null | undefined;
280
+ }>;
281
+ reconcile(runNo: string, idempotencyKey: string): Promise<{
282
+ runNo: string;
283
+ planNo: string;
284
+ state: "ACCEPTED" | "BINDING" | "CREATING_JOB" | "FAILED" | "NEEDS_ATTENTION" | "RECONCILING" | "SCANNING" | "SUCCEEDED" | "SYNCING_INVENTORY" | "VERIFYING_CONFIGURATION" | "WAITING_RETRY";
285
+ stepCode?: string | null | undefined;
286
+ job?: {
287
+ id: number;
288
+ instanceId: number;
289
+ instanceCode: string;
290
+ fullName: string;
291
+ displayName: string;
292
+ jobType: "BRANCH" | "FOLDER" | "FREESTYLE" | "MULTIBRANCH" | "OTHER" | "PIPELINE";
293
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
294
+ syncStatus: "CURRENT" | "ERROR" | "STALE";
295
+ inventoryGeneration: number;
296
+ configDigest: string;
297
+ managedByControlPlane: boolean;
298
+ lastSeenAt?: string | null | undefined;
299
+ } | undefined;
300
+ binding?: {
301
+ id: number;
302
+ applicationId: number;
303
+ applicationCode: string;
304
+ jobId: number;
305
+ tier: "DEVELOP" | "PRODUCTION" | "STAGING" | "UNKNOWN";
306
+ confirmationStatus: "CANDIDATE" | "CONFIRMED" | "REJECTED";
307
+ productionLocked: boolean;
308
+ version: number;
309
+ } | undefined;
310
+ retryable: boolean;
311
+ errorCode?: string | null | undefined;
312
+ errorMessage?: string | null | undefined;
313
+ createdAt?: string | null | undefined;
314
+ startedAt?: string | null | undefined;
315
+ completedAt?: string | null | undefined;
316
+ }>;
317
+ private recovery;
318
+ }
319
+ export {};
@@ -0,0 +1,136 @@
1
+ import { resolveBackendUrl } from "../backend.js";
2
+ import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
3
+ import { PipelineError, redactPipelineText } from "../pipeline/errors.js";
4
+ import { ApiErrorSchema } from "../pipeline/schemas.js";
5
+ import { JenkinsJobPlanRequestSchema, JenkinsJobPlanSchema, JenkinsJobRunCreateSchema, JenkinsJobRunEventPageSchema, JenkinsJobRunPageSchema, JenkinsJobRunSchema } from "./schemas.js";
6
+ export const JENKINS_JOB_API_ROOT = "/api/v1/jenkins";
7
+ export const JENKINS_JOB_CONTRACT_VERSION = "v1";
8
+ function safeIdentifier(value, label) {
9
+ const trimmed = value.trim();
10
+ if (!trimmed || trimmed.length > 256 || !/^[A-Za-z0-9][A-Za-z0-9._:+%~-]*$/u.test(trimmed)
11
+ || /%(?![0-9A-Fa-f]{2})/u.test(trimmed)) {
12
+ throw new PipelineError(`${label} is invalid.`, "JENKINS_JOB_CLI_INPUT_INVALID");
13
+ }
14
+ return trimmed;
15
+ }
16
+ function safeRequestId(value, label) {
17
+ const trimmed = value.trim();
18
+ if (!trimmed || trimmed.length > 200 || !/^[A-Za-z0-9][A-Za-z0-9._:/+-]*$/u.test(trimmed)) {
19
+ throw new PipelineError(`${label} is invalid.`, "JENKINS_JOB_IDEMPOTENCY_INVALID");
20
+ }
21
+ return trimmed;
22
+ }
23
+ function queryPath(path, values) {
24
+ const query = new URLSearchParams();
25
+ for (const [key, value] of Object.entries(values))
26
+ if (value != null && value !== "")
27
+ query.set(key, String(value));
28
+ return query.size ? `${path}?${query.toString()}` : path;
29
+ }
30
+ async function responseBody(response) {
31
+ const text = await response.text();
32
+ if (!text)
33
+ return {};
34
+ try {
35
+ return JSON.parse(text);
36
+ }
37
+ catch {
38
+ return text;
39
+ }
40
+ }
41
+ function requestIdFrom(response, body) {
42
+ if (body && typeof body === "object" && "requestId" in body && typeof body.requestId === "string")
43
+ return body.requestId;
44
+ return response.headers.get("x-request-id") ?? undefined;
45
+ }
46
+ function apiFailure(response, body) {
47
+ const parsed = ApiErrorSchema.safeParse(body);
48
+ const message = parsed.success
49
+ ? parsed.data.message ?? response.statusText ?? "Jenkins Job API request failed."
50
+ : typeof body === "string" ? body : response.statusText || "Jenkins Job API request failed.";
51
+ return new PipelineError(`Jenkins Job API HTTP ${response.status}: ${redactPipelineText(message)}`, parsed.success ? parsed.data.code ?? "JENKINS_JOB_API_ERROR" : "JENKINS_JOB_API_ERROR", response.status, requestIdFrom(response, body));
52
+ }
53
+ export class JenkinsJobClient {
54
+ config;
55
+ fetchImpl;
56
+ tokenProvider;
57
+ constructor(config, dependencies = {}) {
58
+ this.config = config;
59
+ this.fetchImpl = dependencies.fetch ?? fetch;
60
+ this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
61
+ }
62
+ async authenticatedFetch(path, init = {}) {
63
+ const method = String(init.method ?? "GET").toUpperCase();
64
+ const url = resolveBackendUrl(this.config, { method, path });
65
+ const headers = new Headers(init.headers);
66
+ headers.set("Accept", "application/json");
67
+ headers.set("X-Numa-Jenkins-Job-Contract", JENKINS_JOB_CONTRACT_VERSION);
68
+ if (init.body != null)
69
+ headers.set("Content-Type", "application/json");
70
+ return fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), {
71
+ fetch: this.fetchImpl,
72
+ tokenProvider: this.tokenProvider
73
+ });
74
+ }
75
+ async json(path, schema, init = {}, expectedStatuses) {
76
+ const response = await this.authenticatedFetch(path, init);
77
+ const body = await responseBody(response);
78
+ if (!response.ok)
79
+ throw apiFailure(response, body);
80
+ if (expectedStatuses && !expectedStatuses.includes(response.status)) {
81
+ throw new PipelineError(`Jenkins Job API returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "JENKINS_JOB_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
82
+ }
83
+ const parsed = schema.safeParse(body);
84
+ if (!parsed.success) {
85
+ throw new PipelineError(`Jenkins Job API returned an invalid response: ${parsed.error.message}`, "JENKINS_JOB_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
86
+ }
87
+ return parsed.data;
88
+ }
89
+ createPlan(input) {
90
+ const parsed = JenkinsJobPlanRequestSchema.safeParse(input);
91
+ if (!parsed.success)
92
+ throw new PipelineError(`Jenkins Job plan input is invalid: ${parsed.error.message}`, "JENKINS_JOB_CLI_INPUT_INVALID");
93
+ return this.json(`${JENKINS_JOB_API_ROOT}/job-plans`, JenkinsJobPlanSchema, {
94
+ method: "POST", body: JSON.stringify(parsed.data)
95
+ }, [200, 201]);
96
+ }
97
+ getPlan(planNo) {
98
+ return this.json(`${JENKINS_JOB_API_ROOT}/job-plans/${encodeURIComponent(safeIdentifier(planNo, "plan-no"))}`, JenkinsJobPlanSchema);
99
+ }
100
+ createRun(input, idempotencyKey) {
101
+ const parsed = JenkinsJobRunCreateSchema.safeParse(input);
102
+ if (!parsed.success)
103
+ throw new PipelineError(`Jenkins Job run input is invalid: ${parsed.error.message}`, "JENKINS_JOB_CLI_INPUT_INVALID");
104
+ const key = safeRequestId(idempotencyKey, "idempotency-key");
105
+ if (key !== safeRequestId(parsed.data.clientRequestId, "client-request-id")) {
106
+ throw new PipelineError("idempotency-key must exactly match client-request-id.", "JENKINS_JOB_IDEMPOTENCY_INVALID");
107
+ }
108
+ return this.json(`${JENKINS_JOB_API_ROOT}/job-runs`, JenkinsJobRunSchema, {
109
+ method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify(parsed.data)
110
+ }, [200, 202]);
111
+ }
112
+ listRuns(options = {}) {
113
+ return this.json(queryPath(`${JENKINS_JOB_API_ROOT}/job-runs`, options), JenkinsJobRunPageSchema);
114
+ }
115
+ getRun(runNo) {
116
+ return this.json(`${JENKINS_JOB_API_ROOT}/job-runs/${encodeURIComponent(safeIdentifier(runNo, "run-no"))}`, JenkinsJobRunSchema);
117
+ }
118
+ resolveRun(clientRequestId) {
119
+ return this.json(queryPath(`${JENKINS_JOB_API_ROOT}/job-runs/resolve`, {
120
+ clientRequestId: safeRequestId(clientRequestId, "client-request-id")
121
+ }), JenkinsJobRunSchema);
122
+ }
123
+ events(runNo, afterSequence = 0, limit = 100) {
124
+ return this.json(queryPath(`${JENKINS_JOB_API_ROOT}/job-runs/${encodeURIComponent(safeIdentifier(runNo, "run-no"))}/events`, { afterSequence, limit }), JenkinsJobRunEventPageSchema);
125
+ }
126
+ retry(runNo, idempotencyKey) { return this.recovery(runNo, "retry", idempotencyKey); }
127
+ reconcile(runNo, idempotencyKey) { return this.recovery(runNo, "reconcile", idempotencyKey); }
128
+ recovery(runNo, action, idempotencyKey) {
129
+ const run = encodeURIComponent(safeIdentifier(runNo, "run-no"));
130
+ const key = safeRequestId(idempotencyKey, "idempotency-key");
131
+ return this.json(`${JENKINS_JOB_API_ROOT}/job-runs/${run}/${action}`, JenkinsJobRunSchema, {
132
+ method: "POST", headers: { "Idempotency-Key": key }
133
+ }, [200, 202]);
134
+ }
135
+ }
136
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/jenkins-jobs/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Command } from "commander";
2
+ import { JenkinsJobClient } from "./client.js";
3
+ export interface JenkinsJobCommandDependencies {
4
+ clientFactory?: () => JenkinsJobClient;
5
+ }
6
+ export declare function registerJenkinsJobCommands(program: Command, dependencies?: JenkinsJobCommandDependencies): void;