@cdot65/prisma-airs-cli 3.0.1 → 3.2.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.
package/dist/index.d.ts CHANGED
@@ -35,16 +35,60 @@ interface RuntimeScanResult {
35
35
  category: string;
36
36
  triggered: boolean;
37
37
  detections: Record<string, boolean>;
38
+ error?: string;
39
+ }
40
+ /** Terminal action emitted by the reliable bulk-scan path. */
41
+ type BulkScanAction = RuntimeScanResult['action'] | 'failed';
42
+ /** A prompt paired with its stable position and AIRS request ID. */
43
+ interface IndexedPrompt {
44
+ index: number;
45
+ prompt: string;
38
46
  }
39
- /** Contract for runtime scanning operations (sync + async). */
47
+ /** Correlation data for one prompt accepted in an async AIRS submission. */
48
+ interface BatchEntry extends IndexedPrompt {
49
+ scanId: string;
50
+ reqId: number;
51
+ }
52
+ /** Receipt for exactly one SDK async submission (at most twenty prompts). */
53
+ interface SubmittedBatch {
54
+ scanId: string;
55
+ reportId?: string;
56
+ entries: BatchEntry[];
57
+ }
58
+ /** A normalized async result with its stable input position and AIRS request ID. */
59
+ interface BulkScanResult extends Omit<RuntimeScanResult, 'action'> {
60
+ index: number;
61
+ reqId: number;
62
+ action: BulkScanAction;
63
+ }
64
+ /** Backwards-compatible contract for the original runtime scanning operations. */
40
65
  interface RuntimeService {
41
66
  /** Scan a single prompt (and optional response) synchronously. */
42
67
  scanPrompt(profileName: string, prompt: string, response?: string): Promise<RuntimeScanResult>;
43
- /** Submit prompts for async bulk scanning, returns scan IDs. */
44
- submitBulkScan(profileName: string, prompts: string[]): Promise<string[]>;
45
- /** Poll async scan results until all complete. */
68
+ /** @deprecated Use ReliableRuntimeService.submitBatch to preserve per-prompt correlation. */
69
+ submitBulkScan(profileName: string, prompts: string[], sessionId?: string): Promise<string[]>;
70
+ /** @deprecated Use ReliableRuntimeService.pollBatch to preserve per-prompt correlation. */
46
71
  pollResults(scanIds: string[], intervalMs?: number): Promise<RuntimeScanResult[]>;
47
72
  }
73
+ /** Runtime scanning contract with item-correlated, resumable bulk operations. */
74
+ interface ReliableRuntimeService extends RuntimeService {
75
+ /** Submit one SDK-sized group of indexed prompts for async scanning. */
76
+ submitBatch(profileName: string, prompts: IndexedPrompt[], sessionId?: string, retryOpts?: {
77
+ maxRetries?: number;
78
+ baseDelayMs?: number;
79
+ maxNoProgressPolls?: number;
80
+ onRetry?: (attempt: number, delayMs: number) => void;
81
+ onProgress?: (results: BulkScanResult[]) => void | Promise<void>;
82
+ }): Promise<SubmittedBatch>;
83
+ /** Poll one async submission and return one result per prompt, ordered by input index. */
84
+ pollBatch(batch: SubmittedBatch, intervalMs?: number, retryOpts?: {
85
+ maxRetries?: number;
86
+ baseDelayMs?: number;
87
+ maxNoProgressPolls?: number;
88
+ onRetry?: (attempt: number, delayMs: number) => void;
89
+ onProgress?: (results: BulkScanResult[]) => void | Promise<void>;
90
+ }): Promise<BulkScanResult[]>;
91
+ }
48
92
  /** Contract for AIRS prompt scanning operations. */
49
93
  interface ScanService {
50
94
  /** Scan a single prompt against a security profile. */
@@ -349,6 +393,71 @@ interface RegistryCredentials {
349
393
  token: string;
350
394
  expiry: string;
351
395
  }
396
+ /** Normalized network broker channel. */
397
+ interface RedTeamChannel {
398
+ uuid?: string;
399
+ name?: string | null;
400
+ description?: string | null;
401
+ status?: string | null;
402
+ addedBy?: string | null;
403
+ createdAt?: string | null;
404
+ updatedAt?: string | null;
405
+ lastOnlineAt?: string | null;
406
+ connectedClientsCount?: number | null;
407
+ outdatedClientsCount?: number | null;
408
+ features?: Record<string, boolean> | null;
409
+ }
410
+ /** Filters for listing network broker channels. */
411
+ interface RedTeamChannelListOptions {
412
+ limit?: number;
413
+ offset?: number;
414
+ search?: string;
415
+ status?: string | string[];
416
+ }
417
+ /** Request to create a network broker channel. */
418
+ interface RedTeamChannelCreateRequest {
419
+ name: string;
420
+ description?: string;
421
+ }
422
+ /** Request to update a network broker channel. */
423
+ interface RedTeamChannelUpdateRequest {
424
+ name?: string;
425
+ description?: string;
426
+ }
427
+ /** Normalized network broker channel statistics. */
428
+ interface RedTeamChannelStats {
429
+ serverDomain?: string | null;
430
+ dockerRegistry?: string | null;
431
+ helmChart?: string | null;
432
+ dockerImage?: string | null;
433
+ onlineChannels?: number | null;
434
+ totalChannels?: number | null;
435
+ clientVersion?: string | null;
436
+ }
437
+ /** Normalized tenant language configuration. */
438
+ interface RedTeamLanguages {
439
+ multilingualEnabled: boolean;
440
+ supportedJobTypes: string[];
441
+ languages: Array<{
442
+ code: string;
443
+ name: string;
444
+ }>;
445
+ }
446
+ /** Normalized target-profile error log entry. */
447
+ interface RedTeamErrorLog {
448
+ createdAt: string;
449
+ updatedAt: string;
450
+ jobId?: string | null;
451
+ targetId?: string | null;
452
+ targetVersion?: number | null;
453
+ attackId?: string | null;
454
+ errorType?: string | null;
455
+ errorSource?: string | null;
456
+ errorMessage?: string | null;
457
+ targetObject?: Record<string, unknown> | null;
458
+ extraInfo?: Record<string, unknown> | null;
459
+ version?: number;
460
+ }
352
461
  /** Contract for AI Red Team scan operations. */
353
462
  interface RedTeamService {
354
463
  /** Get EULA content. */
@@ -439,6 +548,30 @@ interface RedTeamService {
439
548
  getCategories(): Promise<RedTeamCategory[]>;
440
549
  /** Poll until scan completes. Calls onProgress for status updates. */
441
550
  waitForCompletion(jobId: string, onProgress?: (job: RedTeamJob) => void, intervalMs?: number): Promise<RedTeamJob>;
551
+ /** List network broker channels. */
552
+ listChannels(opts?: RedTeamChannelListOptions): Promise<{
553
+ channels: RedTeamChannel[];
554
+ totalItems?: number;
555
+ }>;
556
+ /** Get a network broker channel by ID. */
557
+ getChannel(channelId: string): Promise<RedTeamChannel>;
558
+ /** Create a network broker channel. */
559
+ createChannel(request: RedTeamChannelCreateRequest): Promise<RedTeamChannel>;
560
+ /** Update a network broker channel. */
561
+ updateChannel(channelId: string, request: RedTeamChannelUpdateRequest): Promise<RedTeamChannel>;
562
+ /** Get network broker channel statistics. */
563
+ getChannelStats(): Promise<RedTeamChannelStats>;
564
+ /** List tenant languages (data plane, or management plane when `management`). */
565
+ getLanguages(management?: boolean): Promise<RedTeamLanguages>;
566
+ /** List target-profile error logs. */
567
+ getTargetProfileErrorLogs(targetId: string, opts?: {
568
+ limit?: number;
569
+ offset?: number;
570
+ search?: string;
571
+ }): Promise<{
572
+ logs: RedTeamErrorLog[];
573
+ totalItems?: number;
574
+ }>;
442
575
  }
443
576
  /** Normalized security group. */
444
577
  interface ModelSecurityGroup {
@@ -606,6 +739,63 @@ interface ModelSecurityPyPIAuth {
606
739
  url: string;
607
740
  expiresAt: string;
608
741
  }
742
+ /** Normalized model catalog entry. */
743
+ interface ModelSecurityModel {
744
+ uuid: string;
745
+ tsgId: string;
746
+ name: string;
747
+ createdAt: string;
748
+ updatedAt: string;
749
+ latestVersionUuid?: string | null;
750
+ latestVersionFingerprint?: string | null;
751
+ latestVersionRevision?: string | null;
752
+ latestVersionHfCommitSha?: string | null;
753
+ latestVersionOutcome?: string | null;
754
+ latestVersionFormats?: string[] | null;
755
+ latestVersionSourceTypes?: string[] | null;
756
+ latestVersionScanTime?: string | null;
757
+ }
758
+ /** Filter options for listing models. */
759
+ interface ModelSecurityModelListOptions {
760
+ search?: string;
761
+ searchQuery?: string;
762
+ sortField?: string;
763
+ sortOrder?: string;
764
+ skip?: number;
765
+ limit?: number;
766
+ }
767
+ /** Normalized model version. */
768
+ interface ModelSecurityModelVersion {
769
+ uuid: string;
770
+ tsgId: string;
771
+ modelUuid: string;
772
+ revision: string;
773
+ createdAt: string;
774
+ updatedAt: string;
775
+ fingerprint?: string | null;
776
+ fileCount?: number | null;
777
+ license?: string | null;
778
+ latestScanTime?: string | null;
779
+ hfCommitSha?: string | null;
780
+ hfCommitTitle?: string | null;
781
+ hfCommitAuthors?: string[] | null;
782
+ hfModelName?: string | null;
783
+ hfOrganization?: string | null;
784
+ modelFormats?: string[] | null;
785
+ sourceTypes?: string[] | null;
786
+ lastEvalOutcome?: string | null;
787
+ lastEvalSummary?: {
788
+ rulesFailed: number;
789
+ rulesPassed: number;
790
+ totalRules: number;
791
+ } | null;
792
+ }
793
+ /** Filter options for listing model versions. */
794
+ interface ModelSecurityModelVersionListOptions {
795
+ sortOrder?: string;
796
+ skip?: number;
797
+ limit?: number;
798
+ }
609
799
  /** Contract for Model Security operations. */
610
800
  interface ModelSecurityService {
611
801
  listGroups(opts?: ModelSecurityGroupListOptions): Promise<{
@@ -671,6 +861,23 @@ interface ModelSecurityService {
671
861
  values: string[];
672
862
  }>;
673
863
  getPyPIAuth(): Promise<ModelSecurityPyPIAuth>;
864
+ listModels(opts?: ModelSecurityModelListOptions): Promise<{
865
+ totalItems: number;
866
+ models: ModelSecurityModel[];
867
+ }>;
868
+ getModel(uuid: string): Promise<ModelSecurityModel>;
869
+ listModelVersions(modelUuid: string, opts?: ModelSecurityModelVersionListOptions): Promise<{
870
+ totalItems: number;
871
+ versions: ModelSecurityModelVersion[];
872
+ }>;
873
+ getModelVersion(uuid: string): Promise<ModelSecurityModelVersion>;
874
+ listModelVersionFiles(modelVersionUuid: string, opts?: {
875
+ skip?: number;
876
+ limit?: number;
877
+ }): Promise<{
878
+ totalItems: number;
879
+ files: ModelSecurityFile[];
880
+ }>;
674
881
  }
675
882
  /** Normalized security profile. */
676
883
  interface SecurityProfileInfo {
@@ -1016,6 +1223,23 @@ declare class SdkModelSecurityService implements ModelSecurityService {
1016
1223
  values: string[];
1017
1224
  }>;
1018
1225
  getPyPIAuth(): Promise<ModelSecurityPyPIAuth>;
1226
+ listModels(opts?: ModelSecurityModelListOptions): Promise<{
1227
+ totalItems: number;
1228
+ models: ModelSecurityModel[];
1229
+ }>;
1230
+ getModel(uuid: string): Promise<ModelSecurityModel>;
1231
+ listModelVersions(modelUuid: string, opts?: ModelSecurityModelVersionListOptions): Promise<{
1232
+ totalItems: number;
1233
+ versions: ModelSecurityModelVersion[];
1234
+ }>;
1235
+ getModelVersion(uuid: string): Promise<ModelSecurityModelVersion>;
1236
+ listModelVersionFiles(modelVersionUuid: string, opts?: {
1237
+ skip?: number;
1238
+ limit?: number;
1239
+ }): Promise<{
1240
+ totalItems: number;
1241
+ files: ModelSecurityFile[];
1242
+ }>;
1019
1243
  }
1020
1244
 
1021
1245
  /**
@@ -1139,32 +1363,56 @@ declare class SdkRedTeamService implements RedTeamService {
1139
1363
  }): Promise<RedTeamCustomAttack[]>;
1140
1364
  getCategories(): Promise<RedTeamCategory[]>;
1141
1365
  waitForCompletion(jobId: string, onProgress?: (job: RedTeamJob) => void, intervalMs?: number): Promise<RedTeamJob>;
1366
+ listChannels(opts?: RedTeamChannelListOptions): Promise<{
1367
+ channels: RedTeamChannel[];
1368
+ totalItems?: number;
1369
+ }>;
1370
+ getChannel(channelId: string): Promise<RedTeamChannel>;
1371
+ createChannel(request: RedTeamChannelCreateRequest): Promise<RedTeamChannel>;
1372
+ updateChannel(channelId: string, request: RedTeamChannelUpdateRequest): Promise<RedTeamChannel>;
1373
+ getChannelStats(): Promise<RedTeamChannelStats>;
1374
+ getLanguages(management?: boolean): Promise<RedTeamLanguages>;
1375
+ getTargetProfileErrorLogs(targetId: string, opts?: {
1376
+ limit?: number;
1377
+ offset?: number;
1378
+ search?: string;
1379
+ }): Promise<{
1380
+ logs: RedTeamErrorLog[];
1381
+ totalItems?: number;
1382
+ }>;
1142
1383
  }
1143
1384
 
1385
+ /** Maximum async request objects accepted by the installed AIRS SDK. */
1386
+ declare const SDK_ASYNC_BATCH_SIZE = 20;
1144
1387
  interface PollRetryOptions {
1145
1388
  /** Max retries per rate-limit error before giving up. Default: 5. */
1146
1389
  maxRetries?: number;
1147
1390
  /** Base delay in ms for exponential backoff. Default: 10000. */
1148
1391
  baseDelayMs?: number;
1392
+ /** Stop after this many consecutive successful polls resolve no new prompts. Default: 120. */
1393
+ maxNoProgressPolls?: number;
1149
1394
  /** Called on each retry with (attempt, delayMs). */
1150
1395
  onRetry?: (attempt: number, delayMs: number) => void;
1396
+ /** Called whenever newly terminal prompt results are resolved. */
1397
+ onProgress?: (results: BulkScanResult[]) => void | Promise<void>;
1151
1398
  }
1152
- declare class SdkRuntimeService implements RuntimeService {
1399
+ declare class SdkRuntimeService implements ReliableRuntimeService {
1153
1400
  private scanner;
1154
1401
  constructor(opts: InitOptions);
1155
1402
  scanPrompt(profileName: string, prompt: string, response?: string): Promise<RuntimeScanResult>;
1403
+ submitBatch(profileName: string, prompts: IndexedPrompt[], sessionId?: string, retryOpts?: PollRetryOptions): Promise<SubmittedBatch>;
1404
+ pollBatch(batch: SubmittedBatch, intervalMs?: number, retryOpts?: PollRetryOptions): Promise<BulkScanResult[]>;
1405
+ /** @deprecated Use submitBatch to preserve per-prompt request correlation. */
1156
1406
  submitBulkScan(profileName: string, prompts: string[], sessionId?: string): Promise<string[]>;
1157
1407
  /**
1158
- * Poll async scan results until all complete or fail.
1159
- *
1160
- * Note: The async query API (`queryByScanIds`) does not return `prompt`,
1161
- * `response`, `triggered`, or `detections` fields. These are set to
1162
- * defaults (`''`, `undefined`, `false`, `{}`) in the returned results.
1163
- * Use `scanPrompt()` (sync API) when these fields are needed.
1408
+ * Compatibility poller for callers that retained only batch scan IDs.
1409
+ * Nested detection data is preserved, but prompt text and per-request fan-out
1410
+ * cannot be reconstructed from scan IDs alone.
1411
+ * @deprecated Use pollBatch to preserve `(scan_id, req_id)` correlation and prompt text.
1164
1412
  */
1165
1413
  pollResults(scanIds: string[], intervalMs?: number, retryOpts?: PollRetryOptions): Promise<RuntimeScanResult[]>;
1166
1414
  private processQueryResults;
1167
- static formatResultsCsv(results: RuntimeScanResult[]): string;
1415
+ static formatResultsCsv(results: Array<RuntimeScanResult | BulkScanResult>): string;
1168
1416
  }
1169
1417
 
1170
1418
  /** Scans prompts against AIRS security profiles via the Prisma AIRS SDK. */
@@ -1230,6 +1478,7 @@ declare const ConfigSchema: z.ZodObject<{
1230
1478
  redTeamDataEndpoint: z.ZodOptional<z.ZodString>;
1231
1479
  redTeamMgmtEndpoint: z.ZodOptional<z.ZodString>;
1232
1480
  redTeamTokenEndpoint: z.ZodOptional<z.ZodString>;
1481
+ redTeamNetworkBrokerEndpoint: z.ZodOptional<z.ZodString>;
1233
1482
  modelSecDataEndpoint: z.ZodOptional<z.ZodString>;
1234
1483
  modelSecMgmtEndpoint: z.ZodOptional<z.ZodString>;
1235
1484
  modelSecTokenEndpoint: z.ZodOptional<z.ZodString>;
@@ -1251,6 +1500,7 @@ declare const ConfigSchema: z.ZodObject<{
1251
1500
  redTeamDataEndpoint?: string | undefined;
1252
1501
  redTeamMgmtEndpoint?: string | undefined;
1253
1502
  redTeamTokenEndpoint?: string | undefined;
1503
+ redTeamNetworkBrokerEndpoint?: string | undefined;
1254
1504
  modelSecDataEndpoint?: string | undefined;
1255
1505
  modelSecMgmtEndpoint?: string | undefined;
1256
1506
  modelSecTokenEndpoint?: string | undefined;
@@ -1268,6 +1518,7 @@ declare const ConfigSchema: z.ZodObject<{
1268
1518
  redTeamDataEndpoint?: string | undefined;
1269
1519
  redTeamMgmtEndpoint?: string | undefined;
1270
1520
  redTeamTokenEndpoint?: string | undefined;
1521
+ redTeamNetworkBrokerEndpoint?: string | undefined;
1271
1522
  modelSecDataEndpoint?: string | undefined;
1272
1523
  modelSecMgmtEndpoint?: string | undefined;
1273
1524
  modelSecTokenEndpoint?: string | undefined;
@@ -1395,4 +1646,4 @@ declare function computeMetrics(results: TestResult[]): EfficacyMetrics;
1395
1646
  /** Compute per-category error breakdown from test results. Sorted by error rate descending. */
1396
1647
  declare function computeCategoryBreakdown(results: TestResult[]): CategoryBreakdown[];
1397
1648
 
1398
- export { AirsScanService, type AnalysisReport, type BackupEnvelope, type BackupFormat, type BackupResult, type CategoryBreakdown, type CustomTopic, type EfficacyMetrics, type IterationResult, type ModelSecurityEvaluation, type ModelSecurityFile, type ModelSecurityFileListOptions, type ModelSecurityGroup, type ModelSecurityGroupCreateRequest, type ModelSecurityGroupListOptions, type ModelSecurityGroupUpdateRequest, type ModelSecurityLabel, type ModelSecurityPyPIAuth, type ModelSecurityRule, type ModelSecurityRuleEditableField, type ModelSecurityRuleInstance, type ModelSecurityRuleInstanceListOptions, type ModelSecurityRuleInstanceUpdateRequest, type ModelSecurityRuleListOptions, type ModelSecurityScan, type ModelSecurityScanListOptions, type ModelSecurityService, type ModelSecurityViolation, type MutationResponse, type ProfileTopic, type PromptDetail, type PromptSetDetail, type PromptSetService, type PromptSetVersionInfo, type PropertyValueList, type RedTeamAttack, type RedTeamCategory, type RedTeamCustomAttack, type RedTeamCustomReport, type RedTeamJob, type RedTeamService, type RedTeamStaticReport, type RedTeamTarget, type RedTeamTargetCreateRequest, type RedTeamTargetDetail, type RedTeamTargetUpdateRequest, type ResourceType, type RestoreResult, type RunState, type RuntimeScanResult, type RuntimeService, SdkManagementService, SdkModelSecurityService, SdkPromptSetService, SdkRedTeamService, SdkRuntimeService, type TargetOperationOptions, type TestCase, type TestResult, type UserInput, type ValidationError, computeCategoryBreakdown, computeMetrics, loadConfig, readBackupDir, readBackupFile, resolveOutputDir, sanitizeFilename, validateDescription, validateExamples, validateName, validateTopic, writeBackupFile };
1649
+ export { AirsScanService, type AnalysisReport, type BackupEnvelope, type BackupFormat, type BackupResult, type BatchEntry, type BulkScanAction, type BulkScanResult, type CategoryBreakdown, type CustomTopic, type EfficacyMetrics, type IndexedPrompt, type IterationResult, type ModelSecurityEvaluation, type ModelSecurityFile, type ModelSecurityFileListOptions, type ModelSecurityGroup, type ModelSecurityGroupCreateRequest, type ModelSecurityGroupListOptions, type ModelSecurityGroupUpdateRequest, type ModelSecurityLabel, type ModelSecurityPyPIAuth, type ModelSecurityRule, type ModelSecurityRuleEditableField, type ModelSecurityRuleInstance, type ModelSecurityRuleInstanceListOptions, type ModelSecurityRuleInstanceUpdateRequest, type ModelSecurityRuleListOptions, type ModelSecurityScan, type ModelSecurityScanListOptions, type ModelSecurityService, type ModelSecurityViolation, type MutationResponse, type PollRetryOptions, type ProfileTopic, type PromptDetail, type PromptSetDetail, type PromptSetService, type PromptSetVersionInfo, type PropertyValueList, type RedTeamAttack, type RedTeamCategory, type RedTeamCustomAttack, type RedTeamCustomReport, type RedTeamJob, type RedTeamService, type RedTeamStaticReport, type RedTeamTarget, type RedTeamTargetCreateRequest, type RedTeamTargetDetail, type RedTeamTargetUpdateRequest, type ReliableRuntimeService, type ResourceType, type RestoreResult, type RunState, type RuntimeScanResult, type RuntimeService, SDK_ASYNC_BATCH_SIZE, SdkManagementService, SdkModelSecurityService, SdkPromptSetService, SdkRedTeamService, SdkRuntimeService, type SubmittedBatch, type TargetOperationOptions, type TestCase, type TestResult, type UserInput, type ValidationError, computeCategoryBreakdown, computeMetrics, loadConfig, readBackupDir, readBackupFile, resolveOutputDir, sanitizeFilename, validateDescription, validateExamples, validateName, validateTopic, writeBackupFile };
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  AirsScanService,
3
+ SDK_ASYNC_BATCH_SIZE,
3
4
  SdkManagementService,
4
5
  SdkModelSecurityService,
5
6
  SdkPromptSetService,
@@ -17,9 +18,10 @@ import {
17
18
  validateName,
18
19
  validateTopic,
19
20
  writeBackupFile
20
- } from "./chunk-JXHYQFEK.js";
21
+ } from "./chunk-TTBN7YHC.js";
21
22
  export {
22
23
  AirsScanService,
24
+ SDK_ASYNC_BATCH_SIZE,
23
25
  SdkManagementService,
24
26
  SdkModelSecurityService,
25
27
  SdkPromptSetService,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cdot65/prisma-airs-cli",
3
3
  "packageManager": "pnpm@10.6.5",
4
- "version": "3.0.1",
4
+ "version": "3.2.0",
5
5
  "description": "CLI and library for Palo Alto Prisma AIRS — guardrail refinement, AI red teaming, model security scanning, profile audits",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "license": "MIT",
46
46
  "dependencies": {
47
- "@cdot65/prisma-airs-sdk": "^0.12.0",
47
+ "@cdot65/prisma-airs-sdk": "^0.13.2",
48
48
  "@inquirer/prompts": "^8.3.0",
49
49
  "chalk": "^5.6.2",
50
50
  "commander": "^14.0.3",