Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95bcaa07ef | ||
|
|
f3cd103b31 | ||
|
|
94e360c11b | ||
|
|
7b9ab778a1 | ||
|
|
a92b960f6f | ||
|
|
da49ea2692 | ||
|
|
f993d33028 |
No files matched your search
@@ -103,6 +103,11 @@ architectures, build_metadata, load_commands, dependencies, imports, exports,
|
|||||||
segments and provenance. `source_exhaustive: false` means unreturned symbols
|
segments and provenance. `source_exhaustive: false` means unreturned symbols
|
||||||
may exist.
|
may exist.
|
||||||
|
|
||||||
|
`decode_interface_builder` graphs are often several megabytes and can exceed the
|
||||||
|
MCP response budget. Select `detail: "summary"` for every decoded document and
|
||||||
|
node/edge counts, then page `view: {kind: "interface-builder", collection:
|
||||||
|
"edges", document: "<documents[].relative_path>", offset: 0, limit: 64}`.
|
||||||
|
|
||||||
To see which functions or Objective-C methods a Mach-O actually calls in one
|
To see which functions or Objective-C methods a Mach-O actually calls in one
|
||||||
run, use `observe_native_calls` with explicit breakpoints and a bounded
|
run, use `observe_native_calls` with explicit breakpoints and a bounded
|
||||||
`duration_ms`/`max_events`. It launches a new process under LLDB, so the target
|
`duration_ms`/`max_events`. It launches a new process under LLDB, so the target
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createHash } from "node:crypto";
|
import { createHash } from "node:crypto";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import type { AnalysisError } from "../analysisErrorBase.js";
|
import type { AnalysisError } from "../analysisErrorBase.js";
|
||||||
import { analysisInputErrorFromIssues } from "../inputIssueProjection.js";
|
|
||||||
import type { JsonValue } from "../jsonValue.js";
|
import type { JsonValue } from "../jsonValue.js";
|
||||||
import { err, ok, type Result } from "../result.js";
|
import { err, ok, type Result } from "../result.js";
|
||||||
|
import { parseAnalysisViewResult } from "./analysisViewParent.js";
|
||||||
import {
|
import {
|
||||||
webNetworkCaptureRecordSchema,
|
webNetworkCaptureRecordSchema,
|
||||||
webNetworkCaptureBinaryDescriptorSchema,
|
webNetworkCaptureBinaryDescriptorSchema,
|
||||||
@@ -388,20 +388,9 @@ const preview = (record: WebNetworkCaptureRecord, format: string) => {
|
|||||||
const parseCaptureParent = (
|
const parseCaptureParent = (
|
||||||
parent: AnalysisViewParent,
|
parent: AnalysisViewParent,
|
||||||
): Result<WebNetworkCapture, AnalysisError> => {
|
): Result<WebNetworkCapture, AnalysisError> => {
|
||||||
const parsed = webNetworkCaptureSchema.safeParse(parent.normalizedResult);
|
const parsed = parseAnalysisViewResult(webNetworkCaptureSchema, parent);
|
||||||
if (!parsed.success)
|
if (!parsed.ok) return parsed;
|
||||||
return err(
|
const report = parsed.value;
|
||||||
analysisInputErrorFromIssues(
|
|
||||||
"inspect_analysis_view",
|
|
||||||
parsed.error.issues.map((issue) => ({
|
|
||||||
...issue,
|
|
||||||
path: ["source", "normalized_result", ...issue.path],
|
|
||||||
})),
|
|
||||||
{ source: { normalized_result: parent.normalizedResult } },
|
|
||||||
{ cause: parsed.error },
|
|
||||||
),
|
|
||||||
);
|
|
||||||
const report = parsed.data;
|
|
||||||
if (
|
if (
|
||||||
report.artifact.sha256 !== null &&
|
report.artifact.sha256 !== null &&
|
||||||
(parent.subject == null ||
|
(parent.subject == null ||
|
||||||
|
|||||||
@@ -67,6 +67,18 @@ mcpTest(
|
|||||||
const app = await fixtureApp();
|
const app = await fixtureApp();
|
||||||
const client = await openProductionTarget(mcp, onTestFinished, app);
|
const client = await openProductionTarget(mcp, onTestFinished, app);
|
||||||
|
|
||||||
|
const invalidDetail = await client.callTool({
|
||||||
|
name: "decode_interface_builder",
|
||||||
|
arguments: { detail: "brief" },
|
||||||
|
});
|
||||||
|
expect(invalidDetail.isError).toBe(true);
|
||||||
|
expect(invalidDetail.content).toEqual([
|
||||||
|
expect.objectContaining({
|
||||||
|
type: "text",
|
||||||
|
text: expect.stringMatching(/Input validation error:.*detail/su),
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
// Summary first: its own retained parent must serve every later page.
|
// Summary first: its own retained parent must serve every later page.
|
||||||
const summarized = await client.callTool({
|
const summarized = await client.callTool({
|
||||||
name: "decode_interface_builder",
|
name: "decode_interface_builder",
|
||||||
|
|||||||
Reference in new issue
Block a user