Files
reverse-engineering-anything/tests/boundary/providers/fixedAllowanceRecovery.test.ts
T
morluto f3ed1657f8 feat(mcp): support runtime analysis limit recovery (#7049)
* feat(mcp): support runtime analysis limit recovery

* refactor(config): remove unused limit re-exports

* fix(android): keep fixture release metadata dependency-free

* fix(settings): preserve provider budgets and recovery facts

* fix(tests): resolve lint plugins from their repository owner

* refactor(mcp): verify guidance delivery without frozen wording

* fix(android): align availability with runtime timeout

* test(recovery): assert limit facts instead of frozen wording

* fix(mcp): share runtime settings with the default JADX provider

* test(mcp): bound acknowledgements and release held work on failure

* fix(catalog): declare runtime settings tools as MCP-only
2026-10-25 09:45:26 +08:00

80 lines
2.8 KiB
TypeScript

import { analysisSettingLimit } from "../../../src/domain/analysisSettingDefinitions.js";
import { expect, it } from "vitest";
import { AnalysisResourceConstraintError } from "../../../src/domain/analysisErrorCore.js";
import type { AnalysisError } from "../../../src/domain/analysisErrorBase.js";
import { projectAnalysisError } from "../../../src/domain/analysisErrorProjection.js";
import { redactExplicitFailure } from "../../../src/domain/explicitSensitiveFailure.js";
import {
fixedAllowanceOptions,
fixedAllowanceRemediation,
} from "../../../src/domain/fixedAllowanceRemediation.js";
import { analysisClientFailureForOperation } from "../../../src/providers/AnalysisClientFailure.js";
const refusal = () =>
new AnalysisResourceConstraintError(
"provider_stage",
"memory",
"decoded representation exceeds the fixture allowance",
{ maximum_decoded_bytes: 64 },
fixedAllowanceOptions(
"The explicit-secret fixture decode allowance",
"parser",
),
);
it.each([
{
boundary: "operation attribution",
copy: (error: AnalysisError) =>
analysisClientFailureForOperation(error, "fixture", "inspect_fixture"),
allowance: "The explicit-secret fixture decode allowance",
},
{
boundary: "explicit redaction",
copy: (error: AnalysisError) =>
redactExplicitFailure(error, ["explicit-secret"]),
allowance: "The [REDACTED] fixture decode allowance",
},
])(
"keeps a fixed allowance's derived recovery through $boundary",
({ copy, allowance }) => {
const copied = copy(refusal());
expect(copied).toBeInstanceOf(AnalysisResourceConstraintError);
expect(copied).toMatchObject({
fixedAllowance: { name: allowance, kind: "parser" },
remediationAction: undefined,
retryable: false,
});
expect(projectAnalysisError(copied)).toMatchObject({
code: "resource_constraint",
retryable: false,
remediation: { action: fixedAllowanceRemediation(allowance, "parser") },
details: { reported_limits: { maximum_decoded_bytes: 64 } },
});
},
);
it.each(["operation attribution", "explicit redaction"])(
"preserves structured adjustable limits through %s",
(boundary) => {
const original = refusal().bindLimit(
analysisSettingLimit("regex.matching_deadline_ms", 123, "runtime"),
);
const copied =
boundary === "operation attribution"
? analysisClientFailureForOperation(
original,
"hopper",
"search_strings",
)
: redactExplicitFailure(original, ["explicit-secret"]);
expect(copied).not.toBe(original);
expect(copied.limit).toEqual(original.limit);
expect(projectAnalysisError(copied)).toMatchObject({
details: { limit: original.limit },
});
expect(original.message).toContain("fixture allowance");
},
);