@numa-tech/numa 1.12.10 → 1.13.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 (94) hide show
  1. package/README.md +96 -14
  2. package/dist/ai-registry/commands.js +33 -33
  3. package/dist/ai-registry/commands.js.map +1 -1
  4. package/dist/app-config.d.ts +0 -1
  5. package/dist/app-config.js +4 -2
  6. package/dist/app-config.js.map +1 -1
  7. package/dist/application-onboarding/client.d.ts +83 -8
  8. package/dist/application-onboarding/client.js +23 -1
  9. package/dist/application-onboarding/client.js.map +1 -1
  10. package/dist/application-onboarding/commands.js +66 -4
  11. package/dist/application-onboarding/commands.js.map +1 -1
  12. package/dist/application-onboarding/schemas.d.ts +301 -58
  13. package/dist/application-onboarding/schemas.js +134 -8
  14. package/dist/application-onboarding/schemas.js.map +1 -1
  15. package/dist/application-onboarding/tui-model.d.ts +18 -0
  16. package/dist/application-onboarding/tui-model.js +215 -3
  17. package/dist/application-onboarding/tui-model.js.map +1 -1
  18. package/dist/application-onboarding/tui.d.ts +1 -1
  19. package/dist/application-onboarding/tui.js +20 -6
  20. package/dist/application-onboarding/tui.js.map +1 -1
  21. package/dist/authorization/access-request-client.d.ts +45 -0
  22. package/dist/authorization/access-request-client.js +93 -0
  23. package/dist/authorization/access-request-client.js.map +1 -0
  24. package/dist/authorization/access-request-commands.d.ts +25 -0
  25. package/dist/authorization/access-request-commands.js +196 -0
  26. package/dist/authorization/access-request-commands.js.map +1 -0
  27. package/dist/authorization/access-request-schemas.d.ts +123 -0
  28. package/dist/authorization/access-request-schemas.js +67 -0
  29. package/dist/authorization/access-request-schemas.js.map +1 -0
  30. package/dist/authorization/client.d.ts +50 -0
  31. package/dist/authorization/client.js +113 -0
  32. package/dist/authorization/client.js.map +1 -0
  33. package/dist/authorization/commands.d.ts +40 -0
  34. package/dist/authorization/commands.js +296 -0
  35. package/dist/authorization/commands.js.map +1 -0
  36. package/dist/authorization/errors.d.ts +13 -0
  37. package/dist/authorization/errors.js +70 -0
  38. package/dist/authorization/errors.js.map +1 -0
  39. package/dist/authorization/schemas.d.ts +187 -0
  40. package/dist/authorization/schemas.js +101 -0
  41. package/dist/authorization/schemas.js.map +1 -0
  42. package/dist/cli.js +73 -9
  43. package/dist/cli.js.map +1 -1
  44. package/dist/clusters/client.d.ts +436 -0
  45. package/dist/clusters/client.js +207 -0
  46. package/dist/clusters/client.js.map +1 -0
  47. package/dist/clusters/commands.d.ts +11 -0
  48. package/dist/clusters/commands.js +373 -0
  49. package/dist/clusters/commands.js.map +1 -0
  50. package/dist/clusters/errors.d.ts +10 -0
  51. package/dist/clusters/errors.js +61 -0
  52. package/dist/clusters/errors.js.map +1 -0
  53. package/dist/clusters/kubeconfig-discovery.d.ts +48 -0
  54. package/dist/clusters/kubeconfig-discovery.js +280 -0
  55. package/dist/clusters/kubeconfig-discovery.js.map +1 -0
  56. package/dist/clusters/schemas.d.ts +510 -0
  57. package/dist/clusters/schemas.js +201 -0
  58. package/dist/clusters/schemas.js.map +1 -0
  59. package/dist/command-catalog.js +490 -26
  60. package/dist/command-catalog.js.map +1 -1
  61. package/dist/gitops/client.d.ts +499 -0
  62. package/dist/gitops/client.js +163 -0
  63. package/dist/gitops/client.js.map +1 -0
  64. package/dist/gitops/commands.d.ts +11 -0
  65. package/dist/gitops/commands.js +367 -0
  66. package/dist/gitops/commands.js.map +1 -0
  67. package/dist/gitops/errors.d.ts +10 -0
  68. package/dist/gitops/errors.js +59 -0
  69. package/dist/gitops/errors.js.map +1 -0
  70. package/dist/gitops/schemas.d.ts +1712 -0
  71. package/dist/gitops/schemas.js +360 -0
  72. package/dist/gitops/schemas.js.map +1 -0
  73. package/dist/repositories/client.d.ts +540 -0
  74. package/dist/repositories/client.js +215 -0
  75. package/dist/repositories/client.js.map +1 -0
  76. package/dist/repositories/commands.d.ts +10 -0
  77. package/dist/repositories/commands.js +347 -0
  78. package/dist/repositories/commands.js.map +1 -0
  79. package/dist/repositories/errors.d.ts +10 -0
  80. package/dist/repositories/errors.js +60 -0
  81. package/dist/repositories/errors.js.map +1 -0
  82. package/dist/repositories/schemas.d.ts +1692 -0
  83. package/dist/repositories/schemas.js +255 -0
  84. package/dist/repositories/schemas.js.map +1 -0
  85. package/dist/web-console-page.d.ts +1 -1
  86. package/dist/web-console-page.js +1 -1
  87. package/dist/web-console.js +2 -2
  88. package/dist/web-console.js.map +1 -1
  89. package/examples/ai-registry/README.md +18 -0
  90. package/examples/ai-registry/nacos-instance.username-password.example.json +25 -0
  91. package/package.json +4 -4
  92. package/skills/numa-ai-registry/SKILL.md +5 -5
  93. package/skills/numa-ai-registry/evals/evals.json +1 -1
  94. package/skills/numa-ai-registry/references/command-contract.md +22 -22
@@ -0,0 +1,436 @@
1
+ import type { AuthConfig } from "../config.js";
2
+ import { type KeycloakTokenProvider } from "../oauth.js";
3
+ import { type ClusterAdoptRequest, type ClusterIgnoreRequest, type ClusterLinkRequest, type ClusterObservationBatchRequest, type ClusterSourceCreate, type ClusterSourceUpdate } from "./schemas.js";
4
+ export declare const CLUSTER_CONTROL_PLANE_API_ROOT = "/api/v1/cluster-control-plane";
5
+ export declare const CLUSTER_CONTROL_PLANE_CONTRACT_VERSION = "v1";
6
+ export interface ClusterControlPlaneClientDependencies {
7
+ fetch?: typeof fetch;
8
+ tokenProvider?: KeycloakTokenProvider;
9
+ }
10
+ export interface ClusterCandidateListOptions {
11
+ status?: string;
12
+ sourceKey?: string;
13
+ page?: number;
14
+ size?: number;
15
+ }
16
+ export interface ClusterObservationListOptions {
17
+ sourceKey?: string;
18
+ candidateKey?: string;
19
+ page?: number;
20
+ size?: number;
21
+ }
22
+ export declare class ClusterControlPlaneClient {
23
+ private readonly config;
24
+ private readonly fetchImpl;
25
+ private readonly tokenProvider;
26
+ constructor(config: AuthConfig, dependencies?: ClusterControlPlaneClientDependencies);
27
+ private authenticatedFetch;
28
+ private json;
29
+ private mutation;
30
+ listClusters(): Promise<{
31
+ id?: string | undefined;
32
+ clusterKey: string;
33
+ code: string;
34
+ name: string;
35
+ provider: string;
36
+ providerClusterId?: string | null | undefined;
37
+ region?: string | null | undefined;
38
+ status: string;
39
+ identityStatus: string;
40
+ endpointFingerprintPrefix?: string | null | undefined;
41
+ lastObservedAt?: string | null | undefined;
42
+ version: number;
43
+ }[]>;
44
+ getCluster(clusterKey: string): Promise<{
45
+ cluster: {
46
+ id?: string | undefined;
47
+ clusterKey: string;
48
+ code: string;
49
+ name: string;
50
+ provider: string;
51
+ providerClusterId?: string | null | undefined;
52
+ region?: string | null | undefined;
53
+ status: string;
54
+ identityStatus: string;
55
+ endpointFingerprintPrefix?: string | null | undefined;
56
+ lastObservedAt?: string | null | undefined;
57
+ version: number;
58
+ };
59
+ description?: string | null | undefined;
60
+ fingerprintKinds: string[];
61
+ linkedCandidateKeys: string[];
62
+ }>;
63
+ listSources(): Promise<{
64
+ id?: string | undefined;
65
+ sourceKey: string;
66
+ sourceType: "ALIYUN_ACK_ASSUME_ROLE" | "KUBECONFIG_CLI";
67
+ displayName: string;
68
+ aliyunAccountId?: string | null | undefined;
69
+ aliyunAssumeRoleId?: string | null | undefined;
70
+ regions: string[];
71
+ enabled: boolean;
72
+ status: "ACTIVE" | "DISABLED" | "ERROR";
73
+ lastObservedAt?: string | null | undefined;
74
+ observationCount: number;
75
+ lastErrorCode?: string | null | undefined;
76
+ lastErrorMessage?: string | null | undefined;
77
+ version: number;
78
+ }[]>;
79
+ getSource(sourceKey: string): Promise<{
80
+ id?: string | undefined;
81
+ sourceKey: string;
82
+ sourceType: "ALIYUN_ACK_ASSUME_ROLE" | "KUBECONFIG_CLI";
83
+ displayName: string;
84
+ aliyunAccountId?: string | null | undefined;
85
+ aliyunAssumeRoleId?: string | null | undefined;
86
+ regions: string[];
87
+ enabled: boolean;
88
+ status: "ACTIVE" | "DISABLED" | "ERROR";
89
+ lastObservedAt?: string | null | undefined;
90
+ observationCount: number;
91
+ lastErrorCode?: string | null | undefined;
92
+ lastErrorMessage?: string | null | undefined;
93
+ version: number;
94
+ }>;
95
+ listCandidates(options?: ClusterCandidateListOptions): Promise<{
96
+ items: {
97
+ candidateKey: string;
98
+ sourceKey: string;
99
+ status: "ADOPTED" | "AMBIGUOUS" | "IGNORED" | "LINKED" | "MATCHED" | "PENDING";
100
+ matchKind: string;
101
+ matchedClusterKey?: string | null | undefined;
102
+ observedName?: string | null | undefined;
103
+ provider: string;
104
+ providerClusterId?: string | null | undefined;
105
+ region?: string | null | undefined;
106
+ kubernetesVersion?: string | null | undefined;
107
+ evidence: {
108
+ kind: string;
109
+ fingerprintPrefix: string;
110
+ strength: string;
111
+ matched: boolean;
112
+ }[];
113
+ firstObservedAt?: string | null | undefined;
114
+ lastObservedAt?: string | null | undefined;
115
+ observationCount: number;
116
+ resolutionReason?: string | null | undefined;
117
+ reviewedBy?: string | null | undefined;
118
+ reviewedAt?: string | null | undefined;
119
+ version: number;
120
+ }[];
121
+ total: number;
122
+ page: number;
123
+ size: number;
124
+ totalPages: number;
125
+ }>;
126
+ getCandidate(candidateKey: string): Promise<{
127
+ candidateKey: string;
128
+ sourceKey: string;
129
+ status: "ADOPTED" | "AMBIGUOUS" | "IGNORED" | "LINKED" | "MATCHED" | "PENDING";
130
+ matchKind: string;
131
+ matchedClusterKey?: string | null | undefined;
132
+ observedName?: string | null | undefined;
133
+ provider: string;
134
+ providerClusterId?: string | null | undefined;
135
+ region?: string | null | undefined;
136
+ kubernetesVersion?: string | null | undefined;
137
+ evidence: {
138
+ kind: string;
139
+ fingerprintPrefix: string;
140
+ strength: string;
141
+ matched: boolean;
142
+ }[];
143
+ firstObservedAt?: string | null | undefined;
144
+ lastObservedAt?: string | null | undefined;
145
+ observationCount: number;
146
+ resolutionReason?: string | null | undefined;
147
+ reviewedBy?: string | null | undefined;
148
+ reviewedAt?: string | null | undefined;
149
+ version: number;
150
+ }>;
151
+ listObservations(options?: ClusterObservationListOptions): Promise<{
152
+ items: {
153
+ observationKey: string;
154
+ sourceKey: string;
155
+ candidateKey: string;
156
+ observedName?: string | null | undefined;
157
+ provider: string;
158
+ providerClusterId?: string | null | undefined;
159
+ region?: string | null | undefined;
160
+ kubernetesVersion?: string | null | undefined;
161
+ evidence: {
162
+ kind: string;
163
+ fingerprintPrefix: string;
164
+ strength: string;
165
+ matched: boolean;
166
+ }[];
167
+ evidenceSource: "ACK_API" | "KUBECONFIG_CLI";
168
+ observedAt?: string | null | undefined;
169
+ receivedAt?: string | null | undefined;
170
+ disposition?: string | null | undefined;
171
+ }[];
172
+ total: number;
173
+ page: number;
174
+ size: number;
175
+ totalPages: number;
176
+ }>;
177
+ getObservation(observationKey: string): Promise<{
178
+ observationKey: string;
179
+ sourceKey: string;
180
+ candidateKey: string;
181
+ observedName?: string | null | undefined;
182
+ provider: string;
183
+ providerClusterId?: string | null | undefined;
184
+ region?: string | null | undefined;
185
+ kubernetesVersion?: string | null | undefined;
186
+ evidence: {
187
+ kind: string;
188
+ fingerprintPrefix: string;
189
+ strength: string;
190
+ matched: boolean;
191
+ }[];
192
+ evidenceSource: "ACK_API" | "KUBECONFIG_CLI";
193
+ observedAt?: string | null | undefined;
194
+ receivedAt?: string | null | undefined;
195
+ disposition?: string | null | undefined;
196
+ }>;
197
+ createSource(input: ClusterSourceCreate, idempotencyKey: string): Promise<{
198
+ id?: string | undefined;
199
+ sourceKey: string;
200
+ sourceType: "ALIYUN_ACK_ASSUME_ROLE" | "KUBECONFIG_CLI";
201
+ displayName: string;
202
+ aliyunAccountId?: string | null | undefined;
203
+ aliyunAssumeRoleId?: string | null | undefined;
204
+ regions: string[];
205
+ enabled: boolean;
206
+ status: "ACTIVE" | "DISABLED" | "ERROR";
207
+ lastObservedAt?: string | null | undefined;
208
+ observationCount: number;
209
+ lastErrorCode?: string | null | undefined;
210
+ lastErrorMessage?: string | null | undefined;
211
+ version: number;
212
+ }>;
213
+ updateSource(sourceKey: string, input: ClusterSourceUpdate, idempotencyKey: string): Promise<{
214
+ id?: string | undefined;
215
+ sourceKey: string;
216
+ sourceType: "ALIYUN_ACK_ASSUME_ROLE" | "KUBECONFIG_CLI";
217
+ displayName: string;
218
+ aliyunAccountId?: string | null | undefined;
219
+ aliyunAssumeRoleId?: string | null | undefined;
220
+ regions: string[];
221
+ enabled: boolean;
222
+ status: "ACTIVE" | "DISABLED" | "ERROR";
223
+ lastObservedAt?: string | null | undefined;
224
+ observationCount: number;
225
+ lastErrorCode?: string | null | undefined;
226
+ lastErrorMessage?: string | null | undefined;
227
+ version: number;
228
+ }>;
229
+ discoverSource(sourceKey: string, idempotencyKey: string): Promise<{
230
+ runNo: string;
231
+ sourceKey: string;
232
+ state: string;
233
+ discoveredCount: number;
234
+ candidateCount: number;
235
+ errorCode?: string | null | undefined;
236
+ errorMessage?: string | null | undefined;
237
+ startedAt?: string | null | undefined;
238
+ completedAt?: string | null | undefined;
239
+ }>;
240
+ getRun(runNo: string): Promise<{
241
+ runNo: string;
242
+ sourceKey: string;
243
+ state: string;
244
+ discoveredCount: number;
245
+ candidateCount: number;
246
+ errorCode?: string | null | undefined;
247
+ errorMessage?: string | null | undefined;
248
+ startedAt?: string | null | undefined;
249
+ completedAt?: string | null | undefined;
250
+ }>;
251
+ submitObservations(sourceKey: string, input: ClusterObservationBatchRequest, idempotencyKey: string): Promise<{
252
+ items: {
253
+ observation: {
254
+ observationKey: string;
255
+ sourceKey: string;
256
+ candidateKey: string;
257
+ observedName?: string | null | undefined;
258
+ provider: string;
259
+ providerClusterId?: string | null | undefined;
260
+ region?: string | null | undefined;
261
+ kubernetesVersion?: string | null | undefined;
262
+ evidence: {
263
+ kind: string;
264
+ fingerprintPrefix: string;
265
+ strength: string;
266
+ matched: boolean;
267
+ }[];
268
+ evidenceSource: "ACK_API" | "KUBECONFIG_CLI";
269
+ observedAt?: string | null | undefined;
270
+ receivedAt?: string | null | undefined;
271
+ disposition?: string | null | undefined;
272
+ };
273
+ candidate: {
274
+ candidateKey: string;
275
+ sourceKey: string;
276
+ status: "ADOPTED" | "AMBIGUOUS" | "IGNORED" | "LINKED" | "MATCHED" | "PENDING";
277
+ matchKind: string;
278
+ matchedClusterKey?: string | null | undefined;
279
+ observedName?: string | null | undefined;
280
+ provider: string;
281
+ providerClusterId?: string | null | undefined;
282
+ region?: string | null | undefined;
283
+ kubernetesVersion?: string | null | undefined;
284
+ evidence: {
285
+ kind: string;
286
+ fingerprintPrefix: string;
287
+ strength: string;
288
+ matched: boolean;
289
+ }[];
290
+ firstObservedAt?: string | null | undefined;
291
+ lastObservedAt?: string | null | undefined;
292
+ observationCount: number;
293
+ resolutionReason?: string | null | undefined;
294
+ reviewedBy?: string | null | undefined;
295
+ reviewedAt?: string | null | undefined;
296
+ version: number;
297
+ };
298
+ replayed: boolean;
299
+ }[];
300
+ observationCount: number;
301
+ candidateCount: number;
302
+ replayed: boolean;
303
+ }>;
304
+ adoptCandidate(candidateKey: string, input: ClusterAdoptRequest, idempotencyKey: string): Promise<{
305
+ action: "ADOPT" | "IGNORE" | "LINK";
306
+ candidate: {
307
+ candidateKey: string;
308
+ sourceKey: string;
309
+ status: "ADOPTED" | "AMBIGUOUS" | "IGNORED" | "LINKED" | "MATCHED" | "PENDING";
310
+ matchKind: string;
311
+ matchedClusterKey?: string | null | undefined;
312
+ observedName?: string | null | undefined;
313
+ provider: string;
314
+ providerClusterId?: string | null | undefined;
315
+ region?: string | null | undefined;
316
+ kubernetesVersion?: string | null | undefined;
317
+ evidence: {
318
+ kind: string;
319
+ fingerprintPrefix: string;
320
+ strength: string;
321
+ matched: boolean;
322
+ }[];
323
+ firstObservedAt?: string | null | undefined;
324
+ lastObservedAt?: string | null | undefined;
325
+ observationCount: number;
326
+ resolutionReason?: string | null | undefined;
327
+ reviewedBy?: string | null | undefined;
328
+ reviewedAt?: string | null | undefined;
329
+ version: number;
330
+ };
331
+ cluster?: {
332
+ id?: string | undefined;
333
+ clusterKey: string;
334
+ code: string;
335
+ name: string;
336
+ provider: string;
337
+ providerClusterId?: string | null | undefined;
338
+ region?: string | null | undefined;
339
+ status: string;
340
+ identityStatus: string;
341
+ endpointFingerprintPrefix?: string | null | undefined;
342
+ lastObservedAt?: string | null | undefined;
343
+ version: number;
344
+ } | null | undefined;
345
+ replayed: boolean;
346
+ decidedAt: string;
347
+ }>;
348
+ linkCandidate(candidateKey: string, input: ClusterLinkRequest, idempotencyKey: string): Promise<{
349
+ action: "ADOPT" | "IGNORE" | "LINK";
350
+ candidate: {
351
+ candidateKey: string;
352
+ sourceKey: string;
353
+ status: "ADOPTED" | "AMBIGUOUS" | "IGNORED" | "LINKED" | "MATCHED" | "PENDING";
354
+ matchKind: string;
355
+ matchedClusterKey?: string | null | undefined;
356
+ observedName?: string | null | undefined;
357
+ provider: string;
358
+ providerClusterId?: string | null | undefined;
359
+ region?: string | null | undefined;
360
+ kubernetesVersion?: string | null | undefined;
361
+ evidence: {
362
+ kind: string;
363
+ fingerprintPrefix: string;
364
+ strength: string;
365
+ matched: boolean;
366
+ }[];
367
+ firstObservedAt?: string | null | undefined;
368
+ lastObservedAt?: string | null | undefined;
369
+ observationCount: number;
370
+ resolutionReason?: string | null | undefined;
371
+ reviewedBy?: string | null | undefined;
372
+ reviewedAt?: string | null | undefined;
373
+ version: number;
374
+ };
375
+ cluster?: {
376
+ id?: string | undefined;
377
+ clusterKey: string;
378
+ code: string;
379
+ name: string;
380
+ provider: string;
381
+ providerClusterId?: string | null | undefined;
382
+ region?: string | null | undefined;
383
+ status: string;
384
+ identityStatus: string;
385
+ endpointFingerprintPrefix?: string | null | undefined;
386
+ lastObservedAt?: string | null | undefined;
387
+ version: number;
388
+ } | null | undefined;
389
+ replayed: boolean;
390
+ decidedAt: string;
391
+ }>;
392
+ ignoreCandidate(candidateKey: string, input: ClusterIgnoreRequest, idempotencyKey: string): Promise<{
393
+ action: "ADOPT" | "IGNORE" | "LINK";
394
+ candidate: {
395
+ candidateKey: string;
396
+ sourceKey: string;
397
+ status: "ADOPTED" | "AMBIGUOUS" | "IGNORED" | "LINKED" | "MATCHED" | "PENDING";
398
+ matchKind: string;
399
+ matchedClusterKey?: string | null | undefined;
400
+ observedName?: string | null | undefined;
401
+ provider: string;
402
+ providerClusterId?: string | null | undefined;
403
+ region?: string | null | undefined;
404
+ kubernetesVersion?: string | null | undefined;
405
+ evidence: {
406
+ kind: string;
407
+ fingerprintPrefix: string;
408
+ strength: string;
409
+ matched: boolean;
410
+ }[];
411
+ firstObservedAt?: string | null | undefined;
412
+ lastObservedAt?: string | null | undefined;
413
+ observationCount: number;
414
+ resolutionReason?: string | null | undefined;
415
+ reviewedBy?: string | null | undefined;
416
+ reviewedAt?: string | null | undefined;
417
+ version: number;
418
+ };
419
+ cluster?: {
420
+ id?: string | undefined;
421
+ clusterKey: string;
422
+ code: string;
423
+ name: string;
424
+ provider: string;
425
+ providerClusterId?: string | null | undefined;
426
+ region?: string | null | undefined;
427
+ status: string;
428
+ identityStatus: string;
429
+ endpointFingerprintPrefix?: string | null | undefined;
430
+ lastObservedAt?: string | null | undefined;
431
+ version: number;
432
+ } | null | undefined;
433
+ replayed: boolean;
434
+ decidedAt: string;
435
+ }>;
436
+ }
@@ -0,0 +1,207 @@
1
+ import { resolveBackendUrl } from "../backend.js";
2
+ import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
3
+ import { ClusterError } from "./errors.js";
4
+ import { ClusterAdoptRequestSchema, ClusterApiErrorSchema, ClusterCandidateDecisionViewSchema, ClusterCandidatePageSchema, ClusterCandidateViewSchema, ClusterDetailSchema, ClusterDiscoveryRunViewSchema, ClusterIgnoreRequestSchema, ClusterLinkRequestSchema, ClusterObservationBatchReceiptSchema, ClusterObservationBatchRequestSchema, ClusterObservationPageSchema, ClusterObservationViewSchema, ClusterSourceCreateSchema, ClusterSourceListSchema, ClusterSourceUpdateSchema, ClusterSourceViewSchema, ClusterSummaryListSchema } from "./schemas.js";
5
+ export const CLUSTER_CONTROL_PLANE_API_ROOT = "/api/v1/cluster-control-plane";
6
+ export const CLUSTER_CONTROL_PLANE_CONTRACT_VERSION = "v1";
7
+ function safeIdentifier(value, label) {
8
+ const trimmed = value.trim();
9
+ if (!trimmed || trimmed.length > 256 || !/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(trimmed)) {
10
+ throw new ClusterError(`${label} must be a stable platform identifier.`, "CLUSTER_CLI_INPUT_INVALID");
11
+ }
12
+ return trimmed;
13
+ }
14
+ function safeIdempotencyKey(value) {
15
+ const trimmed = value.trim();
16
+ if (!trimmed || trimmed.length > 200 || !/^[A-Za-z0-9][A-Za-z0-9._:/+-]*$/u.test(trimmed)) {
17
+ throw new ClusterError("idempotency-key must be 1-200 safe opaque characters.", "CLUSTER_IDEMPOTENCY_INVALID");
18
+ }
19
+ return trimmed;
20
+ }
21
+ function positiveInteger(value, label, maximum) {
22
+ if (value == null)
23
+ return undefined;
24
+ if (!Number.isInteger(value) || value < 1 || value > maximum) {
25
+ throw new ClusterError(`${label} must be an integer between 1 and ${maximum}.`, "CLUSTER_CLI_INPUT_INVALID");
26
+ }
27
+ return value;
28
+ }
29
+ function queryPath(path, values) {
30
+ const query = new URLSearchParams();
31
+ for (const [key, value] of Object.entries(values)) {
32
+ if (value != null && value !== "")
33
+ query.set(key, String(value));
34
+ }
35
+ return query.size ? `${path}?${query.toString()}` : path;
36
+ }
37
+ async function responseBody(response) {
38
+ const text = await response.text();
39
+ if (!text)
40
+ return {};
41
+ try {
42
+ return JSON.parse(text);
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ function requestIdFrom(response, body) {
49
+ if (body && typeof body === "object" && "requestId" in body && typeof body.requestId === "string")
50
+ return body.requestId;
51
+ return response.headers.get("x-request-id") ?? undefined;
52
+ }
53
+ function apiFailure(response, body) {
54
+ const parsed = ClusterApiErrorSchema.safeParse(body);
55
+ return new ClusterError(parsed.success && parsed.data.message
56
+ ? `Cluster Control Plane HTTP ${response.status}: ${parsed.data.message}`
57
+ : `Cluster Control Plane request failed with HTTP ${response.status}.`, parsed.success ? parsed.data.code ?? "CLUSTER_API_ERROR" : "CLUSTER_API_ERROR", response.status, requestIdFrom(response, body), parsed.success ? parsed.data.details : undefined);
58
+ }
59
+ function shouldRetryUnknown(error) {
60
+ if (error instanceof ClusterError) {
61
+ return [502, 503, 504].includes(error.status ?? 0) || /RESULT_UNKNOWN/u.test(error.code);
62
+ }
63
+ return error instanceof TypeError || (error instanceof Error && error.name === "AbortError");
64
+ }
65
+ export class ClusterControlPlaneClient {
66
+ config;
67
+ fetchImpl;
68
+ tokenProvider;
69
+ constructor(config, dependencies = {}) {
70
+ this.config = config;
71
+ this.fetchImpl = dependencies.fetch ?? fetch;
72
+ this.tokenProvider = dependencies.tokenProvider ?? ensureAccessToken;
73
+ }
74
+ async authenticatedFetch(path, init = {}) {
75
+ const method = String(init.method ?? "GET").toUpperCase();
76
+ const url = resolveBackendUrl(this.config, { method, path });
77
+ const headers = new Headers(init.headers);
78
+ headers.set("Accept", "application/json");
79
+ headers.set("X-Numa-Cluster-Contract", CLUSTER_CONTROL_PLANE_CONTRACT_VERSION);
80
+ if (init.body != null)
81
+ headers.set("Content-Type", "application/json");
82
+ return fetchWithKeycloakIdentity(this.config, url, () => ({ ...init, headers }), {
83
+ fetch: this.fetchImpl,
84
+ tokenProvider: this.tokenProvider
85
+ });
86
+ }
87
+ async json(path, schema, init = {}, expectedStatuses) {
88
+ const response = await this.authenticatedFetch(path, init);
89
+ const body = await responseBody(response);
90
+ if (!response.ok)
91
+ throw apiFailure(response, body);
92
+ if (expectedStatuses && !expectedStatuses.includes(response.status)) {
93
+ throw new ClusterError(`Cluster Control Plane returned HTTP ${response.status}; expected ${expectedStatuses.join(" or ")}.`, "CLUSTER_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
94
+ }
95
+ const parsed = schema.safeParse(body);
96
+ if (!parsed.success) {
97
+ throw new ClusterError(`Cluster Control Plane returned an invalid response: ${parsed.error.message}`, "CLUSTER_INVALID_RESPONSE", response.status, requestIdFrom(response, body));
98
+ }
99
+ return parsed.data;
100
+ }
101
+ async mutation(path, schema, method, body, idempotencyKey, expectedStatuses) {
102
+ const key = safeIdempotencyKey(idempotencyKey);
103
+ const serialized = body == null ? undefined : JSON.stringify(body);
104
+ let lastError;
105
+ for (let attempt = 0; attempt < 2; attempt++) {
106
+ try {
107
+ return await this.json(path, schema, {
108
+ method,
109
+ headers: { "Idempotency-Key": key },
110
+ ...(serialized == null ? {} : { body: serialized })
111
+ }, expectedStatuses);
112
+ }
113
+ catch (error) {
114
+ lastError = error;
115
+ if (!shouldRetryUnknown(error) || attempt === 1)
116
+ break;
117
+ }
118
+ }
119
+ if (shouldRetryUnknown(lastError)) {
120
+ throw new ClusterError("Cluster mutation result is unknown. Retry the same command with the same Idempotency-Key and unchanged input.", "CLUSTER_RESULT_UNKNOWN", lastError instanceof ClusterError ? lastError.status : undefined, lastError instanceof ClusterError ? lastError.requestId : undefined);
121
+ }
122
+ throw lastError;
123
+ }
124
+ listClusters() {
125
+ return this.json(`${CLUSTER_CONTROL_PLANE_API_ROOT}/clusters`, ClusterSummaryListSchema);
126
+ }
127
+ getCluster(clusterKey) {
128
+ return this.json(`${CLUSTER_CONTROL_PLANE_API_ROOT}/clusters/${encodeURIComponent(safeIdentifier(clusterKey, "cluster-key"))}`, ClusterDetailSchema);
129
+ }
130
+ listSources() {
131
+ return this.json(`${CLUSTER_CONTROL_PLANE_API_ROOT}/sources`, ClusterSourceListSchema);
132
+ }
133
+ getSource(sourceKey) {
134
+ return this.json(`${CLUSTER_CONTROL_PLANE_API_ROOT}/sources/${encodeURIComponent(safeIdentifier(sourceKey, "source-key"))}`, ClusterSourceViewSchema);
135
+ }
136
+ listCandidates(options = {}) {
137
+ return this.json(queryPath(`${CLUSTER_CONTROL_PLANE_API_ROOT}/candidates`, {
138
+ status: options.status,
139
+ sourceKey: options.sourceKey,
140
+ page: positiveInteger(options.page, "page", 1_000_000),
141
+ size: positiveInteger(options.size, "size", 100)
142
+ }), ClusterCandidatePageSchema);
143
+ }
144
+ getCandidate(candidateKey) {
145
+ return this.json(`${CLUSTER_CONTROL_PLANE_API_ROOT}/candidates/${encodeURIComponent(safeIdentifier(candidateKey, "candidate-key"))}`, ClusterCandidateViewSchema);
146
+ }
147
+ listObservations(options = {}) {
148
+ return this.json(queryPath(`${CLUSTER_CONTROL_PLANE_API_ROOT}/observations`, {
149
+ sourceKey: options.sourceKey,
150
+ candidateKey: options.candidateKey,
151
+ page: positiveInteger(options.page, "page", 1_000_000),
152
+ size: positiveInteger(options.size, "size", 100)
153
+ }), ClusterObservationPageSchema);
154
+ }
155
+ getObservation(observationKey) {
156
+ return this.json(`${CLUSTER_CONTROL_PLANE_API_ROOT}/observations/${encodeURIComponent(safeIdentifier(observationKey, "observation-key"))}`, ClusterObservationViewSchema);
157
+ }
158
+ createSource(input, idempotencyKey) {
159
+ const parsed = ClusterSourceCreateSchema.safeParse(input);
160
+ if (!parsed.success)
161
+ throw new ClusterError(`Source input is invalid: ${parsed.error.message}`, "CLUSTER_CLI_INPUT_INVALID");
162
+ return this.mutation(`${CLUSTER_CONTROL_PLANE_API_ROOT}/sources`, ClusterSourceViewSchema, "POST", parsed.data, idempotencyKey, [201]);
163
+ }
164
+ updateSource(sourceKey, input, idempotencyKey) {
165
+ const parsed = ClusterSourceUpdateSchema.safeParse(input);
166
+ if (!parsed.success)
167
+ throw new ClusterError(`Source update is invalid: ${parsed.error.message}`, "CLUSTER_CLI_INPUT_INVALID");
168
+ const source = encodeURIComponent(safeIdentifier(sourceKey, "source-key"));
169
+ return this.mutation(`${CLUSTER_CONTROL_PLANE_API_ROOT}/sources/${source}`, ClusterSourceViewSchema, "PUT", parsed.data, idempotencyKey, [200]);
170
+ }
171
+ discoverSource(sourceKey, idempotencyKey) {
172
+ const source = encodeURIComponent(safeIdentifier(sourceKey, "source-key"));
173
+ return this.mutation(`${CLUSTER_CONTROL_PLANE_API_ROOT}/sources/${source}/discover`, ClusterDiscoveryRunViewSchema, "POST", undefined, idempotencyKey, [202]);
174
+ }
175
+ getRun(runNo) {
176
+ return this.json(`${CLUSTER_CONTROL_PLANE_API_ROOT}/runs/${encodeURIComponent(safeIdentifier(runNo, "run-no"))}`, ClusterDiscoveryRunViewSchema);
177
+ }
178
+ submitObservations(sourceKey, input, idempotencyKey) {
179
+ const parsed = ClusterObservationBatchRequestSchema.safeParse(input);
180
+ if (!parsed.success)
181
+ throw new ClusterError(`Observation plan is invalid: ${parsed.error.message}`, "CLUSTER_PLAN_INVALID");
182
+ const source = encodeURIComponent(safeIdentifier(sourceKey, "source-key"));
183
+ return this.mutation(`${CLUSTER_CONTROL_PLANE_API_ROOT}/sources/${source}/observations`, ClusterObservationBatchReceiptSchema, "POST", parsed.data, idempotencyKey, [202]);
184
+ }
185
+ adoptCandidate(candidateKey, input, idempotencyKey) {
186
+ const parsed = ClusterAdoptRequestSchema.safeParse(input);
187
+ if (!parsed.success)
188
+ throw new ClusterError(`Adopt input is invalid: ${parsed.error.message}`, "CLUSTER_CLI_INPUT_INVALID");
189
+ const candidate = encodeURIComponent(safeIdentifier(candidateKey, "candidate-key"));
190
+ return this.mutation(`${CLUSTER_CONTROL_PLANE_API_ROOT}/candidates/${candidate}/adopt`, ClusterCandidateDecisionViewSchema, "POST", parsed.data, idempotencyKey, [200]);
191
+ }
192
+ linkCandidate(candidateKey, input, idempotencyKey) {
193
+ const parsed = ClusterLinkRequestSchema.safeParse(input);
194
+ if (!parsed.success)
195
+ throw new ClusterError(`Link input is invalid: ${parsed.error.message}`, "CLUSTER_CLI_INPUT_INVALID");
196
+ const candidate = encodeURIComponent(safeIdentifier(candidateKey, "candidate-key"));
197
+ return this.mutation(`${CLUSTER_CONTROL_PLANE_API_ROOT}/candidates/${candidate}/link`, ClusterCandidateDecisionViewSchema, "POST", parsed.data, idempotencyKey, [200]);
198
+ }
199
+ ignoreCandidate(candidateKey, input, idempotencyKey) {
200
+ const parsed = ClusterIgnoreRequestSchema.safeParse(input);
201
+ if (!parsed.success)
202
+ throw new ClusterError(`Ignore input is invalid: ${parsed.error.message}`, "CLUSTER_CLI_INPUT_INVALID");
203
+ const candidate = encodeURIComponent(safeIdentifier(candidateKey, "candidate-key"));
204
+ return this.mutation(`${CLUSTER_CONTROL_PLANE_API_ROOT}/candidates/${candidate}/ignore`, ClusterCandidateDecisionViewSchema, "POST", parsed.data, idempotencyKey, [200]);
205
+ }
206
+ }
207
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/clusters/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Command } from "commander";
2
+ import { ClusterControlPlaneClient } from "./client.js";
3
+ import { type KubeconfigDiscoveryOptions, type LocalKubeconfigDiscoveryPlan } from "./kubeconfig-discovery.js";
4
+ export interface ClusterCommandDependencies {
5
+ clientFactory?: () => ClusterControlPlaneClient;
6
+ discoverKubeconfig?: (options: KubeconfigDiscoveryOptions) => Promise<LocalKubeconfigDiscoveryPlan>;
7
+ readPlan?: (path: string) => Promise<unknown>;
8
+ }
9
+ export declare function parseClusterIdentifier(value: string | undefined, label: string): string;
10
+ export declare function parseClusterIdempotencyKey(value: string | undefined): string;
11
+ export declare function registerClusterCommands(program: Command, dependencies?: ClusterCommandDependencies): void;