mirror of
https://github.com/morluto/rea.git
synced 2026-10-30 03:15:54 +00:00
## Changes Related to #545 and the permission-system removal in #555. - Upgrade the shipped skill to v24 and remove obsolete filesystem grants, per-call approval flags, Electron file-root configuration, and DMG approval flags. Calls follow the user-requested investigation directly. Keep setup plan confirmation, actual OS requirements, and process/archive lifecycle boundaries. - Correct the passive browser guide: endpoint/scope come from requests; ordinary local URL queries are retained, while credentials remain redacted. - Audit canonical tool effects: declare possible DMG process/temp-directory effects, mark fresh extraction non-idempotent, and mark comparisons of supplied captures/PNGs as closed-world. Align artifact-provider capability effects with temporary mount-directory writes. - Retain non-read-only hints for calls that add Evidence to the session; document that annotations are hints and that clients control their confirmation UI. Do not mislabel session mutations as read-only to suppress prompts. - Regenerate package, skill, MCP, and product metadata from source. ## Verification - `npm run test:focused -- <11 affected test files>`: **40 tests passed**, including skill transaction/backup/idempotence, SDK tools/list annotations, actual local capture/PNG comparisons, artifact extraction/containment/cancellation, DMG launcher/cleanup seam, setup confirmation, browser MCP and scenario MCP, CLI catalog parity. - `npm run check`: typecheck, lint, format, knip, package metadata. - `npm run docs:check`: generated catalogs, skill metadata, documentation facts, completion ledger, error schema. No local real Hopper/Ghidra run: their adapters and analysis operations are unchanged. Native macOS DMG behavior is covered locally through the launcher seam; no local macOS/hdiutil claim is made. Real browser verification passed using existing Headless Chrome143.0.7499.4: actual CLI/stdio MCP,9,331,407-byte PNG, passive capture/source maps, and owned/external scenario cleanup. An initial full Chrome143 run failed the existing screenshot-height assertion (1397 versus1536); the dedicated headless-shell run passed the complete verifier without code changes. The verifier run-lineage field remained unavailable; no lineage-coverage claim is made. Browser download into `.codex` was blocked by CDN403, so the successful run used an existing browser without changing host configuration.
60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { listBrowserTargetsInputSchema } from "../domain/browserObservation.js";
|
|
import { browserCaptureComparisonInputSchema } from "../domain/browserCaptureComparison.js";
|
|
import { compareWebScreenshotsInputSchema } from "../domain/webScreenshot.js";
|
|
import { BROWSER_TOOL_CONTRACTS } from "../contracts/browserToolContracts.js";
|
|
import { CdpBrowserProvider } from "../browser/CdpBrowserProvider.js";
|
|
import {
|
|
compareWebCaptureEvidence,
|
|
compareWebScreenshotEvidence,
|
|
listBrowserTargets,
|
|
} from "./BrowserObservationService.js";
|
|
|
|
describe("browser observation service prerequisites", () => {
|
|
it("reports a missing provider without requiring a permission grant", async () => {
|
|
const endpoint = "http://127.0.0.1:9222";
|
|
const origin = "http://[::1]:3000";
|
|
const result = await listBrowserTargets(
|
|
undefined,
|
|
listBrowserTargetsInputSchema.parse({
|
|
cdp_endpoint: endpoint,
|
|
allowed_origins: [origin],
|
|
}),
|
|
);
|
|
expect(result).toMatchObject({
|
|
ok: false,
|
|
error: {
|
|
_tag: "AnalysisCapabilityUnavailableError",
|
|
},
|
|
});
|
|
});
|
|
it("compares supplied scenarios and PNG artifacts without a CDP endpoint", async () => {
|
|
const browser = new CdpBrowserProvider();
|
|
const captures = await compareWebCaptureEvidence(
|
|
browser,
|
|
browserCaptureComparisonInputSchema.parse(
|
|
example("compare_web_captures"),
|
|
),
|
|
);
|
|
const screenshots = await compareWebScreenshotEvidence(
|
|
browser,
|
|
compareWebScreenshotsInputSchema.parse(
|
|
example("compare_web_screenshots"),
|
|
),
|
|
);
|
|
for (const result of [captures, screenshots]) {
|
|
expect(result.ok).toBe(true);
|
|
if (!result.ok) throw result.error;
|
|
expect(result.value.parameters).not.toHaveProperty("cdp_endpoint");
|
|
}
|
|
});
|
|
});
|
|
|
|
const example = (name: string) => {
|
|
const input = BROWSER_TOOL_CONTRACTS.find((tool) => tool.name === name)
|
|
?.examples[0]?.input;
|
|
if (input === undefined) throw new Error(`Missing example for ${name}`);
|
|
return input;
|
|
};
|