Files
reverse-engineering-anything/src/application/BrowserObservationService.test.ts
T
N0zoM1z0 2919def828 fix(skill): remove obsolete grants and audit tool effects
## 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.
2026-10-06 01:40:58 +08:00

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;
};