* fix(kuna): name the setting that owns a timed-out Kuna run A Kuna run past its deadline surfaced the generic "Analysis took too long. Try a smaller request" message. The request is already one function or one whole-program scan, and the same run takes as long again, so the advice was wrong and REA_KUNA_TIMEOUT_MS or REA_KUNA_PROJECT_TIMEOUT_MS was never mentioned. Each Kuna command now carries a KunaDeadline: the configured milliseconds and the setting that owns them, from KunaConfiguration. A timeout reports, for example, "kuna decompile did not finish within REA_KUNA_TIMEOUT_MS (120000 ms)." Its remediation says to raise that setting and restart REA, and for a single-function decompile that the session's project export can still answer. AnalysisTimeoutError now accepts a producer message and remediation, which projection uses and per-waiter scan errors keep. Refs #1957 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(kuna): scope the provider_timeout statement to direct Kuna runs A timed-out project export is reported through the export failure as capability_unavailable, not provider_timeout. Refs #1957 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(kuna): verify native xrefs under the project deadline The provider's xrefs scan runs under REA_KUNA_PROJECT_TIMEOUT_MS, but the native oracle in verify:kuna aborted at REA_KUNA_TIMEOUT_MS. A scan that fit the project deadline but not the function deadline failed verification although the provider answered it. Use the same deadline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
55 lines
2.0 KiB
JavaScript
55 lines
2.0 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { realpath } from "node:fs/promises";
|
|
|
|
import { runKunaCommand } from "../../dist/kuna/KunaCommand.js";
|
|
import { kunaProjectDeadline } from "../../dist/kuna/KunaConfiguration.js";
|
|
import { inspectKunaInstallation } from "../../dist/kuna/KunaInstallation.js";
|
|
import { KUNA_XREF_OUTPUT_BYTES } from "../../dist/kuna/KunaReferenceFiles.js";
|
|
|
|
/** Independent projection of native exact-target rows, bypassing REA's parser. */
|
|
export const nativeKunaIncomingSites = async ({
|
|
executable,
|
|
cacheRoot,
|
|
workspace,
|
|
binary,
|
|
address,
|
|
retain,
|
|
fileCloseResources,
|
|
}) => {
|
|
const installed = await inspectKunaInstallation(
|
|
{
|
|
REA_KUNA_COMMAND: executable,
|
|
REA_KUNA_CACHE_DIR: cacheRoot,
|
|
},
|
|
{ fileCloseResources },
|
|
);
|
|
assert.ok(installed.ok, "Native reference oracle could not inspect Kuna");
|
|
const input = await realpath(binary);
|
|
// Match the provider's own xrefs scan, which runs under the project deadline.
|
|
const deadline = kunaProjectDeadline(installed.value.configuration);
|
|
const outcome = await runKunaCommand({
|
|
installation: installed.value,
|
|
arguments: ["xrefs", input, "--to", address, "--json"],
|
|
workspace,
|
|
operation: "verify:kuna-native-xrefs",
|
|
timeoutMs: deadline.ms,
|
|
deadline,
|
|
outputBytes: KUNA_XREF_OUTPUT_BYTES,
|
|
signal: new AbortController().signal,
|
|
retainFailedFileClose: (owner, resource) =>
|
|
fileCloseResources.retain(owner, resource),
|
|
});
|
|
if (outcome.kind === "retained") retain(outcome);
|
|
if (outcome.kind !== "ok") throw outcome.error;
|
|
const document = JSON.parse(outcome.snapshot.stdout.text);
|
|
assert.equal(document.binary, input);
|
|
assert.equal(document.direction, "to");
|
|
assert.equal(document.target.address_hex, address);
|
|
assert.equal(document.count, document.xrefs.length);
|
|
const sites = document.xrefs
|
|
.filter((row) => row.to_address_hex === address)
|
|
.map((row) => row.from_address_hex);
|
|
assert.ok(sites.every((site) => /^0x[0-9a-f]+$/u.test(site)));
|
|
return [...new Set(sites)].sort();
|
|
};
|