@numa-tech/numa 1.13.0 → 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 (53) hide show
  1. package/README.md +87 -7
  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 +208 -8
  7. package/dist/application-onboarding/commands.js.map +1 -1
  8. package/dist/application-onboarding/schemas.d.ts +773 -1
  9. package/dist/application-onboarding/schemas.js +316 -4
  10. package/dist/application-onboarding/schemas.js.map +1 -1
  11. package/dist/application-onboarding/tui-model.d.ts +2 -0
  12. package/dist/application-onboarding/tui-model.js +150 -20
  13. package/dist/application-onboarding/tui-model.js.map +1 -1
  14. package/dist/application-onboarding/tui.d.ts +6 -1
  15. package/dist/application-onboarding/tui.js +87 -4
  16. package/dist/application-onboarding/tui.js.map +1 -1
  17. package/dist/cli.js +6 -1
  18. package/dist/cli.js.map +1 -1
  19. package/dist/command-catalog.js +171 -4
  20. package/dist/command-catalog.js.map +1 -1
  21. package/dist/gitops/schemas.js +2 -1
  22. package/dist/gitops/schemas.js.map +1 -1
  23. package/dist/jenkins-jobs/client.d.ts +319 -0
  24. package/dist/jenkins-jobs/client.js +136 -0
  25. package/dist/jenkins-jobs/client.js.map +1 -0
  26. package/dist/jenkins-jobs/commands.d.ts +6 -0
  27. package/dist/jenkins-jobs/commands.js +239 -0
  28. package/dist/jenkins-jobs/commands.js.map +1 -0
  29. package/dist/jenkins-jobs/schemas.d.ts +359 -0
  30. package/dist/jenkins-jobs/schemas.js +119 -0
  31. package/dist/jenkins-jobs/schemas.js.map +1 -0
  32. package/dist/publications/client.d.ts +181 -0
  33. package/dist/publications/client.js +147 -0
  34. package/dist/publications/client.js.map +1 -0
  35. package/dist/publications/commands.d.ts +8 -0
  36. package/dist/publications/commands.js +202 -0
  37. package/dist/publications/commands.js.map +1 -0
  38. package/dist/publications/scanner.d.ts +23 -0
  39. package/dist/publications/scanner.js +247 -0
  40. package/dist/publications/scanner.js.map +1 -0
  41. package/dist/publications/schemas.d.ts +164 -0
  42. package/dist/publications/schemas.js +90 -0
  43. package/dist/publications/schemas.js.map +1 -0
  44. package/dist/repositories/client.d.ts +36 -18
  45. package/dist/repositories/commands.d.ts +3 -0
  46. package/dist/repositories/commands.js +27 -6
  47. package/dist/repositories/commands.js.map +1 -1
  48. package/dist/repositories/errors.js +1 -1
  49. package/dist/repositories/errors.js.map +1 -1
  50. package/dist/repositories/schemas.d.ts +96 -64
  51. package/dist/repositories/schemas.js +9 -3
  52. package/dist/repositories/schemas.js.map +1 -1
  53. package/package.json +4 -4
@@ -0,0 +1,119 @@
1
+ import { z } from "zod";
2
+ const NonEmptyString = z.string().trim().min(1);
3
+ const OptionalString = NonEmptyString.nullable().optional();
4
+ const Sha256 = z.string().regex(/^[0-9a-f]{64}$/u);
5
+ export const JenkinsJobOperationSchema = z.enum(["CREATE_MULTIBRANCH", "USE_EXISTING"]);
6
+ export const JenkinsTierSchema = z.enum(["DEVELOP", "STAGING", "PRODUCTION", "UNKNOWN"]);
7
+ export const JenkinsScanModeSchema = z.enum(["NONE", "INDEX_ONLY"]);
8
+ export const JenkinsJobPlanStateSchema = z.enum(["READY", "BLOCKED", "CONSUMED", "EXPIRED", "SUPERSEDED"]);
9
+ export const JenkinsJobRunStateSchema = z.enum([
10
+ "ACCEPTED", "CREATING_JOB", "VERIFYING_CONFIGURATION", "SCANNING", "SYNCING_INVENTORY",
11
+ "BINDING", "RECONCILING", "WAITING_RETRY", "SUCCEEDED", "NEEDS_ATTENTION", "FAILED"
12
+ ]);
13
+ export const JenkinsJobPlanRequestSchema = z.object({
14
+ operation: JenkinsJobOperationSchema,
15
+ ownerTeamId: z.number().int().positive(),
16
+ applicationId: z.number().int().positive(),
17
+ instanceCode: NonEmptyString,
18
+ parentFullName: NonEmptyString.optional(),
19
+ jobName: NonEmptyString,
20
+ repositoryKey: NonEmptyString,
21
+ tier: JenkinsTierSchema,
22
+ defaultBranch: NonEmptyString.optional(),
23
+ jenkinsfilePath: NonEmptyString.optional(),
24
+ scanMode: JenkinsScanModeSchema.optional()
25
+ }).strict();
26
+ export const JenkinsJobNormalizedSpecSchema = z.object({
27
+ applicationId: z.number().int().positive(),
28
+ applicationCode: NonEmptyString,
29
+ instanceCode: NonEmptyString,
30
+ parentFullName: NonEmptyString.nullable(),
31
+ jobName: NonEmptyString,
32
+ fullName: NonEmptyString,
33
+ repositoryKey: NonEmptyString,
34
+ tier: JenkinsTierSchema,
35
+ defaultBranch: NonEmptyString,
36
+ jenkinsfilePath: NonEmptyString,
37
+ scanMode: JenkinsScanModeSchema,
38
+ expectedConfigDigest: Sha256,
39
+ credentialReferenceDigest: Sha256
40
+ }).strict();
41
+ export const JenkinsJobPlanSchema = z.object({
42
+ planNo: NonEmptyString,
43
+ operation: JenkinsJobOperationSchema,
44
+ state: JenkinsJobPlanStateSchema,
45
+ planHash: Sha256,
46
+ ownerTeamId: z.number().int().positive(),
47
+ consumerType: NonEmptyString,
48
+ consumerRef: NonEmptyString,
49
+ normalizedSpec: JenkinsJobNormalizedSpecSchema,
50
+ sideEffects: z.array(NonEmptyString).default([]),
51
+ warnings: z.array(NonEmptyString).default([]),
52
+ blockers: z.array(NonEmptyString).default([]),
53
+ expiresAt: OptionalString
54
+ }).strict();
55
+ export const JenkinsJobViewSchema = z.object({
56
+ id: z.number().int().positive(),
57
+ instanceId: z.number().int().positive(),
58
+ instanceCode: NonEmptyString,
59
+ fullName: NonEmptyString,
60
+ displayName: NonEmptyString,
61
+ jobType: z.enum(["FOLDER", "MULTIBRANCH", "PIPELINE", "FREESTYLE", "BRANCH", "OTHER"]),
62
+ tier: JenkinsTierSchema,
63
+ syncStatus: z.enum(["CURRENT", "STALE", "ERROR"]),
64
+ inventoryGeneration: z.number().int().nonnegative(),
65
+ configDigest: Sha256,
66
+ managedByControlPlane: z.boolean(),
67
+ lastSeenAt: OptionalString
68
+ }).strict();
69
+ export const JenkinsBindingViewSchema = z.object({
70
+ id: z.number().int().positive(),
71
+ applicationId: z.number().int().positive(),
72
+ applicationCode: NonEmptyString,
73
+ jobId: z.number().int().positive(),
74
+ tier: JenkinsTierSchema,
75
+ confirmationStatus: z.enum(["CANDIDATE", "CONFIRMED", "REJECTED"]),
76
+ productionLocked: z.boolean(),
77
+ version: z.number().int().nonnegative()
78
+ }).strict();
79
+ export const JenkinsJobRunSchema = z.object({
80
+ runNo: NonEmptyString,
81
+ planNo: NonEmptyString,
82
+ state: JenkinsJobRunStateSchema,
83
+ stepCode: OptionalString,
84
+ job: JenkinsJobViewSchema.optional(),
85
+ binding: JenkinsBindingViewSchema.optional(),
86
+ retryable: z.boolean().default(false),
87
+ errorCode: OptionalString,
88
+ errorMessage: OptionalString,
89
+ createdAt: OptionalString,
90
+ startedAt: OptionalString,
91
+ completedAt: OptionalString
92
+ }).strict();
93
+ export const JenkinsJobRunCreateSchema = z.object({
94
+ planNo: NonEmptyString,
95
+ planHash: Sha256,
96
+ clientRequestId: NonEmptyString
97
+ }).strict();
98
+ export const JenkinsJobRunPageSchema = z.object({
99
+ items: z.array(JenkinsJobRunSchema),
100
+ page: z.number().int().positive(),
101
+ size: z.number().int().positive(),
102
+ total: z.number().int().nonnegative(),
103
+ totalPages: z.number().int().nonnegative()
104
+ }).strict();
105
+ export const JenkinsJobRunEventSchema = z.object({
106
+ sequenceNo: z.number().int().nonnegative(),
107
+ eventType: NonEmptyString,
108
+ state: OptionalString,
109
+ stepCode: OptionalString,
110
+ message: OptionalString,
111
+ errorCode: OptionalString,
112
+ retryable: z.boolean().optional(),
113
+ occurredAt: OptionalString
114
+ }).strict();
115
+ export const JenkinsJobRunEventPageSchema = z.object({
116
+ items: z.array(JenkinsJobRunEventSchema),
117
+ nextSequence: z.number().int().nonnegative().nullable()
118
+ }).strict();
119
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/jenkins-jobs/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ import type { AuthConfig } from "../config.js";
2
+ import { type KeycloakTokenProvider } from "../oauth.js";
3
+ import { type PublicationPlanRequest } from "./schemas.js";
4
+ export declare const PUBLICATION_API_ROOT = "/api/v1/scm";
5
+ export declare const PUBLICATION_CONTRACT_VERSION = "v1";
6
+ interface PublicationClientDependencies {
7
+ fetch?: typeof fetch;
8
+ tokenProvider?: KeycloakTokenProvider;
9
+ }
10
+ export declare class ProjectPublicationClient {
11
+ private readonly config;
12
+ private readonly fetchImpl;
13
+ private readonly tokenProvider;
14
+ constructor(config: AuthConfig, dependencies?: PublicationClientDependencies);
15
+ private authenticatedFetch;
16
+ private json;
17
+ createPlan(input: PublicationPlanRequest, idempotencyKey: string): Promise<{
18
+ planNo: string;
19
+ state: "BLOCKED" | "CONSUMED" | "EXPIRED" | "READY";
20
+ planHash: string;
21
+ repositoryKey: string;
22
+ ownerTeamId?: string | number | null | undefined;
23
+ consumerType: string;
24
+ consumerRef: string;
25
+ publicationMode: "CAS_COMMIT" | "INITIAL_COMMIT";
26
+ branch: string;
27
+ expectedHead?: string | null | undefined;
28
+ manifest: {
29
+ path: string;
30
+ mode: "100644" | "100755";
31
+ size: number;
32
+ sha256: string;
33
+ action: "CREATE" | "UPDATE";
34
+ }[];
35
+ warnings: (string | {
36
+ code?: string | null | undefined;
37
+ path?: string | null | undefined;
38
+ message: string;
39
+ })[];
40
+ blockers: (string | {
41
+ code?: string | null | undefined;
42
+ path?: string | null | undefined;
43
+ message: string;
44
+ })[];
45
+ expiresAt?: string | null | undefined;
46
+ }>;
47
+ getPlan(planNo: string): Promise<{
48
+ planNo: string;
49
+ state: "BLOCKED" | "CONSUMED" | "EXPIRED" | "READY";
50
+ planHash: string;
51
+ repositoryKey: string;
52
+ ownerTeamId?: string | number | null | undefined;
53
+ consumerType: string;
54
+ consumerRef: string;
55
+ publicationMode: "CAS_COMMIT" | "INITIAL_COMMIT";
56
+ branch: string;
57
+ expectedHead?: string | null | undefined;
58
+ manifest: {
59
+ path: string;
60
+ mode: "100644" | "100755";
61
+ size: number;
62
+ sha256: string;
63
+ action: "CREATE" | "UPDATE";
64
+ }[];
65
+ warnings: (string | {
66
+ code?: string | null | undefined;
67
+ path?: string | null | undefined;
68
+ message: string;
69
+ })[];
70
+ blockers: (string | {
71
+ code?: string | null | undefined;
72
+ path?: string | null | undefined;
73
+ message: string;
74
+ })[];
75
+ expiresAt?: string | null | undefined;
76
+ }>;
77
+ createRun(input: {
78
+ planNo: string;
79
+ planHash: string;
80
+ clientRequestId: string;
81
+ }, idempotencyKey: string): Promise<{
82
+ runNo: string;
83
+ planNo: string;
84
+ state: "ACCEPTED" | "FAILED" | "NEEDS_ATTENTION" | "PUBLISHING" | "SUCCEEDED" | "VALIDATING" | "VERIFYING" | "WAITING_RETRY";
85
+ stepCode?: string | null | undefined;
86
+ repositoryKey: string;
87
+ beforeRevision?: string | null | undefined;
88
+ afterRevision?: string | null | undefined;
89
+ manifestDigest?: string | null | undefined;
90
+ filesWritten?: number | null | undefined;
91
+ retryable: boolean;
92
+ errorCode?: string | null | undefined;
93
+ errorMessage?: string | null | undefined;
94
+ createdAt?: string | null | undefined;
95
+ startedAt?: string | null | undefined;
96
+ completedAt?: string | null | undefined;
97
+ }>;
98
+ getRun(runNo: string): Promise<{
99
+ runNo: string;
100
+ planNo: string;
101
+ state: "ACCEPTED" | "FAILED" | "NEEDS_ATTENTION" | "PUBLISHING" | "SUCCEEDED" | "VALIDATING" | "VERIFYING" | "WAITING_RETRY";
102
+ stepCode?: string | null | undefined;
103
+ repositoryKey: string;
104
+ beforeRevision?: string | null | undefined;
105
+ afterRevision?: string | null | undefined;
106
+ manifestDigest?: string | null | undefined;
107
+ filesWritten?: number | null | undefined;
108
+ retryable: boolean;
109
+ errorCode?: string | null | undefined;
110
+ errorMessage?: string | null | undefined;
111
+ createdAt?: string | null | undefined;
112
+ startedAt?: string | null | undefined;
113
+ completedAt?: string | null | undefined;
114
+ }>;
115
+ resolveRun(clientRequestId: string): Promise<{
116
+ runNo: string;
117
+ planNo: string;
118
+ state: "ACCEPTED" | "FAILED" | "NEEDS_ATTENTION" | "PUBLISHING" | "SUCCEEDED" | "VALIDATING" | "VERIFYING" | "WAITING_RETRY";
119
+ stepCode?: string | null | undefined;
120
+ repositoryKey: string;
121
+ beforeRevision?: string | null | undefined;
122
+ afterRevision?: string | null | undefined;
123
+ manifestDigest?: string | null | undefined;
124
+ filesWritten?: number | null | undefined;
125
+ retryable: boolean;
126
+ errorCode?: string | null | undefined;
127
+ errorMessage?: string | null | undefined;
128
+ createdAt?: string | null | undefined;
129
+ startedAt?: string | null | undefined;
130
+ completedAt?: string | null | undefined;
131
+ }>;
132
+ events(runNo: string, afterSequence?: number, limit?: number): Promise<{
133
+ items: {
134
+ sequenceNo: number;
135
+ eventType: string;
136
+ state?: string | null | undefined;
137
+ stepCode?: string | null | undefined;
138
+ message?: string | null | undefined;
139
+ errorCode?: string | null | undefined;
140
+ retryable?: boolean | undefined;
141
+ occurredAt?: string | null | undefined;
142
+ }[];
143
+ nextSequence: number | null;
144
+ }>;
145
+ retry(runNo: string, idempotencyKey: string): Promise<{
146
+ runNo: string;
147
+ planNo: string;
148
+ state: "ACCEPTED" | "FAILED" | "NEEDS_ATTENTION" | "PUBLISHING" | "SUCCEEDED" | "VALIDATING" | "VERIFYING" | "WAITING_RETRY";
149
+ stepCode?: string | null | undefined;
150
+ repositoryKey: string;
151
+ beforeRevision?: string | null | undefined;
152
+ afterRevision?: string | null | undefined;
153
+ manifestDigest?: string | null | undefined;
154
+ filesWritten?: number | null | undefined;
155
+ retryable: boolean;
156
+ errorCode?: string | null | undefined;
157
+ errorMessage?: string | null | undefined;
158
+ createdAt?: string | null | undefined;
159
+ startedAt?: string | null | undefined;
160
+ completedAt?: string | null | undefined;
161
+ }>;
162
+ reconcile(runNo: string, idempotencyKey: string): Promise<{
163
+ runNo: string;
164
+ planNo: string;
165
+ state: "ACCEPTED" | "FAILED" | "NEEDS_ATTENTION" | "PUBLISHING" | "SUCCEEDED" | "VALIDATING" | "VERIFYING" | "WAITING_RETRY";
166
+ stepCode?: string | null | undefined;
167
+ repositoryKey: string;
168
+ beforeRevision?: string | null | undefined;
169
+ afterRevision?: string | null | undefined;
170
+ manifestDigest?: string | null | undefined;
171
+ filesWritten?: number | null | undefined;
172
+ retryable: boolean;
173
+ errorCode?: string | null | undefined;
174
+ errorMessage?: string | null | undefined;
175
+ createdAt?: string | null | undefined;
176
+ startedAt?: string | null | undefined;
177
+ completedAt?: string | null | undefined;
178
+ }>;
179
+ private recovery;
180
+ }
181
+ export {};
@@ -0,0 +1,147 @@
1
+ import { resolveBackendUrl } from "../backend.js";
2
+ import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
3
+ import { RepositoryError, redactRepositoryText } from "../repositories/errors.js";
4
+ import { RepositoryApiErrorSchema } from "../repositories/schemas.js";
5
+ import { PublicationPlanRequestSchema, PublicationPlanSchema, PublicationRunCreateSchema, PublicationRunEventListSchema, PublicationRunSchema } from "./schemas.js";
6
+ export const PUBLICATION_API_ROOT = "/api/v1/scm";
7
+ export const PUBLICATION_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 RepositoryError(`${label} is invalid.`, "PUBLICATION_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 RepositoryError(`${label} is invalid.`, "PUBLICATION_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
+ }
29
+ return query.size ? `${path}?${query.toString()}` : path;
30
+ }
31
+ async function responseBody(response) {
32
+ const text = await response.text();
33
+ if (!text)
34
+ return {};
35
+ try {
36
+ return JSON.parse(text);
37
+ }
38
+ catch {
39
+ return text;
40
+ }
41
+ }
42
+ function requestIdFrom(response, body) {
43
+ if (body && typeof body === "object" && "requestId" in body && typeof body.requestId === "string")
44
+ return body.requestId;
45
+ if (body && typeof body === "object" && "error" in body && body.error && typeof body.error === "object"
46
+ && "requestId" in body.error && typeof body.error.requestId === "string")
47
+ return body.error.requestId;
48
+ return response.headers.get("x-request-id") ?? undefined;
49
+ }
50
+ function apiFailure(response, body) {
51
+ const parsed = RepositoryApiErrorSchema.safeParse(body);
52
+ const message = parsed.success
53
+ ? parsed.data.message ?? response.statusText ?? "Project Publication API request failed."
54
+ : typeof body === "string" ? body : response.statusText || "Project Publication API request failed.";
55
+ return new RepositoryError(`Project Publication API HTTP ${response.status}: ${redactRepositoryText(message)}`, parsed.success ? parsed.data.code ?? "PUBLICATION_API_ERROR" : "PUBLICATION_API_ERROR", response.status, requestIdFrom(response, body), parsed.success ? parsed.data.details : undefined);
56
+ }
57
+ export class ProjectPublicationClient {
58
+ config;
59
+ fetchImpl;
60
+ tokenProvider;
61
+ constructor(config, dependencies = {}) {
62
+ this.config = config;
63
+ this.fetchImpl = dependencies.fetch ?? fetch;
64
+ this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
65
+ }
66
+ async authenticatedFetch(path, init = {}) {
67
+ const method = String(init.method ?? "GET").toUpperCase();
68
+ const url = resolveBackendUrl(this.config, { method, path });
69
+ const headers = new Headers(init.headers);
70
+ headers.set("Accept", "application/json");
71
+ headers.set("X-Numa-Publication-Contract", PUBLICATION_CONTRACT_VERSION);
72
+ if (init.body != null)
73
+ headers.set("Content-Type", "application/json");
74
+ return fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), {
75
+ fetch: this.fetchImpl,
76
+ tokenProvider: this.tokenProvider
77
+ });
78
+ }
79
+ async json(path, schema, init = {}, expectedStatuses) {
80
+ const response = await this.authenticatedFetch(path, init);
81
+ const body = await responseBody(response);
82
+ if (!response.ok)
83
+ throw apiFailure(response, body);
84
+ if (expectedStatuses && !expectedStatuses.includes(response.status)) {
85
+ throw new RepositoryError(`Project Publication API returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "PUBLICATION_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
86
+ }
87
+ const parsed = schema.safeParse(body);
88
+ if (!parsed.success) {
89
+ throw new RepositoryError(`Project Publication API returned an invalid response: ${parsed.error.message}`, "PUBLICATION_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
90
+ }
91
+ return parsed.data;
92
+ }
93
+ createPlan(input, idempotencyKey) {
94
+ const parsed = PublicationPlanRequestSchema.safeParse(input);
95
+ if (!parsed.success) {
96
+ throw new RepositoryError(`Publication plan input is invalid: ${parsed.error.message}`, "PUBLICATION_CLI_INPUT_INVALID");
97
+ }
98
+ const key = safeRequestId(idempotencyKey, "idempotency-key");
99
+ if (key !== safeRequestId(parsed.data.clientRequestId, "client-request-id")) {
100
+ throw new RepositoryError("idempotency-key must exactly match client-request-id.", "PUBLICATION_IDEMPOTENCY_INVALID");
101
+ }
102
+ return this.json(`${PUBLICATION_API_ROOT}/project-publication-plans`, PublicationPlanSchema, {
103
+ method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify(parsed.data)
104
+ }, [200, 201]);
105
+ }
106
+ getPlan(planNo) {
107
+ return this.json(`${PUBLICATION_API_ROOT}/project-publication-plans/${encodeURIComponent(safeIdentifier(planNo, "plan-no"))}`, PublicationPlanSchema);
108
+ }
109
+ createRun(input, idempotencyKey) {
110
+ const parsed = PublicationRunCreateSchema.safeParse(input);
111
+ if (!parsed.success) {
112
+ throw new RepositoryError(`Publication run input is invalid: ${parsed.error.message}`, "PUBLICATION_CLI_INPUT_INVALID");
113
+ }
114
+ const key = safeRequestId(idempotencyKey, "idempotency-key");
115
+ if (key !== safeRequestId(parsed.data.clientRequestId, "client-request-id")) {
116
+ throw new RepositoryError("idempotency-key must exactly match client-request-id.", "PUBLICATION_IDEMPOTENCY_INVALID");
117
+ }
118
+ return this.json(`${PUBLICATION_API_ROOT}/project-publication-runs`, PublicationRunSchema, {
119
+ method: "POST", headers: { "Idempotency-Key": key }, body: JSON.stringify(parsed.data)
120
+ }, [200, 202]);
121
+ }
122
+ getRun(runNo) {
123
+ return this.json(`${PUBLICATION_API_ROOT}/project-publication-runs/${encodeURIComponent(safeIdentifier(runNo, "run-no"))}`, PublicationRunSchema);
124
+ }
125
+ resolveRun(clientRequestId) {
126
+ return this.json(queryPath(`${PUBLICATION_API_ROOT}/project-publication-runs/resolve`, {
127
+ clientRequestId: safeRequestId(clientRequestId, "client-request-id")
128
+ }), PublicationRunSchema);
129
+ }
130
+ events(runNo, afterSequence = 0, limit = 100) {
131
+ return this.json(queryPath(`${PUBLICATION_API_ROOT}/project-publication-runs/${encodeURIComponent(safeIdentifier(runNo, "run-no"))}/events`, { afterSequence, limit }), PublicationRunEventListSchema);
132
+ }
133
+ retry(runNo, idempotencyKey) {
134
+ return this.recovery(runNo, "retry", idempotencyKey);
135
+ }
136
+ reconcile(runNo, idempotencyKey) {
137
+ return this.recovery(runNo, "reconcile", idempotencyKey);
138
+ }
139
+ recovery(runNo, action, idempotencyKey) {
140
+ const run = encodeURIComponent(safeIdentifier(runNo, "run-no"));
141
+ const key = safeRequestId(idempotencyKey, "idempotency-key");
142
+ return this.json(`${PUBLICATION_API_ROOT}/project-publication-runs/${run}/${action}`, PublicationRunSchema, {
143
+ method: "POST", headers: { "Idempotency-Key": key }
144
+ }, [200, 202]);
145
+ }
146
+ }
147
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/publications/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Command } from "commander";
2
+ import { ProjectPublicationClient } from "./client.js";
3
+ import { type PublicationScanResult } from "./scanner.js";
4
+ export interface PublicationCommandDependencies {
5
+ clientFactory?: () => ProjectPublicationClient;
6
+ scan?: (sourceDirectory: string) => Promise<PublicationScanResult>;
7
+ }
8
+ export declare function registerPublicationCommands(program: Command, dependencies?: PublicationCommandDependencies): void;