mirror of
https://github.com/morluto/rea.git
synced 2026-11-06 06:46:10 +00:00
Retain exact bounded wire facts and optional supplied-schema interpretations for selected historical captures. Share CLI/MCP views and preserve Evidence, partial coverage, credential exclusions and source provenance. Fixes #4986 Co-authored-by: AayushJB03 <aayushjb14@gmail.com> Co-authored-by: gensokyo-dev <gensokyo-dev@users.noreply.github.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
224 lines
6.2 KiB
TypeScript
224 lines
6.2 KiB
TypeScript
import { expect, it } from "vitest";
|
|
import { createEvidence } from "../evidence.js";
|
|
import { projectAnalysisView } from "./analysisView.js";
|
|
import { webNetworkCaptureSchema } from "../webNetworkCapture.js";
|
|
|
|
const capture = async () => {
|
|
const report = webNetworkCaptureSchema.parse({
|
|
artifact: { path: "/recordings/a.har", bytes: 100, sha256: "b".repeat(64) },
|
|
decoder: {
|
|
id: "projection-fixture",
|
|
name: "Original projection facts",
|
|
version: "1",
|
|
},
|
|
container: {
|
|
reported: null,
|
|
numeric_literals: [],
|
|
redactions: [],
|
|
records_pointer: "/log/entries",
|
|
},
|
|
format: "har",
|
|
total_records: 1,
|
|
runtime_attribution: "unknown",
|
|
limitations: [],
|
|
records: [
|
|
{
|
|
ordinal: 0,
|
|
location: { kind: "json-pointer", pointer: "/log/entries/0" },
|
|
reported: null,
|
|
binary_fields: [],
|
|
numeric_literals: [],
|
|
redactions: [],
|
|
limitations: [],
|
|
protobuf: [
|
|
{
|
|
decoder: "rea-protobuf-wire-v1",
|
|
pointer: "/response/content/text",
|
|
content_type: "application/grpc-web+proto",
|
|
body_sha256: "c".repeat(64),
|
|
framing: "grpc-web",
|
|
offset_basis: "retained-body",
|
|
decoded_bytes: 37,
|
|
status: "complete",
|
|
examined_bytes: 37,
|
|
limitations: [],
|
|
frames: [
|
|
{
|
|
index: 0,
|
|
kind: "data",
|
|
offset: 0,
|
|
payload_offset: 5,
|
|
bytes: 11,
|
|
compressed: false,
|
|
status: "complete",
|
|
examined_bytes: 11,
|
|
},
|
|
{
|
|
index: 1,
|
|
kind: "trailer",
|
|
offset: 16,
|
|
payload_offset: 21,
|
|
bytes: 16,
|
|
compressed: false,
|
|
status: "complete",
|
|
examined_bytes: 16,
|
|
},
|
|
],
|
|
fields: [
|
|
{
|
|
index: 0,
|
|
frame_index: 0,
|
|
parent_index: null,
|
|
field_id: "offset:5",
|
|
parent_field_id: null,
|
|
number: 1,
|
|
wire_type: "len",
|
|
offset: 5,
|
|
bytes: 7,
|
|
payload_offset: 7,
|
|
payload_bytes: 5,
|
|
text: "hello",
|
|
interpretations: ["utf8-string", "packed-varint", "bytes"],
|
|
},
|
|
{
|
|
index: 1,
|
|
frame_index: 0,
|
|
parent_index: null,
|
|
field_id: "offset:12",
|
|
parent_field_id: null,
|
|
number: 2,
|
|
wire_type: "len",
|
|
offset: 12,
|
|
bytes: 4,
|
|
payload_offset: 14,
|
|
payload_bytes: 2,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
});
|
|
const evidence = createEvidence(
|
|
{ ...report.artifact, sha256: "b".repeat(64), format: "file" },
|
|
report.decoder,
|
|
{
|
|
operation: "inspect_web_network_capture",
|
|
parameters: { record_ordinals: [0] },
|
|
result: report,
|
|
confidence: "observed",
|
|
authority: "historical-reference",
|
|
},
|
|
);
|
|
return {
|
|
report,
|
|
parent: {
|
|
evidenceId: evidence.evidence_id,
|
|
operation: evidence.operation,
|
|
normalizedResult: report,
|
|
subject: evidence.subject,
|
|
limitations: evidence.limitations,
|
|
},
|
|
};
|
|
};
|
|
|
|
it("keeps coordinate identity and coverage with empty fields, batch filters and offset paging", async () => {
|
|
const { parent } = await capture();
|
|
const viewed = projectAnalysisView(parent, {
|
|
kind: "protobuf",
|
|
collection: "fields",
|
|
field_ids: ["offset:5", "offset:12"],
|
|
fields: [],
|
|
offset: 1,
|
|
limit: 1,
|
|
});
|
|
if (!viewed.ok) throw viewed.error;
|
|
expect(viewed.value).toMatchObject({
|
|
kind: "protobuf",
|
|
coverage: { total: 2, examined: 1, exhausted: true },
|
|
items: [
|
|
{
|
|
field_id: "offset:12",
|
|
record_ordinal: 0,
|
|
body_pointer: "/response/content/text",
|
|
body_status: "complete",
|
|
offset_basis: "retained-body",
|
|
},
|
|
],
|
|
});
|
|
const empty = projectAnalysisView(parent, {
|
|
kind: "protobuf",
|
|
collection: "fields",
|
|
field_numbers: [],
|
|
offset: 0,
|
|
limit: 1,
|
|
});
|
|
if (!empty.ok) throw empty.error;
|
|
expect(empty.value).toMatchObject({
|
|
items: [],
|
|
coverage: { total: 0, exhausted: true },
|
|
});
|
|
});
|
|
|
|
it("omits large values by default, returns requested text inline and preserves parser uncertainty", async () => {
|
|
const { parent, report } = await capture();
|
|
const brief = projectAnalysisView(parent, {
|
|
kind: "protobuf",
|
|
collection: "fields",
|
|
offset: 0,
|
|
limit: 1,
|
|
});
|
|
if (!brief.ok) throw brief.error;
|
|
expect(brief.value).toMatchObject({
|
|
items: [{ interpretations: ["utf8-string", "packed-varint", "bytes"] }],
|
|
});
|
|
expect(JSON.stringify(brief.value)).not.toContain('"hello"');
|
|
const preview = projectAnalysisView(parent, {
|
|
kind: "capture",
|
|
detail: "preview",
|
|
offset: 0,
|
|
limit: 1,
|
|
});
|
|
if (!preview.ok) throw preview.error;
|
|
expect(preview.value).toMatchObject({
|
|
items: [
|
|
{
|
|
protobuf_summary: {
|
|
bodies: 1,
|
|
frames: 2,
|
|
fields: 2,
|
|
incomplete_bodies: 0,
|
|
},
|
|
},
|
|
],
|
|
});
|
|
expect(JSON.stringify(preview.value)).not.toContain('"field_id"');
|
|
report.records[0]!.protobuf![0]!.status = "partial";
|
|
const full = projectAnalysisView(parent, {
|
|
kind: "protobuf",
|
|
collection: "fields",
|
|
fields: ["text"],
|
|
offset: 0,
|
|
limit: 1,
|
|
});
|
|
if (!full.ok) throw full.error;
|
|
expect(full.value).toMatchObject({
|
|
source_status: "partial",
|
|
items: [{ text: "hello", body_status: "partial" }],
|
|
});
|
|
const changedSubject = projectAnalysisView(
|
|
{ ...parent, subject: { ...parent.subject!, local_path: "/other.har" } },
|
|
{ kind: "protobuf", collection: "bodies", offset: 0, limit: 1 },
|
|
);
|
|
expect(changedSubject.ok).toBe(false);
|
|
report.records[0]!.protobuf![0]!.fields[0]!.offset = 1000;
|
|
expect(
|
|
projectAnalysisView(parent, {
|
|
kind: "protobuf",
|
|
collection: "fields",
|
|
offset: 0,
|
|
limit: 1,
|
|
}).ok,
|
|
).toBe(false);
|
|
});
|