memorydetective 1.14.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +7 -3
- package/USAGE.md +6 -5
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/analyzeEnergyImpact.d.ts +69 -0
- package/dist/tools/analyzeEnergyImpact.js +239 -0
- package/dist/tools/analyzeEnergyImpact.js.map +1 -0
- package/dist/tools/analyzeLeakTimeline.d.ts +75 -0
- package/dist/tools/analyzeLeakTimeline.js +213 -0
- package/dist/tools/analyzeLeakTimeline.js.map +1 -0
- package/dist/tools/analyzeMemoryFootprint.d.ts +72 -0
- package/dist/tools/analyzeMemoryFootprint.js +234 -0
- package/dist/tools/analyzeMemoryFootprint.js.map +1 -0
- package/dist/tools/inspectTrace.js +12 -0
- package/dist/tools/inspectTrace.js.map +1 -1
- package/dist/tools/recordViaInstrumentsApp.d.ts +81 -0
- package/dist/tools/recordViaInstrumentsApp.js +200 -0
- package/dist/tools/recordViaInstrumentsApp.js.map +1 -0
- package/dist/tools/replayScenario.d.ts +16 -0
- package/dist/tools/replayScenario.js +66 -0
- package/dist/tools/replayScenario.js.map +1 -1
- package/dist/tools/summarizeTrace.d.ts +6 -3
- package/dist/tools/summarizeTrace.js +49 -2
- package/dist/tools/summarizeTrace.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspectTrace.js","sourceRoot":"","sources":["../../src/tools/inspectTrace.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"inspectTrace.js","sourceRoot":"","sources":["../../src/tools/inspectTrace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `recordViaInstrumentsApp`: open Instruments.app, prompt the user to
|
|
3
|
+
* record + save, watch a directory for the resulting `.trace` bundle.
|
|
4
|
+
* v1.16 item G.
|
|
5
|
+
*
|
|
6
|
+
* The macOS 26.x escape hatch. `xcrun xctrace record` is broken on this
|
|
7
|
+
* OS (the regression we documented in v1.14: `--time-limit` ignored,
|
|
8
|
+
* wedge, partial bundle that fails template export). Instruments.app's
|
|
9
|
+
* GUI still produces valid `.trace` bundles. Until Apple fixes the CLI,
|
|
10
|
+
* the only automated path on macOS 26.x sims is "open Instruments,
|
|
11
|
+
* pick a template, hit Record, Stop, Save" - and we wrap that.
|
|
12
|
+
*
|
|
13
|
+
* Why not full AppleScript automation? Instruments.app's AppleScript
|
|
14
|
+
* surface is minimal (queries on the `document` class only, no verbs
|
|
15
|
+
* for start/stop/select-template). Documented in the .sdef file at
|
|
16
|
+
* `Xcode.app/Contents/Applications/Instruments.app/Contents/Resources/
|
|
17
|
+
* Instruments.sdef`. We can query open document file URLs but cannot
|
|
18
|
+
* programmatically drive recording. The user-in-loop step stays.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
import { type InspectTraceResult } from "./inspectTrace.js";
|
|
22
|
+
export declare const recordViaInstrumentsAppSchema: z.ZodObject<{
|
|
23
|
+
template: z.ZodDefault<z.ZodString>;
|
|
24
|
+
watchDir: z.ZodOptional<z.ZodString>;
|
|
25
|
+
timeoutSec: z.ZodDefault<z.ZodNumber>;
|
|
26
|
+
preexistingTraces: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
template: string;
|
|
29
|
+
timeoutSec: number;
|
|
30
|
+
watchDir?: string | undefined;
|
|
31
|
+
preexistingTraces?: string[] | undefined;
|
|
32
|
+
}, {
|
|
33
|
+
template?: string | undefined;
|
|
34
|
+
watchDir?: string | undefined;
|
|
35
|
+
timeoutSec?: number | undefined;
|
|
36
|
+
preexistingTraces?: string[] | undefined;
|
|
37
|
+
}>;
|
|
38
|
+
export type RecordViaInstrumentsAppInput = z.infer<typeof recordViaInstrumentsAppSchema>;
|
|
39
|
+
export interface RecordViaInstrumentsAppResult {
|
|
40
|
+
ok: boolean;
|
|
41
|
+
/** Absolute path to the newly-saved `.trace` bundle. Empty when timed out. */
|
|
42
|
+
tracePath: string;
|
|
43
|
+
watchDir: string;
|
|
44
|
+
/** Step-by-step instructions to show the user before they interact with Instruments. */
|
|
45
|
+
instructions: string[];
|
|
46
|
+
/** True when the watcher gave up before finding a new `.trace`. */
|
|
47
|
+
timedOut?: boolean;
|
|
48
|
+
/** Wall-clock seconds the user spent recording (start of watcher to detection). */
|
|
49
|
+
elapsedSec: number;
|
|
50
|
+
/** Chained inspectTrace summary when the recording was found AND was readable. */
|
|
51
|
+
inspection?: InspectTraceResult;
|
|
52
|
+
/** Plain-English diagnosis (success vs timeout vs unreadable). */
|
|
53
|
+
diagnosis: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Pure: snapshot the set of `.trace` bundle names currently in `dir`.
|
|
57
|
+
* Used as the "existing files" baseline so the watcher only matches
|
|
58
|
+
* NEW traces. Exported for testing.
|
|
59
|
+
*/
|
|
60
|
+
export declare function snapshotTracesInDir(dir: string): Set<string>;
|
|
61
|
+
/**
|
|
62
|
+
* Pure: given the set of trace paths now in `dir` and the baseline
|
|
63
|
+
* snapshot, return paths that are NEW (in current but not in baseline).
|
|
64
|
+
* The order is alphabetical for determinism. Exported for testing.
|
|
65
|
+
*/
|
|
66
|
+
export declare function detectNewTraces(current: Set<string>, baseline: Set<string>): string[];
|
|
67
|
+
/**
|
|
68
|
+
* Pure: given a candidate `.trace` bundle path and the current time
|
|
69
|
+
* (in ms since epoch), decide whether the bundle has been "stable" for
|
|
70
|
+
* at least `stableForMs` (the user has finished saving). Returns false
|
|
71
|
+
* when the path does not exist or stat fails. Exported for testing.
|
|
72
|
+
*/
|
|
73
|
+
export declare function isStable(candidatePath: string, nowMs: number, stableForMs: number, statFn?: (p: string) => {
|
|
74
|
+
mtimeMs: number;
|
|
75
|
+
}): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Pure: build the step-by-step instruction text the response surfaces.
|
|
78
|
+
* Exported for testing.
|
|
79
|
+
*/
|
|
80
|
+
export declare function buildInstructions(template: string, watchDir: string): string[];
|
|
81
|
+
export declare function recordViaInstrumentsApp(input: RecordViaInstrumentsAppInput): Promise<RecordViaInstrumentsAppResult>;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `recordViaInstrumentsApp`: open Instruments.app, prompt the user to
|
|
3
|
+
* record + save, watch a directory for the resulting `.trace` bundle.
|
|
4
|
+
* v1.16 item G.
|
|
5
|
+
*
|
|
6
|
+
* The macOS 26.x escape hatch. `xcrun xctrace record` is broken on this
|
|
7
|
+
* OS (the regression we documented in v1.14: `--time-limit` ignored,
|
|
8
|
+
* wedge, partial bundle that fails template export). Instruments.app's
|
|
9
|
+
* GUI still produces valid `.trace` bundles. Until Apple fixes the CLI,
|
|
10
|
+
* the only automated path on macOS 26.x sims is "open Instruments,
|
|
11
|
+
* pick a template, hit Record, Stop, Save" - and we wrap that.
|
|
12
|
+
*
|
|
13
|
+
* Why not full AppleScript automation? Instruments.app's AppleScript
|
|
14
|
+
* surface is minimal (queries on the `document` class only, no verbs
|
|
15
|
+
* for start/stop/select-template). Documented in the .sdef file at
|
|
16
|
+
* `Xcode.app/Contents/Applications/Instruments.app/Contents/Resources/
|
|
17
|
+
* Instruments.sdef`. We can query open document file URLs but cannot
|
|
18
|
+
* programmatically drive recording. The user-in-loop step stays.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
import { existsSync, mkdirSync, statSync, readdirSync } from "node:fs";
|
|
22
|
+
import { resolve as resolvePath, join as joinPath } from "node:path";
|
|
23
|
+
import { spawn } from "node:child_process";
|
|
24
|
+
import { getSecurityFlags } from "../runtime/securityFlags.js";
|
|
25
|
+
import { inspectTrace } from "./inspectTrace.js";
|
|
26
|
+
export const recordViaInstrumentsAppSchema = z.object({
|
|
27
|
+
template: z
|
|
28
|
+
.string()
|
|
29
|
+
.default("Time Profiler")
|
|
30
|
+
.describe("The Instruments template the user should pick after the app launches. Surfaced in the response's instructions array. Default 'Time Profiler'. Common alternatives: 'Allocations', 'Animation Hitches', 'Leaks', 'Energy Log', 'Network Profile'."),
|
|
31
|
+
watchDir: z
|
|
32
|
+
.string()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("Directory to watch for the saved `.trace` bundle. When omitted, defaults to $MEMORYDETECTIVE_TRACE_ROOT (typically `~/Library/Application Support/memorydetective/traces`). The directory is created if it does not exist."),
|
|
35
|
+
timeoutSec: z
|
|
36
|
+
.number()
|
|
37
|
+
.int()
|
|
38
|
+
.positive()
|
|
39
|
+
.max(3600)
|
|
40
|
+
.default(600)
|
|
41
|
+
.describe("Maximum seconds to wait for the user to save a `.trace` before returning a timeout. Default 600 (10 minutes). Capped at 3600 (1 hour)."),
|
|
42
|
+
preexistingTraces: z
|
|
43
|
+
.array(z.string())
|
|
44
|
+
.optional()
|
|
45
|
+
.describe("Absolute paths to `.trace` bundles already in `watchDir`. The watcher excludes these so it only matches NEW files. When omitted, the watcher snapshots the directory at start. Optional override for callers who want explicit control."),
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Pure: snapshot the set of `.trace` bundle names currently in `dir`.
|
|
49
|
+
* Used as the "existing files" baseline so the watcher only matches
|
|
50
|
+
* NEW traces. Exported for testing.
|
|
51
|
+
*/
|
|
52
|
+
export function snapshotTracesInDir(dir) {
|
|
53
|
+
if (!existsSync(dir))
|
|
54
|
+
return new Set();
|
|
55
|
+
try {
|
|
56
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
57
|
+
const out = new Set();
|
|
58
|
+
for (const e of entries) {
|
|
59
|
+
if (!e.name.endsWith(".trace"))
|
|
60
|
+
continue;
|
|
61
|
+
out.add(joinPath(dir, e.name));
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return new Set();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Pure: given the set of trace paths now in `dir` and the baseline
|
|
71
|
+
* snapshot, return paths that are NEW (in current but not in baseline).
|
|
72
|
+
* The order is alphabetical for determinism. Exported for testing.
|
|
73
|
+
*/
|
|
74
|
+
export function detectNewTraces(current, baseline) {
|
|
75
|
+
const fresh = [];
|
|
76
|
+
for (const path of current) {
|
|
77
|
+
if (!baseline.has(path))
|
|
78
|
+
fresh.push(path);
|
|
79
|
+
}
|
|
80
|
+
return fresh.sort();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Pure: given a candidate `.trace` bundle path and the current time
|
|
84
|
+
* (in ms since epoch), decide whether the bundle has been "stable" for
|
|
85
|
+
* at least `stableForMs` (the user has finished saving). Returns false
|
|
86
|
+
* when the path does not exist or stat fails. Exported for testing.
|
|
87
|
+
*/
|
|
88
|
+
export function isStable(candidatePath, nowMs, stableForMs, statFn = (p) => statSync(p)) {
|
|
89
|
+
try {
|
|
90
|
+
if (!existsSync(candidatePath))
|
|
91
|
+
return false;
|
|
92
|
+
const s = statFn(candidatePath);
|
|
93
|
+
return nowMs - s.mtimeMs >= stableForMs;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Pure: build the step-by-step instruction text the response surfaces.
|
|
101
|
+
* Exported for testing.
|
|
102
|
+
*/
|
|
103
|
+
export function buildInstructions(template, watchDir) {
|
|
104
|
+
return [
|
|
105
|
+
`Instruments.app is opening. Wait for the template chooser to appear.`,
|
|
106
|
+
`Pick the **${template}** template from the chooser (if it does not show, File > New > pick the template).`,
|
|
107
|
+
`Choose the target device + app from the toolbar (top-left in the Instruments window).`,
|
|
108
|
+
`Press the **Record** button (red circle). Drive the scenario you want to capture.`,
|
|
109
|
+
`Press **Stop** when finished.`,
|
|
110
|
+
`**File > Save As** the trace to \`${watchDir}\` (this MCP is watching that directory).`,
|
|
111
|
+
`Once saved, this tool detects the new \`.trace\` bundle (within ~10 seconds) and returns its path.`,
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Spawn `open -a Instruments` fire-and-forget. v1.16. Returns immediately;
|
|
116
|
+
* Instruments.app launch takes a few seconds and the user interacts with
|
|
117
|
+
* it independently of the watcher loop.
|
|
118
|
+
*/
|
|
119
|
+
function openInstrumentsApp() {
|
|
120
|
+
try {
|
|
121
|
+
const child = spawn("open", ["-a", "Instruments"], {
|
|
122
|
+
detached: true,
|
|
123
|
+
stdio: "ignore",
|
|
124
|
+
});
|
|
125
|
+
child.unref();
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// The watcher loop will still poll; surfacing the error here would
|
|
129
|
+
// bias toward false-negatives if the open command exited non-zero for
|
|
130
|
+
// a reason that doesn't actually prevent Instruments from launching
|
|
131
|
+
// (e.g. it was already open).
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Async sleep. Tests inject a faster variant; production uses real
|
|
136
|
+
* setTimeout.
|
|
137
|
+
*/
|
|
138
|
+
function sleep(ms) {
|
|
139
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
140
|
+
}
|
|
141
|
+
const POLL_INTERVAL_MS = 5_000;
|
|
142
|
+
const STABLE_FOR_MS = 10_000;
|
|
143
|
+
export async function recordViaInstrumentsApp(input) {
|
|
144
|
+
const security = getSecurityFlags();
|
|
145
|
+
const watchDir = resolvePath(input.watchDir ?? security.traceRoot);
|
|
146
|
+
if (!existsSync(watchDir)) {
|
|
147
|
+
mkdirSync(watchDir, { recursive: true });
|
|
148
|
+
}
|
|
149
|
+
const template = input.template ?? "Time Profiler";
|
|
150
|
+
const timeoutMs = (input.timeoutSec ?? 600) * 1000;
|
|
151
|
+
const instructions = buildInstructions(template, watchDir);
|
|
152
|
+
const baseline = input.preexistingTraces && input.preexistingTraces.length > 0
|
|
153
|
+
? new Set(input.preexistingTraces.map((p) => resolvePath(p)))
|
|
154
|
+
: snapshotTracesInDir(watchDir);
|
|
155
|
+
openInstrumentsApp();
|
|
156
|
+
const start = Date.now();
|
|
157
|
+
while (Date.now() - start < timeoutMs) {
|
|
158
|
+
const current = snapshotTracesInDir(watchDir);
|
|
159
|
+
const fresh = detectNewTraces(current, baseline);
|
|
160
|
+
// Pick the first stable new trace (oldest mtime that is also stable).
|
|
161
|
+
for (const candidate of fresh) {
|
|
162
|
+
if (isStable(candidate, Date.now(), STABLE_FOR_MS)) {
|
|
163
|
+
const elapsedSec = Math.round((Date.now() - start) / 1000);
|
|
164
|
+
// Best-effort: chain into inspectTrace so the caller sees an
|
|
165
|
+
// immediate summary. Failures here do not invalidate the
|
|
166
|
+
// recording itself; we just omit the field.
|
|
167
|
+
let inspection;
|
|
168
|
+
try {
|
|
169
|
+
inspection = await inspectTrace({ tracePath: candidate });
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Inspection failure is non-fatal.
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
ok: true,
|
|
176
|
+
tracePath: candidate,
|
|
177
|
+
watchDir,
|
|
178
|
+
instructions,
|
|
179
|
+
elapsedSec,
|
|
180
|
+
...(inspection ? { inspection } : {}),
|
|
181
|
+
diagnosis: inspection
|
|
182
|
+
? `Captured \`${candidate}\` after ${elapsedSec}s. ${inspection.schemas.length} schemas in the TOC.`
|
|
183
|
+
: `Captured \`${candidate}\` after ${elapsedSec}s. Inspect failed; pass the path to inspectTrace manually.`,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
await sleep(POLL_INTERVAL_MS);
|
|
188
|
+
}
|
|
189
|
+
const elapsedSec = Math.round((Date.now() - start) / 1000);
|
|
190
|
+
return {
|
|
191
|
+
ok: false,
|
|
192
|
+
tracePath: "",
|
|
193
|
+
watchDir,
|
|
194
|
+
instructions,
|
|
195
|
+
timedOut: true,
|
|
196
|
+
elapsedSec,
|
|
197
|
+
diagnosis: `Timed out after ${elapsedSec}s waiting for a \`.trace\` bundle to appear in \`${watchDir}\`. The user may not have saved yet, or saved to a different directory. Re-run with the correct \`watchDir\` if needed.`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=recordViaInstrumentsApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recordViaInstrumentsApp.js","sourceRoot":"","sources":["../../src/tools/recordViaInstrumentsApp.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,6 +115,7 @@ export declare const replayScenarioShape: {
|
|
|
115
115
|
readonly repeat: z.ZodDefault<z.ZodNumber>;
|
|
116
116
|
readonly settleBetweenActionsMs: z.ZodDefault<z.ZodNumber>;
|
|
117
117
|
readonly finalUITreePath: z.ZodOptional<z.ZodString>;
|
|
118
|
+
readonly screenshotDir: z.ZodOptional<z.ZodString>;
|
|
118
119
|
};
|
|
119
120
|
export declare const replayScenarioSchema: z.ZodObject<{
|
|
120
121
|
readonly simulatorUDID: z.ZodString;
|
|
@@ -170,6 +171,7 @@ export declare const replayScenarioSchema: z.ZodObject<{
|
|
|
170
171
|
readonly repeat: z.ZodDefault<z.ZodNumber>;
|
|
171
172
|
readonly settleBetweenActionsMs: z.ZodDefault<z.ZodNumber>;
|
|
172
173
|
readonly finalUITreePath: z.ZodOptional<z.ZodString>;
|
|
174
|
+
readonly screenshotDir: z.ZodOptional<z.ZodString>;
|
|
173
175
|
}, "strip", z.ZodTypeAny, {
|
|
174
176
|
repeat: number;
|
|
175
177
|
simulatorUDID: string;
|
|
@@ -192,6 +194,7 @@ export declare const replayScenarioSchema: z.ZodObject<{
|
|
|
192
194
|
})[];
|
|
193
195
|
settleBetweenActionsMs: number;
|
|
194
196
|
finalUITreePath?: string | undefined;
|
|
197
|
+
screenshotDir?: string | undefined;
|
|
195
198
|
}, {
|
|
196
199
|
simulatorUDID: string;
|
|
197
200
|
actions: ({
|
|
@@ -214,6 +217,7 @@ export declare const replayScenarioSchema: z.ZodObject<{
|
|
|
214
217
|
repeat?: number | undefined;
|
|
215
218
|
settleBetweenActionsMs?: number | undefined;
|
|
216
219
|
finalUITreePath?: string | undefined;
|
|
220
|
+
screenshotDir?: string | undefined;
|
|
217
221
|
}>;
|
|
218
222
|
export type ReplayScenarioInput = z.infer<typeof replayScenarioSchema>;
|
|
219
223
|
export interface ReplayScenarioFailure {
|
|
@@ -231,9 +235,21 @@ export interface ReplayScenarioResult {
|
|
|
231
235
|
failures: ReplayScenarioFailure[];
|
|
232
236
|
totalDurationMs: number;
|
|
233
237
|
finalUITreePath?: string;
|
|
238
|
+
/** v1.15+. When screenshotDir was provided, the absolute paths of the captured PNGs in order. Empty array when screenshotDir was omitted. */
|
|
239
|
+
screenshotPaths?: string[];
|
|
234
240
|
workaroundNotice?: ReplayScenarioWorkaroundNotice;
|
|
235
241
|
}
|
|
236
242
|
export declare function replayScenario(input: ReplayScenarioInput): Promise<ReplayScenarioResult>;
|
|
243
|
+
/**
|
|
244
|
+
* v1.15+. Run `xcrun simctl io <udid> screenshot <path>` to capture the
|
|
245
|
+
* current simulator state. Returns `true` on success, `false` on any
|
|
246
|
+
* failure (we surface failures via the `failures[]` array on the
|
|
247
|
+
* result, no exceptions thrown so the scenario continues).
|
|
248
|
+
*
|
|
249
|
+
* Exported so callers / tests can drive screenshot capture independently
|
|
250
|
+
* of the scenario loop.
|
|
251
|
+
*/
|
|
252
|
+
export declare function captureSimulatorScreenshot(udid: string, outputPath: string): Promise<boolean>;
|
|
237
253
|
/** Pure: convert a tap-action input shape into the runtime TapTarget union. Exposed for tests. */
|
|
238
254
|
export declare function resolveTapTarget(action: {
|
|
239
255
|
label?: string;
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
import { z } from "zod";
|
|
13
13
|
import { existsSync, mkdirSync } from "node:fs";
|
|
14
14
|
import { writeFile } from "node:fs/promises";
|
|
15
|
+
import { dirname, join as joinPath } from "node:path";
|
|
15
16
|
import { checkAxeAvailable, describeUI, swipe, tap, typeText, } from "../runtime/axe.js";
|
|
17
|
+
import { runCommand } from "../runtime/exec.js";
|
|
16
18
|
const tapActionSchema = z.object({
|
|
17
19
|
type: z.literal("tap"),
|
|
18
20
|
label: z
|
|
@@ -75,6 +77,10 @@ export const replayScenarioShape = {
|
|
|
75
77
|
.string()
|
|
76
78
|
.optional()
|
|
77
79
|
.describe("When provided, after the scenario completes the final UI tree is written here as JSON for the caller to verify the app ended in the expected state."),
|
|
80
|
+
screenshotDir: z
|
|
81
|
+
.string()
|
|
82
|
+
.optional()
|
|
83
|
+
.describe("v1.15+. DebugSwift-inspired. When provided, captures a simulator screenshot after each action into `<screenshotDir>/iteration-{N}_step-{M}.png`. Useful for 'what was on screen when the leak fired?' context in verify-fix loops. Uses `xcrun simctl io ... screenshot` directly (no axe dependency). Screenshot capture failures are non-fatal: surfaced in `failures[]` but do not halt the scenario."),
|
|
78
84
|
};
|
|
79
85
|
export const replayScenarioSchema = z.object(replayScenarioShape);
|
|
80
86
|
export async function replayScenario(input) {
|
|
@@ -94,7 +100,25 @@ export async function replayScenario(input) {
|
|
|
94
100
|
}
|
|
95
101
|
const start = Date.now();
|
|
96
102
|
const failures = [];
|
|
103
|
+
const screenshotPaths = [];
|
|
97
104
|
let executedSteps = 0;
|
|
105
|
+
// v1.15: prepare the screenshot directory upfront so the loop does not
|
|
106
|
+
// mkdir on every iteration. Failure to create the dir is non-fatal:
|
|
107
|
+
// we just skip screenshots and record the issue on `failures[]`.
|
|
108
|
+
let screenshotDirReady = false;
|
|
109
|
+
if (input.screenshotDir) {
|
|
110
|
+
try {
|
|
111
|
+
mkdirSync(input.screenshotDir, { recursive: true });
|
|
112
|
+
screenshotDirReady = true;
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
failures.push({
|
|
116
|
+
iteration: 0,
|
|
117
|
+
stepIndex: 0,
|
|
118
|
+
reason: `Failed to create screenshotDir: ${err.message}`,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
98
122
|
for (let iteration = 0; iteration < input.repeat; iteration++) {
|
|
99
123
|
for (let i = 0; i < input.actions.length; i++) {
|
|
100
124
|
const action = input.actions[i];
|
|
@@ -114,6 +138,22 @@ export async function replayScenario(input) {
|
|
|
114
138
|
if (input.settleBetweenActionsMs > 0) {
|
|
115
139
|
await sleep(input.settleBetweenActionsMs);
|
|
116
140
|
}
|
|
141
|
+
// v1.15: capture screenshot AFTER the settle window so the frame
|
|
142
|
+
// we save reflects post-action state, not transition state.
|
|
143
|
+
if (screenshotDirReady && input.screenshotDir) {
|
|
144
|
+
const path = joinPath(input.screenshotDir, `iteration-${iteration}_step-${i}.png`);
|
|
145
|
+
const captured = await captureSimulatorScreenshot(input.simulatorUDID, path);
|
|
146
|
+
if (captured) {
|
|
147
|
+
screenshotPaths.push(path);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
failures.push({
|
|
151
|
+
iteration,
|
|
152
|
+
stepIndex: i,
|
|
153
|
+
reason: `Failed to capture screenshot at ${path}`,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
117
157
|
}
|
|
118
158
|
}
|
|
119
159
|
let finalUITreePath;
|
|
@@ -138,8 +178,34 @@ export async function replayScenario(input) {
|
|
|
138
178
|
failures,
|
|
139
179
|
totalDurationMs: Date.now() - start,
|
|
140
180
|
...(finalUITreePath ? { finalUITreePath } : {}),
|
|
181
|
+
...(input.screenshotDir ? { screenshotPaths } : {}),
|
|
141
182
|
};
|
|
142
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* v1.15+. Run `xcrun simctl io <udid> screenshot <path>` to capture the
|
|
186
|
+
* current simulator state. Returns `true` on success, `false` on any
|
|
187
|
+
* failure (we surface failures via the `failures[]` array on the
|
|
188
|
+
* result, no exceptions thrown so the scenario continues).
|
|
189
|
+
*
|
|
190
|
+
* Exported so callers / tests can drive screenshot capture independently
|
|
191
|
+
* of the scenario loop.
|
|
192
|
+
*/
|
|
193
|
+
export async function captureSimulatorScreenshot(udid, outputPath) {
|
|
194
|
+
try {
|
|
195
|
+
// Ensure the parent directory exists (replayScenario mkdir's the
|
|
196
|
+
// configured dir upfront but captureSimulatorScreenshot may be
|
|
197
|
+
// called against arbitrary nested paths).
|
|
198
|
+
const parent = dirname(outputPath);
|
|
199
|
+
if (!existsSync(parent)) {
|
|
200
|
+
mkdirSync(parent, { recursive: true });
|
|
201
|
+
}
|
|
202
|
+
const result = await runCommand("xcrun", ["simctl", "io", udid, "screenshot", outputPath], { timeoutMs: 30_000 });
|
|
203
|
+
return result.code === 0 && existsSync(outputPath);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
143
209
|
async function executeAction(udid, action) {
|
|
144
210
|
switch (action.type) {
|
|
145
211
|
case "tap": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayScenario.js","sourceRoot":"","sources":["../../src/tools/replayScenario.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,KAAK,EACL,GAAG,EACH,QAAQ,GAET,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"replayScenario.js","sourceRoot":"","sources":["../../src/tools/replayScenario.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,17 +31,18 @@ import { type AnalyzeAnimationHitchesResult } from "./analyzeAnimationHitches.js
|
|
|
31
31
|
import { type AnalyzeTimeProfileResult } from "./analyzeTimeProfile.js";
|
|
32
32
|
import { type AnalyzeAllocationsResult } from "./analyzeAllocations.js";
|
|
33
33
|
import { type AnalyzeAppLaunchResult } from "./analyzeAppLaunch.js";
|
|
34
|
+
import { type AnalyzeNetworkActivityResult } from "./analyzeNetworkActivity.js";
|
|
34
35
|
export declare const summarizeTraceSchema: z.ZodObject<{
|
|
35
36
|
tracePath: z.ZodString;
|
|
36
|
-
focus: z.ZodDefault<z.ZodEnum<["hangs", "hitches", "allocations", "launch", "all"]>>;
|
|
37
|
+
focus: z.ZodDefault<z.ZodEnum<["hangs", "hitches", "allocations", "launch", "network", "all"]>>;
|
|
37
38
|
verbose: z.ZodDefault<z.ZodBoolean>;
|
|
38
39
|
}, "strip", z.ZodTypeAny, {
|
|
39
40
|
tracePath: string;
|
|
40
|
-
focus: "allocations" | "all" | "hangs" | "hitches" | "launch";
|
|
41
|
+
focus: "allocations" | "all" | "hangs" | "network" | "hitches" | "launch";
|
|
41
42
|
verbose: boolean;
|
|
42
43
|
}, {
|
|
43
44
|
tracePath: string;
|
|
44
|
-
focus?: "allocations" | "all" | "hangs" | "hitches" | "launch" | undefined;
|
|
45
|
+
focus?: "allocations" | "all" | "hangs" | "network" | "hitches" | "launch" | undefined;
|
|
45
46
|
verbose?: boolean | undefined;
|
|
46
47
|
}>;
|
|
47
48
|
export type SummarizeTraceInput = z.infer<typeof summarizeTraceSchema>;
|
|
@@ -86,6 +87,8 @@ export interface SummarizeTraceResult {
|
|
|
86
87
|
timeProfile: SummarizeAreaSummary<AnalyzeTimeProfileResult>;
|
|
87
88
|
allocations: SummarizeAreaSummary<AnalyzeAllocationsResult>;
|
|
88
89
|
appLaunch: SummarizeAreaSummary<AnalyzeAppLaunchResult>;
|
|
90
|
+
/** v1.15: network-connections schema. Absent when the trace was recorded with a non-Network template. */
|
|
91
|
+
network: SummarizeAreaSummary<AnalyzeNetworkActivityResult>;
|
|
89
92
|
};
|
|
90
93
|
/** Cross-area correlations (v1.13 Phase 2). Empty when areas don't have enough data to correlate. */
|
|
91
94
|
correlations: Correlation[];
|