@adversarylabs/sdk 0.1.3 → 0.1.5
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/LICENSE +21 -0
- package/README.md +68 -20
- package/dist/index.d.ts +69 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +338 -143
- package/dist/index.js.map +1 -1
- package/package.json +20 -5
- package/schemas/adversary.review.v1.schema.json +136 -0
- package/templates/basic/.dockerignore +5 -0
- package/templates/basic/Dockerfile +11 -4
- package/templates/basic/README.md +3 -1
- package/templates/basic/adversary.yaml +1 -1
- package/templates/basic/npm-shrinkwrap.json +1364 -0
- package/templates/basic/package.json +4 -4
- package/templates/basic/src/index.ts +2 -1
- package/templates/basic/test/index.test.ts +0 -4
- package/schemas/adversary.findings.v1.schema.json +0 -80
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Adversary Labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -9,21 +9,38 @@ and write runtime output.
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
npm install @adversarylabs/sdk
|
|
12
|
+
npm install @adversarylabs/sdk@^0.1.5
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
Requires Node 22 or newer and ESM.
|
|
16
16
|
|
|
17
|
+
## Migrating from 0.1.4
|
|
18
|
+
|
|
19
|
+
SDK 0.1.4 output is incompatible with the current strict Adversary CLI schema. Version 0.1.5 is
|
|
20
|
+
the canonical protocol release. Existing adversaries should:
|
|
21
|
+
|
|
22
|
+
1. Upgrade the package to `@adversarylabs/sdk@^0.1.5`.
|
|
23
|
+
2. Set `findings.format` to `adversary.review.v1` in `adversary.yaml`.
|
|
24
|
+
3. Stop reading `result.schemaVersion`; protocol selection is expressed by `protocolVersion: 1`
|
|
25
|
+
and the manifest format.
|
|
26
|
+
4. If consuming serialized evidence, read `file`, `line`, `endLine`, `message`, `snippet`, and
|
|
27
|
+
`metadata` instead of `location`, `label`, and `data`.
|
|
28
|
+
5. If consuming review scores, read the canonical review observation with key `score.<score-key>`;
|
|
29
|
+
the complete authored score is preserved in that note's metadata.
|
|
30
|
+
|
|
31
|
+
There is no compatibility adapter or dual wire format. Output is validated against the strict
|
|
32
|
+
`adversary.review.v1` schema before it is written.
|
|
33
|
+
|
|
17
34
|
## Author an adversary
|
|
18
35
|
|
|
19
36
|
```ts
|
|
20
|
-
import { Adversary, Severity,
|
|
37
|
+
import { Adversary, Severity, log } from "@adversarylabs/sdk";
|
|
21
38
|
|
|
22
39
|
const app = new Adversary({
|
|
23
40
|
name: "adversarylabs/comment-sentences"
|
|
24
41
|
});
|
|
25
42
|
|
|
26
|
-
defineRule({
|
|
43
|
+
app.defineRule({
|
|
27
44
|
id: "comments.complete-sentence",
|
|
28
45
|
category: "code-style",
|
|
29
46
|
defaultSeverity: Severity.Info,
|
|
@@ -59,7 +76,7 @@ app.rule("comments.complete-sentence", async (ctx) => {
|
|
|
59
76
|
});
|
|
60
77
|
});
|
|
61
78
|
|
|
62
|
-
await app.
|
|
79
|
+
await app.runFromEnvironment();
|
|
63
80
|
```
|
|
64
81
|
|
|
65
82
|
## API
|
|
@@ -93,14 +110,14 @@ Rule context exposes:
|
|
|
93
110
|
- `ctx.review.observe(note)`
|
|
94
111
|
- `ctx.review.opinion(opinion)`
|
|
95
112
|
|
|
96
|
-
### `defineRule(definition)`
|
|
113
|
+
### `app.defineRule(definition)`
|
|
97
114
|
|
|
98
115
|
Registers domain-specific aggregation for a stable rule id. The SDK still owns grouping,
|
|
99
116
|
deduplication, ranking, suppression, and rendering; the rule definition supplies engineering
|
|
100
117
|
language for a grouped set of observations.
|
|
101
118
|
|
|
102
119
|
```ts
|
|
103
|
-
defineRule({
|
|
120
|
+
app.defineRule({
|
|
104
121
|
id: "comments.complete-sentence",
|
|
105
122
|
category: "code-style",
|
|
106
123
|
defaultSeverity: "info",
|
|
@@ -126,6 +143,10 @@ defineRule({
|
|
|
126
143
|
`category`, `defaultSeverity`, `defaultConfidence`, and `groupBy` act as defaults for observations
|
|
127
144
|
with the same `ruleId`. If a rule has no `aggregate(...)`, the SDK uses generic synthesis.
|
|
128
145
|
|
|
146
|
+
Definitions are scoped to one `Adversary`. Duplicate IDs throw; use `app.replaceRule(...)` when an
|
|
147
|
+
intentional replacement is required. The top-level `defineRule(...)` API remains temporarily
|
|
148
|
+
available for compatibility but is deprecated.
|
|
149
|
+
|
|
129
150
|
### `ctx.observe(input)`
|
|
130
151
|
|
|
131
152
|
Use observations for raw detector output and evidence. Observations are normalized, deduplicated,
|
|
@@ -157,7 +178,8 @@ ctx.observe({
|
|
|
157
178
|
});
|
|
158
179
|
```
|
|
159
180
|
|
|
160
|
-
Set `deduplicate: false`
|
|
181
|
+
Set `deduplicate: false` on a completed finding when separate findings intentionally share an
|
|
182
|
+
identity. The SDK otherwise merges findings with the same group key or generated ID.
|
|
161
183
|
|
|
162
184
|
### `ctx.finding(input)`
|
|
163
185
|
|
|
@@ -173,9 +195,9 @@ ctx.finding({
|
|
|
173
195
|
whyItMatters: "Complete-sentence comments can be useful for intent, but noisy when they restate code.",
|
|
174
196
|
impact: "Reviewers may spend time reading comments that do not add much context.",
|
|
175
197
|
evidence: [
|
|
176
|
-
{ file: "src/index.ts", line: 3, message: "Explains parser intent." },
|
|
177
|
-
{ file: "src/index.ts", line: 11, message: "Explains fallback behavior." },
|
|
178
|
-
{ file: "src/index.ts", line: 20, message: "Explains output formatting." }
|
|
198
|
+
{ location: { file: "src/index.ts", line: 3 }, message: "Explains parser intent." },
|
|
199
|
+
{ location: { file: "src/index.ts", line: 11 }, message: "Explains fallback behavior." },
|
|
200
|
+
{ location: { file: "src/index.ts", line: 20 }, message: "Explains output formatting." }
|
|
179
201
|
],
|
|
180
202
|
recommendation: "Keep complete-sentence comments only when they explain non-obvious intent.",
|
|
181
203
|
remediation: { complexity: "trivial" }
|
|
@@ -260,7 +282,7 @@ ctx.review.assessment({
|
|
|
260
282
|
ctx.review.positive({
|
|
261
283
|
key: "intentional-comments",
|
|
262
284
|
summary: "Several comments explain intent rather than restating implementation.",
|
|
263
|
-
evidence: [{ file: "src/index.ts", line: 3 }]
|
|
285
|
+
evidence: [{ location: { file: "src/index.ts", line: 3 } }]
|
|
264
286
|
});
|
|
265
287
|
|
|
266
288
|
ctx.review.observe({
|
|
@@ -282,7 +304,10 @@ ctx.review.score({
|
|
|
282
304
|
});
|
|
283
305
|
```
|
|
284
306
|
|
|
285
|
-
Scores are optional
|
|
307
|
+
Scores are optional and remain available as an authoring API and terminal section. Because the CLI
|
|
308
|
+
schema has no top-level score collection, the SDK serializes each score as a review
|
|
309
|
+
observation. The note key is `score.<score-key>`, its summary is the rendered score, and its metadata
|
|
310
|
+
preserves the authored `key`, `label`, `score`, `max`, and `summary`. No score data is discarded.
|
|
286
311
|
|
|
287
312
|
### Observation-First Authoring
|
|
288
313
|
|
|
@@ -309,7 +334,9 @@ Use `ctx.finding(...)` when the adversary has already done issue synthesis itsel
|
|
|
309
334
|
|
|
310
335
|
## Review Result
|
|
311
336
|
|
|
312
|
-
`app.run()` returns one normalized review object
|
|
337
|
+
`app.run({ input })` is the side-effect-free library API and returns one normalized review object.
|
|
338
|
+
Container and CLI entry points should call `app.runFromEnvironment()`, which reads the runtime
|
|
339
|
+
environment and writes the run envelope to the configured output path.
|
|
313
340
|
|
|
314
341
|
```ts
|
|
315
342
|
type ReviewResult = {
|
|
@@ -318,7 +345,6 @@ type ReviewResult = {
|
|
|
318
345
|
assessment?: { risk: "none" | "low" | "medium" | "high" | "critical"; summary?: string };
|
|
319
346
|
positives: ReviewNote[];
|
|
320
347
|
observations: ReviewNote[];
|
|
321
|
-
scores?: ReviewScore[];
|
|
322
348
|
findings: ReviewFinding[];
|
|
323
349
|
opinion?: { ship?: boolean; summary: string };
|
|
324
350
|
suppressed: { observations: number; findings: number };
|
|
@@ -329,13 +355,29 @@ type ReviewResult = {
|
|
|
329
355
|
Renderers consume this result. The SDK includes `TerminalRenderer` and `JsonRenderer`:
|
|
330
356
|
|
|
331
357
|
```ts
|
|
332
|
-
const result = await app.run({
|
|
358
|
+
const result = await app.run({ input: { source: { path: "/repo" } } });
|
|
333
359
|
new TerminalRenderer().render(result);
|
|
334
360
|
new JsonRenderer().render(result);
|
|
335
361
|
```
|
|
336
362
|
|
|
337
363
|
Adversary implementations should not manually format review output.
|
|
338
364
|
|
|
365
|
+
### Canonical wire evidence
|
|
366
|
+
|
|
367
|
+
The authoring API continues to accept nested `location`, structured `data`, and `label`. Envelope
|
|
368
|
+
serialization translates those fields without losing their meaning:
|
|
369
|
+
|
|
370
|
+
| Authoring field | Canonical wire field |
|
|
371
|
+
| --- | --- |
|
|
372
|
+
| `location.file` | `file` |
|
|
373
|
+
| `location.line` | `line` |
|
|
374
|
+
| `location.endLine` | `endLine` |
|
|
375
|
+
| `data` | `metadata` |
|
|
376
|
+
| `label` when `message` is absent | `message` |
|
|
377
|
+
|
|
378
|
+
Wire evidence never contains `location`, `data`, or `label`. Findings likewise never contain SDK
|
|
379
|
+
diagnostic fields such as `synthesisSource`.
|
|
380
|
+
|
|
339
381
|
## Comment Sentence Example
|
|
340
382
|
|
|
341
383
|
`adversary.yaml`:
|
|
@@ -367,7 +409,7 @@ permissions:
|
|
|
367
409
|
env: []
|
|
368
410
|
|
|
369
411
|
findings:
|
|
370
|
-
format: adversary.
|
|
412
|
+
format: adversary.review.v1
|
|
371
413
|
```
|
|
372
414
|
|
|
373
415
|
`src/index.ts`:
|
|
@@ -375,7 +417,7 @@ findings:
|
|
|
375
417
|
```ts
|
|
376
418
|
import { readFile } from "node:fs/promises";
|
|
377
419
|
import { join } from "node:path";
|
|
378
|
-
import { Adversary
|
|
420
|
+
import { Adversary } from "@adversarylabs/sdk";
|
|
379
421
|
|
|
380
422
|
const app = new Adversary({
|
|
381
423
|
name: "adversarylabs/comment-sentences",
|
|
@@ -384,7 +426,7 @@ const app = new Adversary({
|
|
|
384
426
|
}
|
|
385
427
|
});
|
|
386
428
|
|
|
387
|
-
defineRule({
|
|
429
|
+
app.defineRule({
|
|
388
430
|
id: "comments.complete-sentence",
|
|
389
431
|
category: "code-style",
|
|
390
432
|
defaultSeverity: "info",
|
|
@@ -402,8 +444,10 @@ defineRule({
|
|
|
402
444
|
"Comments are most useful when they explain non-obvious intent rather than restating code.",
|
|
403
445
|
impact: "Repeated prose can make routine code harder to scan during review.",
|
|
404
446
|
evidence: observations.map((observation) => ({
|
|
405
|
-
|
|
406
|
-
|
|
447
|
+
location: {
|
|
448
|
+
file: observation.location?.file,
|
|
449
|
+
line: observation.location?.line
|
|
450
|
+
},
|
|
407
451
|
message: "complete sentence",
|
|
408
452
|
snippet:
|
|
409
453
|
typeof observation.evidence === "object" && observation.evidence !== null
|
|
@@ -521,6 +565,10 @@ Output shape:
|
|
|
521
565
|
}
|
|
522
566
|
```
|
|
523
567
|
|
|
568
|
+
The package exports the exact CLI schema at
|
|
569
|
+
`@adversarylabs/sdk/schemas/adversary.review.v1`. `writeOutput(...)` and
|
|
570
|
+
`runFromEnvironment(...)` validate the complete envelope against that schema before writing.
|
|
571
|
+
|
|
524
572
|
## Development
|
|
525
573
|
|
|
526
574
|
```bash
|
package/dist/index.d.ts
CHANGED
|
@@ -26,21 +26,27 @@ export interface ConfidenceThresholds {
|
|
|
26
26
|
high: number;
|
|
27
27
|
}
|
|
28
28
|
export declare const DEFAULT_CONFIDENCE_THRESHOLDS: ConfidenceThresholds;
|
|
29
|
-
export interface
|
|
30
|
-
location?: {
|
|
31
|
-
file?: string;
|
|
32
|
-
line?: number;
|
|
33
|
-
endLine?: number;
|
|
34
|
-
};
|
|
29
|
+
export interface Location {
|
|
35
30
|
file?: string;
|
|
36
31
|
line?: number;
|
|
37
32
|
endLine?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface EvidenceInput extends Location {
|
|
35
|
+
location?: Location;
|
|
38
36
|
label?: string;
|
|
39
37
|
message?: string;
|
|
40
38
|
snippet?: string;
|
|
41
39
|
data?: Record<string, unknown>;
|
|
40
|
+
/** @deprecated Use data. */
|
|
42
41
|
metadata?: Record<string, unknown>;
|
|
43
42
|
}
|
|
43
|
+
export interface Evidence {
|
|
44
|
+
location?: Location;
|
|
45
|
+
label?: string;
|
|
46
|
+
message?: string;
|
|
47
|
+
snippet?: string;
|
|
48
|
+
data?: Record<string, unknown>;
|
|
49
|
+
}
|
|
44
50
|
export interface Remediation {
|
|
45
51
|
complexity?: "trivial" | "small" | "medium" | "large" | "architectural";
|
|
46
52
|
}
|
|
@@ -74,7 +80,7 @@ export interface ObservationInit {
|
|
|
74
80
|
summary?: ObservationSummary;
|
|
75
81
|
whyItMatters?: string;
|
|
76
82
|
impact?: string;
|
|
77
|
-
location?:
|
|
83
|
+
location?: EvidenceInput;
|
|
78
84
|
evidence?: string | Record<string, unknown>;
|
|
79
85
|
recommendation?: string | RecommendationInput;
|
|
80
86
|
remediation?: Remediation;
|
|
@@ -93,7 +99,7 @@ export interface FindingInput {
|
|
|
93
99
|
summary: string;
|
|
94
100
|
whyItMatters?: string;
|
|
95
101
|
impact?: string;
|
|
96
|
-
evidence:
|
|
102
|
+
evidence: EvidenceInput[];
|
|
97
103
|
recommendation?: string;
|
|
98
104
|
remediation?: Remediation;
|
|
99
105
|
tags?: string[];
|
|
@@ -113,7 +119,6 @@ export interface ReviewFinding {
|
|
|
113
119
|
evidence: Evidence[];
|
|
114
120
|
recommendation?: string;
|
|
115
121
|
remediation?: Remediation;
|
|
116
|
-
synthesisSource?: "rule" | "generic";
|
|
117
122
|
tags?: string[];
|
|
118
123
|
metadata?: Record<string, unknown>;
|
|
119
124
|
}
|
|
@@ -123,6 +128,9 @@ export interface ReviewNote {
|
|
|
123
128
|
evidence?: Evidence[];
|
|
124
129
|
metadata?: Record<string, unknown>;
|
|
125
130
|
}
|
|
131
|
+
export interface ReviewNoteInput extends Omit<ReviewNote, "evidence"> {
|
|
132
|
+
evidence?: EvidenceInput[];
|
|
133
|
+
}
|
|
126
134
|
export interface ReviewAssessment {
|
|
127
135
|
risk: "none" | "low" | "medium" | "high" | "critical";
|
|
128
136
|
summary?: string;
|
|
@@ -157,7 +165,6 @@ export interface ReviewResult {
|
|
|
157
165
|
assessment?: ReviewAssessment;
|
|
158
166
|
positives: ReviewNote[];
|
|
159
167
|
observations: ReviewNote[];
|
|
160
|
-
scores?: ReviewScore[];
|
|
161
168
|
findings: ReviewFinding[];
|
|
162
169
|
opinion?: ReviewOpinion;
|
|
163
170
|
suppressed: {
|
|
@@ -175,7 +182,27 @@ export interface ReviewResult {
|
|
|
175
182
|
}
|
|
176
183
|
export interface AdversaryRunEnvelope {
|
|
177
184
|
protocolVersion: typeof ADVERSARY_RUN_PROTOCOL_VERSION;
|
|
178
|
-
result:
|
|
185
|
+
result: WireReviewResult;
|
|
186
|
+
}
|
|
187
|
+
export interface WireEvidence {
|
|
188
|
+
file?: string;
|
|
189
|
+
line?: number;
|
|
190
|
+
endLine?: number;
|
|
191
|
+
message?: string;
|
|
192
|
+
snippet?: string;
|
|
193
|
+
metadata?: Record<string, unknown>;
|
|
194
|
+
}
|
|
195
|
+
export interface WireReviewFinding extends Omit<ReviewFinding, "evidence"> {
|
|
196
|
+
evidence: WireEvidence[];
|
|
197
|
+
}
|
|
198
|
+
export interface WireReviewNote extends Omit<ReviewNote, "evidence"> {
|
|
199
|
+
evidence?: WireEvidence[];
|
|
200
|
+
}
|
|
201
|
+
export interface WireReviewResult extends Omit<ReviewResult, "positives" | "observations" | "findings" | "suppressedFindings"> {
|
|
202
|
+
positives: WireReviewNote[];
|
|
203
|
+
observations: WireReviewNote[];
|
|
204
|
+
findings: WireReviewFinding[];
|
|
205
|
+
suppressedFindings?: WireReviewFinding[];
|
|
179
206
|
}
|
|
180
207
|
export interface RuntimeInput {
|
|
181
208
|
source: {
|
|
@@ -185,7 +212,6 @@ export interface RuntimeInput {
|
|
|
185
212
|
}
|
|
186
213
|
export interface Summary {
|
|
187
214
|
files_scanned?: number;
|
|
188
|
-
[key: string]: number | string | boolean | null | undefined;
|
|
189
215
|
}
|
|
190
216
|
export interface RuleContext {
|
|
191
217
|
repoPath: string;
|
|
@@ -198,8 +224,8 @@ export interface RuleContext {
|
|
|
198
224
|
finding: (finding: FindingInput) => void;
|
|
199
225
|
review: {
|
|
200
226
|
assessment: (assessment: ReviewAssessment) => void;
|
|
201
|
-
positive: (note:
|
|
202
|
-
observe: (note:
|
|
227
|
+
positive: (note: ReviewNoteInput) => void;
|
|
228
|
+
observe: (note: ReviewNoteInput) => void;
|
|
203
229
|
score: (score: ReviewScore) => void;
|
|
204
230
|
opinion: (opinion: ReviewOpinion) => void;
|
|
205
231
|
};
|
|
@@ -211,13 +237,20 @@ export interface AdversaryOptions {
|
|
|
211
237
|
review?: ReviewPolicy;
|
|
212
238
|
}
|
|
213
239
|
export interface RunOptions {
|
|
240
|
+
input: RuntimeInput;
|
|
241
|
+
review?: ReviewPolicy;
|
|
242
|
+
includeSuppressed?: boolean;
|
|
243
|
+
includeRawObservations?: boolean;
|
|
244
|
+
includeTiming?: boolean;
|
|
245
|
+
}
|
|
246
|
+
export interface EnvironmentRunOptions {
|
|
214
247
|
input?: RuntimeInput;
|
|
215
248
|
inputPath?: string;
|
|
216
249
|
outputPath?: string;
|
|
217
|
-
write?: boolean;
|
|
218
250
|
review?: ReviewPolicy;
|
|
219
251
|
includeSuppressed?: boolean;
|
|
220
252
|
includeRawObservations?: boolean;
|
|
253
|
+
includeTiming?: boolean;
|
|
221
254
|
}
|
|
222
255
|
export interface ReviewRenderer {
|
|
223
256
|
render(result: ReviewResult): Promise<void> | void;
|
|
@@ -228,16 +261,26 @@ export interface RuleDefinition {
|
|
|
228
261
|
defaultSeverity?: Severity;
|
|
229
262
|
defaultConfidence?: ConfidenceInput;
|
|
230
263
|
groupBy?: string[];
|
|
231
|
-
aggregate?: (observations: ObservationInit
|
|
264
|
+
aggregate?: (observations: ReadonlyArray<ObservationInit>) => FindingSynthesis;
|
|
232
265
|
}
|
|
266
|
+
export type FindingSynthesis = Omit<Partial<ReviewFinding>, "evidence"> & {
|
|
267
|
+
evidence?: EvidenceInput[];
|
|
268
|
+
};
|
|
233
269
|
export declare class RuleRegistry {
|
|
234
270
|
private readonly rules;
|
|
235
271
|
register(rule: RuleDefinition): void;
|
|
272
|
+
replace(rule: RuleDefinition): void;
|
|
236
273
|
lookup(ruleId: string): RuleDefinition | undefined;
|
|
237
274
|
has(ruleId: string): boolean;
|
|
275
|
+
snapshot(): RuleRegistry;
|
|
276
|
+
importMissing(source: RuleRegistry): void;
|
|
238
277
|
}
|
|
278
|
+
/** @deprecated Prefer app.defineRule(...) so definitions remain instance-scoped. */
|
|
239
279
|
export declare const ruleRegistry: RuleRegistry;
|
|
280
|
+
/** @deprecated Prefer app.defineRule(...) so definitions remain instance-scoped. */
|
|
240
281
|
export declare function defineRule(rule: RuleDefinition): void;
|
|
282
|
+
/** @deprecated Prefer app.replaceRule(...) so definitions remain instance-scoped. */
|
|
283
|
+
export declare function replaceRule(rule: RuleDefinition): void;
|
|
241
284
|
export declare const log: {
|
|
242
285
|
debug(message: unknown): void;
|
|
243
286
|
info(message: unknown): void;
|
|
@@ -247,18 +290,21 @@ export declare const log: {
|
|
|
247
290
|
export declare class Adversary {
|
|
248
291
|
readonly name: string;
|
|
249
292
|
readonly version?: string;
|
|
250
|
-
readonly rules
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}>;
|
|
254
|
-
readonly reviewPolicy: ReviewPolicy;
|
|
293
|
+
private readonly rules;
|
|
294
|
+
private readonly reviewPolicy;
|
|
295
|
+
private readonly ruleDefinitions;
|
|
255
296
|
constructor(options: AdversaryOptions);
|
|
297
|
+
defineRule(rule: RuleDefinition): void;
|
|
298
|
+
replaceRule(rule: RuleDefinition): void;
|
|
299
|
+
hasRuleDefinition(ruleId: string): boolean;
|
|
256
300
|
rule(id: string, handler: RuleHandler): void;
|
|
257
|
-
run(options
|
|
301
|
+
run(options: RunOptions): Promise<ReviewResult>;
|
|
302
|
+
runFromEnvironment(options?: EnvironmentRunOptions): Promise<ReviewResult>;
|
|
258
303
|
}
|
|
259
304
|
export declare function createAdversaryRunEnvelope(result: ReviewResult): AdversaryRunEnvelope;
|
|
260
305
|
export declare function parseInput(path?: string): Promise<RuntimeInput>;
|
|
261
|
-
export declare function writeOutput(output:
|
|
306
|
+
export declare function writeOutput(output: AdversaryRunEnvelope, path?: string): Promise<void>;
|
|
307
|
+
export declare function validateRunEnvelope(output: unknown): Promise<void>;
|
|
262
308
|
export declare function normalizeConfidence(confidence: ConfidenceInput, thresholds?: ConfidenceThresholds): Confidence;
|
|
263
309
|
export declare function rankFindings(findings: ReviewFinding[]): ReviewFinding[];
|
|
264
310
|
export declare class JsonRenderer implements ReviewRenderer {
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAC1D,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAKhD,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,yBAAyB,EAAE,qBAAqB,EAqB5D,CAAC;AAEF,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,6BAA6B,EAAE,oBAG3C,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,eAAe,CAAC;CACzE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN;IACE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC9C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IACnE,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,kBAAkB,CAAC,EAAE,aAAa,EAAE,CAAC;IACrC,eAAe,CAAC,EAAE,eAAe,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,OAAO,8BAA8B,CAAC;IACvD,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;IACxE,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IAClE,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,oBAAoB,CAAC;IAC5F,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,OAAO,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE;QACN,UAAU,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;QACnD,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;QAC1C,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;QACzC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;QACpC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;KAC3C,CAAC;CACH;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,iBAAiB,CAAC,EAAE,eAAe,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,eAAe,CAAC,KAAK,gBAAgB,CAAC;CAChF;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,GAAG;IACxE,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAE3D,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQpC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQnC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAKlD,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI5B,QAAQ,IAAI,YAAY;IAQxB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;CAO1C;AAmBD,oFAAoF;AACpF,eAAO,MAAM,YAAY,cAAqB,CAAC;AAE/C,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAErD;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAEtD;AAED,eAAO,MAAM,GAAG;mBACC,OAAO,GAAG,IAAI;kBAMf,OAAO,GAAG,IAAI;kBAMd,OAAO,GAAG,IAAI;mBAIb,OAAO,GAAG,IAAI;CAG9B,CAAC;AAEF,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmD;IACzE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;gBAEnC,OAAO,EAAE,gBAAgB;IAYrC,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAItC,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIvC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI1C,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAetC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAiC/C,kBAAkB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,YAAY,CAAC;CAqBrF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,oBAAoB,CAKrF;AA4DD,wBAAsB,UAAU,CAAC,IAAI,SAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBjF;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,IAAI,SAAsB,GACzB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAexE;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,eAAe,EAC3B,UAAU,GAAE,oBAAoD,GAC/D,UAAU,CAuBZ;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAmBvE;AAED,qBAAa,YAAa,YAAW,cAAc;IAE/C,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA2C;IAGvF,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;CAGnC;AAED,qBAAa,gBAAiB,YAAW,cAAc;IAEnD,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA2C;IAGvF,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;CA6FnC"}
|