@adversarylabs/sdk 0.1.43 → 0.1.44
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 +60 -0
- package/dist/candidate-recovery.d.ts +1 -1
- package/dist/candidate-recovery.d.ts.map +1 -1
- package/dist/candidate-recovery.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +106 -5
- package/dist/index.js.map +1 -1
- package/dist/review-sources.d.ts +34 -0
- package/dist/review-sources.d.ts.map +1 -0
- package/dist/review-sources.js +195 -0
- package/dist/review-sources.js.map +1 -0
- package/package.json +1 -1
- package/schemas/adversary.review.v1.schema.json +76 -0
package/README.md
CHANGED
|
@@ -1236,3 +1236,63 @@ findings. The final coverage guard cannot be overwritten by a later clean opinio
|
|
|
1236
1236
|
This API is opt-in. Consumers must replace whole-response validators that throw
|
|
1237
1237
|
because of one candidate; upgrading the dependency alone does not adopt recovery.
|
|
1238
1238
|
Composed reviews must propagate incomplete coverage from their children.
|
|
1239
|
+
|
|
1240
|
+
### Reporting review evidence sources
|
|
1241
|
+
|
|
1242
|
+
Use `ctx.review.source(...)` to register the output of a scanner or an artifact
|
|
1243
|
+
reader, including successful runs with no findings. Sources appear on the review
|
|
1244
|
+
Sources page independently of findings. Re-reporting the same ID updates that
|
|
1245
|
+
invocation; use different IDs for distinct invocations or environments.
|
|
1246
|
+
|
|
1247
|
+
```ts
|
|
1248
|
+
app.rule("workflow-lint", async (ctx) => {
|
|
1249
|
+
ctx.review.source({
|
|
1250
|
+
id: "actionlint:workflows",
|
|
1251
|
+
kind: "tool",
|
|
1252
|
+
title: "Actionlint",
|
|
1253
|
+
status: "passed",
|
|
1254
|
+
summary: "Checked two workflows; no diagnostics.",
|
|
1255
|
+
version: "1.7.7",
|
|
1256
|
+
scope: [".github/workflows/build.yml", ".github/workflows/release.yml"],
|
|
1257
|
+
output: "No diagnostics.",
|
|
1258
|
+
});
|
|
1259
|
+
});
|
|
1260
|
+
```
|
|
1261
|
+
|
|
1262
|
+
For findings, add `sourceIds: ["actionlint:workflows"]` to `ctx.finding(...)` or
|
|
1263
|
+
`ctx.observe(...)`. IDs must reference sources reported by the same run. They
|
|
1264
|
+
are namespaced by the runner when combining adversaries. Optional `data` holds
|
|
1265
|
+
structured JSON results; `headSha` and an HTTP(S) `url` capture artifact provenance.
|
|
1266
|
+
|
|
1267
|
+
Statuses are `passed` (completed without issues), `findings` (completed with
|
|
1268
|
+
issues), `error`, `partial`, and `unavailable`. Never label an unexecuted scanner
|
|
1269
|
+
as passed. Missing evidence should still be reported using the appropriate
|
|
1270
|
+
status; the platform records incomplete source coverage separately from findings.
|
|
1271
|
+
|
|
1272
|
+
The SDK accepts at most 32 sources per run. Source text and structured output
|
|
1273
|
+
share a 32 KiB UTF-8 budget. Structured data that fits is retained, shortening
|
|
1274
|
+
text output to the remaining budget. Data larger than the entire budget is
|
|
1275
|
+
omitted rather than serialized as broken JSON. `truncated` is set whenever output or metadata is
|
|
1276
|
+
shortened. Source titles, summaries and scope also have bounded lengths. The
|
|
1277
|
+
combined protocol supports up to 256 sources. `createAdversaryRunEnvelope` also
|
|
1278
|
+
normalizes sources in manually constructed results, and `validateRunEnvelope`
|
|
1279
|
+
enforces the combined output/data byte budget in addition to JSON Schema's
|
|
1280
|
+
character limits. Both helpers also reject dangling or malformed source IDs
|
|
1281
|
+
in active and suppressed findings, and reject duplicate source IDs. The
|
|
1282
|
+
constructor deduplicates valid finding references.
|
|
1283
|
+
|
|
1284
|
+
Invalid source metadata throws `ReviewSourceValidationError` (exported by the
|
|
1285
|
+
SDK) with code `invalid_review_source`, a field label such as
|
|
1286
|
+
`ctx.review.source.url`, and the source ID when it is valid. Parser failures do
|
|
1287
|
+
not include raw URLs or credential values in error messages. Exceeding the
|
|
1288
|
+
32-source limit throws `ReviewSourceCapacityError` with code
|
|
1289
|
+
`review_source_capacity_exceeded`.
|
|
1290
|
+
|
|
1291
|
+
**Remove secrets before reporting any output or URL.** The SDK additionally
|
|
1292
|
+
redacts common credential keys, assignments and bearer tokens in raw output,
|
|
1293
|
+
structured data and URLs. Display metadata is preserved rather than guessed to
|
|
1294
|
+
be credentials. Raw-text redaction is heuristic and may over-redact ambiguous
|
|
1295
|
+
assignments; it cannot identify every domain-specific secret. Output is evidence, never instructions
|
|
1296
|
+
or executable HTML. The `sources` and `sourceIds` fields are optional, preserving
|
|
1297
|
+
legacy reviews. Deploy a runner supporting these fields before releasing an
|
|
1298
|
+
adversary that emits them; older strict protocol decoders reject unknown fields.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { RuleContext } from "./index.js";
|
|
2
2
|
import { type ModelReviewRequest } from "./model.js";
|
|
3
3
|
export declare const INCOMPLETE_REVIEW_SUMMARY = "Review completed with limited coverage. Supported findings are retained; no whole-change clean opinion is available.";
|
|
4
|
-
export type ReviewIncompleteReason = "candidate_validation" | "assessment_validation";
|
|
4
|
+
export type ReviewIncompleteReason = "candidate_validation" | "assessment_validation" | "source_coverage";
|
|
5
5
|
export interface CandidateValidationIssue {
|
|
6
6
|
field: string;
|
|
7
7
|
code: "missing" | "invalid_type" | "invalid_value" | "too_short" | "too_long" | "placeholder" | "repetition";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-recovery.d.ts","sourceRoot":"","sources":["../src/candidate-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAoB,KAAK,kBAAkB,EAAyB,MAAM,YAAY,CAAC;AAG9F,eAAO,MAAM,yBAAyB,yHACkF,CAAC;AAEzH,MAAM,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"candidate-recovery.d.ts","sourceRoot":"","sources":["../src/candidate-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAoB,KAAK,kBAAkB,EAAyB,MAAM,YAAY,CAAC;AAG9F,eAAO,MAAM,yBAAyB,yHACkF,CAAC;AAEzH,MAAM,MAAM,sBAAsB,GAC9B,sBAAsB,GACtB,uBAAuB,GACvB,iBAAiB,CAAC;AACtB,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EACA,SAAS,GACT,cAAc,GACd,eAAe,GACf,WAAW,GACX,UAAU,GACV,aAAa,GACb,YAAY,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,MAAM;IACxD,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,qFAAqF;IACrF,QAAQ,CACN,SAAS,EAAE,CAAC,GACX,SAAS,wBAAwB,EAAE,GAAG,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAAC;IACtF,MAAM,CAAC,EAAE;QACP,2FAA2F;QAC3F,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,EAAE;YACb,SAAS,EAAE,CAAC,CAAC;YACb,MAAM,EAAE,SAAS,wBAAwB,EAAE,CAAC;YAC5C,kBAAkB,EAAE,MAAM,CAAC;SAC5B,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;KACpC,CAAC;IACF,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD,MAAM,WAAW,uBAAuB,CAAC,CAAC;IACxC,UAAU,EAAE,CAAC,EAAE,CAAC;IAChB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,wBAAwB,EAAE,CAAA;KAAE,EAAE,CAAC;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wFAAwF;AACxF,wBAAsB,uBAAuB,CAAC,CAAC,SAAS,MAAM,EAC5D,OAAO,EAAE;IACP,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;CACnD,EACD,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,GACnC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAiHrC;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACvE,wBAAwB,EAAE,CAoC5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-recovery.js","sourceRoot":"","sources":["../src/candidate-recovery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RuleContext } from \"./index.js\";\nimport { ModelReviewError, type ModelReviewRequest, ModelUnavailableError } from \"./model.js\";\nimport { writeRepositoryDiagnostic } from \"./repository-diagnostics.js\";\n\nexport const INCOMPLETE_REVIEW_SUMMARY =\n \"Review completed with limited coverage. Supported findings are retained; no whole-change clean opinion is available.\";\n\nexport type ReviewIncompleteReason = \"candidate_validation\" | \"assessment_validation\";\nexport interface CandidateValidationIssue {\n field: string;\n code:\n | \"missing\"\n | \"invalid_type\"\n | \"invalid_value\"\n | \"too_short\"\n | \"too_long\"\n | \"placeholder\"\n | \"repetition\";\n actualLength?: number;\n minimumLength?: number;\n maximumLength?: number;\n}\nexport interface CandidateRecoveryOptions<T extends object> {\n candidates: readonly T[];\n /** Diagnostic identity only. Never include source text. */\n reviewer?: string;\n kind?: \"candidate\" | \"assessment\";\n /** Return content-free issues. Programming errors thrown by validators propagate. */\n validate(\n candidate: T,\n ): readonly CandidateValidationIssue[] | Promise<readonly CandidateValidationIssue[]>;\n repair?: {\n /** Only these rejected top-level fields can change. Identity/evidence remain untouched. */\n fields: readonly (keyof T & string)[];\n request(input: {\n candidate: T;\n issues: readonly CandidateValidationIssue[];\n remainingTimeoutMs: number;\n }): ModelReviewRequest<Partial<T>>;\n };\n /** Total repair calls across the batch, default 2; maximum 10. */\n maximumRepairCalls?: number;\n /** Shared repair deadline, default ten minutes; explicit shorter limits are preserved. */\n timeoutMs?: number;\n}\nexport interface CandidateRecoveryResult<T> {\n candidates: T[];\n withheld: { index: number; issues: readonly CandidateValidationIssue[] }[];\n repaired: number;\n repairCalls: number;\n}\n\n/** Independent validation/recovery; an invalid candidate never discards valid peers. */\nexport async function recoverReviewCandidates<T extends object>(\n context: {\n model: Pick<RuleContext[\"model\"], \"review\">;\n review: Pick<RuleContext[\"review\"], \"incomplete\">;\n },\n options: CandidateRecoveryOptions<T>,\n): Promise<CandidateRecoveryResult<T>> {\n if (options.kind !== undefined && ![\"candidate\", \"assessment\"].includes(options.kind))\n throw new TypeError(\"Invalid candidate recovery kind.\");\n const maximumRepairCalls = options.maximumRepairCalls ?? 2;\n const timeoutMs = options.timeoutMs ?? 600_000;\n if (\n !Number.isInteger(maximumRepairCalls) ||\n maximumRepairCalls < 0 ||\n maximumRepairCalls > 10 ||\n !Number.isInteger(timeoutMs) ||\n timeoutMs < 1 ||\n timeoutMs > 600_000 ||\n options.candidates.length > 100\n ) {\n throw new TypeError(\n \"Candidate recovery requires at most 100 candidates, 0–10 repair calls, and a 1–600000ms deadline.\",\n );\n }\n for (const field of options.repair?.fields ?? []) requireField(field);\n const startedAt = performance.now();\n const result: CandidateRecoveryResult<T> = {\n candidates: [],\n withheld: [],\n repaired: 0,\n repairCalls: 0,\n };\n for (const [index, original] of options.candidates.entries()) {\n let repairAttempted = false;\n let candidate = original;\n let issues = safeIssues(await options.validate(candidate));\n if (issues.length === 0) {\n result.candidates.push(candidate);\n continue;\n }\n diagnostic(options.reviewer, index, issues, 0, \"rejected\");\n const fields = new Set(\n issues\n .map((issue) => issue.field)\n .filter((field) => options.repair?.fields.includes(field as keyof T & string)),\n );\n const remainingTimeoutMs = Math.floor(timeoutMs - (performance.now() - startedAt));\n if (\n options.repair &&\n fields.size > 0 &&\n issues.every((issue) => fields.has(issue.field)) &&\n result.repairCalls < maximumRepairCalls &&\n remainingTimeoutMs > 0\n ) {\n // Request-construction errors are programming errors, not malformed model output.\n const request = options.repair.request({ candidate, issues, remainingTimeoutMs });\n const requestedTimeout = request.budget?.timeoutMs ?? remainingTimeoutMs;\n if (\n !Number.isInteger(requestedTimeout) ||\n requestedTimeout < 1 ||\n requestedTimeout > 600_000\n ) {\n throw new ModelReviewError(\"Invalid candidate repair request timeout.\", {\n code: \"invalid_model_budget\",\n });\n }\n repairAttempted = true;\n result.repairCalls += 1;\n try {\n const { output } = await context.model.review<Partial<T>>({\n ...request,\n budget: { ...request.budget, timeoutMs: Math.min(requestedTimeout, remainingTimeoutMs) },\n });\n if (typeof output !== \"object\" || output === null || Array.isArray(output)) {\n throw new ModelReviewError(\"Candidate repair returned a non-object.\", {\n code: \"invalid_model_output\",\n });\n }\n candidate = { ...original };\n for (const field of fields) {\n if (Object.hasOwn(output, field))\n (candidate as Record<string, unknown>)[field] = (output as Record<string, unknown>)[\n field\n ];\n }\n } catch (error) {\n if (!(error instanceof ModelReviewError) && !(error instanceof ModelUnavailableError))\n throw error;\n if (\n error instanceof ModelReviewError &&\n [\n \"invalid_model_request\",\n \"model_request_too_large\",\n \"invalid_model_schema\",\n \"invalid_model_budget\",\n \"invalid_broker_endpoint\",\n \"invalid_broker_token\",\n ].includes(error.code ?? \"\")\n )\n throw error;\n diagnostic(options.reviewer, index, issues, 1, \"repair_failed\");\n }\n // Validation is outside the model-error catch: never swallow validator bugs.\n issues = safeIssues(await options.validate(candidate));\n if (issues.length === 0) {\n result.repaired += 1;\n result.candidates.push(candidate);\n diagnostic(options.reviewer, index, [], 1, \"repaired\");\n continue;\n }\n }\n result.withheld.push({ index, issues });\n diagnostic(options.reviewer, index, issues, repairAttempted ? 1 : 0, \"withheld\");\n }\n if (result.withheld.length > 0)\n context.review.incomplete(\n options.kind === \"assessment\" ? \"assessment_validation\" : \"candidate_validation\",\n );\n return result;\n}\n\n/** Shared prose checks, with domain-specific length limits supplied by the reviewer. */\nexport function validateReviewText(\n value: unknown,\n options: { field: string; minimumLength: number; maximumLength: number },\n): CandidateValidationIssue[] {\n requireField(options.field);\n const { minimumLength, maximumLength } = options;\n if (\n !Number.isInteger(minimumLength) ||\n minimumLength < 1 ||\n !Number.isInteger(maximumLength) ||\n maximumLength < minimumLength\n )\n throw new TypeError(\"Invalid review text length limits.\");\n const issue = (\n code: CandidateValidationIssue[\"code\"],\n actualLength?: number,\n ): CandidateValidationIssue[] => [\n { ...options, code, ...(actualLength === undefined ? {} : { actualLength }) },\n ];\n if (value == null) return issue(\"missing\");\n if (typeof value !== \"string\") return issue(\"invalid_type\");\n const text = value.trim();\n if (text.length < minimumLength) return issue(\"too_short\", text.length);\n if (text.length > maximumLength) return issue(\"too_long\", text.length);\n if (\n /^(?:assessment|detail|impact|none|placeholder|principle|quote|recommendation|string|summary|title|tradeoffs?)$/i.test(\n text,\n )\n )\n return issue(\"placeholder\", text.length);\n const counts = new Map<string, number>();\n for (const unit of text\n .toLowerCase()\n .split(/(?:\\r?\\n+|(?<=[.!?])\\s+)/)\n .map((unit) => unit.replace(/[.!?]+$/u, \"\").trim())\n .filter((unit) => unit.length >= 2)) {\n counts.set(unit, (counts.get(unit) ?? 0) + 1);\n }\n return [...counts.values()].some((count) => count >= 4) ? issue(\"repetition\", text.length) : [];\n}\n\nfunction requireField(field: string): void {\n if (\n !/^[A-Za-z_][A-Za-z0-9_]{0,63}$/.test(field) ||\n [\"__proto__\", \"constructor\", \"prototype\"].includes(field)\n )\n throw new TypeError(\"Invalid candidate validation field.\");\n}\nfunction safeIssues(issues: readonly CandidateValidationIssue[]): CandidateValidationIssue[] {\n if (issues.length > 32) throw new TypeError(\"Too many candidate validation issues.\");\n return issues.map((issue) => {\n requireField(issue.field);\n if (\n ![\n \"missing\",\n \"invalid_type\",\n \"invalid_value\",\n \"too_short\",\n \"too_long\",\n \"placeholder\",\n \"repetition\",\n ].includes(issue.code)\n )\n throw new TypeError(\"Invalid candidate validation code.\");\n const safe: CandidateValidationIssue = { field: issue.field, code: issue.code };\n for (const key of [\"actualLength\", \"minimumLength\", \"maximumLength\"] as const) {\n const value = issue[key];\n if (value !== undefined) {\n if (!Number.isSafeInteger(value) || value < 0)\n throw new TypeError(\"Invalid candidate length diagnostic.\");\n safe[key] = value;\n }\n }\n return safe;\n });\n}\nfunction diagnostic(\n reviewer: string | undefined,\n index: number,\n issues: readonly CandidateValidationIssue[],\n attempt: number,\n outcome: string,\n): void {\n const identity = (value: string | undefined) =>\n value && /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/.test(value) ? value : \"unknown\";\n writeRepositoryDiagnostic({\n event: \"review.candidate-validation\",\n jobId: identity(process.env.HOSTED_REVIEW_JOB_ID),\n reviewer: identity(reviewer),\n stage: \"candidate_validation\",\n provider: identity(process.env.ADVERSARY_MODEL_PROVIDER),\n model: identity(process.env.ADVERSARY_MODEL),\n candidateIndex: index,\n attempt,\n outcome,\n issues,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"candidate-recovery.js","sourceRoot":"","sources":["../src/candidate-recovery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RuleContext } from \"./index.js\";\nimport { ModelReviewError, type ModelReviewRequest, ModelUnavailableError } from \"./model.js\";\nimport { writeRepositoryDiagnostic } from \"./repository-diagnostics.js\";\n\nexport const INCOMPLETE_REVIEW_SUMMARY =\n \"Review completed with limited coverage. Supported findings are retained; no whole-change clean opinion is available.\";\n\nexport type ReviewIncompleteReason =\n | \"candidate_validation\"\n | \"assessment_validation\"\n | \"source_coverage\";\nexport interface CandidateValidationIssue {\n field: string;\n code:\n | \"missing\"\n | \"invalid_type\"\n | \"invalid_value\"\n | \"too_short\"\n | \"too_long\"\n | \"placeholder\"\n | \"repetition\";\n actualLength?: number;\n minimumLength?: number;\n maximumLength?: number;\n}\nexport interface CandidateRecoveryOptions<T extends object> {\n candidates: readonly T[];\n /** Diagnostic identity only. Never include source text. */\n reviewer?: string;\n kind?: \"candidate\" | \"assessment\";\n /** Return content-free issues. Programming errors thrown by validators propagate. */\n validate(\n candidate: T,\n ): readonly CandidateValidationIssue[] | Promise<readonly CandidateValidationIssue[]>;\n repair?: {\n /** Only these rejected top-level fields can change. Identity/evidence remain untouched. */\n fields: readonly (keyof T & string)[];\n request(input: {\n candidate: T;\n issues: readonly CandidateValidationIssue[];\n remainingTimeoutMs: number;\n }): ModelReviewRequest<Partial<T>>;\n };\n /** Total repair calls across the batch, default 2; maximum 10. */\n maximumRepairCalls?: number;\n /** Shared repair deadline, default ten minutes; explicit shorter limits are preserved. */\n timeoutMs?: number;\n}\nexport interface CandidateRecoveryResult<T> {\n candidates: T[];\n withheld: { index: number; issues: readonly CandidateValidationIssue[] }[];\n repaired: number;\n repairCalls: number;\n}\n\n/** Independent validation/recovery; an invalid candidate never discards valid peers. */\nexport async function recoverReviewCandidates<T extends object>(\n context: {\n model: Pick<RuleContext[\"model\"], \"review\">;\n review: Pick<RuleContext[\"review\"], \"incomplete\">;\n },\n options: CandidateRecoveryOptions<T>,\n): Promise<CandidateRecoveryResult<T>> {\n if (options.kind !== undefined && ![\"candidate\", \"assessment\"].includes(options.kind))\n throw new TypeError(\"Invalid candidate recovery kind.\");\n const maximumRepairCalls = options.maximumRepairCalls ?? 2;\n const timeoutMs = options.timeoutMs ?? 600_000;\n if (\n !Number.isInteger(maximumRepairCalls) ||\n maximumRepairCalls < 0 ||\n maximumRepairCalls > 10 ||\n !Number.isInteger(timeoutMs) ||\n timeoutMs < 1 ||\n timeoutMs > 600_000 ||\n options.candidates.length > 100\n ) {\n throw new TypeError(\n \"Candidate recovery requires at most 100 candidates, 0–10 repair calls, and a 1–600000ms deadline.\",\n );\n }\n for (const field of options.repair?.fields ?? []) requireField(field);\n const startedAt = performance.now();\n const result: CandidateRecoveryResult<T> = {\n candidates: [],\n withheld: [],\n repaired: 0,\n repairCalls: 0,\n };\n for (const [index, original] of options.candidates.entries()) {\n let repairAttempted = false;\n let candidate = original;\n let issues = safeIssues(await options.validate(candidate));\n if (issues.length === 0) {\n result.candidates.push(candidate);\n continue;\n }\n diagnostic(options.reviewer, index, issues, 0, \"rejected\");\n const fields = new Set(\n issues\n .map((issue) => issue.field)\n .filter((field) => options.repair?.fields.includes(field as keyof T & string)),\n );\n const remainingTimeoutMs = Math.floor(timeoutMs - (performance.now() - startedAt));\n if (\n options.repair &&\n fields.size > 0 &&\n issues.every((issue) => fields.has(issue.field)) &&\n result.repairCalls < maximumRepairCalls &&\n remainingTimeoutMs > 0\n ) {\n // Request-construction errors are programming errors, not malformed model output.\n const request = options.repair.request({ candidate, issues, remainingTimeoutMs });\n const requestedTimeout = request.budget?.timeoutMs ?? remainingTimeoutMs;\n if (\n !Number.isInteger(requestedTimeout) ||\n requestedTimeout < 1 ||\n requestedTimeout > 600_000\n ) {\n throw new ModelReviewError(\"Invalid candidate repair request timeout.\", {\n code: \"invalid_model_budget\",\n });\n }\n repairAttempted = true;\n result.repairCalls += 1;\n try {\n const { output } = await context.model.review<Partial<T>>({\n ...request,\n budget: { ...request.budget, timeoutMs: Math.min(requestedTimeout, remainingTimeoutMs) },\n });\n if (typeof output !== \"object\" || output === null || Array.isArray(output)) {\n throw new ModelReviewError(\"Candidate repair returned a non-object.\", {\n code: \"invalid_model_output\",\n });\n }\n candidate = { ...original };\n for (const field of fields) {\n if (Object.hasOwn(output, field))\n (candidate as Record<string, unknown>)[field] = (output as Record<string, unknown>)[\n field\n ];\n }\n } catch (error) {\n if (!(error instanceof ModelReviewError) && !(error instanceof ModelUnavailableError))\n throw error;\n if (\n error instanceof ModelReviewError &&\n [\n \"invalid_model_request\",\n \"model_request_too_large\",\n \"invalid_model_schema\",\n \"invalid_model_budget\",\n \"invalid_broker_endpoint\",\n \"invalid_broker_token\",\n ].includes(error.code ?? \"\")\n )\n throw error;\n diagnostic(options.reviewer, index, issues, 1, \"repair_failed\");\n }\n // Validation is outside the model-error catch: never swallow validator bugs.\n issues = safeIssues(await options.validate(candidate));\n if (issues.length === 0) {\n result.repaired += 1;\n result.candidates.push(candidate);\n diagnostic(options.reviewer, index, [], 1, \"repaired\");\n continue;\n }\n }\n result.withheld.push({ index, issues });\n diagnostic(options.reviewer, index, issues, repairAttempted ? 1 : 0, \"withheld\");\n }\n if (result.withheld.length > 0)\n context.review.incomplete(\n options.kind === \"assessment\" ? \"assessment_validation\" : \"candidate_validation\",\n );\n return result;\n}\n\n/** Shared prose checks, with domain-specific length limits supplied by the reviewer. */\nexport function validateReviewText(\n value: unknown,\n options: { field: string; minimumLength: number; maximumLength: number },\n): CandidateValidationIssue[] {\n requireField(options.field);\n const { minimumLength, maximumLength } = options;\n if (\n !Number.isInteger(minimumLength) ||\n minimumLength < 1 ||\n !Number.isInteger(maximumLength) ||\n maximumLength < minimumLength\n )\n throw new TypeError(\"Invalid review text length limits.\");\n const issue = (\n code: CandidateValidationIssue[\"code\"],\n actualLength?: number,\n ): CandidateValidationIssue[] => [\n { ...options, code, ...(actualLength === undefined ? {} : { actualLength }) },\n ];\n if (value == null) return issue(\"missing\");\n if (typeof value !== \"string\") return issue(\"invalid_type\");\n const text = value.trim();\n if (text.length < minimumLength) return issue(\"too_short\", text.length);\n if (text.length > maximumLength) return issue(\"too_long\", text.length);\n if (\n /^(?:assessment|detail|impact|none|placeholder|principle|quote|recommendation|string|summary|title|tradeoffs?)$/i.test(\n text,\n )\n )\n return issue(\"placeholder\", text.length);\n const counts = new Map<string, number>();\n for (const unit of text\n .toLowerCase()\n .split(/(?:\\r?\\n+|(?<=[.!?])\\s+)/)\n .map((unit) => unit.replace(/[.!?]+$/u, \"\").trim())\n .filter((unit) => unit.length >= 2)) {\n counts.set(unit, (counts.get(unit) ?? 0) + 1);\n }\n return [...counts.values()].some((count) => count >= 4) ? issue(\"repetition\", text.length) : [];\n}\n\nfunction requireField(field: string): void {\n if (\n !/^[A-Za-z_][A-Za-z0-9_]{0,63}$/.test(field) ||\n [\"__proto__\", \"constructor\", \"prototype\"].includes(field)\n )\n throw new TypeError(\"Invalid candidate validation field.\");\n}\nfunction safeIssues(issues: readonly CandidateValidationIssue[]): CandidateValidationIssue[] {\n if (issues.length > 32) throw new TypeError(\"Too many candidate validation issues.\");\n return issues.map((issue) => {\n requireField(issue.field);\n if (\n ![\n \"missing\",\n \"invalid_type\",\n \"invalid_value\",\n \"too_short\",\n \"too_long\",\n \"placeholder\",\n \"repetition\",\n ].includes(issue.code)\n )\n throw new TypeError(\"Invalid candidate validation code.\");\n const safe: CandidateValidationIssue = { field: issue.field, code: issue.code };\n for (const key of [\"actualLength\", \"minimumLength\", \"maximumLength\"] as const) {\n const value = issue[key];\n if (value !== undefined) {\n if (!Number.isSafeInteger(value) || value < 0)\n throw new TypeError(\"Invalid candidate length diagnostic.\");\n safe[key] = value;\n }\n }\n return safe;\n });\n}\nfunction diagnostic(\n reviewer: string | undefined,\n index: number,\n issues: readonly CandidateValidationIssue[],\n attempt: number,\n outcome: string,\n): void {\n const identity = (value: string | undefined) =>\n value && /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$/.test(value) ? value : \"unknown\";\n writeRepositoryDiagnostic({\n event: \"review.candidate-validation\",\n jobId: identity(process.env.HOSTED_REVIEW_JOB_ID),\n reviewer: identity(reviewer),\n stage: \"candidate_validation\",\n provider: identity(process.env.ADVERSARY_MODEL_PROVIDER),\n model: identity(process.env.ADVERSARY_MODEL),\n candidateIndex: index,\n attempt,\n outcome,\n issues,\n });\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ import { type ContextualReviewModel, type ModelConcernRequest, type ModelConcern
|
|
|
3
3
|
import { type OutcomeContext } from "./outcome-context.js";
|
|
4
4
|
import { type RepoGraph } from "./repo-graph.js";
|
|
5
5
|
import { type RepoIndex } from "./repo-index.js";
|
|
6
|
+
import { type ReviewSource } from "./review-sources.js";
|
|
6
7
|
import { type InScopeSource, type ListInScopePathsOptions, type LoadInScopeSourcesOptions } from "./sources.js";
|
|
8
|
+
export { REVIEW_SOURCE_STATUSES, ReviewSourceValidationError, ReviewSourceCapacityError, type ReviewSource, } from "./review-sources.js";
|
|
7
9
|
export { ADVERSARY_MODEL_ENDPOINT_ENV, ADVERSARY_MODEL_PROTOCOL_VERSION, ADVERSARY_MODEL_TOKEN_ENV, BrokerReviewModel, ModelReviewError, ModelUnavailableError, createModelFromEnvironment, unavailableModel, type ContextualReviewModel, type ModelConcernRequest, type ModelConcernResult, type ModelReviewBudget, type ModelEnvironment, type ModelReviewRequest, type ModelReviewResult, type ModelReviewUsage, type ReviewModel, } from "./model.js";
|
|
8
10
|
export type { ModelRepositoryCitation, ModelRepositoryCoverage, ModelRepositoryChange, ModelRepositoryRetrieval, ModelRepositoryToolOptions, } from "./repository-model.js";
|
|
9
11
|
export { recoverReviewCandidates, validateReviewText, type CandidateValidationIssue, type CandidateRecoveryOptions, type CandidateRecoveryResult, type ReviewIncompleteReason, } from "./candidate-recovery.js";
|
|
@@ -80,6 +82,7 @@ export type ObservationSummary = string | {
|
|
|
80
82
|
export type ConfidenceAggregation = "maximum" | "minimum" | "average";
|
|
81
83
|
export type SeverityAggregation = "highest" | "lowest";
|
|
82
84
|
export interface ObservationInit {
|
|
85
|
+
sourceIds?: string[];
|
|
83
86
|
ruleId: string;
|
|
84
87
|
subject: string;
|
|
85
88
|
groupKey?: string;
|
|
@@ -103,6 +106,7 @@ export interface ObservationInit {
|
|
|
103
106
|
metadata?: Record<string, unknown>;
|
|
104
107
|
}
|
|
105
108
|
export interface FindingInput {
|
|
109
|
+
sourceIds?: string[];
|
|
106
110
|
id?: string;
|
|
107
111
|
ruleId?: string;
|
|
108
112
|
groupKey?: string;
|
|
@@ -121,6 +125,7 @@ export interface FindingInput {
|
|
|
121
125
|
metadata?: Record<string, unknown>;
|
|
122
126
|
}
|
|
123
127
|
export interface ReviewFinding {
|
|
128
|
+
sourceIds?: string[];
|
|
124
129
|
id: string;
|
|
125
130
|
ruleId?: string;
|
|
126
131
|
groupKey?: string;
|
|
@@ -203,6 +208,7 @@ export interface ReviewPolicy {
|
|
|
203
208
|
severityOverrides?: Record<string, Severity>;
|
|
204
209
|
}
|
|
205
210
|
export interface ReviewResult {
|
|
211
|
+
sources?: ReviewSource[];
|
|
206
212
|
adversary: {
|
|
207
213
|
name: string;
|
|
208
214
|
version?: string;
|
|
@@ -346,6 +352,8 @@ export interface RuleContext {
|
|
|
346
352
|
observe: (observation: ObservationInit) => void;
|
|
347
353
|
finding: (finding: FindingInput) => void;
|
|
348
354
|
review: {
|
|
355
|
+
/** Register evidence even when it produced no findings. Same ID replaces a previous report. */
|
|
356
|
+
source: (source: ReviewSource) => void;
|
|
349
357
|
/** Sticky coverage guard; later approvals cannot overwrite it. */
|
|
350
358
|
incomplete: (reason: ReviewIncompleteReason) => void;
|
|
351
359
|
assessment: (assessment: ReviewAssessment) => void;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAGtB,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,cAAc,EAAiC,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,KAAK,SAAS,EAA4B,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,KAAK,SAAS,EAA4B,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAG/B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,EAChC,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,qCAAqC,EACrC,8BAA8B,EAC9B,kBAAkB,EAClB,6BAA6B,EAC7B,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,aAAa,EACb,wBAAwB,EACxB,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,wBAAwB,EACxB,2BAA2B,EAC3B,yBAAyB,EACzB,aAAa,EACb,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,4BAA4B,EAC5B,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAC1D,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAKhD,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,yBAAyB,EAAE,qBAAqB,EAqB5D,CAAC;AAEF,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,6BAA6B,EAAE,oBAG3C,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,eAAe,CAAC;CACzE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN;IACE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,cAAc,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC9C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IACnE,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,oFAAoF;IACpF,IAAI,EAAE,OAAO,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,iCAAiC;IACjC,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,yBAA0B,SAAQ,oBAAoB;IACrE,0FAA0F;IAC1F,KAAK,EAAE,WAAW,CAAC;IACnB,iDAAiD;IACjD,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,kBAAkB,CAAC,EAAE,aAAa,EAAE,CAAC;IACrC,eAAe,CAAC,EAAE,eAAe,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,OAAO,8BAA8B,CAAC;IACvD,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;IACxE,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IAClE,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,oBAAoB,CAAC;IAC5F,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAED,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,oFAAoF;AACpF,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC;IACrC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,OAAO;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC;;;OAGG;IACH,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C;;;OAGG;IACH,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,uBAAuB,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E;;;OAGG;IACH,kBAAkB,EAAE,CAAC,OAAO,CAAC,EAAE,yBAAyB,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACtF;;;OAGG;IACH,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE;QACN,kEAAkE;QAClE,UAAU,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;QACrD,UAAU,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;QACnD,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;QAC1C,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;QACzC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;QACpC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;KAC3C,CAAC;CACH;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gFAAgF;IAChF,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,kFAAkF;IAClF,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,iBAAiB,CAAC,EAAE,eAAe,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,eAAe,CAAC,KAAK,gBAAgB,CAAC;CAChF;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,GAAG;IACxE,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAE3D,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQpC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQnC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAKlD,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI5B,QAAQ,IAAI,YAAY;IAQxB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;CAO1C;AAmBD,oFAAoF;AACpF,eAAO,MAAM,YAAY,cAAqB,CAAC;AAE/C,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAErD;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAEtD;AAED,eAAO,MAAM,GAAG;mBACC,OAAO,GAAG,IAAI;kBAMf,OAAO,GAAG,IAAI;kBAMd,OAAO,GAAG,IAAI;mBAIb,OAAO,GAAG,IAAI;CAG9B,CAAC;AAEF,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmD;IACzE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;gBAEnC,OAAO,EAAE,gBAAgB;IAYrC,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAItC,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIvC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI1C,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAetC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAuD/C,kBAAkB,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,YAAY,CAAC;CAuBrF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,oBAAoB,CAKrF;AA4DD,wBAAsB,UAAU,CAAC,IAAI,SAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAwBjF;AA0DD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,IAAI,SAAsB,GACzB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAexE;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,eAAe,EAC3B,UAAU,GAAE,oBAAoD,GAC/D,UAAU,CAuBZ;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAmBvE;AAED,qBAAa,YAAa,YAAW,cAAc;IAE/C,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA2C;IAGvF,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;CAGnC;AAKD,qBAAa,gBAAiB,YAAW,cAAc;IAEnD,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAA2C;IAGvF;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;CAqGnC;AAwED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GACvC,aAAa,GAAG,IAAI,CAiBtB;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAW/F;AA2oBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,CAQ5F;AAED,mEAAmE;AACnE,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAoB,GAAG,MAAM,CAqCxF;AAED,4FAA4F;AAC5F,eAAO,MAAM,8BAA8B,omBASoC,CAAC;AAEhF,yDAAyD;AACzD,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAWlE,CAAC;AAOF;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA4E7B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAmDxB;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,cAAc,CAAC,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,qBAAqB,CAQvB;AAWD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA6C1E"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,9 @@ import { outcomeContextFromEnvironment } from "./outcome-context.js";
|
|
|
7
7
|
import { repoGraphFromEnvironment } from "./repo-graph.js";
|
|
8
8
|
import { repoIndexFromEnvironment } from "./repo-index.js";
|
|
9
9
|
import { reviewWithRepositoryTools } from "./repository-model.js";
|
|
10
|
+
import { ReviewSourceCapacityError, ReviewSourceValidationError, normalizeReviewSource, parseReviewSourceUrl, validateReviewSourceBudget, validateSourceIds, } from "./review-sources.js";
|
|
10
11
|
import { listInScopePaths as listInScopePathsImpl, loadInScopeSources as loadInScopeSourcesImpl, } from "./sources.js";
|
|
12
|
+
export { REVIEW_SOURCE_STATUSES, ReviewSourceValidationError, ReviewSourceCapacityError, } from "./review-sources.js";
|
|
11
13
|
export { ADVERSARY_MODEL_ENDPOINT_ENV, ADVERSARY_MODEL_PROTOCOL_VERSION, ADVERSARY_MODEL_TOKEN_ENV, BrokerReviewModel, ModelReviewError, ModelUnavailableError, createModelFromEnvironment, unavailableModel, } from "./model.js";
|
|
12
14
|
export { recoverReviewCandidates, validateReviewText, } from "./candidate-recovery.js";
|
|
13
15
|
export { resolveModelCitation } from "./repository-model.js";
|
|
@@ -239,12 +241,15 @@ export function createAdversaryRunEnvelope(result) {
|
|
|
239
241
|
};
|
|
240
242
|
}
|
|
241
243
|
function toWireReviewResult(result) {
|
|
244
|
+
const sources = result.sources?.map((source, index) => normalizeReviewSource(source, `result.sources[${index}]`));
|
|
245
|
+
assertResultSourceReferences(result, sources ?? []);
|
|
242
246
|
return omitUndefined({
|
|
243
247
|
adversary: omitUndefined(result.adversary),
|
|
244
248
|
target: omitUndefined(result.target),
|
|
245
249
|
assessment: result.assessment === undefined ? undefined : omitUndefined({ ...result.assessment }),
|
|
246
250
|
positives: result.positives.map(toWireReviewNote),
|
|
247
251
|
observations: result.observations.map(toWireReviewNote),
|
|
252
|
+
sources: sources?.length ? sources : undefined,
|
|
248
253
|
findings: result.findings.map(toWireFinding),
|
|
249
254
|
opinion: result.opinion === undefined ? undefined : omitUndefined({ ...result.opinion }),
|
|
250
255
|
suppressed: result.suppressed,
|
|
@@ -264,6 +269,7 @@ function toWireReviewNote(note) {
|
|
|
264
269
|
function toWireFinding(finding) {
|
|
265
270
|
return omitUndefined({
|
|
266
271
|
id: finding.id,
|
|
272
|
+
sourceIds: finding.sourceIds === undefined ? undefined : uniqueStrings(finding.sourceIds),
|
|
267
273
|
ruleId: finding.ruleId,
|
|
268
274
|
groupKey: finding.groupKey,
|
|
269
275
|
title: finding.title,
|
|
@@ -356,7 +362,31 @@ export async function writeOutput(output, path = DEFAULT_OUTPUT_PATH) {
|
|
|
356
362
|
await mkdir(dirname(path), { recursive: true });
|
|
357
363
|
await writeFile(path, `${JSON.stringify(output, null, 2)}\n`, "utf8");
|
|
358
364
|
}
|
|
365
|
+
function validateWireSourceUrl(source, index) {
|
|
366
|
+
if (!isRecord(source) || source.url === undefined)
|
|
367
|
+
return;
|
|
368
|
+
parseReviewSourceUrl(source.url, `result.sources[${index}].url`, typeof source.id === "string" ? source.id : undefined);
|
|
369
|
+
}
|
|
370
|
+
function validateWireFindingSourceIds(finding, index, field) {
|
|
371
|
+
if (!isRecord(finding))
|
|
372
|
+
return;
|
|
373
|
+
validateSourceIds(finding.sourceIds, `result.${field}[${index}].sourceIds`);
|
|
374
|
+
}
|
|
375
|
+
function validateEnvelopeSourceInputs(output) {
|
|
376
|
+
if (!isRecord(output) || !isRecord(output.result))
|
|
377
|
+
return;
|
|
378
|
+
const result = output.result;
|
|
379
|
+
if (Array.isArray(result.sources))
|
|
380
|
+
result.sources.forEach(validateWireSourceUrl);
|
|
381
|
+
for (const field of ["findings", "suppressedFindings"]) {
|
|
382
|
+
const findings = result[field];
|
|
383
|
+
if (!Array.isArray(findings))
|
|
384
|
+
continue;
|
|
385
|
+
findings.forEach((finding, index) => validateWireFindingSourceIds(finding, index, field));
|
|
386
|
+
}
|
|
387
|
+
}
|
|
359
388
|
export async function validateRunEnvelope(output) {
|
|
389
|
+
validateEnvelopeSourceInputs(output);
|
|
360
390
|
let validator = envelopeValidator;
|
|
361
391
|
if (validator === undefined) {
|
|
362
392
|
const schema = JSON.parse(await readFile(new URL("../schemas/adversary.review.v1.schema.json", import.meta.url), "utf8"));
|
|
@@ -366,6 +396,11 @@ export async function validateRunEnvelope(output) {
|
|
|
366
396
|
if (!validator(output)) {
|
|
367
397
|
throw new Error(`Invalid adversary.review.v1 envelope: ${JSON.stringify(validator.errors)}`);
|
|
368
398
|
}
|
|
399
|
+
const result = output.result;
|
|
400
|
+
assertResultSourceReferences(result, result.sources ?? []);
|
|
401
|
+
for (const [index, source] of (result.sources ?? []).entries()) {
|
|
402
|
+
validateReviewSourceBudget(source, `result.sources[${index}]`);
|
|
403
|
+
}
|
|
369
404
|
}
|
|
370
405
|
export function normalizeConfidence(confidence, thresholds = DEFAULT_CONFIDENCE_THRESHOLDS) {
|
|
371
406
|
if (isConfidence(confidence)) {
|
|
@@ -630,19 +665,25 @@ function createRuleContext(repoPath, change, summary, cache, collector, registry
|
|
|
630
665
|
return loadInScopeSourcesImpl(absoluteRepoPath, change, options);
|
|
631
666
|
},
|
|
632
667
|
observe(observation) {
|
|
633
|
-
assertObservationInit(observation, "ctx.observe", registry);
|
|
668
|
+
assertObservationInit(observation, "ctx.observe", registry, collector.observations.length);
|
|
634
669
|
collector.observations.push(observation);
|
|
635
670
|
},
|
|
636
671
|
finding(finding) {
|
|
637
|
-
assertFindingInput(finding, "ctx.finding");
|
|
672
|
+
assertFindingInput(finding, "ctx.finding", collector.findings.length);
|
|
638
673
|
collector.findings.push({
|
|
639
674
|
finding: normalizeFindingInput(finding, collector.findings.length),
|
|
640
675
|
deduplicate: finding.deduplicate !== false,
|
|
641
676
|
});
|
|
642
677
|
},
|
|
643
678
|
review: {
|
|
679
|
+
source(source) {
|
|
680
|
+
const normalized = normalizeReviewSource(source, "ctx.review.source");
|
|
681
|
+
if (!collector.sources.has(normalized.id) && collector.sources.size >= 32)
|
|
682
|
+
throw new ReviewSourceCapacityError(normalized.id);
|
|
683
|
+
collector.sources.set(normalized.id, normalized);
|
|
684
|
+
},
|
|
644
685
|
incomplete(reason) {
|
|
645
|
-
if (!["candidate_validation", "assessment_validation"].includes(reason))
|
|
686
|
+
if (!["candidate_validation", "assessment_validation", "source_coverage"].includes(reason))
|
|
646
687
|
throw new TypeError("Invalid incomplete review reason.");
|
|
647
688
|
collector.incomplete = true;
|
|
648
689
|
collector.incompleteBlocking ||= collector.opinion?.ship === false;
|
|
@@ -735,6 +776,7 @@ function globPatternToRegExp(pattern) {
|
|
|
735
776
|
}
|
|
736
777
|
function createReviewCollector() {
|
|
737
778
|
return {
|
|
779
|
+
sources: new Map(),
|
|
738
780
|
observations: [],
|
|
739
781
|
findings: [],
|
|
740
782
|
positives: [],
|
|
@@ -743,6 +785,7 @@ function createReviewCollector() {
|
|
|
743
785
|
};
|
|
744
786
|
}
|
|
745
787
|
function buildReviewResult(input) {
|
|
788
|
+
assertCollectedSourceReferences(input.collector);
|
|
746
789
|
const thresholds = input.policy.confidenceThresholds ?? DEFAULT_CONFIDENCE_THRESHOLDS;
|
|
747
790
|
const synthesis = synthesizeObservationFindings(input.collector.observations, thresholds, input.registry);
|
|
748
791
|
const allFindings = deduplicateFindings([
|
|
@@ -766,6 +809,7 @@ function buildReviewResult(input) {
|
|
|
766
809
|
eligible.push(finding);
|
|
767
810
|
}
|
|
768
811
|
}
|
|
812
|
+
recordIncompleteSourceCoverage(input.collector);
|
|
769
813
|
const positives = selectPositiveSignals(input.collector.positives);
|
|
770
814
|
const reviewObservations = deduplicateReviewObservations([
|
|
771
815
|
...input.collector.reviewObservations,
|
|
@@ -781,6 +825,7 @@ function buildReviewResult(input) {
|
|
|
781
825
|
assessment,
|
|
782
826
|
positives,
|
|
783
827
|
observations: reviewObservations,
|
|
828
|
+
sources: input.collector.sources.size ? [...input.collector.sources.values()] : undefined,
|
|
784
829
|
findings: eligible,
|
|
785
830
|
opinion,
|
|
786
831
|
suppressed: {
|
|
@@ -792,6 +837,48 @@ function buildReviewResult(input) {
|
|
|
792
837
|
rawObservations: input.includeRawObservations ? input.collector.observations : undefined,
|
|
793
838
|
});
|
|
794
839
|
}
|
|
840
|
+
function sourceReferenceField(caller, ruleId, index) {
|
|
841
|
+
return `${caller}${ruleId ? ` (rule ${ruleId})` : ""}${index === undefined ? "" : `[${index}]`}.sourceIds`;
|
|
842
|
+
}
|
|
843
|
+
function assertCollectedSourceReferences(collector) {
|
|
844
|
+
for (const [index, observation] of collector.observations.entries())
|
|
845
|
+
assertSourceReferences(observation.sourceIds, collector.sources, sourceReferenceField("ctx.observe", observation.ruleId, index));
|
|
846
|
+
for (const [index, { finding }] of collector.findings.entries())
|
|
847
|
+
assertSourceReferences(finding.sourceIds, collector.sources, sourceReferenceField("ctx.finding", finding.ruleId, index));
|
|
848
|
+
}
|
|
849
|
+
function assertSourceReferences(sourceIds, sources, field) {
|
|
850
|
+
validateSourceIds(sourceIds, field);
|
|
851
|
+
const unknown = sourceIds?.find((id) => !sources.has(id));
|
|
852
|
+
if (unknown !== undefined)
|
|
853
|
+
throw new ReviewSourceValidationError(field, "Unknown review source", unknown);
|
|
854
|
+
}
|
|
855
|
+
function assertFindingSourceReferences(findings, sources, label) {
|
|
856
|
+
findings.forEach((finding, index) => assertSourceReferences(finding.sourceIds, sources, `${label}[${index}].sourceIds`));
|
|
857
|
+
}
|
|
858
|
+
function assertResultSourceReferences(result, sources) {
|
|
859
|
+
const byId = new Map();
|
|
860
|
+
for (const [index, source] of sources.entries()) {
|
|
861
|
+
if (byId.has(source.id))
|
|
862
|
+
throw new ReviewSourceValidationError(`result.sources[${index}].id`, "duplicate source ID", source.id);
|
|
863
|
+
byId.set(source.id, source);
|
|
864
|
+
}
|
|
865
|
+
assertFindingSourceReferences(result.findings, byId, "result.findings");
|
|
866
|
+
assertFindingSourceReferences(result.suppressedFindings ?? [], byId, "result.suppressedFindings");
|
|
867
|
+
}
|
|
868
|
+
function recordIncompleteSourceCoverage(collector) {
|
|
869
|
+
if (![...collector.sources.values()].some((source) => ["error", "partial", "unavailable"].includes(source.status)))
|
|
870
|
+
return;
|
|
871
|
+
collector.incomplete = true;
|
|
872
|
+
collector.reviewObservations.push({
|
|
873
|
+
key: "code-review.coverage-gap.sources",
|
|
874
|
+
summary: "One or more reported evidence sources are incomplete.",
|
|
875
|
+
metadata: {
|
|
876
|
+
role: "context",
|
|
877
|
+
incomplete: true,
|
|
878
|
+
reason: "source_coverage",
|
|
879
|
+
},
|
|
880
|
+
});
|
|
881
|
+
}
|
|
795
882
|
function resolveReviewConclusion(collector, findings, positives, change) {
|
|
796
883
|
const assessment = collector.assessment ?? synthesizeAssessment(findings, positives);
|
|
797
884
|
if (!collector.incomplete) {
|
|
@@ -863,6 +950,9 @@ function synthesizeObservationFindings(observations, thresholds, registry) {
|
|
|
863
950
|
remediation: synthesis.remediation ?? first.remediation,
|
|
864
951
|
tags: synthesis.tags ?? uniqueStrings(group.flatMap((observation) => observation.tags ?? [])),
|
|
865
952
|
metadata: synthesis.metadata ?? first.metadata,
|
|
953
|
+
...(group.some((item) => item.sourceIds?.length)
|
|
954
|
+
? { sourceIds: uniqueStrings(group.flatMap((item) => item.sourceIds ?? [])) }
|
|
955
|
+
: {}),
|
|
866
956
|
};
|
|
867
957
|
assertFindingInput(finding, `adversary aggregate rule "${first.ruleId}"`);
|
|
868
958
|
return finding;
|
|
@@ -898,8 +988,14 @@ function normalizeFindingInput(input, occurrence = 0) {
|
|
|
898
988
|
remediation: input.remediation,
|
|
899
989
|
tags: input.tags === undefined ? undefined : uniqueStrings(input.tags),
|
|
900
990
|
metadata: input.metadata,
|
|
991
|
+
sourceIds: input.sourceIds === undefined ? undefined : uniqueStrings(input.sourceIds),
|
|
901
992
|
});
|
|
902
993
|
}
|
|
994
|
+
function mergeSourceIds(left, right) {
|
|
995
|
+
if (!left?.length && !right?.length)
|
|
996
|
+
return left;
|
|
997
|
+
return uniqueStrings([...(left ?? []), ...(right ?? [])]);
|
|
998
|
+
}
|
|
903
999
|
function deduplicateFindings(findings) {
|
|
904
1000
|
const seen = new Set();
|
|
905
1001
|
const result = [];
|
|
@@ -914,6 +1010,9 @@ function deduplicateFindings(findings) {
|
|
|
914
1010
|
const existing = result.find((item) => (item.groupKey ?? item.id) === key);
|
|
915
1011
|
if (existing !== undefined) {
|
|
916
1012
|
existing.evidence = deduplicateEvidence([...existing.evidence, ...finding.evidence]);
|
|
1013
|
+
const sourceIds = mergeSourceIds(existing.sourceIds, finding.sourceIds);
|
|
1014
|
+
if (sourceIds !== undefined)
|
|
1015
|
+
existing.sourceIds = sourceIds;
|
|
917
1016
|
existing.tags = uniqueStrings([...(existing.tags ?? []), ...(finding.tags ?? [])]);
|
|
918
1017
|
}
|
|
919
1018
|
continue;
|
|
@@ -1825,7 +1924,7 @@ function stableStringify(value) {
|
|
|
1825
1924
|
function uniqueStrings(values) {
|
|
1826
1925
|
return [...new Set(values.filter(isNonEmptyString))].sort(compareStrings);
|
|
1827
1926
|
}
|
|
1828
|
-
function assertObservationInit(value, source, registry) {
|
|
1927
|
+
function assertObservationInit(value, source, registry, index) {
|
|
1829
1928
|
requireString(value.ruleId, `${source}.ruleId`);
|
|
1830
1929
|
requireString(value.subject, `${source}.subject`);
|
|
1831
1930
|
requireObservationTitle(value.title, `${source}.title`);
|
|
@@ -1852,8 +1951,9 @@ function assertObservationInit(value, source, registry) {
|
|
|
1852
1951
|
optionalString(value.groupKey, `${source}.groupKey`);
|
|
1853
1952
|
optionalStringArray(value.groupBy, `${source}.groupBy`);
|
|
1854
1953
|
optionalStringArray(value.tags, `${source}.tags`);
|
|
1954
|
+
validateSourceIds(value.sourceIds, sourceReferenceField(source, value.ruleId, index));
|
|
1855
1955
|
}
|
|
1856
|
-
function assertFindingInput(value, source) {
|
|
1956
|
+
function assertFindingInput(value, source, index) {
|
|
1857
1957
|
requireString(value.title, `${source}.title`);
|
|
1858
1958
|
requireString(value.category, `${source}.category`);
|
|
1859
1959
|
requireString(value.summary, `${source}.summary`);
|
|
@@ -1871,6 +1971,7 @@ function assertFindingInput(value, source) {
|
|
|
1871
1971
|
optionalString(value.ruleId, `${source}.ruleId`);
|
|
1872
1972
|
optionalString(value.groupKey, `${source}.groupKey`);
|
|
1873
1973
|
optionalStringArray(value.tags, `${source}.tags`);
|
|
1974
|
+
validateSourceIds(value.sourceIds, sourceReferenceField(source, value.ruleId, index));
|
|
1874
1975
|
optionalRemediation(value.remediation, `${source}.remediation`);
|
|
1875
1976
|
}
|
|
1876
1977
|
function assertReviewNote(value, source) {
|