@nifrajs/agent-review 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/dist/canonical.d.ts +11 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +148 -0
- package/dist/canonical.js.map +1 -0
- package/dist/compose.d.ts +8 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +123 -0
- package/dist/compose.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +18 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +664 -0
- package/dist/parser.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +46 -0
- package/src/canonical.ts +174 -0
- package/src/compose.ts +153 -0
- package/src/index.ts +15 -0
- package/src/parser.ts +902 -0
- package/src/types.ts +174 -0
package/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# @nifrajs/agent-review
|
|
2
|
+
|
|
3
|
+
`@nifrajs/agent-review` is a small, provider-neutral contract for bounded review results. It is a
|
|
4
|
+
leaf package: it does not run checks, read a repository, invoke fixes, provide a CLI, or persist
|
|
5
|
+
review data.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { composeReviewReport, parseReviewReport } from "@nifrajs/agent-review"
|
|
9
|
+
|
|
10
|
+
const report = await composeReviewReport({
|
|
11
|
+
strict: false,
|
|
12
|
+
scope: {
|
|
13
|
+
kind: "project",
|
|
14
|
+
state: "valid",
|
|
15
|
+
changedPaths: [],
|
|
16
|
+
pathDigest: "a".repeat(64),
|
|
17
|
+
outOfScopeCount: 0,
|
|
18
|
+
},
|
|
19
|
+
checks: [],
|
|
20
|
+
findings: [],
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const verified = await parseReviewReport(JSON.stringify(report))
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The parser accepts a JSON string or an unknown value and fails closed. It rejects unknown keys and
|
|
27
|
+
content-bearing keys such as `message`, `prompt`, `output`, `payload`, `body`, and `secret` at any
|
|
28
|
+
depth. Findings carry only stable codes, structural categories, safe locations, and opaque
|
|
29
|
+
evidence references; they do not carry diagnostic messages, source text, requests, responses, or
|
|
30
|
+
model content.
|
|
31
|
+
|
|
32
|
+
Reports are limited to 256 KiB, depth 8, 32 keys per object, 1,024 array items, 512-byte paths,
|
|
33
|
+
256-byte Git references, and bounded identifiers. Paths are project-relative POSIX paths. Parsed
|
|
34
|
+
reports are deeply frozen. Report status, blocking count, and success are derived and verified;
|
|
35
|
+
callers cannot make an invalid report pass by changing those fields.
|
|
36
|
+
|
|
37
|
+
Canonical report digests use lowercase Web Crypto SHA-256. Check duration is display-only and is
|
|
38
|
+
excluded from the digest, so equivalent structure has the same identity across runtimes and timing.
|
|
39
|
+
The package uses no runtime dependencies, filesystem access, environment reads, provider SDKs, or
|
|
40
|
+
Nifra package imports. It relies on `globalThis.crypto.subtle` and `TextEncoder`, which are available
|
|
41
|
+
in Bun, modern Node, Deno, Workers, and browsers.
|
|
42
|
+
|
|
43
|
+
The composer accepts only the typed structural inputs already produced by a trusted collector. It
|
|
44
|
+
sorts and copies them, derives the outcome, signs the canonical report, and runs the same parser
|
|
45
|
+
boundary before returning it. Repository collectors, CLI/MCP projections, SARIF, and safe fix
|
|
46
|
+
recipes belong in higher-level packages.
|
|
47
|
+
|
|
48
|
+
For coding agents, see [`LLM.md`](./LLM.md). The full machine-readable corpus is [`../../llms-full.txt`](../../llms-full.txt).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ReviewReport } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Return the stable UTF-8 text that identifies a review report's structural result.
|
|
4
|
+
*
|
|
5
|
+
* The report digest and check duration are omitted. Arrays are copied into their contract-defined
|
|
6
|
+
* order, while object keys are sorted recursively. No caller-owned object is mutated.
|
|
7
|
+
*/
|
|
8
|
+
export declare function canonicalizeReviewReport(report: ReviewReport): string;
|
|
9
|
+
/** Compute a lowercase Web Crypto SHA-256 digest of the canonical report representation. */
|
|
10
|
+
export declare function digestReviewReport(report: ReviewReport): Promise<string>;
|
|
11
|
+
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,YAAY,EACb,MAAM,YAAY,CAAA;AAqInB;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAqBrE;AAED,4FAA4F;AAC5F,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAI9E"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
function isPlainRecord(value) {
|
|
2
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
3
|
+
return false;
|
|
4
|
+
const prototype = Object.getPrototypeOf(value);
|
|
5
|
+
return prototype === Object.prototype || prototype === null;
|
|
6
|
+
}
|
|
7
|
+
function compareText(left, right) {
|
|
8
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
9
|
+
}
|
|
10
|
+
function optionalText(value) {
|
|
11
|
+
return value ?? "";
|
|
12
|
+
}
|
|
13
|
+
function compareEvidence(left, right) {
|
|
14
|
+
return (compareText(left.source, right.source) ||
|
|
15
|
+
compareText(left.token, right.token) ||
|
|
16
|
+
compareText(left.digest, right.digest) ||
|
|
17
|
+
compareText(optionalText(left.path), optionalText(right.path)));
|
|
18
|
+
}
|
|
19
|
+
function compareFinding(left, right) {
|
|
20
|
+
return compareText(left.id, right.id);
|
|
21
|
+
}
|
|
22
|
+
function compareCheck(left, right) {
|
|
23
|
+
return compareText(left.id, right.id);
|
|
24
|
+
}
|
|
25
|
+
function compareFix(left, right) {
|
|
26
|
+
const leftPaths = left.changedPaths?.join("\u0000") ?? "";
|
|
27
|
+
const rightPaths = right.changedPaths?.join("\u0000") ?? "";
|
|
28
|
+
return (compareText(left.recipe, right.recipe) ||
|
|
29
|
+
compareText(left.status, right.status) ||
|
|
30
|
+
compareText(leftPaths, rightPaths) ||
|
|
31
|
+
compareText(optionalText(left.reasonCode), optionalText(right.reasonCode)));
|
|
32
|
+
}
|
|
33
|
+
function canonicalValue(value) {
|
|
34
|
+
if (value === null)
|
|
35
|
+
return "null";
|
|
36
|
+
if (typeof value === "string" || typeof value === "boolean")
|
|
37
|
+
return JSON.stringify(value);
|
|
38
|
+
if (typeof value === "number") {
|
|
39
|
+
if (!Number.isFinite(value) || Object.is(value, -0))
|
|
40
|
+
throw new TypeError("review canonical value must contain finite numbers other than -0");
|
|
41
|
+
return JSON.stringify(value);
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(value))
|
|
44
|
+
return `[${value.map((item) => canonicalValue(item)).join(",")}]`;
|
|
45
|
+
if (!isPlainRecord(value))
|
|
46
|
+
throw new TypeError("review canonical value must contain plain objects");
|
|
47
|
+
const keys = Object.keys(value).sort(compareText);
|
|
48
|
+
return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalValue(value[key])}`).join(",")}}`;
|
|
49
|
+
}
|
|
50
|
+
function sortedEvidence(value) {
|
|
51
|
+
return [...value]
|
|
52
|
+
.map((entry) => ({
|
|
53
|
+
source: entry.source,
|
|
54
|
+
token: entry.token,
|
|
55
|
+
digest: entry.digest,
|
|
56
|
+
...(entry.path === undefined ? {} : { path: entry.path }),
|
|
57
|
+
}))
|
|
58
|
+
.sort(compareEvidence);
|
|
59
|
+
}
|
|
60
|
+
function sortedFindings(value) {
|
|
61
|
+
return [...value]
|
|
62
|
+
.map((entry) => ({
|
|
63
|
+
id: entry.id,
|
|
64
|
+
check: entry.check,
|
|
65
|
+
code: entry.code,
|
|
66
|
+
severity: entry.severity,
|
|
67
|
+
category: entry.category,
|
|
68
|
+
...(entry.location === undefined
|
|
69
|
+
? {}
|
|
70
|
+
: {
|
|
71
|
+
location: {
|
|
72
|
+
path: entry.location.path,
|
|
73
|
+
...(entry.location.line === undefined ? {} : { line: entry.location.line }),
|
|
74
|
+
...(entry.location.column === undefined ? {} : { column: entry.location.column }),
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
evidence: sortedEvidence(entry.evidence),
|
|
78
|
+
...(entry.fix === undefined ? {} : { fix: { recipe: entry.fix.recipe } }),
|
|
79
|
+
}))
|
|
80
|
+
.sort(compareFinding);
|
|
81
|
+
}
|
|
82
|
+
function sortedChecks(value) {
|
|
83
|
+
return [...value]
|
|
84
|
+
.map((entry) => ({
|
|
85
|
+
id: entry.id,
|
|
86
|
+
required: entry.required,
|
|
87
|
+
status: entry.status,
|
|
88
|
+
// Duration is intentionally display-only and must not enter the digest.
|
|
89
|
+
counts: {
|
|
90
|
+
findings: entry.counts.findings,
|
|
91
|
+
errors: entry.counts.errors,
|
|
92
|
+
warnings: entry.counts.warnings,
|
|
93
|
+
info: entry.counts.info,
|
|
94
|
+
outOfScope: entry.counts.outOfScope,
|
|
95
|
+
},
|
|
96
|
+
findingIds: [...entry.findingIds].sort(compareText),
|
|
97
|
+
evidence: sortedEvidence(entry.evidence),
|
|
98
|
+
...(entry.reasonCode === undefined ? {} : { reasonCode: entry.reasonCode }),
|
|
99
|
+
}))
|
|
100
|
+
.sort(compareCheck);
|
|
101
|
+
}
|
|
102
|
+
function sortedFixes(value) {
|
|
103
|
+
return [...value]
|
|
104
|
+
.map((entry) => ({
|
|
105
|
+
recipe: entry.recipe,
|
|
106
|
+
status: entry.status,
|
|
107
|
+
...(entry.changedPaths === undefined
|
|
108
|
+
? {}
|
|
109
|
+
: { changedPaths: [...entry.changedPaths].sort(compareText) }),
|
|
110
|
+
...(entry.reasonCode === undefined ? {} : { reasonCode: entry.reasonCode }),
|
|
111
|
+
}))
|
|
112
|
+
.sort(compareFix);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Return the stable UTF-8 text that identifies a review report's structural result.
|
|
116
|
+
*
|
|
117
|
+
* The report digest and check duration are omitted. Arrays are copied into their contract-defined
|
|
118
|
+
* order, while object keys are sorted recursively. No caller-owned object is mutated.
|
|
119
|
+
*/
|
|
120
|
+
export function canonicalizeReviewReport(report) {
|
|
121
|
+
const value = {
|
|
122
|
+
version: report.version,
|
|
123
|
+
strict: report.strict,
|
|
124
|
+
scope: {
|
|
125
|
+
kind: report.scope.kind,
|
|
126
|
+
state: report.scope.state,
|
|
127
|
+
...(report.scope.gitRef === undefined ? {} : { gitRef: report.scope.gitRef }),
|
|
128
|
+
changedPaths: [...report.scope.changedPaths].sort(compareText),
|
|
129
|
+
pathDigest: report.scope.pathDigest,
|
|
130
|
+
outOfScopeCount: report.scope.outOfScopeCount,
|
|
131
|
+
...(report.scope.reasonCode === undefined ? {} : { reasonCode: report.scope.reasonCode }),
|
|
132
|
+
},
|
|
133
|
+
checks: sortedChecks(report.checks),
|
|
134
|
+
findings: sortedFindings(report.findings),
|
|
135
|
+
...(report.fixes === undefined ? {} : { fixes: sortedFixes(report.fixes) }),
|
|
136
|
+
blocking: report.blocking,
|
|
137
|
+
ok: report.ok,
|
|
138
|
+
status: report.status,
|
|
139
|
+
};
|
|
140
|
+
return canonicalValue(value);
|
|
141
|
+
}
|
|
142
|
+
/** Compute a lowercase Web Crypto SHA-256 digest of the canonical report representation. */
|
|
143
|
+
export async function digestReviewReport(report) {
|
|
144
|
+
const bytes = new TextEncoder().encode(canonicalizeReviewReport(report));
|
|
145
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", bytes);
|
|
146
|
+
return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=canonical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ReviewReport, type ReviewReportDraft } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compose a report from already-sanitized structural values. This function has no repository,
|
|
4
|
+
* collector, CLI, filesystem, provider, or persistence access. The parser is run once more over
|
|
5
|
+
* the assembled value so the returned report has the same boundary guarantees as external input.
|
|
6
|
+
*/
|
|
7
|
+
export declare function composeReviewReport(input: ReviewReportDraft): Promise<ReviewReport>;
|
|
8
|
+
//# sourceMappingURL=compose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,iBAAiB,EAEvB,MAAM,YAAY,CAAA;AA2GnB;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6BzF"}
|
package/dist/compose.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { digestReviewReport } from "./canonical.js";
|
|
2
|
+
import { parseReviewReport } from "./parser.js";
|
|
3
|
+
import { REVIEW_REPORT_VERSION, } from "./types.js";
|
|
4
|
+
function compareText(left, right) {
|
|
5
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
6
|
+
}
|
|
7
|
+
function copyEvidence(value) {
|
|
8
|
+
return [...value]
|
|
9
|
+
.map((entry) => ({
|
|
10
|
+
source: entry.source,
|
|
11
|
+
token: entry.token,
|
|
12
|
+
digest: entry.digest,
|
|
13
|
+
...(entry.path === undefined ? {} : { path: entry.path }),
|
|
14
|
+
}))
|
|
15
|
+
.sort((left, right) => compareText(left.source, right.source) ||
|
|
16
|
+
compareText(left.token, right.token) ||
|
|
17
|
+
compareText(left.digest, right.digest) ||
|
|
18
|
+
compareText(left.path ?? "", right.path ?? ""));
|
|
19
|
+
}
|
|
20
|
+
function copyScope(value) {
|
|
21
|
+
return {
|
|
22
|
+
kind: value.kind,
|
|
23
|
+
state: value.state,
|
|
24
|
+
...(value.gitRef === undefined ? {} : { gitRef: value.gitRef }),
|
|
25
|
+
changedPaths: [...value.changedPaths].sort(compareText),
|
|
26
|
+
pathDigest: value.pathDigest,
|
|
27
|
+
outOfScopeCount: value.outOfScopeCount,
|
|
28
|
+
...(value.reasonCode === undefined ? {} : { reasonCode: value.reasonCode }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function copyFinding(value) {
|
|
32
|
+
return {
|
|
33
|
+
id: value.id,
|
|
34
|
+
check: value.check,
|
|
35
|
+
code: value.code,
|
|
36
|
+
severity: value.severity,
|
|
37
|
+
category: value.category,
|
|
38
|
+
...(value.location === undefined
|
|
39
|
+
? {}
|
|
40
|
+
: {
|
|
41
|
+
location: {
|
|
42
|
+
path: value.location.path,
|
|
43
|
+
...(value.location.line === undefined ? {} : { line: value.location.line }),
|
|
44
|
+
...(value.location.column === undefined ? {} : { column: value.location.column }),
|
|
45
|
+
},
|
|
46
|
+
}),
|
|
47
|
+
evidence: copyEvidence(value.evidence),
|
|
48
|
+
...(value.fix === undefined ? {} : { fix: { recipe: value.fix.recipe } }),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function copyCheck(value) {
|
|
52
|
+
return {
|
|
53
|
+
id: value.id,
|
|
54
|
+
required: value.required,
|
|
55
|
+
status: value.status,
|
|
56
|
+
duration: value.duration,
|
|
57
|
+
counts: {
|
|
58
|
+
findings: value.counts.findings,
|
|
59
|
+
errors: value.counts.errors,
|
|
60
|
+
warnings: value.counts.warnings,
|
|
61
|
+
info: value.counts.info,
|
|
62
|
+
outOfScope: value.counts.outOfScope,
|
|
63
|
+
},
|
|
64
|
+
findingIds: [...value.findingIds].sort(compareText),
|
|
65
|
+
evidence: copyEvidence(value.evidence),
|
|
66
|
+
...(value.reasonCode === undefined ? {} : { reasonCode: value.reasonCode }),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function copyFix(value) {
|
|
70
|
+
return {
|
|
71
|
+
recipe: value.recipe,
|
|
72
|
+
status: value.status,
|
|
73
|
+
...(value.changedPaths === undefined
|
|
74
|
+
? {}
|
|
75
|
+
: { changedPaths: [...value.changedPaths].sort(compareText) }),
|
|
76
|
+
...(value.reasonCode === undefined ? {} : { reasonCode: value.reasonCode }),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function deriveOutcome(strict, scope, checks, findings, fixes) {
|
|
80
|
+
const errors = findings.filter((finding) => finding.severity === "error").length;
|
|
81
|
+
const warnings = findings.filter((finding) => finding.severity === "warning").length;
|
|
82
|
+
const unresolvedFixes = fixes?.filter((fix) => fix.status === "no-op" || fix.status === "failed").length ?? 0;
|
|
83
|
+
const blocking = errors + (strict ? warnings : 0) + unresolvedFixes;
|
|
84
|
+
const inconclusive = scope.state === "invalid" ||
|
|
85
|
+
checks.some((check) => check.required && (check.status === "unavailable" || check.status === "error"));
|
|
86
|
+
const status = inconclusive ? "inconclusive" : blocking > 0 ? "fail" : "pass";
|
|
87
|
+
return { blocking, status, ok: status === "pass" };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Compose a report from already-sanitized structural values. This function has no repository,
|
|
91
|
+
* collector, CLI, filesystem, provider, or persistence access. The parser is run once more over
|
|
92
|
+
* the assembled value so the returned report has the same boundary guarantees as external input.
|
|
93
|
+
*/
|
|
94
|
+
export async function composeReviewReport(input) {
|
|
95
|
+
const scope = copyScope(input.scope);
|
|
96
|
+
const checks = [...input.checks]
|
|
97
|
+
.map(copyCheck)
|
|
98
|
+
.sort((left, right) => compareText(left.id, right.id));
|
|
99
|
+
const findings = [...input.findings]
|
|
100
|
+
.map(copyFinding)
|
|
101
|
+
.sort((left, right) => compareText(left.id, right.id));
|
|
102
|
+
const fixes = input.fixes === undefined
|
|
103
|
+
? undefined
|
|
104
|
+
: [...input.fixes].map(copyFix).sort((left, right) => {
|
|
105
|
+
const leftKey = `${left.recipe}\u0000${left.status}\u0000${left.changedPaths?.join("\u0000") ?? ""}`;
|
|
106
|
+
const rightKey = `${right.recipe}\u0000${right.status}\u0000${right.changedPaths?.join("\u0000") ?? ""}`;
|
|
107
|
+
return compareText(leftKey, rightKey);
|
|
108
|
+
});
|
|
109
|
+
const outcome = deriveOutcome(input.strict, scope, checks, findings, fixes);
|
|
110
|
+
const unsigned = {
|
|
111
|
+
version: REVIEW_REPORT_VERSION,
|
|
112
|
+
strict: input.strict,
|
|
113
|
+
scope,
|
|
114
|
+
checks,
|
|
115
|
+
findings,
|
|
116
|
+
...(fixes === undefined ? {} : { fixes }),
|
|
117
|
+
...outcome,
|
|
118
|
+
digest: "0".repeat(64),
|
|
119
|
+
};
|
|
120
|
+
const digest = await digestReviewReport(unsigned);
|
|
121
|
+
return parseReviewReport({ ...unsigned, digest });
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { canonicalizeReviewReport, digestReviewReport } from "./canonical.js";
|
|
2
|
+
export { composeReviewReport } from "./compose.js";
|
|
3
|
+
export { parseReviewReport, REVIEW_MAX_ARRAY_ITEMS, REVIEW_MAX_BYTES, REVIEW_MAX_CODE_BYTES, REVIEW_MAX_DEPTH, REVIEW_MAX_ID_BYTES, REVIEW_MAX_OBJECT_KEYS, REVIEW_MAX_PATH_BYTES, REVIEW_MAX_REF_BYTES, ReviewParserError, } from "./parser.js";
|
|
4
|
+
export * from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,cAAc,YAAY,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { canonicalizeReviewReport, digestReviewReport } from "./canonical.js";
|
|
2
|
+
export { composeReviewReport } from "./compose.js";
|
|
3
|
+
export { parseReviewReport, REVIEW_MAX_ARRAY_ITEMS, REVIEW_MAX_BYTES, REVIEW_MAX_CODE_BYTES, REVIEW_MAX_DEPTH, REVIEW_MAX_ID_BYTES, REVIEW_MAX_OBJECT_KEYS, REVIEW_MAX_PATH_BYTES, REVIEW_MAX_REF_BYTES, ReviewParserError, } from "./parser.js";
|
|
4
|
+
export * from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,cAAc,YAAY,CAAA"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ReviewParserErrorCode, type ReviewReport } from "./types.js";
|
|
2
|
+
export declare const REVIEW_MAX_BYTES: number;
|
|
3
|
+
export declare const REVIEW_MAX_DEPTH = 8;
|
|
4
|
+
export declare const REVIEW_MAX_OBJECT_KEYS = 32;
|
|
5
|
+
export declare const REVIEW_MAX_ARRAY_ITEMS = 1024;
|
|
6
|
+
export declare const REVIEW_MAX_PATH_BYTES = 512;
|
|
7
|
+
export declare const REVIEW_MAX_REF_BYTES = 256;
|
|
8
|
+
export declare const REVIEW_MAX_ID_BYTES = 128;
|
|
9
|
+
export declare const REVIEW_MAX_CODE_BYTES = 64;
|
|
10
|
+
/** Error raised for every malformed, unsafe, or payload-bearing report. */
|
|
11
|
+
export declare class ReviewParserError extends Error {
|
|
12
|
+
readonly code: ReviewParserErrorCode;
|
|
13
|
+
readonly path?: string;
|
|
14
|
+
constructor(code: ReviewParserErrorCode, path?: string);
|
|
15
|
+
}
|
|
16
|
+
/** Parse a JSON string or unknown value into a bounded, deeply frozen review report. */
|
|
17
|
+
export declare function parseReviewReport(input: unknown): Promise<ReviewReport>;
|
|
18
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AACA,OAAO,EAgBL,KAAK,qBAAqB,EAE1B,KAAK,YAAY,EAIlB,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,gBAAgB,QAAa,CAAA;AAC1C,eAAO,MAAM,gBAAgB,IAAI,CAAA;AACjC,eAAO,MAAM,sBAAsB,KAAK,CAAA;AACxC,eAAO,MAAM,sBAAsB,OAAO,CAAA;AAC1C,eAAO,MAAM,qBAAqB,MAAM,CAAA;AACxC,eAAO,MAAM,oBAAoB,MAAM,CAAA;AACvC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AACtC,eAAO,MAAM,qBAAqB,KAAK,CAAA;AAoGvC,2EAA2E;AAC3E,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAA;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;gBAEV,IAAI,EAAE,qBAAqB,EAAE,IAAI,CAAC,EAAE,MAAM;CAMvD;AAmuBD,wFAAwF;AACxF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAkB7E"}
|