@bridge-ds/mcp 0.0.0-stage → 0.3.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/ops.d.ts ADDED
@@ -0,0 +1,739 @@
1
+ import { type ScaffoldInput } from './components.js';
2
+ import type { BridgeContext } from './context.js';
3
+ import { type BridgeConfig, type GitHubClient } from '@bridge-ds/core';
4
+ import { type Combo, type PairInput, type TokenEdit, type TokenSet } from './core-adapter.js';
5
+ /** Accepts `color.text.muted`, `--color-text-muted` or `var(--color-text-muted)`. */
6
+ export declare function normalizeTokenPath(set: TokenSet, input: string): string;
7
+ export declare function getConfig(ctx: BridgeContext): Promise<{
8
+ source: string;
9
+ configOrigin: string;
10
+ write: string;
11
+ repo: string | null;
12
+ tokenFiles: number;
13
+ tokens: number;
14
+ tokensPerTier: {
15
+ [k: string]: number;
16
+ };
17
+ modes: Record<string, import("@bridge-ds/core").ModeAxis>;
18
+ modeCombinations: number;
19
+ config: BridgeConfig;
20
+ }>;
21
+ export declare function listTokens(ctx: BridgeContext, a: {
22
+ tier?: string;
23
+ type?: string;
24
+ prefix?: string;
25
+ mode?: Partial<Combo>;
26
+ limit?: number;
27
+ offset?: number;
28
+ }): Promise<{
29
+ next?: string | undefined;
30
+ mode: Combo;
31
+ total: number;
32
+ offset: number;
33
+ returned: number;
34
+ tokens: {
35
+ alias?: string | undefined;
36
+ path: string;
37
+ type: string | undefined;
38
+ tier: string | undefined;
39
+ value: string;
40
+ }[];
41
+ }>;
42
+ export declare function getToken(ctx: BridgeContext, a: {
43
+ path: string;
44
+ }): Promise<{
45
+ definedIn: {
46
+ file: string;
47
+ tier: string | undefined;
48
+ value: unknown;
49
+ }[];
50
+ values: {
51
+ modes: string[];
52
+ value: string;
53
+ chain: string[];
54
+ }[];
55
+ referencedBy: string[];
56
+ usedIn: {
57
+ component: string;
58
+ file: string;
59
+ via?: string;
60
+ }[];
61
+ description?: string | undefined;
62
+ path: string;
63
+ cssVar: string;
64
+ type: string | undefined;
65
+ tier: string | undefined;
66
+ }>;
67
+ export declare function searchTokens(ctx: BridgeContext, a: {
68
+ query: string;
69
+ type?: string;
70
+ limit?: number;
71
+ }): Promise<{
72
+ query: string;
73
+ mode: Combo;
74
+ total: number;
75
+ results: {
76
+ description?: string | undefined;
77
+ path: string;
78
+ score: number;
79
+ type: string | undefined;
80
+ tier: string | undefined;
81
+ value: string;
82
+ }[];
83
+ }>;
84
+ export declare function checkContrast(ctx: BridgeContext, a: {
85
+ edits?: TokenEdit[];
86
+ pairs?: PairInput[];
87
+ mode?: Partial<Combo>;
88
+ includePassing?: boolean;
89
+ }): Promise<{
90
+ results?: import("@bridge-ds/core").LayeredContrastResult[] | undefined;
91
+ source: string | undefined;
92
+ checks: number;
93
+ failing: number;
94
+ failures: import("@bridge-ds/core").LayeredContrastResult[];
95
+ tightest: {
96
+ pair: string;
97
+ modes: string;
98
+ ratio: number | null;
99
+ min: number;
100
+ }[];
101
+ } | {
102
+ pairs: number;
103
+ message: string;
104
+ } | {
105
+ edits: number;
106
+ notes: string[];
107
+ changed: import("@bridge-ds/core").ContrastDelta[];
108
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
109
+ results?: import("@bridge-ds/core").LayeredContrastResult[] | undefined;
110
+ source: string | undefined;
111
+ checks: number;
112
+ failing: number;
113
+ failures: import("@bridge-ds/core").LayeredContrastResult[];
114
+ tightest: {
115
+ pair: string;
116
+ modes: string;
117
+ ratio: number | null;
118
+ min: number;
119
+ }[];
120
+ pairs?: undefined;
121
+ message?: undefined;
122
+ }>;
123
+ export declare function validateTokens(ctx: BridgeContext, a: {
124
+ edits?: TokenEdit[];
125
+ includeWarnings?: boolean;
126
+ }): Promise<{
127
+ valid: boolean;
128
+ files: number;
129
+ tokens: number;
130
+ modeCombinations: number;
131
+ errors: import("@bridge-ds/core").LayerIssue[];
132
+ warningCount: number;
133
+ } | {
134
+ notes: string[];
135
+ newErrors: import("@bridge-ds/core").LayerIssue[];
136
+ warnings: import("@bridge-ds/core").LayerIssue[];
137
+ valid: boolean;
138
+ files: number;
139
+ tokens: number;
140
+ modeCombinations: number;
141
+ errors: import("@bridge-ds/core").LayerIssue[];
142
+ warningCount: number;
143
+ } | {
144
+ notes: string[];
145
+ newErrors: import("@bridge-ds/core").LayerIssue[];
146
+ warningSample: import("@bridge-ds/core").LayerIssue[];
147
+ valid: boolean;
148
+ files: number;
149
+ tokens: number;
150
+ modeCombinations: number;
151
+ errors: import("@bridge-ds/core").LayerIssue[];
152
+ warningCount: number;
153
+ } | {
154
+ notes: string[];
155
+ newErrors: import("@bridge-ds/core").LayerIssue[];
156
+ valid: boolean;
157
+ files: number;
158
+ tokens: number;
159
+ modeCombinations: number;
160
+ errors: import("@bridge-ds/core").LayerIssue[];
161
+ warningCount: number;
162
+ }>;
163
+ export declare function listComponentsOp(ctx: BridgeContext, a: {
164
+ withSummaries?: boolean;
165
+ family?: string;
166
+ }): Promise<{
167
+ components: never[];
168
+ message: string;
169
+ dir?: undefined;
170
+ total?: undefined;
171
+ } | {
172
+ dir: string;
173
+ total: number;
174
+ components: import("./components.js").ComponentSummary[];
175
+ message?: undefined;
176
+ }>;
177
+ export declare function getComponentOp(ctx: BridgeContext, a: {
178
+ name: string;
179
+ include?: string[];
180
+ }): Promise<{
181
+ tokens: {
182
+ notTokens?: string[] | undefined;
183
+ used: string[];
184
+ };
185
+ stories: string[];
186
+ extends?: string | undefined;
187
+ props: import("./components.js").PropInfo[];
188
+ docs?: Record<string, unknown> | undefined;
189
+ name: string;
190
+ family: string | undefined;
191
+ files: string[];
192
+ }>;
193
+ /**
194
+ * bridge_draft_docs: the deterministic pre-fill of a component's docs.json (props table, tokens, anatomy from the
195
+ * CSS module classes, contrast notes, changelog line, existing prose kept) and a prompt for the user's own Claude
196
+ * to write the prose that code cannot tell. Nothing is written.
197
+ */
198
+ export declare function draftDocsOp(ctx: BridgeContext, a: {
199
+ name: string;
200
+ branch?: string | undefined;
201
+ }): Promise<{
202
+ branch?: string | undefined;
203
+ rules?: string[] | undefined;
204
+ component: string;
205
+ path: string;
206
+ exists: boolean;
207
+ prefill: import("@bridge-ds/core").DocsPrefill;
208
+ prompt: string;
209
+ instruction: string;
210
+ }>;
211
+ export declare function getDesignLanguage(ctx: BridgeContext, a: {
212
+ section?: string;
213
+ }): Promise<{
214
+ file: string | undefined;
215
+ sections: {
216
+ level: number;
217
+ title: string;
218
+ slug: string;
219
+ }[];
220
+ hint: string;
221
+ error?: undefined;
222
+ } | {
223
+ file: string | undefined;
224
+ error: string;
225
+ sections: {
226
+ level: number;
227
+ title: string;
228
+ slug: string;
229
+ }[];
230
+ hint?: undefined;
231
+ } | {
232
+ otherMatches?: string[] | undefined;
233
+ file: string | undefined;
234
+ text: string;
235
+ sections?: undefined;
236
+ hint?: undefined;
237
+ error?: undefined;
238
+ }>;
239
+ export declare function getGuidelines(ctx: BridgeContext, a: {
240
+ section?: string;
241
+ }): Promise<{
242
+ file: string | undefined;
243
+ text: string;
244
+ error?: undefined;
245
+ sections?: undefined;
246
+ } | {
247
+ file: string | undefined;
248
+ error: string;
249
+ sections: {
250
+ level: number;
251
+ title: string;
252
+ slug: string;
253
+ }[];
254
+ text?: undefined;
255
+ } | {
256
+ bridgeEnforces: string[];
257
+ sections: {
258
+ level: number;
259
+ title: string;
260
+ slug: string;
261
+ }[];
262
+ riskTiers?: string | undefined;
263
+ file: string | undefined;
264
+ always: string[];
265
+ askBefore: string[];
266
+ never: string[];
267
+ tokenConventions: string[];
268
+ text?: undefined;
269
+ error?: undefined;
270
+ }>;
271
+ export declare function proposeTokenChange(ctx: BridgeContext, a: {
272
+ edits: TokenEdit[];
273
+ title: string;
274
+ summary?: string;
275
+ dryRun?: boolean;
276
+ branch?: string | undefined;
277
+ }): Promise<{
278
+ status: string;
279
+ message: string;
280
+ } | {
281
+ hint: string;
282
+ title: string;
283
+ tier: 1 | 2 | 3;
284
+ bump: import("@bridge-ds/core").SemverBump;
285
+ reasons: string[];
286
+ changes: {
287
+ fields?: ("value" | "description" | "type" | "extensions")[] | undefined;
288
+ file: string;
289
+ before: string | undefined;
290
+ after: string | undefined;
291
+ from?: string | undefined;
292
+ kind: "added" | "changed" | "renamed" | "removed";
293
+ path: string;
294
+ }[];
295
+ contrast: {
296
+ moved: number;
297
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
298
+ };
299
+ impact: {
300
+ total: number;
301
+ sample: import("@bridge-ds/core").ImpactEntry[];
302
+ };
303
+ notes: string[];
304
+ status: string;
305
+ why: string;
306
+ newErrors: import("@bridge-ds/core").LayerIssue[];
307
+ message?: undefined;
308
+ } | {
309
+ fileContents: {
310
+ path: string;
311
+ content: string | null;
312
+ }[];
313
+ branch: string;
314
+ files: string[];
315
+ prBody: string;
316
+ title: string;
317
+ tier: 1 | 2 | 3;
318
+ bump: import("@bridge-ds/core").SemverBump;
319
+ reasons: string[];
320
+ changes: {
321
+ fields?: ("value" | "description" | "type" | "extensions")[] | undefined;
322
+ file: string;
323
+ before: string | undefined;
324
+ after: string | undefined;
325
+ from?: string | undefined;
326
+ kind: "added" | "changed" | "renamed" | "removed";
327
+ path: string;
328
+ }[];
329
+ contrast: {
330
+ moved: number;
331
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
332
+ };
333
+ impact: {
334
+ total: number;
335
+ sample: import("@bridge-ds/core").ImpactEntry[];
336
+ };
337
+ notes: string[];
338
+ status: string;
339
+ message?: undefined;
340
+ } | {
341
+ status: "preview";
342
+ message: string;
343
+ branch: string;
344
+ next?: undefined;
345
+ exploration: boolean;
346
+ files: string[];
347
+ prBody: string;
348
+ title: string;
349
+ tier: 1 | 2 | 3;
350
+ bump: import("@bridge-ds/core").SemverBump;
351
+ reasons: string[];
352
+ changes: {
353
+ fields?: ("value" | "description" | "type" | "extensions")[] | undefined;
354
+ file: string;
355
+ before: string | undefined;
356
+ after: string | undefined;
357
+ from?: string | undefined;
358
+ kind: "added" | "changed" | "renamed" | "removed";
359
+ path: string;
360
+ }[];
361
+ contrast: {
362
+ moved: number;
363
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
364
+ };
365
+ impact: {
366
+ total: number;
367
+ sample: import("@bridge-ds/core").ImpactEntry[];
368
+ };
369
+ notes: string[];
370
+ } | {
371
+ next: string;
372
+ pr?: number | undefined;
373
+ url?: string | undefined;
374
+ status: "committed";
375
+ branch: string;
376
+ commit: string;
377
+ message?: undefined;
378
+ exploration: boolean;
379
+ files: string[];
380
+ prBody: string;
381
+ title: string;
382
+ tier: 1 | 2 | 3;
383
+ bump: import("@bridge-ds/core").SemverBump;
384
+ reasons: string[];
385
+ changes: {
386
+ fields?: ("value" | "description" | "type" | "extensions")[] | undefined;
387
+ file: string;
388
+ before: string | undefined;
389
+ after: string | undefined;
390
+ from?: string | undefined;
391
+ kind: "added" | "changed" | "renamed" | "removed";
392
+ path: string;
393
+ }[];
394
+ contrast: {
395
+ moved: number;
396
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
397
+ };
398
+ impact: {
399
+ total: number;
400
+ sample: import("@bridge-ds/core").ImpactEntry[];
401
+ };
402
+ notes: string[];
403
+ } | {
404
+ status: "written";
405
+ branch: string;
406
+ next: string;
407
+ message?: undefined;
408
+ exploration: boolean;
409
+ files: string[];
410
+ prBody: string;
411
+ title: string;
412
+ tier: 1 | 2 | 3;
413
+ bump: import("@bridge-ds/core").SemverBump;
414
+ reasons: string[];
415
+ changes: {
416
+ fields?: ("value" | "description" | "type" | "extensions")[] | undefined;
417
+ file: string;
418
+ before: string | undefined;
419
+ after: string | undefined;
420
+ from?: string | undefined;
421
+ kind: "added" | "changed" | "renamed" | "removed";
422
+ path: string;
423
+ }[];
424
+ contrast: {
425
+ moved: number;
426
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
427
+ };
428
+ impact: {
429
+ total: number;
430
+ sample: import("@bridge-ds/core").ImpactEntry[];
431
+ };
432
+ notes: string[];
433
+ } | {
434
+ fileContents: {
435
+ path: string;
436
+ content: string | null;
437
+ }[];
438
+ branch: string;
439
+ files: string[];
440
+ prBody: string;
441
+ title: string;
442
+ tier: 1 | 2 | 3;
443
+ bump: import("@bridge-ds/core").SemverBump;
444
+ reasons: string[];
445
+ changes: {
446
+ fields?: ("value" | "description" | "type" | "extensions")[] | undefined;
447
+ file: string;
448
+ before: string | undefined;
449
+ after: string | undefined;
450
+ from?: string | undefined;
451
+ kind: "added" | "changed" | "renamed" | "removed";
452
+ path: string;
453
+ }[];
454
+ contrast: {
455
+ moved: number;
456
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
457
+ };
458
+ impact: {
459
+ total: number;
460
+ sample: import("@bridge-ds/core").ImpactEntry[];
461
+ };
462
+ notes: string[];
463
+ status: string;
464
+ message: string;
465
+ } | {
466
+ branch: string;
467
+ base: string;
468
+ commit: string;
469
+ diff: string;
470
+ next: string;
471
+ files: string[];
472
+ prBody: string;
473
+ title: string;
474
+ tier: 1 | 2 | 3;
475
+ bump: import("@bridge-ds/core").SemverBump;
476
+ reasons: string[];
477
+ changes: {
478
+ fields?: ("value" | "description" | "type" | "extensions")[] | undefined;
479
+ file: string;
480
+ before: string | undefined;
481
+ after: string | undefined;
482
+ from?: string | undefined;
483
+ kind: "added" | "changed" | "renamed" | "removed";
484
+ path: string;
485
+ }[];
486
+ contrast: {
487
+ moved: number;
488
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
489
+ };
490
+ impact: {
491
+ total: number;
492
+ sample: import("@bridge-ds/core").ImpactEntry[];
493
+ };
494
+ notes: string[];
495
+ status: string;
496
+ message?: undefined;
497
+ } | {
498
+ branch: string;
499
+ commit: string;
500
+ pr: number;
501
+ url: string;
502
+ labels: string[];
503
+ draft: boolean;
504
+ files: string[];
505
+ prBody: string;
506
+ title: string;
507
+ tier: 1 | 2 | 3;
508
+ bump: import("@bridge-ds/core").SemverBump;
509
+ reasons: string[];
510
+ changes: {
511
+ fields?: ("value" | "description" | "type" | "extensions")[] | undefined;
512
+ file: string;
513
+ before: string | undefined;
514
+ after: string | undefined;
515
+ from?: string | undefined;
516
+ kind: "added" | "changed" | "renamed" | "removed";
517
+ path: string;
518
+ }[];
519
+ contrast: {
520
+ moved: number;
521
+ newFailures: import("@bridge-ds/core").ContrastDelta[];
522
+ };
523
+ impact: {
524
+ total: number;
525
+ sample: import("@bridge-ds/core").ImpactEntry[];
526
+ };
527
+ notes: string[];
528
+ status: string;
529
+ message?: undefined;
530
+ }>;
531
+ export declare function listReviews(ctx: BridgeContext, a: {
532
+ state?: 'open' | 'closed' | 'all';
533
+ onlyBridge?: boolean;
534
+ }): Promise<Record<string, unknown>>;
535
+ export declare function getReview(ctx: BridgeContext, a: {
536
+ pr?: number;
537
+ branch?: string;
538
+ }): Promise<{
539
+ tokenChanges: number;
540
+ diffTable: string;
541
+ contrastTable: string;
542
+ contrastNewFailures: number;
543
+ validation: {
544
+ errors: number;
545
+ newErrors: import("@bridge-ds/core").LayerIssue[];
546
+ };
547
+ impact: {
548
+ total: number;
549
+ entries: import("@bridge-ds/core").ImpactEntry[];
550
+ };
551
+ tierWarning?: string | undefined;
552
+ changedFiles: string[];
553
+ tier: 1 | 2 | 3;
554
+ bump: import("@bridge-ds/core").SemverBump;
555
+ reasons: string[];
556
+ }>;
557
+ /**
558
+ * Who holds each role for a review, teams included: governance.owners through governance.rights, each GitHub team
559
+ * read from GitHub and named with its size ("@acme/design (4 people)"). An approval counts for a role when the
560
+ * reviewer is listed or in a listed team. A team that cannot be read is named with the reason, never dropped.
561
+ */
562
+ export declare function reviewRoles(gh: GitHubClient, config: BridgeConfig, approvers: string[]): Promise<{
563
+ unreadableTeams?: string[] | undefined;
564
+ design: {
565
+ owners: string[];
566
+ approvedBy: string[];
567
+ };
568
+ tech: {
569
+ owners: string[];
570
+ approvedBy: string[];
571
+ };
572
+ ship: string;
573
+ }>;
574
+ export declare function reviewPr(ctx: BridgeContext, a: {
575
+ pr: number;
576
+ event: 'comment' | 'approve' | 'request_changes';
577
+ body: string;
578
+ }): Promise<{
579
+ pr: number;
580
+ event: "COMMENT" | "APPROVE" | "REQUEST_CHANGES";
581
+ id: number;
582
+ state: string;
583
+ note: string | undefined;
584
+ }>;
585
+ export declare function scaffoldComponentOp(ctx: BridgeContext, a: ScaffoldInput & {
586
+ write?: boolean;
587
+ }): Promise<{
588
+ written: boolean;
589
+ tier: number;
590
+ files: string[] | {
591
+ path: string;
592
+ content: string;
593
+ }[];
594
+ nextSteps: string[];
595
+ }>;
596
+ export declare function auditUi(ctx: BridgeContext, code: string): Promise<import("./audit.js").Finding[]>;
597
+ /**
598
+ * Visual impact of a change: screenshots of the stories and app screens it touches at both refs, pixel-diffed.
599
+ * Local repos only (it builds Storybook and the app). `plan` returns the selection without building.
600
+ */
601
+ export declare function visualImpact(ctx: BridgeContext, a: {
602
+ base?: string;
603
+ head?: string;
604
+ out?: string;
605
+ only?: ('stories' | 'app')[];
606
+ plan?: boolean;
607
+ threshold?: number;
608
+ maxStoriesPerComponent?: number;
609
+ }, run?: typeof import('@bridge-ds/visual').runImpact): Promise<{
610
+ summary: string;
611
+ base: {
612
+ ref: string;
613
+ sha: string;
614
+ };
615
+ head: {
616
+ ref: string;
617
+ sha: string;
618
+ };
619
+ counts: import("@bridge-ds/visual").Summary;
620
+ selection: {
621
+ tokens: number;
622
+ directTokens: string[];
623
+ components: {
624
+ id: string;
625
+ why: string | undefined;
626
+ }[];
627
+ stories: number;
628
+ fallback: string | null;
629
+ app: {
630
+ include: boolean;
631
+ reason: string;
632
+ };
633
+ };
634
+ changed: {
635
+ error?: string | undefined;
636
+ composite?: string | undefined;
637
+ label: string;
638
+ mode: string;
639
+ status: import("@bridge-ds/visual").ShotStatus;
640
+ percent: number;
641
+ boxes: number;
642
+ }[];
643
+ outDir: string;
644
+ manifest: string;
645
+ next: string;
646
+ }>;
647
+ /** Audit a product folder or file (local only): adoption metrics, top files, top fixes, and findings for one file. */
648
+ export declare function auditOp(ctx: BridgeContext, a: {
649
+ path: string;
650
+ baseline?: string;
651
+ label?: string;
652
+ limit?: number;
653
+ findings?: boolean;
654
+ }): Promise<{
655
+ next: string;
656
+ findings?: {
657
+ file: string;
658
+ values: {
659
+ use?: string | undefined;
660
+ confidence?: import("@bridge-ds/core/audit").Confidence | undefined;
661
+ property?: string | undefined;
662
+ line: number;
663
+ value: string;
664
+ category: import("@bridge-ds/core/audit").FindingCategory;
665
+ }[];
666
+ components: {
667
+ use?: string | undefined;
668
+ line: number;
669
+ name: string;
670
+ kind: "foreign" | "native" | "recreated";
671
+ library: string;
672
+ }[];
673
+ }[] | undefined;
674
+ byCategory: Partial<Record<import("@bridge-ds/core/audit").FindingCategory, import("@bridge-ds/core/audit").CategoryCount>>;
675
+ components: {
676
+ ds: Record<string, number>;
677
+ foreign: {
678
+ [k: string]: {
679
+ instances: number;
680
+ top: string[];
681
+ };
682
+ };
683
+ native: Record<string, number>;
684
+ recreated: {
685
+ name: string;
686
+ file: string;
687
+ line: number;
688
+ instances: number;
689
+ }[];
690
+ };
691
+ topFiles: {
692
+ path: string;
693
+ hardcoded: number;
694
+ otherComponents: number;
695
+ tokenUsages: number;
696
+ dsComponents: number;
697
+ }[];
698
+ topFixes: ({
699
+ confidence: import("@bridge-ds/core/audit").Confidence;
700
+ mode?: string | undefined;
701
+ use: string;
702
+ token: string;
703
+ tokenValue: string;
704
+ value: string;
705
+ category: import("@bridge-ds/core/audit").FindingCategory;
706
+ count: number;
707
+ } | {
708
+ use: null;
709
+ value: string;
710
+ category: import("@bridge-ds/core/audit").FindingCategory;
711
+ count: number;
712
+ })[];
713
+ sinceBaseline?: {
714
+ tokenAdoption: {
715
+ before: number | null;
716
+ after: number | null;
717
+ delta: number | null;
718
+ };
719
+ componentAdoption: {
720
+ before: number | null;
721
+ after: number | null;
722
+ delta: number | null;
723
+ };
724
+ hardcoded: {
725
+ before: number;
726
+ after: number;
727
+ delta: number;
728
+ };
729
+ improved: number;
730
+ regressed: {
731
+ path: string;
732
+ before: number;
733
+ after: number;
734
+ }[];
735
+ } | undefined;
736
+ target: string;
737
+ files: number;
738
+ metrics: import("@bridge-ds/core/audit").AuditMetrics;
739
+ }>;