@adversarylabs/sdk 0.1.5 → 0.1.7

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/README.md CHANGED
@@ -393,6 +393,11 @@ triggers:
393
393
  - "*.ts"
394
394
  - "**/*.ts"
395
395
 
396
+ detection:
397
+ files:
398
+ - "*.ts"
399
+ - "**/*.ts"
400
+
396
401
  runtime:
397
402
  name: node
398
403
  version: "22"
@@ -406,12 +411,45 @@ permissions:
406
411
  write:
407
412
  - .adversary/results
408
413
  network: false
409
- env: []
414
+ environment:
415
+ allow: []
410
416
 
411
417
  findings:
412
418
  format: adversary.review.v1
413
419
  ```
414
420
 
421
+ ### Automatic detection
422
+
423
+ The SDK owns the canonical `adversary.yaml` model, parser, validation, and published JSON schema.
424
+ The CLI uses the parsed optional `detection` section when deciding which installed adversaries are
425
+ relevant to `adversary auto`.
426
+
427
+ Use declarative file detection when changed repository-relative paths are sufficient:
428
+
429
+ ```yaml
430
+ detection:
431
+ files:
432
+ - Dockerfile
433
+ - "**/Dockerfile"
434
+ - .dockerignore
435
+ ```
436
+
437
+ Use a detector entrypoint when applicability requires lightweight repository or change inspection:
438
+
439
+ ```yaml
440
+ detection:
441
+ entrypoint: dist/detect.js
442
+ ```
443
+
444
+ Both forms may be declared together. The entrypoint is validated as a portable project-relative
445
+ path, but its build output does not need to exist while the manifest is parsed. Detector execution
446
+ and matching behavior belong to the CLI/runtime and are not implemented by this SDK feature.
447
+
448
+ Use `parseAdversaryManifest(...)` to parse YAML or `validateAdversaryManifest(...)` to validate an
449
+ already-decoded value. The resulting `AdversaryManifest` exposes `detection` directly, so consumers
450
+ never need to re-read raw YAML. The schema is published as
451
+ `@adversarylabs/sdk/schemas/adversary.manifest.v1`.
452
+
415
453
  `src/index.ts`:
416
454
 
417
455
  ```ts
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { ADVERSARY_MANIFEST_FILE_NAME, ADVERSARY_MANIFEST_MAX_BYTES, ManifestValidationError, parseAdversaryManifest, validateAdversaryManifest, type AdversaryManifest, type DetectionManifest, type EnvironmentPermissionsManifest, type FilesystemPermissionsManifest, type FindingsManifest, type PermissionsManifest, type RuntimeManifest, type TriggerManifest, } from "./manifest.js";
1
2
  export declare const DEFAULT_INPUT_PATH = "/adversary/input.json";
2
3
  export declare const DEFAULT_OUTPUT_PATH = "/adversary/output.json";
3
4
  export declare const ADVERSARY_RUN_PROTOCOL_VERSION = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
2
2
  import { dirname, isAbsolute, relative, resolve } from "node:path";
3
3
  import { Ajv2020 } from "ajv/dist/2020.js";
4
+ export { ADVERSARY_MANIFEST_FILE_NAME, ADVERSARY_MANIFEST_MAX_BYTES, ManifestValidationError, parseAdversaryManifest, validateAdversaryManifest, } from "./manifest.js";
4
5
  export const DEFAULT_INPUT_PATH = "/adversary/input.json";
5
6
  export const DEFAULT_OUTPUT_PATH = "/adversary/output.json";
6
7
  export const ADVERSARY_RUN_PROTOCOL_VERSION = 1;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, relative, resolve } from \"node:path\";\nimport { Ajv2020, type ValidateFunction } from \"ajv/dist/2020.js\";\n\nexport const DEFAULT_INPUT_PATH = \"/adversary/input.json\";\nexport const DEFAULT_OUTPUT_PATH = \"/adversary/output.json\";\nexport const ADVERSARY_RUN_PROTOCOL_VERSION = 1;\n\nconst verboseValues = new Set([\"1\", \"true\", \"TRUE\", \"yes\", \"YES\"]);\nlet envelopeValidator: ValidateFunction | undefined;\n\nexport const Severity = {\n Info: \"info\",\n Low: \"low\",\n Medium: \"medium\",\n High: \"high\",\n Critical: \"critical\",\n} as const;\n\nexport type Severity = (typeof Severity)[keyof typeof Severity];\n\nexport interface SeverityGuidanceEntry {\n severity: Severity;\n guidance: string;\n}\n\nexport const DEFAULT_SEVERITY_GUIDANCE: SeverityGuidanceEntry[] = [\n {\n severity: Severity.Info,\n guidance: \"Interesting observations.\",\n },\n {\n severity: Severity.Low,\n guidance: \"Reasonable engineering improvements.\",\n },\n {\n severity: Severity.Medium,\n guidance: \"Issues likely to create operational problems.\",\n },\n {\n severity: Severity.High,\n guidance: \"Security, correctness, or reliability risks.\",\n },\n {\n severity: Severity.Critical,\n guidance: \"Immediate production risk.\",\n },\n];\n\nexport const Confidence = {\n Low: \"low\",\n Medium: \"medium\",\n High: \"high\",\n} as const;\n\nexport type Confidence = (typeof Confidence)[keyof typeof Confidence];\nexport type ConfidenceInput = Confidence | number;\n\nexport interface ConfidenceThresholds {\n medium: number;\n high: number;\n}\n\nexport const DEFAULT_CONFIDENCE_THRESHOLDS: ConfidenceThresholds = {\n medium: 0.6,\n high: 0.85,\n};\n\nexport interface Location {\n file?: string;\n line?: number;\n endLine?: number;\n}\n\nexport interface EvidenceInput extends Location {\n location?: Location;\n label?: string;\n message?: string;\n snippet?: string;\n data?: Record<string, unknown>;\n /** @deprecated Use data. */\n metadata?: Record<string, unknown>;\n}\n\nexport interface Evidence {\n location?: Location;\n label?: string;\n message?: string;\n snippet?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface Remediation {\n complexity?: \"trivial\" | \"small\" | \"medium\" | \"large\" | \"architectural\";\n}\n\nexport interface RecommendationInput {\n summary: string;\n details?: string;\n}\n\nexport type ObservationTitle =\n | string\n | {\n singular: string;\n plural: string;\n };\n\nexport type ObservationSummary =\n | string\n | {\n singular?: string;\n grouped?: string;\n };\n\nexport type ConfidenceAggregation = \"maximum\" | \"minimum\" | \"average\";\nexport type SeverityAggregation = \"highest\" | \"lowest\";\n\nexport interface ObservationInit {\n ruleId: string;\n subject: string;\n groupKey?: string;\n groupBy?: string[];\n groupedTitle?: string;\n deduplicate?: boolean;\n category?: string;\n severity?: Severity;\n confidence?: ConfidenceInput;\n confidenceAggregation?: ConfidenceAggregation;\n severityAggregation?: SeverityAggregation;\n title: ObservationTitle;\n summary?: ObservationSummary;\n whyItMatters?: string;\n impact?: string;\n location?: EvidenceInput;\n evidence?: string | Record<string, unknown>;\n recommendation?: string | RecommendationInput;\n remediation?: Remediation;\n tags?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface FindingInput {\n id?: string;\n ruleId?: string;\n groupKey?: string;\n deduplicate?: boolean;\n title: string;\n category: string;\n severity: Severity;\n confidence: ConfidenceInput;\n summary: string;\n whyItMatters?: string;\n impact?: string;\n evidence: EvidenceInput[];\n recommendation?: string;\n remediation?: Remediation;\n tags?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReviewFinding {\n id: string;\n ruleId?: string;\n groupKey?: string;\n title: string;\n category: string;\n severity: Severity;\n confidence: Confidence;\n summary: string;\n whyItMatters?: string;\n impact?: string;\n evidence: Evidence[];\n recommendation?: string;\n remediation?: Remediation;\n tags?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReviewNote {\n key: string;\n summary: string;\n evidence?: Evidence[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReviewNoteInput extends Omit<ReviewNote, \"evidence\"> {\n evidence?: EvidenceInput[];\n}\n\nexport interface ReviewAssessment {\n risk: \"none\" | \"low\" | \"medium\" | \"high\" | \"critical\";\n summary?: string;\n}\n\nexport interface ReviewOpinion {\n ship?: boolean;\n summary: string;\n}\n\nexport interface ReviewScore {\n key: string;\n label?: string;\n score: number;\n max?: number;\n summary?: string;\n}\n\nexport interface ReviewPolicy {\n minimumConfidence?: Confidence;\n maximumFindings?: number;\n includeInformational?: boolean;\n confidenceThresholds?: ConfidenceThresholds;\n severityOverrides?: Record<string, Severity>;\n}\n\nexport interface ReviewResult {\n adversary: {\n name: string;\n version?: string;\n };\n target: {\n repository?: string;\n filesScanned?: number;\n };\n assessment?: ReviewAssessment;\n positives: ReviewNote[];\n observations: ReviewNote[];\n findings: ReviewFinding[];\n opinion?: ReviewOpinion;\n suppressed: {\n observations: number;\n findings: number;\n };\n timing?: {\n buildMs?: number;\n startupMs?: number;\n scanMs?: number;\n totalMs?: number;\n };\n suppressedFindings?: ReviewFinding[];\n rawObservations?: ObservationInit[];\n}\n\nexport interface AdversaryRunEnvelope {\n protocolVersion: typeof ADVERSARY_RUN_PROTOCOL_VERSION;\n result: WireReviewResult;\n}\n\nexport interface WireEvidence {\n file?: string;\n line?: number;\n endLine?: number;\n message?: string;\n snippet?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface WireReviewFinding extends Omit<ReviewFinding, \"evidence\"> {\n evidence: WireEvidence[];\n}\n\nexport interface WireReviewNote extends Omit<ReviewNote, \"evidence\"> {\n evidence?: WireEvidence[];\n}\n\nexport interface WireReviewResult\n extends Omit<ReviewResult, \"positives\" | \"observations\" | \"findings\" | \"suppressedFindings\"> {\n positives: WireReviewNote[];\n observations: WireReviewNote[];\n findings: WireReviewFinding[];\n suppressedFindings?: WireReviewFinding[];\n}\n\nexport interface RuntimeInput {\n source: {\n path: string;\n };\n [key: string]: unknown;\n}\n\nexport interface Summary {\n files_scanned?: number;\n}\n\nexport interface RuleContext {\n repoPath: string;\n summary: Summary;\n cache: Map<string, unknown>;\n relpath: (path: string) => string;\n glob: (pattern: string) => Promise<string[]>;\n rglob: (pattern: string) => Promise<string[]>;\n observe: (observation: ObservationInit) => void;\n finding: (finding: FindingInput) => void;\n review: {\n assessment: (assessment: ReviewAssessment) => void;\n positive: (note: ReviewNoteInput) => void;\n observe: (note: ReviewNoteInput) => void;\n score: (score: ReviewScore) => void;\n opinion: (opinion: ReviewOpinion) => void;\n };\n}\n\nexport type RuleHandler = (context: RuleContext) => void | Promise<void>;\n\nexport interface AdversaryOptions {\n name: string;\n version?: string;\n review?: ReviewPolicy;\n}\n\nexport interface RunOptions {\n input: RuntimeInput;\n review?: ReviewPolicy;\n includeSuppressed?: boolean;\n includeRawObservations?: boolean;\n includeTiming?: boolean;\n}\n\nexport interface EnvironmentRunOptions {\n input?: RuntimeInput;\n inputPath?: string;\n outputPath?: string;\n review?: ReviewPolicy;\n includeSuppressed?: boolean;\n includeRawObservations?: boolean;\n includeTiming?: boolean;\n}\n\nexport interface ReviewRenderer {\n render(result: ReviewResult): Promise<void> | void;\n}\n\nexport interface RuleDefinition {\n id: string;\n category?: string;\n defaultSeverity?: Severity;\n defaultConfidence?: ConfidenceInput;\n groupBy?: string[];\n aggregate?: (observations: ReadonlyArray<ObservationInit>) => FindingSynthesis;\n}\n\nexport type FindingSynthesis = Omit<Partial<ReviewFinding>, \"evidence\"> & {\n evidence?: EvidenceInput[];\n};\n\nexport class RuleRegistry {\n private readonly rules = new Map<string, RuleDefinition>();\n\n register(rule: RuleDefinition): void {\n assertRuleDefinition(rule);\n if (this.rules.has(rule.id)) {\n throw new Error(`Rule definition \"${rule.id}\" is already registered.`);\n }\n this.rules.set(rule.id, cloneRuleDefinition(rule));\n }\n\n replace(rule: RuleDefinition): void {\n assertRuleDefinition(rule);\n if (!this.rules.has(rule.id)) {\n throw new Error(`Rule definition \"${rule.id}\" is not registered.`);\n }\n this.rules.set(rule.id, cloneRuleDefinition(rule));\n }\n\n lookup(ruleId: string): RuleDefinition | undefined {\n const rule = this.rules.get(ruleId);\n return rule === undefined ? undefined : cloneRuleDefinition(rule);\n }\n\n has(ruleId: string): boolean {\n return this.rules.has(ruleId);\n }\n\n snapshot(): RuleRegistry {\n const snapshot = new RuleRegistry();\n for (const rule of this.rules.values()) {\n snapshot.register(rule);\n }\n return snapshot;\n }\n\n importMissing(source: RuleRegistry): void {\n for (const rule of source.rules.values()) {\n if (!this.rules.has(rule.id)) {\n this.rules.set(rule.id, cloneRuleDefinition(rule));\n }\n }\n }\n}\n\nfunction cloneRuleDefinition(rule: RuleDefinition): RuleDefinition {\n return {\n ...rule,\n groupBy: rule.groupBy === undefined ? undefined : [...rule.groupBy],\n };\n}\n\nfunction cloneReviewPolicy(policy: ReviewPolicy): ReviewPolicy {\n return {\n ...policy,\n confidenceThresholds:\n policy.confidenceThresholds === undefined ? undefined : { ...policy.confidenceThresholds },\n severityOverrides:\n policy.severityOverrides === undefined ? undefined : { ...policy.severityOverrides },\n };\n}\n\n/** @deprecated Prefer app.defineRule(...) so definitions remain instance-scoped. */\nexport const ruleRegistry = new RuleRegistry();\n\n/** @deprecated Prefer app.defineRule(...) so definitions remain instance-scoped. */\nexport function defineRule(rule: RuleDefinition): void {\n ruleRegistry.register(rule);\n}\n\n/** @deprecated Prefer app.replaceRule(...) so definitions remain instance-scoped. */\nexport function replaceRule(rule: RuleDefinition): void {\n ruleRegistry.replace(rule);\n}\n\nexport const log = {\n debug(message: unknown): void {\n if (isVerbose()) {\n writeLog(\"debug\", message);\n }\n },\n\n info(message: unknown): void {\n if (isVerbose()) {\n writeLog(\"info\", message);\n }\n },\n\n warn(message: unknown): void {\n writeLog(\"warn\", message);\n },\n\n error(message: unknown): void {\n writeLog(\"error\", message);\n },\n};\n\nexport class Adversary {\n readonly name: string;\n readonly version?: string;\n private readonly rules: Array<{ id: string; handler: RuleHandler }> = [];\n private readonly reviewPolicy: ReviewPolicy;\n private readonly ruleDefinitions: RuleRegistry;\n\n constructor(options: AdversaryOptions) {\n if (options.name.length === 0) {\n throw new Error(\"Adversary name must be a non-empty string.\");\n }\n\n this.name = options.name;\n this.version = options.version;\n this.reviewPolicy = cloneReviewPolicy(options.review ?? {});\n assertReviewPolicy(this.reviewPolicy, `adversary \"${this.name}\" review policy`);\n this.ruleDefinitions = ruleRegistry.snapshot();\n }\n\n defineRule(rule: RuleDefinition): void {\n this.ruleDefinitions.register(rule);\n }\n\n replaceRule(rule: RuleDefinition): void {\n this.ruleDefinitions.replace(rule);\n }\n\n hasRuleDefinition(ruleId: string): boolean {\n return this.ruleDefinitions.has(ruleId);\n }\n\n rule(id: string, handler: RuleHandler): void {\n if (id.length === 0) {\n throw new Error(\"Rule id must be a non-empty string.\");\n }\n\n if (this.rules.some((rule) => rule.id === id)) {\n throw new Error(`App rule \"${id}\" is already registered.`);\n }\n\n // Compatibility for definitions registered with the deprecated top-level API after\n // this Adversary was constructed. Once copied, later global changes cannot affect it.\n this.ruleDefinitions.importMissing(ruleRegistry);\n this.rules.push({ id, handler });\n }\n\n async run(options: RunOptions): Promise<ReviewResult> {\n const startedAt = performance.now();\n assertReviewPolicy(options.review ?? {}, `adversary \"${this.name}\" run review policy`);\n const repoPath = options.input.source.path;\n const summary: Summary = {};\n const cache = new Map<string, unknown>();\n const collector = createReviewCollector();\n const registry = this.ruleDefinitions.snapshot();\n const context = createRuleContext(repoPath, summary, cache, collector, registry);\n const includeSuppressed = options.includeSuppressed;\n\n for (const rule of this.rules) {\n log.debug(`running rule ${rule.id}`);\n await rule.handler(context);\n }\n\n const output = buildReviewResult({\n adversary: { name: this.name, version: this.version },\n repository: repoPath,\n filesScanned: typeof summary.files_scanned === \"number\" ? summary.files_scanned : undefined,\n collector,\n policy: cloneReviewPolicy({ ...this.reviewPolicy, ...options.review }),\n registry,\n includeSuppressed,\n includeRawObservations: options.includeRawObservations,\n timing: options.includeTiming\n ? { totalMs: Math.round(performance.now() - startedAt) }\n : undefined,\n });\n\n return output;\n }\n\n async runFromEnvironment(options: EnvironmentRunOptions = {}): Promise<ReviewResult> {\n const input =\n options.input ??\n (await parseInput(options.inputPath ?? process.env.ADVERSARY_INPUT ?? DEFAULT_INPUT_PATH));\n const repository = options.input\n ? input.source.path\n : (process.env.ADVERSARY_REPO ?? input.source.path);\n const result = await this.run({\n input: { ...input, source: { ...input.source, path: repository } },\n review: options.review,\n includeSuppressed:\n options.includeSuppressed ?? parseBooleanEnv(process.env.ADVERSARY_INCLUDE_SUPPRESSED),\n includeRawObservations: options.includeRawObservations,\n includeTiming: options.includeTiming,\n });\n await writeOutput(\n createAdversaryRunEnvelope(result),\n options.outputPath ?? process.env.ADVERSARY_OUTPUT ?? DEFAULT_OUTPUT_PATH,\n );\n return result;\n }\n}\n\nexport function createAdversaryRunEnvelope(result: ReviewResult): AdversaryRunEnvelope {\n return {\n protocolVersion: ADVERSARY_RUN_PROTOCOL_VERSION,\n result: toWireReviewResult(result),\n };\n}\n\nfunction toWireReviewResult(result: ReviewResult): WireReviewResult {\n return omitUndefined({\n adversary: omitUndefined(result.adversary),\n target: omitUndefined(result.target),\n assessment:\n result.assessment === undefined ? undefined : omitUndefined({ ...result.assessment }),\n positives: result.positives.map(toWireReviewNote),\n observations: result.observations.map(toWireReviewNote),\n findings: result.findings.map(toWireFinding),\n opinion: result.opinion === undefined ? undefined : omitUndefined({ ...result.opinion }),\n suppressed: result.suppressed,\n timing: result.timing === undefined ? undefined : omitUndefined(result.timing),\n suppressedFindings: result.suppressedFindings?.map(toWireFinding),\n rawObservations: result.rawObservations,\n }) as WireReviewResult;\n}\n\nfunction toWireReviewNote(note: ReviewNote): WireReviewNote {\n return omitUndefined({\n key: note.key,\n summary: note.summary,\n evidence: note.evidence?.map(toWireEvidence),\n metadata: note.metadata,\n });\n}\n\nfunction toWireFinding(finding: ReviewFinding): WireReviewFinding {\n return omitUndefined({\n id: finding.id,\n ruleId: finding.ruleId,\n groupKey: finding.groupKey,\n title: finding.title,\n category: finding.category,\n severity: finding.severity,\n confidence: finding.confidence,\n summary: finding.summary,\n whyItMatters: finding.whyItMatters,\n impact: finding.impact,\n evidence: finding.evidence.map(toWireEvidence),\n recommendation: finding.recommendation,\n remediation:\n finding.remediation === undefined ? undefined : omitUndefined({ ...finding.remediation }),\n tags: finding.tags,\n metadata: finding.metadata,\n }) as WireReviewFinding;\n}\n\nfunction toWireEvidence(evidence: Evidence): WireEvidence {\n return omitUndefined({\n file: evidence.location?.file,\n line: evidence.location?.line,\n endLine: evidence.location?.endLine,\n message: evidence.message ?? evidence.label,\n snippet: evidence.snippet,\n metadata: evidence.data,\n });\n}\n\nexport async function parseInput(path = DEFAULT_INPUT_PATH): Promise<RuntimeInput> {\n const raw = await readFile(path, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (!isRecord(parsed)) {\n throw new Error(`Invalid input at ${path}: expected an object.`);\n }\n\n if (!isRecord(parsed.source)) {\n throw new Error(`Invalid input at ${path}: source must be an object.`);\n }\n\n if (typeof parsed.source.path !== \"string\" || parsed.source.path.length === 0) {\n throw new Error(`Invalid input at ${path}: source.path must be a non-empty string.`);\n }\n\n return parsed as RuntimeInput;\n}\n\nexport async function writeOutput(\n output: AdversaryRunEnvelope,\n path = DEFAULT_OUTPUT_PATH,\n): Promise<void> {\n await validateRunEnvelope(output);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(output, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function validateRunEnvelope(output: unknown): Promise<void> {\n let validator = envelopeValidator;\n if (validator === undefined) {\n const schema = JSON.parse(\n await readFile(\n new URL(\"../schemas/adversary.review.v1.schema.json\", import.meta.url),\n \"utf8\",\n ),\n );\n validator = new Ajv2020({ allErrors: true, strict: true }).compile(schema);\n envelopeValidator = validator;\n }\n if (!validator(output)) {\n throw new Error(`Invalid adversary.review.v1 envelope: ${JSON.stringify(validator.errors)}`);\n }\n}\n\nexport function normalizeConfidence(\n confidence: ConfidenceInput,\n thresholds: ConfidenceThresholds = DEFAULT_CONFIDENCE_THRESHOLDS,\n): Confidence {\n if (isConfidence(confidence)) {\n return confidence;\n }\n\n if (\n typeof confidence !== \"number\" ||\n Number.isNaN(confidence) ||\n confidence < 0 ||\n confidence > 1\n ) {\n throw new Error(\"confidence must be low, medium, high, or a number from 0 to 1.\");\n }\n\n if (confidence >= thresholds.high) {\n return Confidence.High;\n }\n\n if (confidence >= thresholds.medium) {\n return Confidence.Medium;\n }\n\n return Confidence.Low;\n}\n\nexport function rankFindings(findings: ReviewFinding[]): ReviewFinding[] {\n return [...findings].sort((left, right) => {\n const scoreComparison = scoreFinding(right) - scoreFinding(left);\n if (scoreComparison !== 0) {\n return scoreComparison;\n }\n\n const severityComparison = severityWeight(right.severity) - severityWeight(left.severity);\n if (severityComparison !== 0) {\n return severityComparison;\n }\n\n const titleComparison = compareStrings(left.title, right.title);\n if (titleComparison !== 0) {\n return titleComparison;\n }\n\n return compareStrings(left.id, right.id);\n });\n}\n\nexport class JsonRenderer implements ReviewRenderer {\n constructor(\n private readonly write: (text: string) => void = (text) => process.stdout.write(text),\n ) {}\n\n render(result: ReviewResult): void {\n this.write(`${JSON.stringify(toWireReviewResult(result), null, 2)}\\n`);\n }\n}\n\nexport class TerminalRenderer implements ReviewRenderer {\n constructor(\n private readonly write: (text: string) => void = (text) => process.stdout.write(text),\n ) {}\n\n render(result: ReviewResult): void {\n const lines: string[] = [];\n lines.push(`Adversary: ${result.adversary.name}`);\n if (result.target.repository !== undefined) {\n lines.push(`Repository: ${result.target.repository}`);\n }\n lines.push(\"\");\n\n if (result.assessment !== undefined) {\n lines.push(\"Overall assessment\", \"\");\n lines.push(`Risk: ${capitalize(result.assessment.risk)}`, \"\");\n if (result.assessment.summary !== undefined) {\n lines.push(normalizeParagraph(result.assessment.summary), \"\");\n }\n }\n\n const scoreNotes = result.observations.filter(isScoreReviewNote);\n const additionalObservations = result.observations.filter((note) => !isScoreReviewNote(note));\n\n if (scoreNotes.length > 0) {\n lines.push(\"Scores\", \"\");\n for (const note of scoreNotes) {\n lines.push(note.summary);\n }\n lines.push(\"\");\n }\n\n if (result.positives.length > 0) {\n lines.push(\"Positive signals\", \"\");\n for (const positive of result.positives) {\n lines.push(`- ${normalizeParagraph(positive.summary)}`);\n }\n lines.push(\"\");\n }\n\n if (additionalObservations.length > 0) {\n lines.push(\"Additional observations\", \"\");\n for (const observation of additionalObservations) {\n lines.push(`- ${normalizeParagraph(observation.summary)}`);\n }\n lines.push(\"\");\n }\n\n const primary = result.findings[0];\n if (primary !== undefined) {\n lines.push(\"Primary opportunity\", \"\");\n lines.push(`- ${primary.title.endsWith(\".\") ? primary.title : `${primary.title}.`}`, \"\");\n }\n\n if (result.opinion !== undefined) {\n lines.push(\"Overall opinion\", \"\", normalizeParagraph(result.opinion.summary), \"\");\n }\n\n lines.push(\"Scan complete\", \"\");\n if (result.target.filesScanned !== undefined) {\n lines.push(`Files scanned: ${result.target.filesScanned}`);\n }\n lines.push(`Findings: ${result.findings.length}`, \"\");\n\n for (const finding of result.findings) {\n lines.push(`[${finding.severity}] ${finding.title}`);\n const firstEvidence = finding.evidence.find((item) => item.location?.file !== undefined);\n if (firstEvidence?.location?.file !== undefined) {\n lines.push(formatEvidenceLocation(firstEvidence));\n }\n lines.push(\"\");\n lines.push(`Category: ${finding.category}`);\n lines.push(`Confidence: ${finding.confidence}`, \"\");\n lines.push(\"Summary\", \"\", finding.summary, \"\");\n\n if (finding.whyItMatters !== undefined) {\n lines.push(\"Why it matters\", \"\", finding.whyItMatters, \"\");\n }\n\n if (finding.impact !== undefined) {\n lines.push(\"Impact\", \"\", finding.impact, \"\");\n }\n\n if (finding.evidence.length > 0) {\n lines.push(\"Evidence\", \"\");\n for (const evidence of finding.evidence) {\n lines.push(...formatEvidenceLines(evidence));\n }\n lines.push(\"\");\n }\n\n if (finding.recommendation !== undefined) {\n lines.push(\"Recommendation\", \"\", normalizeParagraph(finding.recommendation), \"\");\n }\n }\n\n this.write(`${lines.join(\"\\n\").trimEnd()}\\n`);\n }\n}\n\nfunction createRuleContext(\n repoPath: string,\n summary: Summary,\n cache: Map<string, unknown>,\n collector: ReviewCollector,\n registry: RuleRegistry,\n): RuleContext {\n const absoluteRepoPath = resolve(repoPath);\n\n return {\n repoPath: absoluteRepoPath,\n summary,\n cache,\n relpath(path: string): string {\n return relative(absoluteRepoPath, isAbsolute(path) ? path : resolve(absoluteRepoPath, path));\n },\n glob(pattern: string): Promise<string[]> {\n return findMatchingPaths(absoluteRepoPath, pattern, false);\n },\n rglob(pattern: string): Promise<string[]> {\n return findMatchingPaths(absoluteRepoPath, pattern, true);\n },\n observe(observation: ObservationInit): void {\n assertObservationInit(observation, \"ctx.observe\", registry);\n collector.observations.push(observation);\n },\n finding(finding: FindingInput): void {\n assertFindingInput(finding, \"ctx.finding\");\n collector.findings.push({\n finding: normalizeFindingInput(finding, collector.findings.length),\n deduplicate: finding.deduplicate !== false,\n });\n },\n review: {\n assessment(assessment: ReviewAssessment): void {\n assertAssessment(assessment);\n collector.assessment = assessment;\n },\n positive(note: ReviewNoteInput): void {\n assertReviewNote(note, \"ctx.review.positive\");\n collector.positives.push(normalizeReviewNote(note));\n },\n observe(note: ReviewNoteInput): void {\n assertReviewNote(note, \"ctx.review.observe\");\n collector.reviewObservations.push(normalizeReviewNote(note));\n },\n score(score: ReviewScore): void {\n assertReviewScore(score);\n collector.scores.push(score);\n },\n opinion(opinion: ReviewOpinion): void {\n assertOpinion(opinion);\n collector.opinion = opinion;\n },\n },\n };\n}\n\nasync function findMatchingPaths(\n repoPath: string,\n pattern: string,\n recursive: boolean,\n): Promise<string[]> {\n const matcher = globPatternToRegExp(pattern);\n const paths = recursive ? await walk(repoPath) : await listFiles(repoPath);\n\n return paths\n .map((path) => relative(repoPath, path))\n .filter((path) => {\n const posixPath = toPosixPath(path);\n const candidate = recursive && !pattern.includes(\"/\") ? basename(posixPath) : posixPath;\n return matcher.test(candidate);\n })\n .sort(compareStrings);\n}\n\nasync function listFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n return entries.filter((entry) => entry.isFile()).map((entry) => resolve(directory, entry.name));\n}\n\nasync function walk(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const paths: string[] = [];\n\n for (const entry of entries) {\n const path = resolve(directory, entry.name);\n\n if (entry.isDirectory()) {\n paths.push(...(await walk(path)));\n } else if (entry.isFile()) {\n paths.push(path);\n }\n }\n\n return paths;\n}\n\nfunction globPatternToRegExp(pattern: string): RegExp {\n const source = toPosixPath(pattern)\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"\\0\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\?/g, \"[^/]\")\n .replace(/\\0/g, \".*\");\n\n return new RegExp(`^${source}$`);\n}\n\ninterface ReviewCollector {\n observations: ObservationInit[];\n findings: CollectedFinding[];\n assessment?: ReviewAssessment;\n positives: ReviewNote[];\n reviewObservations: ReviewNote[];\n scores: ReviewScore[];\n opinion?: ReviewOpinion;\n}\n\ninterface CollectedFinding {\n finding: ReviewFinding;\n deduplicate: boolean;\n}\n\nfunction createReviewCollector(): ReviewCollector {\n return {\n observations: [],\n findings: [],\n positives: [],\n reviewObservations: [],\n scores: [],\n };\n}\n\nfunction buildReviewResult(input: {\n adversary: ReviewResult[\"adversary\"];\n repository: string;\n filesScanned?: number;\n collector: ReviewCollector;\n policy: ReviewPolicy;\n registry: RuleRegistry;\n includeSuppressed?: boolean;\n includeRawObservations?: boolean;\n timing?: ReviewResult[\"timing\"];\n}): ReviewResult {\n const thresholds = input.policy.confidenceThresholds ?? DEFAULT_CONFIDENCE_THRESHOLDS;\n const synthesis = synthesizeObservationFindings(\n input.collector.observations,\n thresholds,\n input.registry,\n );\n const allFindings = deduplicateFindings([\n ...synthesis.findings.map((finding) => ({ finding, deduplicate: true })),\n ...input.collector.findings,\n ]).map((finding) => calibrateFindingSeverity(finding, input.policy));\n const ranked = rankFindings(allFindings);\n const minimumConfidence = input.policy.minimumConfidence ?? Confidence.Medium;\n const includeInformational = input.policy.includeInformational ?? false;\n const maximumFindings = input.policy.maximumFindings ?? Number.POSITIVE_INFINITY;\n const eligible: ReviewFinding[] = [];\n const suppressedFindings: ReviewFinding[] = [];\n\n for (const finding of ranked) {\n const suppressed =\n confidenceWeight(finding.confidence) < confidenceWeight(minimumConfidence) ||\n (!includeInformational && finding.severity === Severity.Info) ||\n eligible.length >= maximumFindings;\n\n if (suppressed) {\n suppressedFindings.push(finding);\n } else {\n eligible.push(finding);\n }\n }\n\n const positives = selectPositiveSignals(input.collector.positives);\n const reviewObservations = deduplicateReviewObservations(\n [\n ...input.collector.reviewObservations,\n ...deduplicateScores(input.collector.scores).map(scoreToReviewNote),\n ],\n positives,\n );\n\n return omitUndefined({\n adversary: input.adversary,\n target: omitUndefined({\n repository: input.repository,\n filesScanned: input.filesScanned,\n }),\n assessment: input.collector.assessment ?? synthesizeAssessment(eligible, positives),\n positives,\n observations: reviewObservations,\n findings: eligible,\n opinion: input.collector.opinion ?? synthesizeOpinion(eligible),\n suppressed: {\n observations: synthesis.suppressedObservations,\n findings: suppressedFindings.length,\n },\n timing: input.timing,\n suppressedFindings: input.includeSuppressed ? suppressedFindings : undefined,\n rawObservations: input.includeRawObservations ? input.collector.observations : undefined,\n }) as ReviewResult;\n}\n\ninterface ObservationSynthesisResult {\n findings: ReviewFinding[];\n suppressedObservations: number;\n}\n\nfunction synthesizeObservationFindings(\n observations: ObservationInit[],\n thresholds: ConfidenceThresholds,\n registry: RuleRegistry,\n): ObservationSynthesisResult {\n const grouped = new Map<string, ObservationInit[]>();\n const seen = new Set<string>();\n let suppressedObservations = 0;\n\n for (const observation of observations) {\n const rule = registry.lookup(observation.ruleId);\n const groupKey = observation.groupKey ?? defaultObservationGroupKey(observation, rule);\n const dedupeKey = stableStringify({ groupKey, observation });\n if (observation.deduplicate !== false && seen.has(dedupeKey)) {\n suppressedObservations += 1;\n continue;\n }\n seen.add(dedupeKey);\n grouped.set(groupKey, [...(grouped.get(groupKey) ?? []), observation]);\n }\n\n const findings = [...grouped.entries()].map(([groupKey, group]) => {\n const first = group[0];\n if (first === undefined) {\n throw new Error(\"Cannot synthesize finding from an empty observation group.\");\n }\n\n const rule = registry.lookup(first.ruleId);\n const synthesis = rule?.aggregate?.(group) ?? {};\n const synthesisSource = rule?.aggregate === undefined ? \"generic\" : \"rule\";\n log.debug(\n `review synthesis ruleId=${first.ruleId} groupKey=${groupKey} observations=${group.length} selected=${synthesisSource} fallback=${synthesisSource === \"generic\"}`,\n );\n\n const evidence = deduplicateEvidence(synthesis.evidence ?? group.map(observationToEvidence));\n const recommendation =\n synthesis.recommendation === undefined\n ? synthesizeRecommendation(group)\n : normalizeParagraph(synthesis.recommendation);\n const confidence = aggregateConfidence(\n group.map((observation) =>\n normalizeConfidence(\n observation.confidence ?? rule?.defaultConfidence ?? Confidence.Medium,\n thresholds,\n ),\n ),\n first.confidenceAggregation ?? \"maximum\",\n );\n const severity = aggregateSeverity(\n group.map((observation) => observation.severity ?? rule?.defaultSeverity ?? Severity.Info),\n first.severityAggregation ?? \"highest\",\n );\n\n const finding: ReviewFinding = {\n id: synthesis.id ?? stableId(`${first.ruleId}:${groupKey}`),\n ruleId: synthesis.ruleId ?? first.ruleId,\n groupKey: synthesis.groupKey ?? groupKey,\n title:\n synthesis.title ??\n synthesizeObservationTitle(first.title, group.length, first.groupedTitle),\n category: synthesis.category ?? first.category ?? rule?.category ?? \"general\",\n severity: synthesis.severity ?? severity,\n confidence:\n synthesis.confidence ??\n (rule?.defaultConfidence === undefined\n ? confidence\n : normalizeConfidence(rule.defaultConfidence, thresholds)),\n summary: synthesis.summary ?? summarizeObservationGroup(group),\n whyItMatters: synthesis.whyItMatters ?? first.whyItMatters,\n impact: synthesis.impact ?? first.impact,\n evidence,\n recommendation: recommendation.length > 0 ? recommendation : undefined,\n remediation: synthesis.remediation ?? first.remediation,\n tags: synthesis.tags ?? uniqueStrings(group.flatMap((observation) => observation.tags ?? [])),\n metadata: synthesis.metadata ?? first.metadata,\n };\n assertFindingInput(finding, `adversary aggregate rule \"${first.ruleId}\"`);\n return finding;\n });\n return { findings, suppressedObservations };\n}\n\nfunction normalizeFindingInput(input: FindingInput, occurrence = 0): ReviewFinding {\n return omitUndefined({\n id:\n input.id ??\n stableId(\n `${input.ruleId ?? input.title}:${input.groupKey ?? input.category}${\n input.deduplicate === false ? `:${occurrence}` : \"\"\n }`,\n ),\n ruleId: input.ruleId,\n groupKey: input.groupKey,\n title: input.title,\n category: input.category,\n severity: input.severity,\n confidence: normalizeConfidence(input.confidence),\n summary: input.summary,\n whyItMatters: input.whyItMatters,\n impact: input.impact,\n evidence: deduplicateEvidence(input.evidence),\n recommendation:\n input.recommendation === undefined ? undefined : normalizeParagraph(input.recommendation),\n remediation: input.remediation,\n tags: input.tags === undefined ? undefined : uniqueStrings(input.tags),\n metadata: input.metadata,\n }) as ReviewFinding;\n}\n\nfunction deduplicateFindings(findings: CollectedFinding[]): ReviewFinding[] {\n const seen = new Set<string>();\n const result: ReviewFinding[] = [];\n\n for (const collected of findings) {\n const { finding } = collected;\n if (!collected.deduplicate) {\n result.push({ ...finding, evidence: deduplicateEvidence(finding.evidence) });\n continue;\n }\n const key = finding.groupKey ?? finding.id;\n if (seen.has(key)) {\n const existing = result.find((item) => (item.groupKey ?? item.id) === key);\n if (existing !== undefined) {\n existing.evidence = deduplicateEvidence([...existing.evidence, ...finding.evidence]);\n existing.tags = uniqueStrings([...(existing.tags ?? []), ...(finding.tags ?? [])]);\n }\n continue;\n }\n seen.add(key);\n result.push({ ...finding, evidence: deduplicateEvidence(finding.evidence) });\n }\n\n return result;\n}\n\nfunction deduplicateEvidence(evidence: ReadonlyArray<EvidenceInput | Evidence>): Evidence[] {\n const seen = new Set<string>();\n const result: Evidence[] = [];\n\n for (const item of evidence) {\n const normalized = normalizeEvidence(item);\n const key = stableStringify(normalized);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(normalized);\n }\n }\n\n return result.sort((left, right) => {\n const fileComparison = compareStrings(left.location?.file ?? \"\", right.location?.file ?? \"\");\n if (fileComparison !== 0) {\n return fileComparison;\n }\n const lineComparison = compareNumbers(left.location?.line, right.location?.line);\n if (lineComparison !== 0) {\n return lineComparison;\n }\n return compareStrings(left.message ?? \"\", right.message ?? \"\");\n });\n}\n\nfunction normalizeEvidence(input: EvidenceInput | Evidence): Evidence {\n const legacy = input as EvidenceInput;\n const hasLocation =\n legacy.location !== undefined ||\n legacy.file !== undefined ||\n legacy.line !== undefined ||\n legacy.endLine !== undefined;\n const location = hasLocation\n ? omitUndefined({\n file: legacy.location?.file ?? legacy.file,\n line: legacy.location?.line ?? legacy.line,\n endLine: legacy.location?.endLine ?? legacy.endLine,\n })\n : undefined;\n return omitUndefined({\n location,\n label: input.label,\n message: input.message,\n snippet: input.snippet,\n data: input.data ?? legacy.metadata,\n });\n}\n\nfunction normalizeReviewNote(note: ReviewNoteInput): ReviewNote {\n return omitUndefined({\n ...note,\n evidence: note.evidence === undefined ? undefined : deduplicateEvidence(note.evidence),\n }) as ReviewNote;\n}\n\nfunction deduplicateNotes(notes: ReviewNote[]): ReviewNote[] {\n const seen = new Set<string>();\n const result: ReviewNote[] = [];\n\n for (const note of notes) {\n const normalized = {\n ...note,\n evidence: note.evidence === undefined ? undefined : deduplicateEvidence(note.evidence),\n };\n const key = note.key;\n if (!seen.has(key)) {\n seen.add(key);\n result.push(normalized);\n }\n }\n\n return result.sort((left, right) => compareStrings(left.key, right.key));\n}\n\nfunction selectPositiveSignals(notes: ReviewNote[]): ReviewNote[] {\n const selected: ReviewNote[] = [];\n const seen = new Set<string>();\n\n // Registration order expresses the review author's priority. Two strong signals\n // provide useful context without diluting the findings.\n for (const note of notes) {\n if (!seen.has(note.key)) {\n seen.add(note.key);\n selected.push(note);\n }\n if (selected.length === 2) {\n break;\n }\n }\n\n return deduplicateNotes(selected);\n}\n\nfunction deduplicateReviewObservations(\n observations: ReviewNote[],\n positives: ReviewNote[],\n): ReviewNote[] {\n const deduped = deduplicateNotes(observations);\n\n return deduped.filter((item) => {\n return !positives.some((positive) => notesDescribeSameFact(positive, item));\n });\n}\n\nfunction notesDescribeSameFact(positive: ReviewNote, observation: ReviewNote): boolean {\n if (positive.key === observation.key) {\n return true;\n }\n\n const positiveText = normalizeSemanticText(`${positive.key} ${positive.summary}`);\n const observationText = normalizeSemanticText(`${observation.key} ${observation.summary}`);\n return positiveText.length > 0 && positiveText === observationText;\n}\n\nfunction synthesizeAssessment(\n findings: ReviewFinding[],\n positives: ReviewNote[] = [],\n): ReviewAssessment {\n const strength = assessmentStrength(positives[0]);\n\n if (findings.length === 0) {\n return {\n risk: \"none\",\n summary: joinSentences(\n strength,\n \"No material concerns were identified in the reviewed repository.\",\n ),\n };\n }\n\n const risk = highestRisk(findings);\n const primary = findings[0];\n const primaryConcern =\n primary === undefined ? \"the highest-ranked finding\" : assessmentConcern(primary);\n\n if (findings.length === 1) {\n return {\n risk,\n summary: joinSentences(\n strength,\n `The only material concern identified is ${primaryConcern}.`,\n ),\n };\n }\n\n return {\n risk,\n summary: joinSentences(\n strength,\n `${numberWord(findings.length)} material concerns were identified. The highest-value improvement is ${primaryConcern}.`,\n ),\n };\n}\n\nfunction assessmentStrength(positive: ReviewNote | undefined): string | undefined {\n if (positive === undefined) {\n return undefined;\n }\n\n const summary = normalizeParagraph(positive.summary);\n if (/^uses\\b/i.test(summary)) {\n return `The repository ${lowercaseFirst(summary)}`;\n }\n return summary;\n}\n\nfunction assessmentConcern(finding: ReviewFinding): string {\n const summary = normalizeParagraph(finding.summary).split(/(?<=[.!?])\\s+/, 1)[0];\n return concernClause(\n lowercaseFirst(trimTrailingSentencePunctuation(summary ?? findingConcern(finding))),\n );\n}\n\nfunction concernClause(concern: string): string {\n const isClause =\n /\\b(?:allows|are|builds|can|contains|copies|could|did|do|does|exposes|has|have|includes|installs|is|lacks|may|might|must|reads|references|relies|requires|runs|uses|was|were|writes)\\b/i.test(\n concern,\n );\n if (!isClause) {\n return concern;\n }\n\n const hasDeterminer = /^(?:a|an|any|each|its|no|one|some|the|their|these|this|those)\\b/i.test(\n concern,\n );\n return `that ${hasDeterminer ? concern : `the ${concern}`}`;\n}\n\nfunction joinSentences(...sentences: Array<string | undefined>): string {\n return sentences.filter(isNonEmptyString).join(\" \");\n}\n\nfunction synthesizeOpinion(findings: ReviewFinding[]): ReviewOpinion | undefined {\n if (findings.length === 0) {\n return {\n ship: true,\n summary: \"I would ship this as-is.\",\n };\n }\n\n const highestSeverity = highestFindingSeverity(findings);\n const ship = severityWeight(highestSeverity) < severityWeight(Severity.High);\n\n if (findings.length > 1) {\n return {\n ship,\n summary: \"I would address the remaining findings before production.\",\n };\n }\n\n const finding = findings[0];\n const improvement = finding === undefined ? \"Addressing the finding\" : improvementPhrase(finding);\n return {\n ship,\n summary: ship\n ? `I would ship this as-is. ${improvement} is the only improvement I would recommend before production.`\n : `${improvement} is the most important improvement to address before production.`,\n };\n}\n\nfunction deduplicateScores(scores: ReviewScore[]): ReviewScore[] {\n const seen = new Set<string>();\n const result: ReviewScore[] = [];\n\n for (const score of scores) {\n if (!seen.has(score.key)) {\n seen.add(score.key);\n result.push(score);\n }\n }\n\n return result.sort((left, right) => compareStrings(left.key, right.key));\n}\n\nfunction scoreToReviewNote(score: ReviewScore): ReviewNote {\n return {\n key: `score.${score.key}`,\n summary: formatScore(score),\n metadata: {\n kind: \"score\",\n score: omitUndefined({\n key: score.key,\n label: score.label,\n score: score.score,\n max: score.max,\n summary: score.summary,\n }),\n },\n };\n}\n\nfunction isScoreReviewNote(note: ReviewNote): boolean {\n return note.metadata?.kind === \"score\" && isRecord(note.metadata.score);\n}\n\nfunction observationToEvidence(observation: ObservationInit): Evidence {\n const data = isRecord(observation.evidence)\n ? observation.evidence\n : observation.evidence === undefined\n ? undefined\n : { evidence: observation.evidence };\n const message = isRecord(observation.evidence)\n ? structuredEvidenceMessage(observation.evidence)\n : stringFromUnknown(observation.evidence);\n const snippet = isRecord(observation.evidence)\n ? (stringFromUnknown(observation.evidence.snippet) ??\n stringFromUnknown(observation.evidence.instruction))\n : observation.location?.snippet;\n\n return omitUndefined({\n location: normalizeEvidence(observation.location ?? {}).location,\n label: observation.location?.label ?? message,\n message: observation.location?.message ?? message,\n snippet,\n data,\n });\n}\n\nfunction structuredEvidenceMessage(evidence: Record<string, unknown>): string | undefined {\n const explicitMessage = stringFromUnknown(evidence.message);\n if (explicitMessage !== undefined) {\n return explicitMessage;\n }\n\n const label = stringFromUnknown(evidence.label) ?? stringFromUnknown(evidence.name);\n if (label !== undefined) {\n return label;\n }\n\n return stringFromUnknown(evidence.summary) ?? stringFromUnknown(evidence.instruction);\n}\n\nfunction synthesizeObservationTitle(\n title: ObservationTitle,\n count: number,\n groupedTitle: string | undefined,\n): string {\n if (typeof title === \"string\") {\n return count > 1 && groupedTitle !== undefined ? groupedTitle : title;\n }\n return count > 1 ? title.plural : title.singular;\n}\n\nfunction summarizeObservationGroup(group: ObservationInit[]): string {\n const first = group[0];\n if (first === undefined) {\n throw new Error(\"Cannot summarize an empty observation group.\");\n }\n\n if (first.summary !== undefined) {\n if (typeof first.summary === \"string\") {\n return normalizeParagraph(renderObservationTemplate(first.summary, group));\n }\n const template = group.length > 1 ? first.summary.grouped : first.summary.singular;\n if (template !== undefined) {\n return normalizeParagraph(renderObservationTemplate(template, group));\n }\n }\n\n const recommendation =\n typeof first.recommendation === \"string\" ? undefined : first.recommendation?.summary;\n if (group.length === 1) {\n return recommendation ?? synthesizeObservationTitle(first.title, 1, first.groupedTitle);\n }\n return `${group.length} related observations were reported for ${first.subject}.`;\n}\n\nfunction synthesizeRecommendation(group: ObservationInit[]): string {\n const recommendations = uniqueStrings(\n group.flatMap((observation) => {\n if (typeof observation.recommendation === \"string\") {\n return [observation.recommendation];\n }\n if (observation.recommendation !== undefined) {\n return [\n joinRecommendation(\n observation.recommendation.summary,\n observation.recommendation.details,\n ),\n ];\n }\n return [];\n }),\n );\n\n return recommendations.map(normalizeParagraph).join(\"\\n\\n\");\n}\n\nfunction joinRecommendation(summary: string, details: string | undefined): string {\n if (!isNonEmptyString(details)) {\n return summary;\n }\n\n const compactSummary = trimTrailingSentencePunctuation(summary);\n const compactDetails = trimTrailingSentencePunctuation(details);\n\n if (/^use\\s+/i.test(compactDetails)) {\n return `${compactSummary} and ${lowercaseFirst(compactDetails)}.`;\n }\n\n return `${compactSummary}. ${compactDetails}.`;\n}\n\nfunction defaultObservationGroupKey(\n observation: ObservationInit,\n rule: RuleDefinition | undefined,\n): string {\n const groupBy = observation.groupBy ?? rule?.groupBy;\n if (groupBy !== undefined && groupBy.length > 0) {\n return groupBy\n .map((field) => `${field}:${stringFromUnknown(observationValue(observation, field)) ?? \"\"}`)\n .join(\"|\");\n }\n return `${observation.ruleId}:${observation.subject}:${observation.category ?? rule?.category ?? \"general\"}`;\n}\n\nfunction renderObservationTemplate(template: string, group: ObservationInit[]): string {\n const values = observationTemplateValues(group);\n return template.replace(/\\{([a-zA-Z][a-zA-Z0-9_]*)\\}/g, (match, key: string) => {\n return values[key] ?? match;\n });\n}\n\nfunction observationTemplateValues(group: ObservationInit[]): Record<string, string> {\n const first = group[0];\n const subjects = uniqueStrings(group.map((observation) => observation.subject));\n const locations = uniqueStrings(group.map(formatObservationLocation).filter(isNonEmptyString));\n\n return omitUndefined({\n count: numberWord(group.length),\n location: locations[0],\n locations: joinHumanList(locations),\n subject: first?.subject,\n subjects: joinHumanList(subjects),\n });\n}\n\nfunction observationValue(observation: ObservationInit, field: string): unknown {\n if (field.includes(\".\")) {\n return field.split(\".\").reduce<unknown>((value, part) => {\n return isRecord(value) ? value[part] : undefined;\n }, observation);\n }\n return (observation as unknown as Record<string, unknown>)[field];\n}\n\nfunction formatObservationLocation(observation: ObservationInit): string | undefined {\n if (observation.location?.file === undefined) {\n return undefined;\n }\n if (observation.location.line === undefined) {\n return observation.location.file;\n }\n return `${observation.location.file}:${observation.location.line}`;\n}\n\nfunction joinHumanList(values: string[]): string {\n if (values.length <= 2) {\n return values.join(\" and \");\n }\n return `${values.slice(0, -1).join(\", \")}, and ${values.at(-1)}`;\n}\n\nfunction highestRisk(findings: ReviewFinding[]): ReviewAssessment[\"risk\"] {\n const severity = highestFindingSeverity(findings);\n if (severity === Severity.Info) {\n return \"none\";\n }\n return severity;\n}\n\nfunction highestFindingSeverity(findings: ReviewFinding[]): Severity {\n return aggregateSeverity(\n findings.map((finding) => finding.severity),\n \"highest\",\n );\n}\n\nfunction findingConcern(finding: ReviewFinding): string {\n return lowercaseFirst(trimTrailingSentencePunctuation(finding.title));\n}\n\nfunction improvementPhrase(finding: ReviewFinding): string {\n const recommendation = recommendationSubject(finding.recommendation);\n if (recommendation !== undefined) {\n return recommendation;\n }\n\n return `Addressing ${findingConcern(finding)}`;\n}\n\nfunction recommendationSubject(recommendation: string | undefined): string | undefined {\n if (recommendation === undefined) {\n return undefined;\n }\n\n const normalized = trimTrailingSentencePunctuation(normalizeParagraph(recommendation));\n const firstClause = normalized.split(/\\s+(?:and|when|where|with)\\s+/i)[0]?.trim();\n if (!isNonEmptyString(firstClause)) {\n return undefined;\n }\n\n return gerundPhrase(firstClause);\n}\n\nfunction gerundPhrase(phrase: string): string {\n const words = phrase.split(/\\s+/);\n const first = words[0];\n if (first === undefined) {\n return phrase;\n }\n\n return capitalize([toGerund(first), ...words.slice(1)].join(\" \"));\n}\n\nfunction toGerund(verb: string): string {\n const lower = verb.toLowerCase();\n const irregular: Record<string, string> = {\n pin: \"pinning\",\n run: \"running\",\n use: \"using\",\n };\n const known = irregular[lower];\n if (known !== undefined) {\n return known;\n }\n if (lower.endsWith(\"e\") && !lower.endsWith(\"ee\")) {\n return `${lower.slice(0, -1)}ing`;\n }\n return `${lower}ing`;\n}\n\nfunction normalizeSemanticText(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .split(/\\s+/)\n .filter((word) => word.length > 0 && !semanticStopWords.has(word))\n .join(\" \");\n}\n\nfunction trimTrailingWord(value: string | undefined, word: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const pattern = new RegExp(`\\\\s+${word}$`, \"i\");\n const trimmed = value.replace(pattern, \"\").trim();\n return trimmed.length > 0 ? trimmed : value;\n}\n\nfunction numberWord(value: number): string {\n return (\n {\n 1: \"One\",\n 2: \"Two\",\n 3: \"Three\",\n 4: \"Four\",\n 5: \"Five\",\n 6: \"Six\",\n 7: \"Seven\",\n 8: \"Eight\",\n 9: \"Nine\",\n 10: \"Ten\",\n }[value] ?? String(value)\n );\n}\n\nfunction calibrateFindingSeverity(finding: ReviewFinding, policy: ReviewPolicy): ReviewFinding {\n const override =\n policy.severityOverrides?.[finding.ruleId ?? \"\"] ??\n policy.severityOverrides?.[finding.groupKey ?? \"\"];\n\n return override === undefined ? finding : { ...finding, severity: override };\n}\n\nfunction scoreFinding(finding: ReviewFinding): number {\n const locationScore = Math.min(finding.evidence.length, 5) * 3;\n const remediationScore = finding.remediation?.complexity === \"trivial\" ? 3 : 0;\n return (\n severityWeight(finding.severity) * 10 +\n confidenceWeight(finding.confidence) * 12 +\n locationScore +\n remediationScore\n );\n}\n\nfunction severityWeight(severity: Severity): number {\n switch (severity) {\n case Severity.Critical:\n return 5;\n case Severity.High:\n return 4;\n case Severity.Medium:\n return 3;\n case Severity.Low:\n return 2;\n case Severity.Info:\n return 1;\n }\n}\n\nfunction confidenceWeight(confidence: Confidence): number {\n switch (confidence) {\n case Confidence.High:\n return 3;\n case Confidence.Medium:\n return 2;\n case Confidence.Low:\n return 1;\n }\n}\n\nfunction aggregateSeverity(values: Severity[], strategy: SeverityAggregation): Severity {\n const sorted = [...values].sort((left, right) => severityWeight(right) - severityWeight(left));\n if (strategy === \"lowest\") {\n return sorted.at(-1) ?? Severity.Info;\n }\n return sorted[0] ?? Severity.Info;\n}\n\nfunction aggregateConfidence(values: Confidence[], strategy: ConfidenceAggregation): Confidence {\n if (values.length === 0) {\n return Confidence.Low;\n }\n\n if (strategy === \"minimum\") {\n return (\n [...values].sort((left, right) => confidenceWeight(left) - confidenceWeight(right))[0] ??\n Confidence.Low\n );\n }\n\n if (strategy === \"average\") {\n const average =\n values.reduce((total, confidence) => total + confidenceNumericValue(confidence), 0) /\n values.length;\n return normalizeConfidence(average);\n }\n\n return (\n [...values].sort((left, right) => confidenceWeight(right) - confidenceWeight(left))[0] ??\n Confidence.Low\n );\n}\n\nfunction confidenceNumericValue(confidence: Confidence): number {\n switch (confidence) {\n case Confidence.High:\n return 0.95;\n case Confidence.Medium:\n return 0.72;\n case Confidence.Low:\n return 0.3;\n }\n}\n\nfunction stableId(value: string): string {\n let hash = 0;\n for (const character of value) {\n hash = (hash * 31 + character.charCodeAt(0)) >>> 0;\n }\n return `finding-${hash.toString(16).padStart(8, \"0\")}`;\n}\n\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n if (isRecord(value)) {\n return `{${Object.keys(value)\n .sort(compareStrings)\n .map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.filter(isNonEmptyString))].sort(compareStrings);\n}\n\nfunction assertObservationInit(\n value: ObservationInit,\n source: string,\n registry: RuleRegistry,\n): void {\n requireString(value.ruleId, `${source}.ruleId`);\n requireString(value.subject, `${source}.subject`);\n requireObservationTitle(value.title, `${source}.title`);\n const rule = registry.lookup(value.ruleId);\n if (value.category === undefined && rule?.category === undefined) {\n throw new Error(`${source}.category is required when rule.category is not defined.`);\n }\n optionalString(value.category, `${source}.category`);\n if (value.severity === undefined && rule?.defaultSeverity === undefined) {\n throw new Error(`${source}.severity is required when rule.defaultSeverity is not defined.`);\n }\n if (value.severity !== undefined && !isSeverity(value.severity)) {\n throw new Error(`${source}.severity must be one of info, low, medium, high, critical.`);\n }\n const ruleConfidence = rule?.defaultConfidence;\n if (value.confidence === undefined && ruleConfidence === undefined) {\n throw new Error(`${source}.confidence is required when rule.defaultConfidence is not defined.`);\n }\n if (value.confidence !== undefined) {\n normalizeConfidence(value.confidence);\n }\n optionalObservationSummary(value.summary, `${source}.summary`);\n optionalEvidence(value.location, `${source}.location`);\n optionalString(value.groupKey, `${source}.groupKey`);\n optionalStringArray(value.groupBy, `${source}.groupBy`);\n optionalStringArray(value.tags, `${source}.tags`);\n}\n\nfunction assertFindingInput(value: FindingInput, source: string): void {\n requireString(value.title, `${source}.title`);\n requireString(value.category, `${source}.category`);\n requireString(value.summary, `${source}.summary`);\n if (!isSeverity(value.severity)) {\n throw new Error(`${source}.severity must be one of info, low, medium, high, critical.`);\n }\n normalizeConfidence(value.confidence);\n if (!Array.isArray(value.evidence) || value.evidence.length === 0) {\n throw new Error(`${source}.evidence must contain at least one evidence item.`);\n }\n for (const [index, evidence] of value.evidence.entries()) {\n optionalEvidence(evidence, `${source}.evidence[${index}]`);\n }\n optionalString(value.id, `${source}.id`);\n optionalString(value.ruleId, `${source}.ruleId`);\n optionalString(value.groupKey, `${source}.groupKey`);\n optionalStringArray(value.tags, `${source}.tags`);\n optionalRemediation(value.remediation, `${source}.remediation`);\n}\n\nfunction assertReviewNote(value: ReviewNoteInput, source: string): void {\n requireString(value.key, `${source}.key`);\n requireString(value.summary, `${source}.summary`);\n if (value.evidence !== undefined) {\n for (const [index, evidence] of value.evidence.entries()) {\n optionalEvidence(evidence, `${source}.evidence[${index}]`);\n }\n }\n}\n\nfunction assertReviewScore(value: ReviewScore): void {\n requireString(value.key, \"ctx.review.score.key\");\n if (typeof value.score !== \"number\" || !Number.isFinite(value.score)) {\n throw new Error(\"ctx.review.score.score must be a finite number.\");\n }\n if (value.max !== undefined && (typeof value.max !== \"number\" || !Number.isFinite(value.max))) {\n throw new Error(\"ctx.review.score.max must be a finite number.\");\n }\n if (value.score < 0) {\n throw new Error(\"ctx.review.score.score must be greater than or equal to zero.\");\n }\n if (value.max !== undefined && (value.max <= 0 || value.score > value.max)) {\n throw new Error(\"ctx.review.score.max must be positive and no smaller than score.\");\n }\n optionalString(value.label, \"ctx.review.score.label\");\n optionalString(value.summary, \"ctx.review.score.summary\");\n}\n\nfunction assertAssessment(value: ReviewAssessment): void {\n if (![\"none\", \"low\", \"medium\", \"high\", \"critical\"].includes(value.risk)) {\n throw new Error(\"ctx.review.assessment.risk must be one of none, low, medium, high, critical.\");\n }\n optionalString(value.summary, \"ctx.review.assessment.summary\");\n}\n\nfunction assertOpinion(value: ReviewOpinion): void {\n requireString(value.summary, \"ctx.review.opinion.summary\");\n}\n\nfunction assertRuleDefinition(rule: RuleDefinition): void {\n requireString(rule.id, \"rule.id\");\n optionalString(rule.category, \"rule.category\");\n if (rule.defaultSeverity !== undefined && !isSeverity(rule.defaultSeverity)) {\n throw new Error(\"rule.defaultSeverity must be one of info, low, medium, high, critical.\");\n }\n if (rule.defaultConfidence !== undefined) {\n normalizeConfidence(rule.defaultConfidence);\n }\n optionalStringArray(rule.groupBy, \"rule.groupBy\");\n if (rule.aggregate !== undefined && typeof rule.aggregate !== \"function\") {\n throw new Error(\"rule.aggregate must be a function.\");\n }\n}\n\nfunction assertReviewPolicy(policy: ReviewPolicy, source: string): void {\n if (policy.minimumConfidence !== undefined && !isConfidence(policy.minimumConfidence)) {\n throw new Error(`${source}.minimumConfidence must be one of low, medium, high.`);\n }\n if (\n policy.maximumFindings !== undefined &&\n (!Number.isInteger(policy.maximumFindings) || policy.maximumFindings < 0)\n ) {\n throw new Error(`${source}.maximumFindings must be a non-negative integer.`);\n }\n if (policy.confidenceThresholds !== undefined) {\n const { medium, high } = policy.confidenceThresholds;\n if (medium < 0 || high > 1 || medium > high) {\n throw new Error(`${source}.confidenceThresholds must satisfy 0 <= medium <= high <= 1.`);\n }\n }\n for (const [ruleId, severity] of Object.entries(policy.severityOverrides ?? {})) {\n if (!isSeverity(severity)) {\n throw new Error(`${source}.severityOverrides[\"${ruleId}\"] is not a valid severity.`);\n }\n }\n}\n\nfunction optionalRemediation(value: Remediation | undefined, field: string): void {\n if (value === undefined) return;\n if (!isRecord(value)) throw new Error(`${field} must be an object.`);\n if (\n value.complexity !== undefined &&\n (typeof value.complexity !== \"string\" ||\n ![\"trivial\", \"small\", \"medium\", \"large\", \"architectural\"].includes(value.complexity))\n ) {\n throw new Error(`${field}.complexity is invalid.`);\n }\n}\n\nfunction requireObservationTitle(value: ObservationTitle, field: string): void {\n if (typeof value === \"string\") {\n requireString(value, field);\n return;\n }\n if (!isRecord(value)) {\n throw new Error(`${field} must be a string or { singular, plural }.`);\n }\n requireString(value.singular, `${field}.singular`);\n requireString(value.plural, `${field}.plural`);\n}\n\nfunction optionalObservationSummary(value: ObservationSummary | undefined, field: string): void {\n if (value === undefined) {\n return;\n }\n if (typeof value === \"string\") {\n optionalString(value, field);\n return;\n }\n if (!isRecord(value)) {\n throw new Error(`${field} must be a string or { singular, grouped }.`);\n }\n optionalString(value.singular, `${field}.singular`);\n optionalString(value.grouped, `${field}.grouped`);\n}\n\nfunction optionalEvidence(value: EvidenceInput | Evidence | undefined, field: string): void {\n if (value === undefined) {\n return;\n }\n if (!isRecord(value)) {\n throw new Error(`${field} must be an object.`);\n }\n const input = value as EvidenceInput;\n optionalString(input.file, `${field}.file`);\n optionalPositiveInteger(input.line, `${field}.line`);\n optionalPositiveInteger(input.endLine, `${field}.endLine`);\n optionalString(value.message, `${field}.message`);\n optionalString(value.snippet, `${field}.snippet`);\n optionalString(value.label, `${field}.label`);\n if (value.location !== undefined) {\n if (!isRecord(value.location)) {\n throw new Error(`${field}.location must be an object.`);\n }\n optionalString(value.location.file, `${field}.location.file`);\n optionalPositiveInteger(value.location.line, `${field}.location.line`);\n optionalPositiveInteger(value.location.endLine, `${field}.location.endLine`);\n }\n const line = value.location?.line ?? input.line;\n const endLine = value.location?.endLine ?? input.endLine;\n if (endLine !== undefined && line === undefined) {\n throw new Error(`${field}.endLine requires line.`);\n }\n if (endLine !== undefined && line !== undefined && endLine < line) {\n throw new Error(`${field}.endLine must not precede line.`);\n }\n if (value.data !== undefined && !isRecord(value.data)) {\n throw new Error(`${field}.data must be an object.`);\n }\n if (input.metadata !== undefined && !isRecord(input.metadata)) {\n throw new Error(`${field}.metadata must be an object.`);\n }\n}\n\nfunction writeLog(level: \"debug\" | \"info\" | \"warn\" | \"error\", message: unknown): void {\n process.stderr.write(`[adversary] ${level}: ${String(message)}\\n`);\n}\n\nfunction parseBooleanEnv(value: string | undefined): boolean | undefined {\n if (value === undefined || value.length === 0) {\n return undefined;\n }\n return [\"1\", \"true\", \"TRUE\", \"yes\", \"YES\"].includes(value);\n}\n\nfunction isVerbose(): boolean {\n return verboseValues.has(process.env.ADVERSARY_VERBOSE ?? \"\");\n}\n\nfunction compareStrings(left: string, right: string): number {\n return left.localeCompare(right);\n}\n\nfunction compareNumbers(left: number | undefined, right: number | undefined): number {\n return (left ?? Number.MAX_SAFE_INTEGER) - (right ?? Number.MAX_SAFE_INTEGER);\n}\n\nfunction toPosixPath(path: string): string {\n return path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction basename(path: string): string {\n return path.split(\"/\").at(-1) ?? path;\n}\n\nfunction requireString(value: unknown, field: string): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n}\n\nfunction optionalString(value: unknown, field: string): void {\n if (value !== undefined && typeof value !== \"string\") {\n throw new Error(`${field} must be a string.`);\n }\n}\n\nfunction optionalStringArray(value: unknown, field: string): void {\n if (\n value !== undefined &&\n (!Array.isArray(value) || value.some((item) => typeof item !== \"string\"))\n ) {\n throw new Error(`${field} must be an array of strings.`);\n }\n}\n\nfunction optionalPositiveInteger(value: unknown, field: string): void {\n if (value !== undefined && (!Number.isInteger(value) || Number(value) < 1)) {\n throw new Error(`${field} must be a positive integer.`);\n }\n}\n\nfunction isConfidence(value: unknown): value is Confidence {\n return value === Confidence.Low || value === Confidence.Medium || value === Confidence.High;\n}\n\nfunction isSeverity(value: unknown): value is Severity {\n return (\n value === Severity.Info ||\n value === Severity.Low ||\n value === Severity.Medium ||\n value === Severity.High ||\n value === Severity.Critical\n );\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction capitalize(value: string): string {\n return `${value.slice(0, 1).toUpperCase()}${value.slice(1)}`;\n}\n\nconst semanticStopWords = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"from\",\n \"in\",\n \"is\",\n \"of\",\n \"the\",\n \"to\",\n \"uses\",\n \"using\",\n]);\n\nfunction formatEvidenceLocation(evidence: Evidence): string {\n const file = evidence.location?.file;\n const line = evidence.location?.line;\n const endLine = evidence.location?.endLine;\n\n if (file === undefined) {\n return \"\";\n }\n if (line !== undefined && endLine !== undefined) {\n return `${file}:${line}-${endLine}`;\n }\n if (line !== undefined) {\n return `${file}:${line}`;\n }\n return file;\n}\n\nfunction formatEvidenceLines(evidence: Evidence): string[] {\n const location = formatEvidenceLocation(evidence);\n const label = evidence.label ?? evidence.message;\n const firstLine =\n location.length > 0 && label !== undefined\n ? `- ${location} — ${label}`\n : `- ${location.length > 0 ? location : (label ?? \"Evidence\")}`;\n const lines = [firstLine];\n\n if (evidence.snippet !== undefined) {\n lines.push(` ${evidence.snippet}`);\n }\n\n return lines;\n}\n\nfunction formatScore(score: ReviewScore): string {\n const label = score.label ?? score.key;\n const max = score.max ?? 10;\n const summary = score.summary === undefined ? \"\" : ` - ${normalizeParagraph(score.summary)}`;\n return `${label}: ${score.score} / ${max}${summary}`;\n}\n\nfunction normalizeParagraph(value: string): string {\n return value\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\" \");\n}\n\nfunction trimTrailingSentencePunctuation(value: string): string {\n return value.trim().replace(/[.!?]+$/g, \"\");\n}\n\nfunction lowercaseFirst(value: string): string {\n return `${value.slice(0, 1).toLowerCase()}${value.slice(1)}`;\n}\n\nfunction omitUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entryValue]) => entryValue !== undefined),\n ) as T;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, relative, resolve } from \"node:path\";\nimport { Ajv2020, type ValidateFunction } from \"ajv/dist/2020.js\";\n\nexport {\n ADVERSARY_MANIFEST_FILE_NAME,\n ADVERSARY_MANIFEST_MAX_BYTES,\n ManifestValidationError,\n parseAdversaryManifest,\n validateAdversaryManifest,\n type AdversaryManifest,\n type DetectionManifest,\n type EnvironmentPermissionsManifest,\n type FilesystemPermissionsManifest,\n type FindingsManifest,\n type PermissionsManifest,\n type RuntimeManifest,\n type TriggerManifest,\n} from \"./manifest.js\";\n\nexport const DEFAULT_INPUT_PATH = \"/adversary/input.json\";\nexport const DEFAULT_OUTPUT_PATH = \"/adversary/output.json\";\nexport const ADVERSARY_RUN_PROTOCOL_VERSION = 1;\n\nconst verboseValues = new Set([\"1\", \"true\", \"TRUE\", \"yes\", \"YES\"]);\nlet envelopeValidator: ValidateFunction | undefined;\n\nexport const Severity = {\n Info: \"info\",\n Low: \"low\",\n Medium: \"medium\",\n High: \"high\",\n Critical: \"critical\",\n} as const;\n\nexport type Severity = (typeof Severity)[keyof typeof Severity];\n\nexport interface SeverityGuidanceEntry {\n severity: Severity;\n guidance: string;\n}\n\nexport const DEFAULT_SEVERITY_GUIDANCE: SeverityGuidanceEntry[] = [\n {\n severity: Severity.Info,\n guidance: \"Interesting observations.\",\n },\n {\n severity: Severity.Low,\n guidance: \"Reasonable engineering improvements.\",\n },\n {\n severity: Severity.Medium,\n guidance: \"Issues likely to create operational problems.\",\n },\n {\n severity: Severity.High,\n guidance: \"Security, correctness, or reliability risks.\",\n },\n {\n severity: Severity.Critical,\n guidance: \"Immediate production risk.\",\n },\n];\n\nexport const Confidence = {\n Low: \"low\",\n Medium: \"medium\",\n High: \"high\",\n} as const;\n\nexport type Confidence = (typeof Confidence)[keyof typeof Confidence];\nexport type ConfidenceInput = Confidence | number;\n\nexport interface ConfidenceThresholds {\n medium: number;\n high: number;\n}\n\nexport const DEFAULT_CONFIDENCE_THRESHOLDS: ConfidenceThresholds = {\n medium: 0.6,\n high: 0.85,\n};\n\nexport interface Location {\n file?: string;\n line?: number;\n endLine?: number;\n}\n\nexport interface EvidenceInput extends Location {\n location?: Location;\n label?: string;\n message?: string;\n snippet?: string;\n data?: Record<string, unknown>;\n /** @deprecated Use data. */\n metadata?: Record<string, unknown>;\n}\n\nexport interface Evidence {\n location?: Location;\n label?: string;\n message?: string;\n snippet?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface Remediation {\n complexity?: \"trivial\" | \"small\" | \"medium\" | \"large\" | \"architectural\";\n}\n\nexport interface RecommendationInput {\n summary: string;\n details?: string;\n}\n\nexport type ObservationTitle =\n | string\n | {\n singular: string;\n plural: string;\n };\n\nexport type ObservationSummary =\n | string\n | {\n singular?: string;\n grouped?: string;\n };\n\nexport type ConfidenceAggregation = \"maximum\" | \"minimum\" | \"average\";\nexport type SeverityAggregation = \"highest\" | \"lowest\";\n\nexport interface ObservationInit {\n ruleId: string;\n subject: string;\n groupKey?: string;\n groupBy?: string[];\n groupedTitle?: string;\n deduplicate?: boolean;\n category?: string;\n severity?: Severity;\n confidence?: ConfidenceInput;\n confidenceAggregation?: ConfidenceAggregation;\n severityAggregation?: SeverityAggregation;\n title: ObservationTitle;\n summary?: ObservationSummary;\n whyItMatters?: string;\n impact?: string;\n location?: EvidenceInput;\n evidence?: string | Record<string, unknown>;\n recommendation?: string | RecommendationInput;\n remediation?: Remediation;\n tags?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface FindingInput {\n id?: string;\n ruleId?: string;\n groupKey?: string;\n deduplicate?: boolean;\n title: string;\n category: string;\n severity: Severity;\n confidence: ConfidenceInput;\n summary: string;\n whyItMatters?: string;\n impact?: string;\n evidence: EvidenceInput[];\n recommendation?: string;\n remediation?: Remediation;\n tags?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReviewFinding {\n id: string;\n ruleId?: string;\n groupKey?: string;\n title: string;\n category: string;\n severity: Severity;\n confidence: Confidence;\n summary: string;\n whyItMatters?: string;\n impact?: string;\n evidence: Evidence[];\n recommendation?: string;\n remediation?: Remediation;\n tags?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReviewNote {\n key: string;\n summary: string;\n evidence?: Evidence[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReviewNoteInput extends Omit<ReviewNote, \"evidence\"> {\n evidence?: EvidenceInput[];\n}\n\nexport interface ReviewAssessment {\n risk: \"none\" | \"low\" | \"medium\" | \"high\" | \"critical\";\n summary?: string;\n}\n\nexport interface ReviewOpinion {\n ship?: boolean;\n summary: string;\n}\n\nexport interface ReviewScore {\n key: string;\n label?: string;\n score: number;\n max?: number;\n summary?: string;\n}\n\nexport interface ReviewPolicy {\n minimumConfidence?: Confidence;\n maximumFindings?: number;\n includeInformational?: boolean;\n confidenceThresholds?: ConfidenceThresholds;\n severityOverrides?: Record<string, Severity>;\n}\n\nexport interface ReviewResult {\n adversary: {\n name: string;\n version?: string;\n };\n target: {\n repository?: string;\n filesScanned?: number;\n };\n assessment?: ReviewAssessment;\n positives: ReviewNote[];\n observations: ReviewNote[];\n findings: ReviewFinding[];\n opinion?: ReviewOpinion;\n suppressed: {\n observations: number;\n findings: number;\n };\n timing?: {\n buildMs?: number;\n startupMs?: number;\n scanMs?: number;\n totalMs?: number;\n };\n suppressedFindings?: ReviewFinding[];\n rawObservations?: ObservationInit[];\n}\n\nexport interface AdversaryRunEnvelope {\n protocolVersion: typeof ADVERSARY_RUN_PROTOCOL_VERSION;\n result: WireReviewResult;\n}\n\nexport interface WireEvidence {\n file?: string;\n line?: number;\n endLine?: number;\n message?: string;\n snippet?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface WireReviewFinding extends Omit<ReviewFinding, \"evidence\"> {\n evidence: WireEvidence[];\n}\n\nexport interface WireReviewNote extends Omit<ReviewNote, \"evidence\"> {\n evidence?: WireEvidence[];\n}\n\nexport interface WireReviewResult\n extends Omit<ReviewResult, \"positives\" | \"observations\" | \"findings\" | \"suppressedFindings\"> {\n positives: WireReviewNote[];\n observations: WireReviewNote[];\n findings: WireReviewFinding[];\n suppressedFindings?: WireReviewFinding[];\n}\n\nexport interface RuntimeInput {\n source: {\n path: string;\n };\n [key: string]: unknown;\n}\n\nexport interface Summary {\n files_scanned?: number;\n}\n\nexport interface RuleContext {\n repoPath: string;\n summary: Summary;\n cache: Map<string, unknown>;\n relpath: (path: string) => string;\n glob: (pattern: string) => Promise<string[]>;\n rglob: (pattern: string) => Promise<string[]>;\n observe: (observation: ObservationInit) => void;\n finding: (finding: FindingInput) => void;\n review: {\n assessment: (assessment: ReviewAssessment) => void;\n positive: (note: ReviewNoteInput) => void;\n observe: (note: ReviewNoteInput) => void;\n score: (score: ReviewScore) => void;\n opinion: (opinion: ReviewOpinion) => void;\n };\n}\n\nexport type RuleHandler = (context: RuleContext) => void | Promise<void>;\n\nexport interface AdversaryOptions {\n name: string;\n version?: string;\n review?: ReviewPolicy;\n}\n\nexport interface RunOptions {\n input: RuntimeInput;\n review?: ReviewPolicy;\n includeSuppressed?: boolean;\n includeRawObservations?: boolean;\n includeTiming?: boolean;\n}\n\nexport interface EnvironmentRunOptions {\n input?: RuntimeInput;\n inputPath?: string;\n outputPath?: string;\n review?: ReviewPolicy;\n includeSuppressed?: boolean;\n includeRawObservations?: boolean;\n includeTiming?: boolean;\n}\n\nexport interface ReviewRenderer {\n render(result: ReviewResult): Promise<void> | void;\n}\n\nexport interface RuleDefinition {\n id: string;\n category?: string;\n defaultSeverity?: Severity;\n defaultConfidence?: ConfidenceInput;\n groupBy?: string[];\n aggregate?: (observations: ReadonlyArray<ObservationInit>) => FindingSynthesis;\n}\n\nexport type FindingSynthesis = Omit<Partial<ReviewFinding>, \"evidence\"> & {\n evidence?: EvidenceInput[];\n};\n\nexport class RuleRegistry {\n private readonly rules = new Map<string, RuleDefinition>();\n\n register(rule: RuleDefinition): void {\n assertRuleDefinition(rule);\n if (this.rules.has(rule.id)) {\n throw new Error(`Rule definition \"${rule.id}\" is already registered.`);\n }\n this.rules.set(rule.id, cloneRuleDefinition(rule));\n }\n\n replace(rule: RuleDefinition): void {\n assertRuleDefinition(rule);\n if (!this.rules.has(rule.id)) {\n throw new Error(`Rule definition \"${rule.id}\" is not registered.`);\n }\n this.rules.set(rule.id, cloneRuleDefinition(rule));\n }\n\n lookup(ruleId: string): RuleDefinition | undefined {\n const rule = this.rules.get(ruleId);\n return rule === undefined ? undefined : cloneRuleDefinition(rule);\n }\n\n has(ruleId: string): boolean {\n return this.rules.has(ruleId);\n }\n\n snapshot(): RuleRegistry {\n const snapshot = new RuleRegistry();\n for (const rule of this.rules.values()) {\n snapshot.register(rule);\n }\n return snapshot;\n }\n\n importMissing(source: RuleRegistry): void {\n for (const rule of source.rules.values()) {\n if (!this.rules.has(rule.id)) {\n this.rules.set(rule.id, cloneRuleDefinition(rule));\n }\n }\n }\n}\n\nfunction cloneRuleDefinition(rule: RuleDefinition): RuleDefinition {\n return {\n ...rule,\n groupBy: rule.groupBy === undefined ? undefined : [...rule.groupBy],\n };\n}\n\nfunction cloneReviewPolicy(policy: ReviewPolicy): ReviewPolicy {\n return {\n ...policy,\n confidenceThresholds:\n policy.confidenceThresholds === undefined ? undefined : { ...policy.confidenceThresholds },\n severityOverrides:\n policy.severityOverrides === undefined ? undefined : { ...policy.severityOverrides },\n };\n}\n\n/** @deprecated Prefer app.defineRule(...) so definitions remain instance-scoped. */\nexport const ruleRegistry = new RuleRegistry();\n\n/** @deprecated Prefer app.defineRule(...) so definitions remain instance-scoped. */\nexport function defineRule(rule: RuleDefinition): void {\n ruleRegistry.register(rule);\n}\n\n/** @deprecated Prefer app.replaceRule(...) so definitions remain instance-scoped. */\nexport function replaceRule(rule: RuleDefinition): void {\n ruleRegistry.replace(rule);\n}\n\nexport const log = {\n debug(message: unknown): void {\n if (isVerbose()) {\n writeLog(\"debug\", message);\n }\n },\n\n info(message: unknown): void {\n if (isVerbose()) {\n writeLog(\"info\", message);\n }\n },\n\n warn(message: unknown): void {\n writeLog(\"warn\", message);\n },\n\n error(message: unknown): void {\n writeLog(\"error\", message);\n },\n};\n\nexport class Adversary {\n readonly name: string;\n readonly version?: string;\n private readonly rules: Array<{ id: string; handler: RuleHandler }> = [];\n private readonly reviewPolicy: ReviewPolicy;\n private readonly ruleDefinitions: RuleRegistry;\n\n constructor(options: AdversaryOptions) {\n if (options.name.length === 0) {\n throw new Error(\"Adversary name must be a non-empty string.\");\n }\n\n this.name = options.name;\n this.version = options.version;\n this.reviewPolicy = cloneReviewPolicy(options.review ?? {});\n assertReviewPolicy(this.reviewPolicy, `adversary \"${this.name}\" review policy`);\n this.ruleDefinitions = ruleRegistry.snapshot();\n }\n\n defineRule(rule: RuleDefinition): void {\n this.ruleDefinitions.register(rule);\n }\n\n replaceRule(rule: RuleDefinition): void {\n this.ruleDefinitions.replace(rule);\n }\n\n hasRuleDefinition(ruleId: string): boolean {\n return this.ruleDefinitions.has(ruleId);\n }\n\n rule(id: string, handler: RuleHandler): void {\n if (id.length === 0) {\n throw new Error(\"Rule id must be a non-empty string.\");\n }\n\n if (this.rules.some((rule) => rule.id === id)) {\n throw new Error(`App rule \"${id}\" is already registered.`);\n }\n\n // Compatibility for definitions registered with the deprecated top-level API after\n // this Adversary was constructed. Once copied, later global changes cannot affect it.\n this.ruleDefinitions.importMissing(ruleRegistry);\n this.rules.push({ id, handler });\n }\n\n async run(options: RunOptions): Promise<ReviewResult> {\n const startedAt = performance.now();\n assertReviewPolicy(options.review ?? {}, `adversary \"${this.name}\" run review policy`);\n const repoPath = options.input.source.path;\n const summary: Summary = {};\n const cache = new Map<string, unknown>();\n const collector = createReviewCollector();\n const registry = this.ruleDefinitions.snapshot();\n const context = createRuleContext(repoPath, summary, cache, collector, registry);\n const includeSuppressed = options.includeSuppressed;\n\n for (const rule of this.rules) {\n log.debug(`running rule ${rule.id}`);\n await rule.handler(context);\n }\n\n const output = buildReviewResult({\n adversary: { name: this.name, version: this.version },\n repository: repoPath,\n filesScanned: typeof summary.files_scanned === \"number\" ? summary.files_scanned : undefined,\n collector,\n policy: cloneReviewPolicy({ ...this.reviewPolicy, ...options.review }),\n registry,\n includeSuppressed,\n includeRawObservations: options.includeRawObservations,\n timing: options.includeTiming\n ? { totalMs: Math.round(performance.now() - startedAt) }\n : undefined,\n });\n\n return output;\n }\n\n async runFromEnvironment(options: EnvironmentRunOptions = {}): Promise<ReviewResult> {\n const input =\n options.input ??\n (await parseInput(options.inputPath ?? process.env.ADVERSARY_INPUT ?? DEFAULT_INPUT_PATH));\n const repository = options.input\n ? input.source.path\n : (process.env.ADVERSARY_REPO ?? input.source.path);\n const result = await this.run({\n input: { ...input, source: { ...input.source, path: repository } },\n review: options.review,\n includeSuppressed:\n options.includeSuppressed ?? parseBooleanEnv(process.env.ADVERSARY_INCLUDE_SUPPRESSED),\n includeRawObservations: options.includeRawObservations,\n includeTiming: options.includeTiming,\n });\n await writeOutput(\n createAdversaryRunEnvelope(result),\n options.outputPath ?? process.env.ADVERSARY_OUTPUT ?? DEFAULT_OUTPUT_PATH,\n );\n return result;\n }\n}\n\nexport function createAdversaryRunEnvelope(result: ReviewResult): AdversaryRunEnvelope {\n return {\n protocolVersion: ADVERSARY_RUN_PROTOCOL_VERSION,\n result: toWireReviewResult(result),\n };\n}\n\nfunction toWireReviewResult(result: ReviewResult): WireReviewResult {\n return omitUndefined({\n adversary: omitUndefined(result.adversary),\n target: omitUndefined(result.target),\n assessment:\n result.assessment === undefined ? undefined : omitUndefined({ ...result.assessment }),\n positives: result.positives.map(toWireReviewNote),\n observations: result.observations.map(toWireReviewNote),\n findings: result.findings.map(toWireFinding),\n opinion: result.opinion === undefined ? undefined : omitUndefined({ ...result.opinion }),\n suppressed: result.suppressed,\n timing: result.timing === undefined ? undefined : omitUndefined(result.timing),\n suppressedFindings: result.suppressedFindings?.map(toWireFinding),\n rawObservations: result.rawObservations,\n }) as WireReviewResult;\n}\n\nfunction toWireReviewNote(note: ReviewNote): WireReviewNote {\n return omitUndefined({\n key: note.key,\n summary: note.summary,\n evidence: note.evidence?.map(toWireEvidence),\n metadata: note.metadata,\n });\n}\n\nfunction toWireFinding(finding: ReviewFinding): WireReviewFinding {\n return omitUndefined({\n id: finding.id,\n ruleId: finding.ruleId,\n groupKey: finding.groupKey,\n title: finding.title,\n category: finding.category,\n severity: finding.severity,\n confidence: finding.confidence,\n summary: finding.summary,\n whyItMatters: finding.whyItMatters,\n impact: finding.impact,\n evidence: finding.evidence.map(toWireEvidence),\n recommendation: finding.recommendation,\n remediation:\n finding.remediation === undefined ? undefined : omitUndefined({ ...finding.remediation }),\n tags: finding.tags,\n metadata: finding.metadata,\n }) as WireReviewFinding;\n}\n\nfunction toWireEvidence(evidence: Evidence): WireEvidence {\n return omitUndefined({\n file: evidence.location?.file,\n line: evidence.location?.line,\n endLine: evidence.location?.endLine,\n message: evidence.message ?? evidence.label,\n snippet: evidence.snippet,\n metadata: evidence.data,\n });\n}\n\nexport async function parseInput(path = DEFAULT_INPUT_PATH): Promise<RuntimeInput> {\n const raw = await readFile(path, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (!isRecord(parsed)) {\n throw new Error(`Invalid input at ${path}: expected an object.`);\n }\n\n if (!isRecord(parsed.source)) {\n throw new Error(`Invalid input at ${path}: source must be an object.`);\n }\n\n if (typeof parsed.source.path !== \"string\" || parsed.source.path.length === 0) {\n throw new Error(`Invalid input at ${path}: source.path must be a non-empty string.`);\n }\n\n return parsed as RuntimeInput;\n}\n\nexport async function writeOutput(\n output: AdversaryRunEnvelope,\n path = DEFAULT_OUTPUT_PATH,\n): Promise<void> {\n await validateRunEnvelope(output);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(output, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function validateRunEnvelope(output: unknown): Promise<void> {\n let validator = envelopeValidator;\n if (validator === undefined) {\n const schema = JSON.parse(\n await readFile(\n new URL(\"../schemas/adversary.review.v1.schema.json\", import.meta.url),\n \"utf8\",\n ),\n );\n validator = new Ajv2020({ allErrors: true, strict: true }).compile(schema);\n envelopeValidator = validator;\n }\n if (!validator(output)) {\n throw new Error(`Invalid adversary.review.v1 envelope: ${JSON.stringify(validator.errors)}`);\n }\n}\n\nexport function normalizeConfidence(\n confidence: ConfidenceInput,\n thresholds: ConfidenceThresholds = DEFAULT_CONFIDENCE_THRESHOLDS,\n): Confidence {\n if (isConfidence(confidence)) {\n return confidence;\n }\n\n if (\n typeof confidence !== \"number\" ||\n Number.isNaN(confidence) ||\n confidence < 0 ||\n confidence > 1\n ) {\n throw new Error(\"confidence must be low, medium, high, or a number from 0 to 1.\");\n }\n\n if (confidence >= thresholds.high) {\n return Confidence.High;\n }\n\n if (confidence >= thresholds.medium) {\n return Confidence.Medium;\n }\n\n return Confidence.Low;\n}\n\nexport function rankFindings(findings: ReviewFinding[]): ReviewFinding[] {\n return [...findings].sort((left, right) => {\n const scoreComparison = scoreFinding(right) - scoreFinding(left);\n if (scoreComparison !== 0) {\n return scoreComparison;\n }\n\n const severityComparison = severityWeight(right.severity) - severityWeight(left.severity);\n if (severityComparison !== 0) {\n return severityComparison;\n }\n\n const titleComparison = compareStrings(left.title, right.title);\n if (titleComparison !== 0) {\n return titleComparison;\n }\n\n return compareStrings(left.id, right.id);\n });\n}\n\nexport class JsonRenderer implements ReviewRenderer {\n constructor(\n private readonly write: (text: string) => void = (text) => process.stdout.write(text),\n ) {}\n\n render(result: ReviewResult): void {\n this.write(`${JSON.stringify(toWireReviewResult(result), null, 2)}\\n`);\n }\n}\n\nexport class TerminalRenderer implements ReviewRenderer {\n constructor(\n private readonly write: (text: string) => void = (text) => process.stdout.write(text),\n ) {}\n\n render(result: ReviewResult): void {\n const lines: string[] = [];\n lines.push(`Adversary: ${result.adversary.name}`);\n if (result.target.repository !== undefined) {\n lines.push(`Repository: ${result.target.repository}`);\n }\n lines.push(\"\");\n\n if (result.assessment !== undefined) {\n lines.push(\"Overall assessment\", \"\");\n lines.push(`Risk: ${capitalize(result.assessment.risk)}`, \"\");\n if (result.assessment.summary !== undefined) {\n lines.push(normalizeParagraph(result.assessment.summary), \"\");\n }\n }\n\n const scoreNotes = result.observations.filter(isScoreReviewNote);\n const additionalObservations = result.observations.filter((note) => !isScoreReviewNote(note));\n\n if (scoreNotes.length > 0) {\n lines.push(\"Scores\", \"\");\n for (const note of scoreNotes) {\n lines.push(note.summary);\n }\n lines.push(\"\");\n }\n\n if (result.positives.length > 0) {\n lines.push(\"Positive signals\", \"\");\n for (const positive of result.positives) {\n lines.push(`- ${normalizeParagraph(positive.summary)}`);\n }\n lines.push(\"\");\n }\n\n if (additionalObservations.length > 0) {\n lines.push(\"Additional observations\", \"\");\n for (const observation of additionalObservations) {\n lines.push(`- ${normalizeParagraph(observation.summary)}`);\n }\n lines.push(\"\");\n }\n\n const primary = result.findings[0];\n if (primary !== undefined) {\n lines.push(\"Primary opportunity\", \"\");\n lines.push(`- ${primary.title.endsWith(\".\") ? primary.title : `${primary.title}.`}`, \"\");\n }\n\n if (result.opinion !== undefined) {\n lines.push(\"Overall opinion\", \"\", normalizeParagraph(result.opinion.summary), \"\");\n }\n\n lines.push(\"Scan complete\", \"\");\n if (result.target.filesScanned !== undefined) {\n lines.push(`Files scanned: ${result.target.filesScanned}`);\n }\n lines.push(`Findings: ${result.findings.length}`, \"\");\n\n for (const finding of result.findings) {\n lines.push(`[${finding.severity}] ${finding.title}`);\n const firstEvidence = finding.evidence.find((item) => item.location?.file !== undefined);\n if (firstEvidence?.location?.file !== undefined) {\n lines.push(formatEvidenceLocation(firstEvidence));\n }\n lines.push(\"\");\n lines.push(`Category: ${finding.category}`);\n lines.push(`Confidence: ${finding.confidence}`, \"\");\n lines.push(\"Summary\", \"\", finding.summary, \"\");\n\n if (finding.whyItMatters !== undefined) {\n lines.push(\"Why it matters\", \"\", finding.whyItMatters, \"\");\n }\n\n if (finding.impact !== undefined) {\n lines.push(\"Impact\", \"\", finding.impact, \"\");\n }\n\n if (finding.evidence.length > 0) {\n lines.push(\"Evidence\", \"\");\n for (const evidence of finding.evidence) {\n lines.push(...formatEvidenceLines(evidence));\n }\n lines.push(\"\");\n }\n\n if (finding.recommendation !== undefined) {\n lines.push(\"Recommendation\", \"\", normalizeParagraph(finding.recommendation), \"\");\n }\n }\n\n this.write(`${lines.join(\"\\n\").trimEnd()}\\n`);\n }\n}\n\nfunction createRuleContext(\n repoPath: string,\n summary: Summary,\n cache: Map<string, unknown>,\n collector: ReviewCollector,\n registry: RuleRegistry,\n): RuleContext {\n const absoluteRepoPath = resolve(repoPath);\n\n return {\n repoPath: absoluteRepoPath,\n summary,\n cache,\n relpath(path: string): string {\n return relative(absoluteRepoPath, isAbsolute(path) ? path : resolve(absoluteRepoPath, path));\n },\n glob(pattern: string): Promise<string[]> {\n return findMatchingPaths(absoluteRepoPath, pattern, false);\n },\n rglob(pattern: string): Promise<string[]> {\n return findMatchingPaths(absoluteRepoPath, pattern, true);\n },\n observe(observation: ObservationInit): void {\n assertObservationInit(observation, \"ctx.observe\", registry);\n collector.observations.push(observation);\n },\n finding(finding: FindingInput): void {\n assertFindingInput(finding, \"ctx.finding\");\n collector.findings.push({\n finding: normalizeFindingInput(finding, collector.findings.length),\n deduplicate: finding.deduplicate !== false,\n });\n },\n review: {\n assessment(assessment: ReviewAssessment): void {\n assertAssessment(assessment);\n collector.assessment = assessment;\n },\n positive(note: ReviewNoteInput): void {\n assertReviewNote(note, \"ctx.review.positive\");\n collector.positives.push(normalizeReviewNote(note));\n },\n observe(note: ReviewNoteInput): void {\n assertReviewNote(note, \"ctx.review.observe\");\n collector.reviewObservations.push(normalizeReviewNote(note));\n },\n score(score: ReviewScore): void {\n assertReviewScore(score);\n collector.scores.push(score);\n },\n opinion(opinion: ReviewOpinion): void {\n assertOpinion(opinion);\n collector.opinion = opinion;\n },\n },\n };\n}\n\nasync function findMatchingPaths(\n repoPath: string,\n pattern: string,\n recursive: boolean,\n): Promise<string[]> {\n const matcher = globPatternToRegExp(pattern);\n const paths = recursive ? await walk(repoPath) : await listFiles(repoPath);\n\n return paths\n .map((path) => relative(repoPath, path))\n .filter((path) => {\n const posixPath = toPosixPath(path);\n const candidate = recursive && !pattern.includes(\"/\") ? basename(posixPath) : posixPath;\n return matcher.test(candidate);\n })\n .sort(compareStrings);\n}\n\nasync function listFiles(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n return entries.filter((entry) => entry.isFile()).map((entry) => resolve(directory, entry.name));\n}\n\nasync function walk(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const paths: string[] = [];\n\n for (const entry of entries) {\n const path = resolve(directory, entry.name);\n\n if (entry.isDirectory()) {\n paths.push(...(await walk(path)));\n } else if (entry.isFile()) {\n paths.push(path);\n }\n }\n\n return paths;\n}\n\nfunction globPatternToRegExp(pattern: string): RegExp {\n const source = toPosixPath(pattern)\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"\\0\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\?/g, \"[^/]\")\n .replace(/\\0/g, \".*\");\n\n return new RegExp(`^${source}$`);\n}\n\ninterface ReviewCollector {\n observations: ObservationInit[];\n findings: CollectedFinding[];\n assessment?: ReviewAssessment;\n positives: ReviewNote[];\n reviewObservations: ReviewNote[];\n scores: ReviewScore[];\n opinion?: ReviewOpinion;\n}\n\ninterface CollectedFinding {\n finding: ReviewFinding;\n deduplicate: boolean;\n}\n\nfunction createReviewCollector(): ReviewCollector {\n return {\n observations: [],\n findings: [],\n positives: [],\n reviewObservations: [],\n scores: [],\n };\n}\n\nfunction buildReviewResult(input: {\n adversary: ReviewResult[\"adversary\"];\n repository: string;\n filesScanned?: number;\n collector: ReviewCollector;\n policy: ReviewPolicy;\n registry: RuleRegistry;\n includeSuppressed?: boolean;\n includeRawObservations?: boolean;\n timing?: ReviewResult[\"timing\"];\n}): ReviewResult {\n const thresholds = input.policy.confidenceThresholds ?? DEFAULT_CONFIDENCE_THRESHOLDS;\n const synthesis = synthesizeObservationFindings(\n input.collector.observations,\n thresholds,\n input.registry,\n );\n const allFindings = deduplicateFindings([\n ...synthesis.findings.map((finding) => ({ finding, deduplicate: true })),\n ...input.collector.findings,\n ]).map((finding) => calibrateFindingSeverity(finding, input.policy));\n const ranked = rankFindings(allFindings);\n const minimumConfidence = input.policy.minimumConfidence ?? Confidence.Medium;\n const includeInformational = input.policy.includeInformational ?? false;\n const maximumFindings = input.policy.maximumFindings ?? Number.POSITIVE_INFINITY;\n const eligible: ReviewFinding[] = [];\n const suppressedFindings: ReviewFinding[] = [];\n\n for (const finding of ranked) {\n const suppressed =\n confidenceWeight(finding.confidence) < confidenceWeight(minimumConfidence) ||\n (!includeInformational && finding.severity === Severity.Info) ||\n eligible.length >= maximumFindings;\n\n if (suppressed) {\n suppressedFindings.push(finding);\n } else {\n eligible.push(finding);\n }\n }\n\n const positives = selectPositiveSignals(input.collector.positives);\n const reviewObservations = deduplicateReviewObservations(\n [\n ...input.collector.reviewObservations,\n ...deduplicateScores(input.collector.scores).map(scoreToReviewNote),\n ],\n positives,\n );\n\n return omitUndefined({\n adversary: input.adversary,\n target: omitUndefined({\n repository: input.repository,\n filesScanned: input.filesScanned,\n }),\n assessment: input.collector.assessment ?? synthesizeAssessment(eligible, positives),\n positives,\n observations: reviewObservations,\n findings: eligible,\n opinion: input.collector.opinion ?? synthesizeOpinion(eligible),\n suppressed: {\n observations: synthesis.suppressedObservations,\n findings: suppressedFindings.length,\n },\n timing: input.timing,\n suppressedFindings: input.includeSuppressed ? suppressedFindings : undefined,\n rawObservations: input.includeRawObservations ? input.collector.observations : undefined,\n }) as ReviewResult;\n}\n\ninterface ObservationSynthesisResult {\n findings: ReviewFinding[];\n suppressedObservations: number;\n}\n\nfunction synthesizeObservationFindings(\n observations: ObservationInit[],\n thresholds: ConfidenceThresholds,\n registry: RuleRegistry,\n): ObservationSynthesisResult {\n const grouped = new Map<string, ObservationInit[]>();\n const seen = new Set<string>();\n let suppressedObservations = 0;\n\n for (const observation of observations) {\n const rule = registry.lookup(observation.ruleId);\n const groupKey = observation.groupKey ?? defaultObservationGroupKey(observation, rule);\n const dedupeKey = stableStringify({ groupKey, observation });\n if (observation.deduplicate !== false && seen.has(dedupeKey)) {\n suppressedObservations += 1;\n continue;\n }\n seen.add(dedupeKey);\n grouped.set(groupKey, [...(grouped.get(groupKey) ?? []), observation]);\n }\n\n const findings = [...grouped.entries()].map(([groupKey, group]) => {\n const first = group[0];\n if (first === undefined) {\n throw new Error(\"Cannot synthesize finding from an empty observation group.\");\n }\n\n const rule = registry.lookup(first.ruleId);\n const synthesis = rule?.aggregate?.(group) ?? {};\n const synthesisSource = rule?.aggregate === undefined ? \"generic\" : \"rule\";\n log.debug(\n `review synthesis ruleId=${first.ruleId} groupKey=${groupKey} observations=${group.length} selected=${synthesisSource} fallback=${synthesisSource === \"generic\"}`,\n );\n\n const evidence = deduplicateEvidence(synthesis.evidence ?? group.map(observationToEvidence));\n const recommendation =\n synthesis.recommendation === undefined\n ? synthesizeRecommendation(group)\n : normalizeParagraph(synthesis.recommendation);\n const confidence = aggregateConfidence(\n group.map((observation) =>\n normalizeConfidence(\n observation.confidence ?? rule?.defaultConfidence ?? Confidence.Medium,\n thresholds,\n ),\n ),\n first.confidenceAggregation ?? \"maximum\",\n );\n const severity = aggregateSeverity(\n group.map((observation) => observation.severity ?? rule?.defaultSeverity ?? Severity.Info),\n first.severityAggregation ?? \"highest\",\n );\n\n const finding: ReviewFinding = {\n id: synthesis.id ?? stableId(`${first.ruleId}:${groupKey}`),\n ruleId: synthesis.ruleId ?? first.ruleId,\n groupKey: synthesis.groupKey ?? groupKey,\n title:\n synthesis.title ??\n synthesizeObservationTitle(first.title, group.length, first.groupedTitle),\n category: synthesis.category ?? first.category ?? rule?.category ?? \"general\",\n severity: synthesis.severity ?? severity,\n confidence:\n synthesis.confidence ??\n (rule?.defaultConfidence === undefined\n ? confidence\n : normalizeConfidence(rule.defaultConfidence, thresholds)),\n summary: synthesis.summary ?? summarizeObservationGroup(group),\n whyItMatters: synthesis.whyItMatters ?? first.whyItMatters,\n impact: synthesis.impact ?? first.impact,\n evidence,\n recommendation: recommendation.length > 0 ? recommendation : undefined,\n remediation: synthesis.remediation ?? first.remediation,\n tags: synthesis.tags ?? uniqueStrings(group.flatMap((observation) => observation.tags ?? [])),\n metadata: synthesis.metadata ?? first.metadata,\n };\n assertFindingInput(finding, `adversary aggregate rule \"${first.ruleId}\"`);\n return finding;\n });\n return { findings, suppressedObservations };\n}\n\nfunction normalizeFindingInput(input: FindingInput, occurrence = 0): ReviewFinding {\n return omitUndefined({\n id:\n input.id ??\n stableId(\n `${input.ruleId ?? input.title}:${input.groupKey ?? input.category}${\n input.deduplicate === false ? `:${occurrence}` : \"\"\n }`,\n ),\n ruleId: input.ruleId,\n groupKey: input.groupKey,\n title: input.title,\n category: input.category,\n severity: input.severity,\n confidence: normalizeConfidence(input.confidence),\n summary: input.summary,\n whyItMatters: input.whyItMatters,\n impact: input.impact,\n evidence: deduplicateEvidence(input.evidence),\n recommendation:\n input.recommendation === undefined ? undefined : normalizeParagraph(input.recommendation),\n remediation: input.remediation,\n tags: input.tags === undefined ? undefined : uniqueStrings(input.tags),\n metadata: input.metadata,\n }) as ReviewFinding;\n}\n\nfunction deduplicateFindings(findings: CollectedFinding[]): ReviewFinding[] {\n const seen = new Set<string>();\n const result: ReviewFinding[] = [];\n\n for (const collected of findings) {\n const { finding } = collected;\n if (!collected.deduplicate) {\n result.push({ ...finding, evidence: deduplicateEvidence(finding.evidence) });\n continue;\n }\n const key = finding.groupKey ?? finding.id;\n if (seen.has(key)) {\n const existing = result.find((item) => (item.groupKey ?? item.id) === key);\n if (existing !== undefined) {\n existing.evidence = deduplicateEvidence([...existing.evidence, ...finding.evidence]);\n existing.tags = uniqueStrings([...(existing.tags ?? []), ...(finding.tags ?? [])]);\n }\n continue;\n }\n seen.add(key);\n result.push({ ...finding, evidence: deduplicateEvidence(finding.evidence) });\n }\n\n return result;\n}\n\nfunction deduplicateEvidence(evidence: ReadonlyArray<EvidenceInput | Evidence>): Evidence[] {\n const seen = new Set<string>();\n const result: Evidence[] = [];\n\n for (const item of evidence) {\n const normalized = normalizeEvidence(item);\n const key = stableStringify(normalized);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(normalized);\n }\n }\n\n return result.sort((left, right) => {\n const fileComparison = compareStrings(left.location?.file ?? \"\", right.location?.file ?? \"\");\n if (fileComparison !== 0) {\n return fileComparison;\n }\n const lineComparison = compareNumbers(left.location?.line, right.location?.line);\n if (lineComparison !== 0) {\n return lineComparison;\n }\n return compareStrings(left.message ?? \"\", right.message ?? \"\");\n });\n}\n\nfunction normalizeEvidence(input: EvidenceInput | Evidence): Evidence {\n const legacy = input as EvidenceInput;\n const hasLocation =\n legacy.location !== undefined ||\n legacy.file !== undefined ||\n legacy.line !== undefined ||\n legacy.endLine !== undefined;\n const location = hasLocation\n ? omitUndefined({\n file: legacy.location?.file ?? legacy.file,\n line: legacy.location?.line ?? legacy.line,\n endLine: legacy.location?.endLine ?? legacy.endLine,\n })\n : undefined;\n return omitUndefined({\n location,\n label: input.label,\n message: input.message,\n snippet: input.snippet,\n data: input.data ?? legacy.metadata,\n });\n}\n\nfunction normalizeReviewNote(note: ReviewNoteInput): ReviewNote {\n return omitUndefined({\n ...note,\n evidence: note.evidence === undefined ? undefined : deduplicateEvidence(note.evidence),\n }) as ReviewNote;\n}\n\nfunction deduplicateNotes(notes: ReviewNote[]): ReviewNote[] {\n const seen = new Set<string>();\n const result: ReviewNote[] = [];\n\n for (const note of notes) {\n const normalized = {\n ...note,\n evidence: note.evidence === undefined ? undefined : deduplicateEvidence(note.evidence),\n };\n const key = note.key;\n if (!seen.has(key)) {\n seen.add(key);\n result.push(normalized);\n }\n }\n\n return result.sort((left, right) => compareStrings(left.key, right.key));\n}\n\nfunction selectPositiveSignals(notes: ReviewNote[]): ReviewNote[] {\n const selected: ReviewNote[] = [];\n const seen = new Set<string>();\n\n // Registration order expresses the review author's priority. Two strong signals\n // provide useful context without diluting the findings.\n for (const note of notes) {\n if (!seen.has(note.key)) {\n seen.add(note.key);\n selected.push(note);\n }\n if (selected.length === 2) {\n break;\n }\n }\n\n return deduplicateNotes(selected);\n}\n\nfunction deduplicateReviewObservations(\n observations: ReviewNote[],\n positives: ReviewNote[],\n): ReviewNote[] {\n const deduped = deduplicateNotes(observations);\n\n return deduped.filter((item) => {\n return !positives.some((positive) => notesDescribeSameFact(positive, item));\n });\n}\n\nfunction notesDescribeSameFact(positive: ReviewNote, observation: ReviewNote): boolean {\n if (positive.key === observation.key) {\n return true;\n }\n\n const positiveText = normalizeSemanticText(`${positive.key} ${positive.summary}`);\n const observationText = normalizeSemanticText(`${observation.key} ${observation.summary}`);\n return positiveText.length > 0 && positiveText === observationText;\n}\n\nfunction synthesizeAssessment(\n findings: ReviewFinding[],\n positives: ReviewNote[] = [],\n): ReviewAssessment {\n const strength = assessmentStrength(positives[0]);\n\n if (findings.length === 0) {\n return {\n risk: \"none\",\n summary: joinSentences(\n strength,\n \"No material concerns were identified in the reviewed repository.\",\n ),\n };\n }\n\n const risk = highestRisk(findings);\n const primary = findings[0];\n const primaryConcern =\n primary === undefined ? \"the highest-ranked finding\" : assessmentConcern(primary);\n\n if (findings.length === 1) {\n return {\n risk,\n summary: joinSentences(\n strength,\n `The only material concern identified is ${primaryConcern}.`,\n ),\n };\n }\n\n return {\n risk,\n summary: joinSentences(\n strength,\n `${numberWord(findings.length)} material concerns were identified. The highest-value improvement is ${primaryConcern}.`,\n ),\n };\n}\n\nfunction assessmentStrength(positive: ReviewNote | undefined): string | undefined {\n if (positive === undefined) {\n return undefined;\n }\n\n const summary = normalizeParagraph(positive.summary);\n if (/^uses\\b/i.test(summary)) {\n return `The repository ${lowercaseFirst(summary)}`;\n }\n return summary;\n}\n\nfunction assessmentConcern(finding: ReviewFinding): string {\n const summary = normalizeParagraph(finding.summary).split(/(?<=[.!?])\\s+/, 1)[0];\n return concernClause(\n lowercaseFirst(trimTrailingSentencePunctuation(summary ?? findingConcern(finding))),\n );\n}\n\nfunction concernClause(concern: string): string {\n const isClause =\n /\\b(?:allows|are|builds|can|contains|copies|could|did|do|does|exposes|has|have|includes|installs|is|lacks|may|might|must|reads|references|relies|requires|runs|uses|was|were|writes)\\b/i.test(\n concern,\n );\n if (!isClause) {\n return concern;\n }\n\n const hasDeterminer = /^(?:a|an|any|each|its|no|one|some|the|their|these|this|those)\\b/i.test(\n concern,\n );\n return `that ${hasDeterminer ? concern : `the ${concern}`}`;\n}\n\nfunction joinSentences(...sentences: Array<string | undefined>): string {\n return sentences.filter(isNonEmptyString).join(\" \");\n}\n\nfunction synthesizeOpinion(findings: ReviewFinding[]): ReviewOpinion | undefined {\n if (findings.length === 0) {\n return {\n ship: true,\n summary: \"I would ship this as-is.\",\n };\n }\n\n const highestSeverity = highestFindingSeverity(findings);\n const ship = severityWeight(highestSeverity) < severityWeight(Severity.High);\n\n if (findings.length > 1) {\n return {\n ship,\n summary: \"I would address the remaining findings before production.\",\n };\n }\n\n const finding = findings[0];\n const improvement = finding === undefined ? \"Addressing the finding\" : improvementPhrase(finding);\n return {\n ship,\n summary: ship\n ? `I would ship this as-is. ${improvement} is the only improvement I would recommend before production.`\n : `${improvement} is the most important improvement to address before production.`,\n };\n}\n\nfunction deduplicateScores(scores: ReviewScore[]): ReviewScore[] {\n const seen = new Set<string>();\n const result: ReviewScore[] = [];\n\n for (const score of scores) {\n if (!seen.has(score.key)) {\n seen.add(score.key);\n result.push(score);\n }\n }\n\n return result.sort((left, right) => compareStrings(left.key, right.key));\n}\n\nfunction scoreToReviewNote(score: ReviewScore): ReviewNote {\n return {\n key: `score.${score.key}`,\n summary: formatScore(score),\n metadata: {\n kind: \"score\",\n score: omitUndefined({\n key: score.key,\n label: score.label,\n score: score.score,\n max: score.max,\n summary: score.summary,\n }),\n },\n };\n}\n\nfunction isScoreReviewNote(note: ReviewNote): boolean {\n return note.metadata?.kind === \"score\" && isRecord(note.metadata.score);\n}\n\nfunction observationToEvidence(observation: ObservationInit): Evidence {\n const data = isRecord(observation.evidence)\n ? observation.evidence\n : observation.evidence === undefined\n ? undefined\n : { evidence: observation.evidence };\n const message = isRecord(observation.evidence)\n ? structuredEvidenceMessage(observation.evidence)\n : stringFromUnknown(observation.evidence);\n const snippet = isRecord(observation.evidence)\n ? (stringFromUnknown(observation.evidence.snippet) ??\n stringFromUnknown(observation.evidence.instruction))\n : observation.location?.snippet;\n\n return omitUndefined({\n location: normalizeEvidence(observation.location ?? {}).location,\n label: observation.location?.label ?? message,\n message: observation.location?.message ?? message,\n snippet,\n data,\n });\n}\n\nfunction structuredEvidenceMessage(evidence: Record<string, unknown>): string | undefined {\n const explicitMessage = stringFromUnknown(evidence.message);\n if (explicitMessage !== undefined) {\n return explicitMessage;\n }\n\n const label = stringFromUnknown(evidence.label) ?? stringFromUnknown(evidence.name);\n if (label !== undefined) {\n return label;\n }\n\n return stringFromUnknown(evidence.summary) ?? stringFromUnknown(evidence.instruction);\n}\n\nfunction synthesizeObservationTitle(\n title: ObservationTitle,\n count: number,\n groupedTitle: string | undefined,\n): string {\n if (typeof title === \"string\") {\n return count > 1 && groupedTitle !== undefined ? groupedTitle : title;\n }\n return count > 1 ? title.plural : title.singular;\n}\n\nfunction summarizeObservationGroup(group: ObservationInit[]): string {\n const first = group[0];\n if (first === undefined) {\n throw new Error(\"Cannot summarize an empty observation group.\");\n }\n\n if (first.summary !== undefined) {\n if (typeof first.summary === \"string\") {\n return normalizeParagraph(renderObservationTemplate(first.summary, group));\n }\n const template = group.length > 1 ? first.summary.grouped : first.summary.singular;\n if (template !== undefined) {\n return normalizeParagraph(renderObservationTemplate(template, group));\n }\n }\n\n const recommendation =\n typeof first.recommendation === \"string\" ? undefined : first.recommendation?.summary;\n if (group.length === 1) {\n return recommendation ?? synthesizeObservationTitle(first.title, 1, first.groupedTitle);\n }\n return `${group.length} related observations were reported for ${first.subject}.`;\n}\n\nfunction synthesizeRecommendation(group: ObservationInit[]): string {\n const recommendations = uniqueStrings(\n group.flatMap((observation) => {\n if (typeof observation.recommendation === \"string\") {\n return [observation.recommendation];\n }\n if (observation.recommendation !== undefined) {\n return [\n joinRecommendation(\n observation.recommendation.summary,\n observation.recommendation.details,\n ),\n ];\n }\n return [];\n }),\n );\n\n return recommendations.map(normalizeParagraph).join(\"\\n\\n\");\n}\n\nfunction joinRecommendation(summary: string, details: string | undefined): string {\n if (!isNonEmptyString(details)) {\n return summary;\n }\n\n const compactSummary = trimTrailingSentencePunctuation(summary);\n const compactDetails = trimTrailingSentencePunctuation(details);\n\n if (/^use\\s+/i.test(compactDetails)) {\n return `${compactSummary} and ${lowercaseFirst(compactDetails)}.`;\n }\n\n return `${compactSummary}. ${compactDetails}.`;\n}\n\nfunction defaultObservationGroupKey(\n observation: ObservationInit,\n rule: RuleDefinition | undefined,\n): string {\n const groupBy = observation.groupBy ?? rule?.groupBy;\n if (groupBy !== undefined && groupBy.length > 0) {\n return groupBy\n .map((field) => `${field}:${stringFromUnknown(observationValue(observation, field)) ?? \"\"}`)\n .join(\"|\");\n }\n return `${observation.ruleId}:${observation.subject}:${observation.category ?? rule?.category ?? \"general\"}`;\n}\n\nfunction renderObservationTemplate(template: string, group: ObservationInit[]): string {\n const values = observationTemplateValues(group);\n return template.replace(/\\{([a-zA-Z][a-zA-Z0-9_]*)\\}/g, (match, key: string) => {\n return values[key] ?? match;\n });\n}\n\nfunction observationTemplateValues(group: ObservationInit[]): Record<string, string> {\n const first = group[0];\n const subjects = uniqueStrings(group.map((observation) => observation.subject));\n const locations = uniqueStrings(group.map(formatObservationLocation).filter(isNonEmptyString));\n\n return omitUndefined({\n count: numberWord(group.length),\n location: locations[0],\n locations: joinHumanList(locations),\n subject: first?.subject,\n subjects: joinHumanList(subjects),\n });\n}\n\nfunction observationValue(observation: ObservationInit, field: string): unknown {\n if (field.includes(\".\")) {\n return field.split(\".\").reduce<unknown>((value, part) => {\n return isRecord(value) ? value[part] : undefined;\n }, observation);\n }\n return (observation as unknown as Record<string, unknown>)[field];\n}\n\nfunction formatObservationLocation(observation: ObservationInit): string | undefined {\n if (observation.location?.file === undefined) {\n return undefined;\n }\n if (observation.location.line === undefined) {\n return observation.location.file;\n }\n return `${observation.location.file}:${observation.location.line}`;\n}\n\nfunction joinHumanList(values: string[]): string {\n if (values.length <= 2) {\n return values.join(\" and \");\n }\n return `${values.slice(0, -1).join(\", \")}, and ${values.at(-1)}`;\n}\n\nfunction highestRisk(findings: ReviewFinding[]): ReviewAssessment[\"risk\"] {\n const severity = highestFindingSeverity(findings);\n if (severity === Severity.Info) {\n return \"none\";\n }\n return severity;\n}\n\nfunction highestFindingSeverity(findings: ReviewFinding[]): Severity {\n return aggregateSeverity(\n findings.map((finding) => finding.severity),\n \"highest\",\n );\n}\n\nfunction findingConcern(finding: ReviewFinding): string {\n return lowercaseFirst(trimTrailingSentencePunctuation(finding.title));\n}\n\nfunction improvementPhrase(finding: ReviewFinding): string {\n const recommendation = recommendationSubject(finding.recommendation);\n if (recommendation !== undefined) {\n return recommendation;\n }\n\n return `Addressing ${findingConcern(finding)}`;\n}\n\nfunction recommendationSubject(recommendation: string | undefined): string | undefined {\n if (recommendation === undefined) {\n return undefined;\n }\n\n const normalized = trimTrailingSentencePunctuation(normalizeParagraph(recommendation));\n const firstClause = normalized.split(/\\s+(?:and|when|where|with)\\s+/i)[0]?.trim();\n if (!isNonEmptyString(firstClause)) {\n return undefined;\n }\n\n return gerundPhrase(firstClause);\n}\n\nfunction gerundPhrase(phrase: string): string {\n const words = phrase.split(/\\s+/);\n const first = words[0];\n if (first === undefined) {\n return phrase;\n }\n\n return capitalize([toGerund(first), ...words.slice(1)].join(\" \"));\n}\n\nfunction toGerund(verb: string): string {\n const lower = verb.toLowerCase();\n const irregular: Record<string, string> = {\n pin: \"pinning\",\n run: \"running\",\n use: \"using\",\n };\n const known = irregular[lower];\n if (known !== undefined) {\n return known;\n }\n if (lower.endsWith(\"e\") && !lower.endsWith(\"ee\")) {\n return `${lower.slice(0, -1)}ing`;\n }\n return `${lower}ing`;\n}\n\nfunction normalizeSemanticText(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \" \")\n .split(/\\s+/)\n .filter((word) => word.length > 0 && !semanticStopWords.has(word))\n .join(\" \");\n}\n\nfunction trimTrailingWord(value: string | undefined, word: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const pattern = new RegExp(`\\\\s+${word}$`, \"i\");\n const trimmed = value.replace(pattern, \"\").trim();\n return trimmed.length > 0 ? trimmed : value;\n}\n\nfunction numberWord(value: number): string {\n return (\n {\n 1: \"One\",\n 2: \"Two\",\n 3: \"Three\",\n 4: \"Four\",\n 5: \"Five\",\n 6: \"Six\",\n 7: \"Seven\",\n 8: \"Eight\",\n 9: \"Nine\",\n 10: \"Ten\",\n }[value] ?? String(value)\n );\n}\n\nfunction calibrateFindingSeverity(finding: ReviewFinding, policy: ReviewPolicy): ReviewFinding {\n const override =\n policy.severityOverrides?.[finding.ruleId ?? \"\"] ??\n policy.severityOverrides?.[finding.groupKey ?? \"\"];\n\n return override === undefined ? finding : { ...finding, severity: override };\n}\n\nfunction scoreFinding(finding: ReviewFinding): number {\n const locationScore = Math.min(finding.evidence.length, 5) * 3;\n const remediationScore = finding.remediation?.complexity === \"trivial\" ? 3 : 0;\n return (\n severityWeight(finding.severity) * 10 +\n confidenceWeight(finding.confidence) * 12 +\n locationScore +\n remediationScore\n );\n}\n\nfunction severityWeight(severity: Severity): number {\n switch (severity) {\n case Severity.Critical:\n return 5;\n case Severity.High:\n return 4;\n case Severity.Medium:\n return 3;\n case Severity.Low:\n return 2;\n case Severity.Info:\n return 1;\n }\n}\n\nfunction confidenceWeight(confidence: Confidence): number {\n switch (confidence) {\n case Confidence.High:\n return 3;\n case Confidence.Medium:\n return 2;\n case Confidence.Low:\n return 1;\n }\n}\n\nfunction aggregateSeverity(values: Severity[], strategy: SeverityAggregation): Severity {\n const sorted = [...values].sort((left, right) => severityWeight(right) - severityWeight(left));\n if (strategy === \"lowest\") {\n return sorted.at(-1) ?? Severity.Info;\n }\n return sorted[0] ?? Severity.Info;\n}\n\nfunction aggregateConfidence(values: Confidence[], strategy: ConfidenceAggregation): Confidence {\n if (values.length === 0) {\n return Confidence.Low;\n }\n\n if (strategy === \"minimum\") {\n return (\n [...values].sort((left, right) => confidenceWeight(left) - confidenceWeight(right))[0] ??\n Confidence.Low\n );\n }\n\n if (strategy === \"average\") {\n const average =\n values.reduce((total, confidence) => total + confidenceNumericValue(confidence), 0) /\n values.length;\n return normalizeConfidence(average);\n }\n\n return (\n [...values].sort((left, right) => confidenceWeight(right) - confidenceWeight(left))[0] ??\n Confidence.Low\n );\n}\n\nfunction confidenceNumericValue(confidence: Confidence): number {\n switch (confidence) {\n case Confidence.High:\n return 0.95;\n case Confidence.Medium:\n return 0.72;\n case Confidence.Low:\n return 0.3;\n }\n}\n\nfunction stableId(value: string): string {\n let hash = 0;\n for (const character of value) {\n hash = (hash * 31 + character.charCodeAt(0)) >>> 0;\n }\n return `finding-${hash.toString(16).padStart(8, \"0\")}`;\n}\n\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n if (isRecord(value)) {\n return `{${Object.keys(value)\n .sort(compareStrings)\n .map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return [...new Set(values.filter(isNonEmptyString))].sort(compareStrings);\n}\n\nfunction assertObservationInit(\n value: ObservationInit,\n source: string,\n registry: RuleRegistry,\n): void {\n requireString(value.ruleId, `${source}.ruleId`);\n requireString(value.subject, `${source}.subject`);\n requireObservationTitle(value.title, `${source}.title`);\n const rule = registry.lookup(value.ruleId);\n if (value.category === undefined && rule?.category === undefined) {\n throw new Error(`${source}.category is required when rule.category is not defined.`);\n }\n optionalString(value.category, `${source}.category`);\n if (value.severity === undefined && rule?.defaultSeverity === undefined) {\n throw new Error(`${source}.severity is required when rule.defaultSeverity is not defined.`);\n }\n if (value.severity !== undefined && !isSeverity(value.severity)) {\n throw new Error(`${source}.severity must be one of info, low, medium, high, critical.`);\n }\n const ruleConfidence = rule?.defaultConfidence;\n if (value.confidence === undefined && ruleConfidence === undefined) {\n throw new Error(`${source}.confidence is required when rule.defaultConfidence is not defined.`);\n }\n if (value.confidence !== undefined) {\n normalizeConfidence(value.confidence);\n }\n optionalObservationSummary(value.summary, `${source}.summary`);\n optionalEvidence(value.location, `${source}.location`);\n optionalString(value.groupKey, `${source}.groupKey`);\n optionalStringArray(value.groupBy, `${source}.groupBy`);\n optionalStringArray(value.tags, `${source}.tags`);\n}\n\nfunction assertFindingInput(value: FindingInput, source: string): void {\n requireString(value.title, `${source}.title`);\n requireString(value.category, `${source}.category`);\n requireString(value.summary, `${source}.summary`);\n if (!isSeverity(value.severity)) {\n throw new Error(`${source}.severity must be one of info, low, medium, high, critical.`);\n }\n normalizeConfidence(value.confidence);\n if (!Array.isArray(value.evidence) || value.evidence.length === 0) {\n throw new Error(`${source}.evidence must contain at least one evidence item.`);\n }\n for (const [index, evidence] of value.evidence.entries()) {\n optionalEvidence(evidence, `${source}.evidence[${index}]`);\n }\n optionalString(value.id, `${source}.id`);\n optionalString(value.ruleId, `${source}.ruleId`);\n optionalString(value.groupKey, `${source}.groupKey`);\n optionalStringArray(value.tags, `${source}.tags`);\n optionalRemediation(value.remediation, `${source}.remediation`);\n}\n\nfunction assertReviewNote(value: ReviewNoteInput, source: string): void {\n requireString(value.key, `${source}.key`);\n requireString(value.summary, `${source}.summary`);\n if (value.evidence !== undefined) {\n for (const [index, evidence] of value.evidence.entries()) {\n optionalEvidence(evidence, `${source}.evidence[${index}]`);\n }\n }\n}\n\nfunction assertReviewScore(value: ReviewScore): void {\n requireString(value.key, \"ctx.review.score.key\");\n if (typeof value.score !== \"number\" || !Number.isFinite(value.score)) {\n throw new Error(\"ctx.review.score.score must be a finite number.\");\n }\n if (value.max !== undefined && (typeof value.max !== \"number\" || !Number.isFinite(value.max))) {\n throw new Error(\"ctx.review.score.max must be a finite number.\");\n }\n if (value.score < 0) {\n throw new Error(\"ctx.review.score.score must be greater than or equal to zero.\");\n }\n if (value.max !== undefined && (value.max <= 0 || value.score > value.max)) {\n throw new Error(\"ctx.review.score.max must be positive and no smaller than score.\");\n }\n optionalString(value.label, \"ctx.review.score.label\");\n optionalString(value.summary, \"ctx.review.score.summary\");\n}\n\nfunction assertAssessment(value: ReviewAssessment): void {\n if (![\"none\", \"low\", \"medium\", \"high\", \"critical\"].includes(value.risk)) {\n throw new Error(\"ctx.review.assessment.risk must be one of none, low, medium, high, critical.\");\n }\n optionalString(value.summary, \"ctx.review.assessment.summary\");\n}\n\nfunction assertOpinion(value: ReviewOpinion): void {\n requireString(value.summary, \"ctx.review.opinion.summary\");\n}\n\nfunction assertRuleDefinition(rule: RuleDefinition): void {\n requireString(rule.id, \"rule.id\");\n optionalString(rule.category, \"rule.category\");\n if (rule.defaultSeverity !== undefined && !isSeverity(rule.defaultSeverity)) {\n throw new Error(\"rule.defaultSeverity must be one of info, low, medium, high, critical.\");\n }\n if (rule.defaultConfidence !== undefined) {\n normalizeConfidence(rule.defaultConfidence);\n }\n optionalStringArray(rule.groupBy, \"rule.groupBy\");\n if (rule.aggregate !== undefined && typeof rule.aggregate !== \"function\") {\n throw new Error(\"rule.aggregate must be a function.\");\n }\n}\n\nfunction assertReviewPolicy(policy: ReviewPolicy, source: string): void {\n if (policy.minimumConfidence !== undefined && !isConfidence(policy.minimumConfidence)) {\n throw new Error(`${source}.minimumConfidence must be one of low, medium, high.`);\n }\n if (\n policy.maximumFindings !== undefined &&\n (!Number.isInteger(policy.maximumFindings) || policy.maximumFindings < 0)\n ) {\n throw new Error(`${source}.maximumFindings must be a non-negative integer.`);\n }\n if (policy.confidenceThresholds !== undefined) {\n const { medium, high } = policy.confidenceThresholds;\n if (medium < 0 || high > 1 || medium > high) {\n throw new Error(`${source}.confidenceThresholds must satisfy 0 <= medium <= high <= 1.`);\n }\n }\n for (const [ruleId, severity] of Object.entries(policy.severityOverrides ?? {})) {\n if (!isSeverity(severity)) {\n throw new Error(`${source}.severityOverrides[\"${ruleId}\"] is not a valid severity.`);\n }\n }\n}\n\nfunction optionalRemediation(value: Remediation | undefined, field: string): void {\n if (value === undefined) return;\n if (!isRecord(value)) throw new Error(`${field} must be an object.`);\n if (\n value.complexity !== undefined &&\n (typeof value.complexity !== \"string\" ||\n ![\"trivial\", \"small\", \"medium\", \"large\", \"architectural\"].includes(value.complexity))\n ) {\n throw new Error(`${field}.complexity is invalid.`);\n }\n}\n\nfunction requireObservationTitle(value: ObservationTitle, field: string): void {\n if (typeof value === \"string\") {\n requireString(value, field);\n return;\n }\n if (!isRecord(value)) {\n throw new Error(`${field} must be a string or { singular, plural }.`);\n }\n requireString(value.singular, `${field}.singular`);\n requireString(value.plural, `${field}.plural`);\n}\n\nfunction optionalObservationSummary(value: ObservationSummary | undefined, field: string): void {\n if (value === undefined) {\n return;\n }\n if (typeof value === \"string\") {\n optionalString(value, field);\n return;\n }\n if (!isRecord(value)) {\n throw new Error(`${field} must be a string or { singular, grouped }.`);\n }\n optionalString(value.singular, `${field}.singular`);\n optionalString(value.grouped, `${field}.grouped`);\n}\n\nfunction optionalEvidence(value: EvidenceInput | Evidence | undefined, field: string): void {\n if (value === undefined) {\n return;\n }\n if (!isRecord(value)) {\n throw new Error(`${field} must be an object.`);\n }\n const input = value as EvidenceInput;\n optionalString(input.file, `${field}.file`);\n optionalPositiveInteger(input.line, `${field}.line`);\n optionalPositiveInteger(input.endLine, `${field}.endLine`);\n optionalString(value.message, `${field}.message`);\n optionalString(value.snippet, `${field}.snippet`);\n optionalString(value.label, `${field}.label`);\n if (value.location !== undefined) {\n if (!isRecord(value.location)) {\n throw new Error(`${field}.location must be an object.`);\n }\n optionalString(value.location.file, `${field}.location.file`);\n optionalPositiveInteger(value.location.line, `${field}.location.line`);\n optionalPositiveInteger(value.location.endLine, `${field}.location.endLine`);\n }\n const line = value.location?.line ?? input.line;\n const endLine = value.location?.endLine ?? input.endLine;\n if (endLine !== undefined && line === undefined) {\n throw new Error(`${field}.endLine requires line.`);\n }\n if (endLine !== undefined && line !== undefined && endLine < line) {\n throw new Error(`${field}.endLine must not precede line.`);\n }\n if (value.data !== undefined && !isRecord(value.data)) {\n throw new Error(`${field}.data must be an object.`);\n }\n if (input.metadata !== undefined && !isRecord(input.metadata)) {\n throw new Error(`${field}.metadata must be an object.`);\n }\n}\n\nfunction writeLog(level: \"debug\" | \"info\" | \"warn\" | \"error\", message: unknown): void {\n process.stderr.write(`[adversary] ${level}: ${String(message)}\\n`);\n}\n\nfunction parseBooleanEnv(value: string | undefined): boolean | undefined {\n if (value === undefined || value.length === 0) {\n return undefined;\n }\n return [\"1\", \"true\", \"TRUE\", \"yes\", \"YES\"].includes(value);\n}\n\nfunction isVerbose(): boolean {\n return verboseValues.has(process.env.ADVERSARY_VERBOSE ?? \"\");\n}\n\nfunction compareStrings(left: string, right: string): number {\n return left.localeCompare(right);\n}\n\nfunction compareNumbers(left: number | undefined, right: number | undefined): number {\n return (left ?? Number.MAX_SAFE_INTEGER) - (right ?? Number.MAX_SAFE_INTEGER);\n}\n\nfunction toPosixPath(path: string): string {\n return path.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction basename(path: string): string {\n return path.split(\"/\").at(-1) ?? path;\n}\n\nfunction requireString(value: unknown, field: string): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`${field} must be a non-empty string.`);\n }\n}\n\nfunction optionalString(value: unknown, field: string): void {\n if (value !== undefined && typeof value !== \"string\") {\n throw new Error(`${field} must be a string.`);\n }\n}\n\nfunction optionalStringArray(value: unknown, field: string): void {\n if (\n value !== undefined &&\n (!Array.isArray(value) || value.some((item) => typeof item !== \"string\"))\n ) {\n throw new Error(`${field} must be an array of strings.`);\n }\n}\n\nfunction optionalPositiveInteger(value: unknown, field: string): void {\n if (value !== undefined && (!Number.isInteger(value) || Number(value) < 1)) {\n throw new Error(`${field} must be a positive integer.`);\n }\n}\n\nfunction isConfidence(value: unknown): value is Confidence {\n return value === Confidence.Low || value === Confidence.Medium || value === Confidence.High;\n}\n\nfunction isSeverity(value: unknown): value is Severity {\n return (\n value === Severity.Info ||\n value === Severity.Low ||\n value === Severity.Medium ||\n value === Severity.High ||\n value === Severity.Critical\n );\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringFromUnknown(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction capitalize(value: string): string {\n return `${value.slice(0, 1).toUpperCase()}${value.slice(1)}`;\n}\n\nconst semanticStopWords = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"from\",\n \"in\",\n \"is\",\n \"of\",\n \"the\",\n \"to\",\n \"uses\",\n \"using\",\n]);\n\nfunction formatEvidenceLocation(evidence: Evidence): string {\n const file = evidence.location?.file;\n const line = evidence.location?.line;\n const endLine = evidence.location?.endLine;\n\n if (file === undefined) {\n return \"\";\n }\n if (line !== undefined && endLine !== undefined) {\n return `${file}:${line}-${endLine}`;\n }\n if (line !== undefined) {\n return `${file}:${line}`;\n }\n return file;\n}\n\nfunction formatEvidenceLines(evidence: Evidence): string[] {\n const location = formatEvidenceLocation(evidence);\n const label = evidence.label ?? evidence.message;\n const firstLine =\n location.length > 0 && label !== undefined\n ? `- ${location} — ${label}`\n : `- ${location.length > 0 ? location : (label ?? \"Evidence\")}`;\n const lines = [firstLine];\n\n if (evidence.snippet !== undefined) {\n lines.push(` ${evidence.snippet}`);\n }\n\n return lines;\n}\n\nfunction formatScore(score: ReviewScore): string {\n const label = score.label ?? score.key;\n const max = score.max ?? 10;\n const summary = score.summary === undefined ? \"\" : ` - ${normalizeParagraph(score.summary)}`;\n return `${label}: ${score.score} / ${max}${summary}`;\n}\n\nfunction normalizeParagraph(value: string): string {\n return value\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\" \");\n}\n\nfunction trimTrailingSentencePunctuation(value: string): string {\n return value.trim().replace(/[.!?]+$/g, \"\");\n}\n\nfunction lowercaseFirst(value: string): string {\n return `${value.slice(0, 1).toLowerCase()}${value.slice(1)}`;\n}\n\nfunction omitUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entryValue]) => entryValue !== undefined),\n ) as T;\n}\n"]}
@@ -0,0 +1,49 @@
1
+ export declare const ADVERSARY_MANIFEST_FILE_NAME = "adversary.yaml";
2
+ export declare const ADVERSARY_MANIFEST_MAX_BYTES: number;
3
+ export interface DetectionManifest {
4
+ files?: string[];
5
+ entrypoint?: string;
6
+ }
7
+ export interface TriggerManifest {
8
+ manual?: boolean;
9
+ files_changed?: string[];
10
+ }
11
+ export interface RuntimeManifest {
12
+ name?: "node" | "process";
13
+ image?: string;
14
+ version?: string;
15
+ command: string[];
16
+ }
17
+ export interface FilesystemPermissionsManifest {
18
+ read?: string[];
19
+ write?: string[];
20
+ }
21
+ export interface EnvironmentPermissionsManifest {
22
+ allow?: string[];
23
+ }
24
+ export interface PermissionsManifest {
25
+ filesystem?: FilesystemPermissionsManifest;
26
+ network?: boolean;
27
+ environment?: EnvironmentPermissionsManifest;
28
+ enforcement?: "advisory" | "required";
29
+ }
30
+ export interface FindingsManifest {
31
+ format?: "adversary.review.v1";
32
+ }
33
+ export interface AdversaryManifest {
34
+ name: string;
35
+ version?: string;
36
+ description?: string;
37
+ triggers?: TriggerManifest;
38
+ detection?: DetectionManifest;
39
+ runtime: RuntimeManifest;
40
+ permissions?: PermissionsManifest;
41
+ findings?: FindingsManifest;
42
+ }
43
+ export declare class ManifestValidationError extends Error {
44
+ readonly issues: string[];
45
+ constructor(message: string, issues?: string[]);
46
+ }
47
+ export declare function parseAdversaryManifest(source: string | Uint8Array): AdversaryManifest;
48
+ export declare function validateAdversaryManifest(value: unknown): AdversaryManifest;
49
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,4BAA4B,mBAAmB,CAAC;AAC7D,eAAO,MAAM,4BAA4B,QAAU,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,6BAA6B,CAAC;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,8BAA8B,CAAC;IAC7C,WAAW,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CACvC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAMD,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO;CAKnD;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,iBAAiB,CAiCrF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAO3E"}
@@ -0,0 +1,89 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { Ajv2020 } from "ajv/dist/2020.js";
3
+ import { parseAllDocuments } from "yaml";
4
+ export const ADVERSARY_MANIFEST_FILE_NAME = "adversary.yaml";
5
+ export const ADVERSARY_MANIFEST_MAX_BYTES = 1 << 20;
6
+ export class ManifestValidationError extends Error {
7
+ issues;
8
+ constructor(message, issues = []) {
9
+ super(message);
10
+ this.name = "ManifestValidationError";
11
+ this.issues = issues;
12
+ }
13
+ }
14
+ let manifestValidator;
15
+ export function parseAdversaryManifest(source) {
16
+ const text = typeof source === "string" ? source : new TextDecoder().decode(source);
17
+ const size = Buffer.byteLength(text, "utf8");
18
+ if (size > ADVERSARY_MANIFEST_MAX_BYTES) {
19
+ throw new ManifestValidationError(`adversary.yaml is too large: ${size} bytes exceeds ${ADVERSARY_MANIFEST_MAX_BYTES} bytes`);
20
+ }
21
+ const documents = parseAllDocuments(text, {
22
+ prettyErrors: true,
23
+ uniqueKeys: true,
24
+ });
25
+ if (documents.length !== 1) {
26
+ throw new ManifestValidationError("manifest must contain exactly one YAML document");
27
+ }
28
+ const document = documents[0];
29
+ if (document === undefined || document.contents === null) {
30
+ throw new ManifestValidationError("manifest is empty");
31
+ }
32
+ if (document.errors.length > 0) {
33
+ const issues = document.errors.map((error) => error.message);
34
+ throw new ManifestValidationError(`decode manifest YAML: ${issues.join("; ")}`, issues);
35
+ }
36
+ let value;
37
+ try {
38
+ value = document.toJS({ maxAliasCount: 0 });
39
+ }
40
+ catch (error) {
41
+ const issue = error instanceof Error ? error.message : String(error);
42
+ throw new ManifestValidationError(`decode manifest YAML: ${issue}`, [issue]);
43
+ }
44
+ return validateAdversaryManifest(value);
45
+ }
46
+ export function validateAdversaryManifest(value) {
47
+ const validator = getManifestValidator();
48
+ if (!validator(value)) {
49
+ const issues = (validator.errors ?? []).map(formatSchemaError);
50
+ throw new ManifestValidationError(`invalid adversary manifest: ${issues.join("; ")}`, issues);
51
+ }
52
+ return normalizeLegacyPermissions(value);
53
+ }
54
+ function getManifestValidator() {
55
+ if (manifestValidator !== undefined)
56
+ return manifestValidator;
57
+ const schema = JSON.parse(readFileSync(new URL("../schemas/adversary.manifest.v1.schema.json", import.meta.url), "utf8"));
58
+ manifestValidator = new Ajv2020({
59
+ allErrors: true,
60
+ strict: true,
61
+ }).compile(schema);
62
+ return manifestValidator;
63
+ }
64
+ function formatSchemaError(error) {
65
+ const path = `manifest${error.instancePath.replaceAll("/", ".")}`;
66
+ if (error.keyword === "pattern" && error.schemaPath === "#/$defs/portableProjectPath/pattern") {
67
+ return `${path} must be a portable project-relative path`;
68
+ }
69
+ if (error.keyword === "additionalProperties") {
70
+ return `${path} contains unknown field ${JSON.stringify(error.params.additionalProperty)}`;
71
+ }
72
+ if (error.keyword === "required") {
73
+ return `${path} is missing required field ${JSON.stringify(error.params.missingProperty)}`;
74
+ }
75
+ return `${path} ${error.message ?? `failed ${error.keyword} validation`}`;
76
+ }
77
+ function normalizeLegacyPermissions(manifest) {
78
+ if (manifest.permissions?.env === undefined)
79
+ return manifest;
80
+ const { env, ...permissions } = manifest.permissions;
81
+ return {
82
+ ...manifest,
83
+ permissions: {
84
+ ...permissions,
85
+ environment: { allow: env },
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { Ajv2020, type ErrorObject, type ValidateFunction } from \"ajv/dist/2020.js\";\nimport { parseAllDocuments } from \"yaml\";\n\nexport const ADVERSARY_MANIFEST_FILE_NAME = \"adversary.yaml\";\nexport const ADVERSARY_MANIFEST_MAX_BYTES = 1 << 20;\n\nexport interface DetectionManifest {\n files?: string[];\n entrypoint?: string;\n}\n\nexport interface TriggerManifest {\n manual?: boolean;\n files_changed?: string[];\n}\n\nexport interface RuntimeManifest {\n name?: \"node\" | \"process\";\n image?: string;\n version?: string;\n command: string[];\n}\n\nexport interface FilesystemPermissionsManifest {\n read?: string[];\n write?: string[];\n}\n\nexport interface EnvironmentPermissionsManifest {\n allow?: string[];\n}\n\nexport interface PermissionsManifest {\n filesystem?: FilesystemPermissionsManifest;\n network?: boolean;\n environment?: EnvironmentPermissionsManifest;\n enforcement?: \"advisory\" | \"required\";\n}\n\ninterface LegacyPermissionsManifest extends PermissionsManifest {\n env?: string[];\n}\n\nexport interface FindingsManifest {\n format?: \"adversary.review.v1\";\n}\n\nexport interface AdversaryManifest {\n name: string;\n version?: string;\n description?: string;\n triggers?: TriggerManifest;\n detection?: DetectionManifest;\n runtime: RuntimeManifest;\n permissions?: PermissionsManifest;\n findings?: FindingsManifest;\n}\n\ninterface ParsedAdversaryManifest extends Omit<AdversaryManifest, \"permissions\"> {\n permissions?: LegacyPermissionsManifest;\n}\n\nexport class ManifestValidationError extends Error {\n readonly issues: string[];\n\n constructor(message: string, issues: string[] = []) {\n super(message);\n this.name = \"ManifestValidationError\";\n this.issues = issues;\n }\n}\n\nlet manifestValidator: ValidateFunction<ParsedAdversaryManifest> | undefined;\n\nexport function parseAdversaryManifest(source: string | Uint8Array): AdversaryManifest {\n const text = typeof source === \"string\" ? source : new TextDecoder().decode(source);\n const size = Buffer.byteLength(text, \"utf8\");\n if (size > ADVERSARY_MANIFEST_MAX_BYTES) {\n throw new ManifestValidationError(\n `adversary.yaml is too large: ${size} bytes exceeds ${ADVERSARY_MANIFEST_MAX_BYTES} bytes`,\n );\n }\n\n const documents = parseAllDocuments(text, {\n prettyErrors: true,\n uniqueKeys: true,\n });\n if (documents.length !== 1) {\n throw new ManifestValidationError(\"manifest must contain exactly one YAML document\");\n }\n const document = documents[0];\n if (document === undefined || document.contents === null) {\n throw new ManifestValidationError(\"manifest is empty\");\n }\n if (document.errors.length > 0) {\n const issues = document.errors.map((error) => error.message);\n throw new ManifestValidationError(`decode manifest YAML: ${issues.join(\"; \")}`, issues);\n }\n\n let value: unknown;\n try {\n value = document.toJS({ maxAliasCount: 0 });\n } catch (error) {\n const issue = error instanceof Error ? error.message : String(error);\n throw new ManifestValidationError(`decode manifest YAML: ${issue}`, [issue]);\n }\n return validateAdversaryManifest(value);\n}\n\nexport function validateAdversaryManifest(value: unknown): AdversaryManifest {\n const validator = getManifestValidator();\n if (!validator(value)) {\n const issues = (validator.errors ?? []).map(formatSchemaError);\n throw new ManifestValidationError(`invalid adversary manifest: ${issues.join(\"; \")}`, issues);\n }\n return normalizeLegacyPermissions(value);\n}\n\nfunction getManifestValidator(): ValidateFunction<ParsedAdversaryManifest> {\n if (manifestValidator !== undefined) return manifestValidator;\n const schema = JSON.parse(\n readFileSync(new URL(\"../schemas/adversary.manifest.v1.schema.json\", import.meta.url), \"utf8\"),\n );\n manifestValidator = new Ajv2020({\n allErrors: true,\n strict: true,\n }).compile<ParsedAdversaryManifest>(schema);\n return manifestValidator;\n}\n\nfunction formatSchemaError(error: ErrorObject): string {\n const path = `manifest${error.instancePath.replaceAll(\"/\", \".\")}`;\n if (error.keyword === \"pattern\" && error.schemaPath === \"#/$defs/portableProjectPath/pattern\") {\n return `${path} must be a portable project-relative path`;\n }\n if (error.keyword === \"additionalProperties\") {\n return `${path} contains unknown field ${JSON.stringify(error.params.additionalProperty)}`;\n }\n if (error.keyword === \"required\") {\n return `${path} is missing required field ${JSON.stringify(error.params.missingProperty)}`;\n }\n return `${path} ${error.message ?? `failed ${error.keyword} validation`}`;\n}\n\nfunction normalizeLegacyPermissions(manifest: ParsedAdversaryManifest): AdversaryManifest {\n if (manifest.permissions?.env === undefined) return manifest;\n const { env, ...permissions } = manifest.permissions;\n return {\n ...manifest,\n permissions: {\n ...permissions,\n environment: { allow: env },\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adversarylabs/sdk",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Small TypeScript SDK for authoring Adversaries.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -22,6 +22,7 @@
22
22
  "types": "./dist/index.d.ts",
23
23
  "import": "./dist/index.js"
24
24
  },
25
+ "./schemas/adversary.manifest.v1": "./schemas/adversary.manifest.v1.schema.json",
25
26
  "./schemas/adversary.input.v1": "./schemas/adversary.input.v1.schema.json",
26
27
  "./schemas/adversary.review.v1": "./schemas/adversary.review.v1.schema.json"
27
28
  },
@@ -44,6 +45,7 @@
44
45
  "vitest": "^4.1.10"
45
46
  },
46
47
  "dependencies": {
47
- "ajv": "^8.20.0"
48
+ "ajv": "^8.20.0",
49
+ "yaml": "^2.8.1"
48
50
  }
49
51
  }
@@ -0,0 +1,159 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://adversary.dev/schemas/adversary.manifest.v1.schema.json",
4
+ "title": "Adversary Manifest v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["name", "runtime"],
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "pattern": "^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?(?:/[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?)*$"
12
+ },
13
+ "version": {
14
+ "type": "string",
15
+ "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-((?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$"
16
+ },
17
+ "description": { "type": "string" },
18
+ "triggers": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "properties": {
22
+ "manual": { "type": "boolean" },
23
+ "files_changed": {
24
+ "type": "array",
25
+ "items": { "$ref": "#/$defs/normalizedString" }
26
+ }
27
+ }
28
+ },
29
+ "detection": {
30
+ "type": "object",
31
+ "additionalProperties": false,
32
+ "minProperties": 1,
33
+ "properties": {
34
+ "files": {
35
+ "type": "array",
36
+ "minItems": 1,
37
+ "uniqueItems": true,
38
+ "items": { "$ref": "#/$defs/normalizedString" }
39
+ },
40
+ "entrypoint": { "$ref": "#/$defs/portableProjectPath" }
41
+ }
42
+ },
43
+ "runtime": {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "required": ["command"],
47
+ "oneOf": [
48
+ {
49
+ "required": ["image"],
50
+ "properties": {
51
+ "image": true,
52
+ "name": false,
53
+ "version": false
54
+ }
55
+ },
56
+ {
57
+ "required": ["name", "version"],
58
+ "properties": {
59
+ "name": true,
60
+ "version": true,
61
+ "image": false
62
+ }
63
+ }
64
+ ],
65
+ "properties": {
66
+ "name": { "enum": ["node", "process"] },
67
+ "image": {
68
+ "type": "string",
69
+ "pattern": "^(?:(?:localhost|\\[[0-9A-Fa-f:]+\\]|[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*)(?::[0-9]{1,5})?/)?[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*(?:/[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*)*(?::[A-Za-z0-9_][A-Za-z0-9_.-]{0,127})?(?:@(?:sha256:[a-f0-9]{64}|sha384:[a-f0-9]{96}|sha512:[a-f0-9]{128}))?$"
70
+ },
71
+ "version": {
72
+ "type": "string",
73
+ "pattern": "^(?:node@|v)?(?:[0-9]+(?:\\.[0-9]+){0,2}|[<>=~^*xX0-9., |+\\-]+)$"
74
+ },
75
+ "command": {
76
+ "type": "array",
77
+ "minItems": 1,
78
+ "items": { "$ref": "#/$defs/normalizedString" }
79
+ }
80
+ }
81
+ },
82
+ "permissions": {
83
+ "type": "object",
84
+ "additionalProperties": false,
85
+ "properties": {
86
+ "filesystem": {
87
+ "type": "object",
88
+ "additionalProperties": false,
89
+ "properties": {
90
+ "read": {
91
+ "type": "array",
92
+ "uniqueItems": true,
93
+ "items": { "$ref": "#/$defs/projectPath" }
94
+ },
95
+ "write": {
96
+ "type": "array",
97
+ "uniqueItems": true,
98
+ "items": { "$ref": "#/$defs/projectPath" }
99
+ }
100
+ }
101
+ },
102
+ "network": { "type": "boolean" },
103
+ "environment": {
104
+ "type": "object",
105
+ "additionalProperties": false,
106
+ "properties": {
107
+ "allow": {
108
+ "type": "array",
109
+ "uniqueItems": true,
110
+ "items": {
111
+ "type": "string",
112
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
113
+ }
114
+ }
115
+ }
116
+ },
117
+ "env": {
118
+ "description": "Deprecated alias for environment.allow.",
119
+ "deprecated": true,
120
+ "type": "array",
121
+ "uniqueItems": true,
122
+ "items": {
123
+ "type": "string",
124
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
125
+ }
126
+ },
127
+ "enforcement": { "enum": ["advisory", "required"] }
128
+ },
129
+ "not": {
130
+ "properties": {
131
+ "environment": true,
132
+ "env": true
133
+ },
134
+ "required": ["environment", "env"]
135
+ }
136
+ },
137
+ "findings": {
138
+ "type": "object",
139
+ "additionalProperties": false,
140
+ "properties": {
141
+ "format": { "const": "adversary.review.v1" }
142
+ }
143
+ }
144
+ },
145
+ "$defs": {
146
+ "normalizedString": {
147
+ "type": "string",
148
+ "pattern": "^[^\\x00\\s](?:[^\\x00]*[^\\x00\\s])?$"
149
+ },
150
+ "portableProjectPath": {
151
+ "type": "string",
152
+ "pattern": "^(?!\\s)(?!/)(?![A-Za-z]:)(?!.*\\\\)(?!(?:\\.{1,2})(?:/|$))(?!.*(?:/\\.{1,2})(?:/|$))(?!.*//)(?!.*\\s$)[^/]+(?:/[^/]+)*$"
153
+ },
154
+ "projectPath": {
155
+ "type": "string",
156
+ "pattern": "^(?:\\.|[^./:\\\\x00\\s](?:[^/:\\\\x00]*[^/:\\\\x00\\s])?|\\.[^./:\\\\x00\\s](?:[^/:\\\\x00]*[^/:\\\\x00\\s])?)(?:/(?:[^./:\\\\x00\\s](?:[^/:\\\\x00]*[^/:\\\\x00\\s])?|\\.[^./:\\\\x00\\s](?:[^/:\\\\x00]*[^/:\\\\x00\\s])?))*$"
157
+ }
158
+ }
159
+ }
@@ -2,6 +2,11 @@
2
2
 
3
3
  Minimal TypeScript Adversary built with `@adversarylabs/sdk`.
4
4
 
5
+ ## Automatic detection
6
+
7
+ `adversary auto` selects this starter when TypeScript files change. Adjust `detection.files` in
8
+ `adversary.yaml` to match the technology or domain your adversary reviews.
9
+
5
10
  ```bash
6
11
  npm ci
7
12
  npm test
@@ -8,6 +8,11 @@ triggers:
8
8
  - "*"
9
9
  - "**/*"
10
10
 
11
+ detection:
12
+ files:
13
+ - "*.ts"
14
+ - "**/*.ts"
15
+
11
16
  runtime:
12
17
  name: node
13
18
  version: "22"
@@ -21,7 +26,8 @@ permissions:
21
26
  write:
22
27
  - .adversary/results
23
28
  network: false
24
- env: []
29
+ environment:
30
+ allow: []
25
31
 
26
32
  findings:
27
33
  format: adversary.review.v1