Return explicit method intents in reference indexes while preserving all full contracts, topic matching and complete MCP catalogs. Separate provider-free contracts from session admission and defer native loading until open. Validate 82 related tests, exact SDK/MCP full-contract parity, real zlib CLI/SDK reads and native/inspection cleanup retries. Freeze the unchanged two-level question for an order-reversed real-model repeat. Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com> Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>
105 lines
3.0 KiB
JavaScript
105 lines
3.0 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { parseByteFacts } from "./byte-facts.mjs";
|
|
import { AtomicSession } from "./session.mjs";
|
|
|
|
const make = () => ({
|
|
binary: "/input",
|
|
kind: "data",
|
|
start_hex: "0x20000000000001",
|
|
end_hex: "0x20000000000005",
|
|
count: 1,
|
|
bytes: 4,
|
|
hex: "00417fff",
|
|
truncated: false,
|
|
notes: [],
|
|
rows: [
|
|
{
|
|
address_hex: "0x20000000000001",
|
|
size: 4,
|
|
bytes: "00417fff",
|
|
},
|
|
],
|
|
});
|
|
const request = { address: "0x20000000000001", length: 4 };
|
|
test("byte facts keep exact u64 extents, null/nontext bytes and loaded-image authority", () => {
|
|
const facts = parseByteFacts(JSON.stringify(make()), "/input", request);
|
|
assert.equal(facts.hex, "00417fff");
|
|
assert.equal(facts.end_address, "0x20000000000005");
|
|
assert.equal(facts.coverage.status, "complete-for-requested-range");
|
|
assert.equal(facts.coverage.original_file_mapping, "unknown");
|
|
assert.equal(facts.coverage.runtime_memory, "not-observed");
|
|
const clipped = parseByteFacts(JSON.stringify(make()), "/input", {
|
|
...request,
|
|
length: 5,
|
|
});
|
|
assert.equal(clipped.coverage.status, "partial");
|
|
const flagged = make();
|
|
flagged.truncated = true;
|
|
assert.equal(
|
|
parseByteFacts(JSON.stringify(flagged), "/input", request).coverage.status,
|
|
"complete-for-requested-range",
|
|
);
|
|
});
|
|
|
|
test("wrong byte subject, contradictory duplicated payload, gaps and counts fail before publishing facts", () => {
|
|
for (const mutate of [
|
|
(d) => (d.binary = "/other"),
|
|
(d) => (d.kind = "code"),
|
|
(d) => (d.hex = "00417f00"),
|
|
(d) => (d.rows[0].address_hex = "0x20000000000000"),
|
|
(d) => (d.rows[0].size = 3),
|
|
(d) => (d.end_hex = "0x20000000000006"),
|
|
(d) => (d.count = 2),
|
|
(d) => (d.rows = Array(4097).fill(null)),
|
|
]) {
|
|
const document = make();
|
|
mutate(document);
|
|
assert.throws(
|
|
() => parseByteFacts(JSON.stringify(document), "/input", request),
|
|
{ code: "invalid_provider_output" },
|
|
);
|
|
}
|
|
const empty = make();
|
|
Object.assign(empty, {
|
|
hex: "",
|
|
rows: [],
|
|
count: 0,
|
|
bytes: 0,
|
|
end_hex: request.address,
|
|
});
|
|
assert.equal(
|
|
parseByteFacts(JSON.stringify(empty), "/input", request).coverage.status,
|
|
"partial",
|
|
);
|
|
});
|
|
|
|
test("byte input capacity, malformed addresses and u64 end overflow reject before native admission", async () => {
|
|
let reads = 0;
|
|
const session = new AtomicSession(async () => ({
|
|
context: { lease: "bytes" },
|
|
bytes: () => {
|
|
reads += 1;
|
|
},
|
|
close: () => {},
|
|
}));
|
|
await session.open("/input");
|
|
try {
|
|
for (const windows of [
|
|
[{ address: "invalid", length: 1 }],
|
|
[{ address: "0xffffffffffffffff", length: 1 }],
|
|
[
|
|
{ address: "0x1000", length: 65536 },
|
|
{ address: "0x2000", length: 1 },
|
|
],
|
|
[{ address: "0x1000", length: 0 }],
|
|
]) {
|
|
const result = await session.call("bytes", { windows });
|
|
assert.equal(result.error.code, "invalid_input", JSON.stringify(result));
|
|
}
|
|
assert.equal(reads, 0);
|
|
} finally {
|
|
await session.close();
|
|
}
|
|
});
|