mirror of
https://github.com/morluto/rea.git
synced 2026-11-10 16:57:19 +00:00
* refactor(analysis): centralize resource budgets and recovery facts * feat(analysis): expose ASAR and Ghidra runtime admission controls * feat(artifacts): expose reader admission and preserve limited recognition * feat(javascript): expose recoverable semantic precision budgets * feat(web): add recoverable source-map budgets and compact retained views * feat(web): make historical capture decoding budgets recoverable * fix(desktop): enforce selected view policies across capture and export * feat(runtime): make Frida and LLDB retention budgets selectable * feat(native): expose diagnostic budgets and preserve exhaustion causes * feat(managed): expose recoverable snapshot and representation budgets * feat(metadata): make Go and Rust inspection budgets recoverable * feat(wasm): expose representation and producer admissions * feat(evm): expose per-call worker resource budgets * feat(android): make resource and string-pool omissions recoverable * feat(producers): expose command and recorded-capture budgets * docs(analysis): record recovery contracts and integrated validation * fix(docs): link calibration oracle from published verification pages * fix(docs): restore desktop task anchors and receipt links * test(analysis): align fixtures with selectable budget contracts * fix(analysis): remove source-location projector dependency cycle * test(analysis): refresh budget recovery and verifier regressions * test(analysis): preserve format and publication recovery expectations * test(windows): align conformance with owned runtime admission * fix(desktop): preserve selected alias kinds in exported state * test(analysis): align provider fixtures with recoverable budgets * test(desktop): validate emitted alias metadata structurally * fix(ghidra): classify bounded Windows endpoint refusals * test(cli): assert selectable artifact admission recovery * fix(cli): preserve capture provenance in environment builds
69 lines
1.9 KiB
JavaScript
69 lines
1.9 KiB
JavaScript
import { readFile, writeFile } from "node:fs/promises";
|
|
import { createHash } from "node:crypto";
|
|
import { parse } from "@babel/parser";
|
|
const [output, ...files] = process.argv.slice(2);
|
|
const rows = [];
|
|
for (const file of files) {
|
|
const text = await readFile(file, "utf8");
|
|
const ast = parse(text, { sourceType: "unambiguous" });
|
|
const strings = [];
|
|
let nodes = 0;
|
|
const stack = [ast];
|
|
while (stack.length) {
|
|
const n = stack.pop();
|
|
if (!n || typeof n !== "object") continue;
|
|
if (Array.isArray(n)) {
|
|
stack.push(...n);
|
|
continue;
|
|
}
|
|
if (typeof n.type === "string") nodes++;
|
|
if (n.type === "StringLiteral") {
|
|
let oracle = false;
|
|
try {
|
|
oracle = JSON.parse(text.slice(n.start, n.end)) === n.value;
|
|
} catch {}
|
|
strings.push({
|
|
start: n.start,
|
|
end: n.end,
|
|
units: n.value.length,
|
|
jsonBytes: Buffer.byteLength(JSON.stringify(n.value)),
|
|
oracle,
|
|
});
|
|
}
|
|
if (
|
|
n.type === "TemplateLiteral" &&
|
|
n.expressions.length === 0 &&
|
|
n.quasis[0].value.cooked !== null
|
|
) {
|
|
const value = n.quasis[0].value.cooked;
|
|
const raw = text.slice(n.start + 1, n.end - 1);
|
|
strings.push({
|
|
start: n.start,
|
|
end: n.end,
|
|
units: value.length,
|
|
jsonBytes: Buffer.byteLength(JSON.stringify(value)),
|
|
oracle: !raw.includes("\\") && raw === value,
|
|
template: true,
|
|
});
|
|
}
|
|
for (const [k, v] of Object.entries(n))
|
|
if (
|
|
!["loc", "extra", "comments", "tokens"].includes(k) &&
|
|
v &&
|
|
typeof v === "object"
|
|
)
|
|
stack.push(v);
|
|
}
|
|
strings.sort((a, b) => b.units - a.units);
|
|
rows.push({
|
|
file,
|
|
bytes: Buffer.byteLength(text),
|
|
sha256: createHash("sha256").update(text).digest("hex"),
|
|
nodes,
|
|
strings: strings.length,
|
|
largest: strings.slice(0, 5),
|
|
});
|
|
}
|
|
await writeFile(output, JSON.stringify(rows, null, 2));
|
|
console.log(JSON.stringify(rows));
|