@gravitylabsllc/porthole 0.1.0 → 0.2.1

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.
Files changed (55) hide show
  1. package/README.md +123 -0
  2. package/dist/adb.js +430 -21
  3. package/dist/adb.js.map +1 -1
  4. package/dist/args.js +144 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/capture.js +139 -30
  7. package/dist/capture.js.map +1 -1
  8. package/dist/cli.js +221 -62
  9. package/dist/cli.js.map +1 -1
  10. package/dist/device.js +337 -4
  11. package/dist/device.js.map +1 -1
  12. package/dist/index.js +2030 -377
  13. package/dist/index.js.map +1 -1
  14. package/dist/moment.js +240 -0
  15. package/dist/moment.js.map +1 -0
  16. package/dist/perfetto.js +826 -0
  17. package/dist/perfetto.js.map +1 -0
  18. package/dist/report.js +68 -7
  19. package/dist/report.js.map +1 -1
  20. package/dist/save.js +252 -0
  21. package/dist/save.js.map +1 -0
  22. package/dist/sessions.js +704 -0
  23. package/dist/sessions.js.map +1 -0
  24. package/dist/system.js +169 -0
  25. package/dist/system.js.map +1 -0
  26. package/dist/systrace.js +198 -0
  27. package/dist/systrace.js.map +1 -0
  28. package/dist/timeline.js +731 -29
  29. package/dist/timeline.js.map +1 -1
  30. package/dist/trace.js +317 -27
  31. package/dist/trace.js.map +1 -1
  32. package/dist/watermark.js +220 -0
  33. package/dist/watermark.js.map +1 -0
  34. package/package.json +10 -4
  35. package/src/adb.ts +583 -0
  36. package/src/args.ts +177 -0
  37. package/src/capture.ts +292 -0
  38. package/src/cli.ts +367 -0
  39. package/src/device.ts +635 -0
  40. package/src/index.ts +2545 -0
  41. package/src/moment.ts +306 -0
  42. package/src/perfetto.ts +972 -0
  43. package/src/report.ts +285 -0
  44. package/src/save.ts +322 -0
  45. package/src/sessions.ts +894 -0
  46. package/src/system.ts +221 -0
  47. package/src/systrace.ts +258 -0
  48. package/src/timeline.ts +1036 -0
  49. package/src/trace.ts +769 -0
  50. package/src/watermark.ts +337 -0
  51. package/ui/dist/assets/index-DtnyBXCM.css +1 -0
  52. package/ui/dist/assets/index-h7VNB9Fl.js +70 -0
  53. package/ui/dist/index.html +2 -2
  54. package/ui/dist/assets/index--1mlZuNZ.css +0 -1
  55. package/ui/dist/assets/index-BeVGHRFm.js +0 -68
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
package/dist/system.js ADDED
@@ -0,0 +1,169 @@
1
+ // Copyright 2026 Gravity Labs
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * What the rest of the device was doing, from what adb can be asked directly.
5
+ *
6
+ * Porthole sees inside one process. When it reports a 400ms stall whose stack
7
+ * bottoms out in a native read, or a janky frame dominated by swapBuffers, the
8
+ * reason is usually below the app and it has no way to look — which is the
9
+ * point at which a developer gives up and opens a system trace by hand.
10
+ *
11
+ * A good share of those cases are answerable without a trace at all: the device
12
+ * was thermally throttled, the governor was holding the cores low, or something
13
+ * else on the device was eating the CPU. Those come straight out of dumpsys and
14
+ * sysfs, cost nothing, and need no extra tooling.
15
+ *
16
+ * Everything here parses defensively. `dumpsys` output varies by vendor and by
17
+ * release, and the honest failure is to say a source could not be read rather
18
+ * than to guess a number from a format that turned out to be different.
19
+ */
20
+ const num = (value, fallback = NaN) => {
21
+ if (value === undefined)
22
+ return fallback;
23
+ const parsed = Number(value.trim());
24
+ return Number.isFinite(parsed) ? parsed : fallback;
25
+ };
26
+ /**
27
+ * `dumpsys thermalservice`.
28
+ *
29
+ * The interesting line is the status: devices report a throttling severity, and
30
+ * anything above NONE means the system was deliberately slowing itself down —
31
+ * which explains a regression that no code change can account for.
32
+ */
33
+ /** android.os.Temperature throttling constants, as reported by ordinal. */
34
+ const SEVERITY = {
35
+ "0": "NONE",
36
+ "1": "LIGHT",
37
+ "2": "MODERATE",
38
+ "3": "SEVERE",
39
+ "4": "CRITICAL",
40
+ "5": "EMERGENCY",
41
+ "6": "SHUTDOWN",
42
+ };
43
+ export function parseThermal(output) {
44
+ const readings = [];
45
+ // Temperature{mValue=41.2, mType=3, mName=CPU, mStatus=0}
46
+ //
47
+ // Anchored on the type. The dump also lists CoolingDevice entries with the
48
+ // identical inner shape, and an unanchored match read one of those as a
49
+ // sensor: "hottest sensor tpu at 7964000°C", which is a throttling level.
50
+ for (const match of output.matchAll(/Temperature\{mValue=([-\d.]+),\s*mType=\d+,\s*mName=([^,}]+)/g)) {
51
+ const celsius = num(match[1]);
52
+ if (Number.isFinite(celsius))
53
+ readings.push({ name: match[2].trim(), celsius });
54
+ }
55
+ // Some devices name the status, some give the enum ordinal. Reported by
56
+ // name either way, because "Thermal status 0" reads like a throttle.
57
+ const raw = output.match(/Thermal Status:\s*(\w+)/i)?.[1] ?? null;
58
+ const status = raw === null ? null : (SEVERITY[raw] ?? raw.toUpperCase());
59
+ // The dump lists each sensor more than once, in different sections.
60
+ const unique = [...new Map(readings.map((r) => [r.name, r])).values()];
61
+ const hottest = unique.reduce((worst, r) => (worst === null || r.celsius > worst.celsius ? r : worst), null);
62
+ return { readings: unique, throttling: status, hottest };
63
+ }
64
+ /**
65
+ * Per-core frequency and governor, read out of sysfs in one shell round trip.
66
+ *
67
+ * A core pinned well below its maximum while the app is janking is the shape of
68
+ * thermal or power-save throttling, and it is invisible from inside the process.
69
+ */
70
+ export function parseCpu(output) {
71
+ const cores = [];
72
+ // Emitted as `cpu0 governor 300000 2400000`, one core per line.
73
+ for (const line of output.split("\n")) {
74
+ const parts = line.trim().split(/\s+/);
75
+ if (parts.length < 4 || !parts[0].startsWith("cpu"))
76
+ continue;
77
+ const cpu = num(parts[0].slice(3));
78
+ if (!Number.isFinite(cpu))
79
+ continue;
80
+ cores.push({
81
+ cpu,
82
+ governor: parts[1] === "?" ? null : parts[1],
83
+ curKhz: num(parts[2], 0),
84
+ maxKhz: num(parts[3], 0),
85
+ });
86
+ }
87
+ // A maximum below the current reading means these files are not the
88
+ // frequencies we assumed — an emulator returns 5270965 and 2 — and
89
+ // dividing them produced a confident 263657263% of maximum. Anything
90
+ // that fails the ordering is treated as unreadable rather than believed.
91
+ const comparable = cores.filter((c) => c.curKhz > 0 && c.maxKhz >= c.curKhz);
92
+ const belowMax = comparable.filter((c) => c.curKhz < c.maxKhz * 0.9).length;
93
+ const headroom = comparable.length
94
+ ? Math.round((comparable.reduce((sum, c) => sum + c.curKhz / c.maxKhz, 0) / comparable.length) * 100)
95
+ : null;
96
+ return { cores, belowMax, headroom };
97
+ }
98
+ /** `dumpsys cpuinfo` — who was actually using the CPU, app included. */
99
+ /** Summary rows dumpsys mixes in among the processes. */
100
+ const AGGREGATES = new Set(["TOTAL", "TOTAL:", "IOW", "irq", "softirq"]);
101
+ export function parseTop(output, limit = 8) {
102
+ const out = [];
103
+ // " 12% 1234/com.example: 8% user + 4% kernel", and without the pid on
104
+ // some lines. The pid group has to be explicit: a lazy prefix matches empty
105
+ // and lets "1234/com.example" through as the name.
106
+ for (const match of output.matchAll(/^\s*([\d.]+)%\s+(?:\d+\/)?([^\s:]+):/gm)) {
107
+ const percent = num(match[1]);
108
+ if (!Number.isFinite(percent))
109
+ continue;
110
+ // dumpsys ends with `95% TOTAL: ...`, which is the sum and not a
111
+ // process. Left in, it is the busiest thing on every device.
112
+ if (AGGREGATES.has(match[2]))
113
+ continue;
114
+ out.push({ percent, name: match[2] });
115
+ }
116
+ return out.sort((a, b) => b.percent - a.percent).slice(0, limit);
117
+ }
118
+ /** `dumpsys meminfo` — whether the device as a whole was under pressure. */
119
+ export function parseMemory(output) {
120
+ const total = num(output.match(/Total RAM:\s*([\d,]+)/)?.[1]?.replace(/,/g, ""));
121
+ const free = num(output.match(/Free RAM:\s*([\d,]+)/)?.[1]?.replace(/,/g, ""));
122
+ if (!Number.isFinite(total))
123
+ return null;
124
+ return {
125
+ totalMb: Math.round(total / 1024),
126
+ availableMb: Number.isFinite(free) ? Math.round(free / 1024) : 0,
127
+ lowMemory: /lowMemory=true/i.test(output),
128
+ };
129
+ }
130
+ /**
131
+ * One sentence naming only what was actually observed.
132
+ *
133
+ * Deliberately does not conclude. "Two cores below maximum" is a fact; "the app
134
+ * is slow because of throttling" is a guess, and this file has no idea what the
135
+ * app was doing at the time.
136
+ */
137
+ export function describeSystem(context) {
138
+ const parts = [];
139
+ if (context.thermal?.throttling && context.thermal.throttling.toUpperCase() !== "NONE") {
140
+ parts.push(`Thermal status ${context.thermal.throttling}.`);
141
+ }
142
+ if (context.thermal?.hottest) {
143
+ parts.push(`Hottest sensor ${context.thermal.hottest.name} at ${context.thermal.hottest.celsius}°C.`);
144
+ }
145
+ if (context.cpu && context.cpu.headroom !== null) {
146
+ parts.push(`CPUs at ${context.cpu.headroom}% of maximum clock` +
147
+ (context.cpu.belowMax ? `, ${context.cpu.belowMax} core(s) well below.` : "."));
148
+ }
149
+ if (context.top.length) {
150
+ const other = context.top[0];
151
+ parts.push(`Busiest process ${other.name} at ${other.percent}%.`);
152
+ }
153
+ if (context.memory) {
154
+ parts.push(`${context.memory.availableMb}MB free of ${context.memory.totalMb}MB` +
155
+ (context.memory.lowMemory ? " — system reports low memory." : "."));
156
+ }
157
+ if (context.unavailable.length) {
158
+ parts.push(`Could not read: ${context.unavailable.map((u) => u.source).join(", ")}.`);
159
+ }
160
+ return parts.length ? parts.join(" ") : "Nothing readable from the device.";
161
+ }
162
+ /** The single shell command that reads every core's governor and frequency. */
163
+ export const CPU_PROBE = "for c in /sys/devices/system/cpu/cpu[0-9]*; do " +
164
+ "n=$(basename $c); " +
165
+ "g=$(cat $c/cpufreq/scaling_governor 2>/dev/null || echo '?'); " +
166
+ "f=$(cat $c/cpufreq/scaling_cur_freq 2>/dev/null || echo 0); " +
167
+ "m=$(cat $c/cpufreq/cpuinfo_max_freq 2>/dev/null || echo 0); " +
168
+ "echo \"$n $g $f $m\"; done";
169
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../src/system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ // Copyright 2026 Gravity Labs
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { open } from "node:fs/promises";
4
+ /**
5
+ * Recording a Perfetto trace from the device, and saying what is in it.
6
+ *
7
+ * Deliberately does not return the trace. A ten-second capture is tens of
8
+ * megabytes of protobuf, and the instinct to hand that to a model is the wrong
9
+ * one — it is not summarisable by reading it, and the useful form is a file you
10
+ * open in a trace viewer plus a sentence saying whether it is worth opening.
11
+ *
12
+ * What makes this worth having at all is that the app's own spans are already
13
+ * inside it. The runtime writes its navigations, HTTP calls, queries and stalls
14
+ * as atrace sections, so a capture arrives annotated with what the app was
15
+ * doing rather than only what the kernel was doing.
16
+ */
17
+ /**
18
+ * A useful default for looking at jank.
19
+ *
20
+ * Note what is *not* here: `app`. The runtime's sections are written under
21
+ * ATRACE_TAG_APP, and that tag is not a category — it is enabled per package
22
+ * with perfetto's `--app`. Passing "app" in this list enables nothing, which
23
+ * was verified by reading debug.atrace.tags.enableflags during a capture and
24
+ * finding 0xa: VIEW and GRAPHICS set, ATRACE_TAG_APP (0x1000) clear. The
25
+ * capture succeeded and contained no Porthole slices at all.
26
+ */
27
+ export const DEFAULT_CATEGORIES = [
28
+ "sched",
29
+ "freq",
30
+ "idle",
31
+ "gfx",
32
+ "view",
33
+ "wm",
34
+ "am",
35
+ "binder_driver",
36
+ "dalvik",
37
+ ];
38
+ /**
39
+ * Works out what to record, and says when the request undercuts itself.
40
+ *
41
+ * Without a package in `apps`, the capture contains no Porthole sections and
42
+ * gives no indication why — it simply succeeds and is unannotated, which reads
43
+ * as the runtime being broken. So the absence is called out rather than left to
44
+ * be discovered in a trace viewer.
45
+ */
46
+ export function planCapture(options) {
47
+ const notes = [];
48
+ const seconds = Math.min(Math.max(Math.round(options.seconds ?? 10), 1), 120);
49
+ if (options.seconds !== undefined && seconds !== Math.round(options.seconds)) {
50
+ notes.push(`Duration clamped to ${seconds}s; 1 to 120 is the supported range.`);
51
+ }
52
+ const categories = (options.categories?.length ? [...options.categories] : [...DEFAULT_CATEGORIES]).filter((c) => {
53
+ // Passing it is harmless but does nothing, and someone who passed it
54
+ // believes their app sections are being recorded. They are not.
55
+ if (c === "app") {
56
+ notes.push("Dropped the `app` category: it is not one. App sections come from " +
57
+ "ATRACE_TAG_APP, which is enabled per package — pass the package in `apps`.");
58
+ return false;
59
+ }
60
+ return true;
61
+ });
62
+ const apps = options.apps?.filter((a) => a.trim().length > 0) ?? [];
63
+ if (apps.length === 0) {
64
+ notes.push("No app named, so this trace will have no Porthole sections in it. Pass the " +
65
+ "package under test in `apps` to record the runtime's navigations, calls and stalls.");
66
+ }
67
+ const stamp = options.now ?? Date.now();
68
+ return {
69
+ categories,
70
+ apps,
71
+ seconds,
72
+ // The traced service writes here; a path under /sdcard is not writable by it.
73
+ devicePath: `/data/misc/perfetto-traces/porthole-${stamp}.pftrace`,
74
+ notes,
75
+ };
76
+ }
77
+ /** The on-device command, in Perfetto's shorthand form. */
78
+ export function captureArgs(plan) {
79
+ return [
80
+ "shell",
81
+ "perfetto",
82
+ "-o",
83
+ plan.devicePath,
84
+ "-t",
85
+ `${plan.seconds}s`,
86
+ // One --app per package. This, not a category, is what turns on the tag
87
+ // the runtime's sections are written under.
88
+ ...plan.apps.flatMap((app) => ["--app", app]),
89
+ ...plan.categories,
90
+ ];
91
+ }
92
+ /**
93
+ * How many bytes `countPortholeLabels` reads at once.
94
+ *
95
+ * Large enough that a hundred-megabyte capture is a hundred `read()` calls,
96
+ * not a hundred thousand; small enough that peak memory while scanning stays
97
+ * a handful of megabytes rather than growing with the file. This is the
98
+ * whole fix for GRA-89's heap-exhaustion half: the code this replaced read
99
+ * the entire capture into a `Buffer` and then decoded the entire buffer into
100
+ * a second, same-sized string before scanning either — two copies of
101
+ * whatever the file's size happened to be, all at once.
102
+ */
103
+ export const CHUNK_BYTES = 1024 * 1024;
104
+ /**
105
+ * How much of one chunk's tail is re-scanned as part of the next.
106
+ *
107
+ * The marker is `porthole: ` (10 characters) plus the capture group's own
108
+ * bound of up to 110 more, 120 characters at the outside. 128 bytes of
109
+ * overlap — one byte per latin1 character — covers that with eight to
110
+ * spare, so a marker whose bytes straddle a chunk boundary is always whole
111
+ * in at least one of the two scans that see it: incomplete (and so
112
+ * unmatched) in the chunk it starts in, complete once its own tail is
113
+ * carried into the front of the next chunk's text.
114
+ */
115
+ export const OVERLAP_BYTES = 128;
116
+ const PORTHOLE_MARKER = /porthole: ([^|\x00-\x1f]{1,110})/g;
117
+ /**
118
+ * Whether the app's own sections made it into the capture — read a chunk at
119
+ * a time rather than all at once.
120
+ *
121
+ * `index.ts` used to `readFileSync` the whole trace and hand this function
122
+ * the resulting `Buffer`, which this then decoded whole with
123
+ * `.toString("latin1")` before scanning it. At the tool's own 120s maximum a
124
+ * real capture is hundreds of megabytes; doubling that into a same-sized JS
125
+ * string is exactly the shape that exhausts Node's heap before the tool can
126
+ * report anything. This reads and decodes `CHUNK_BYTES` at a time instead,
127
+ * so peak memory is a small, fixed multiple of one chunk no matter how large
128
+ * the capture is — see `systrace.test.ts`'s RSS-bound case, which measures
129
+ * this rather than asserting it by argument.
130
+ *
131
+ * A byte search for the prefix, not a parse, exactly as before: slice names
132
+ * are interned as plain strings in the protobuf, so finding one is good
133
+ * evidence it is there and not finding it is good evidence it is not.
134
+ *
135
+ * Counting matches would overstate it — a name is referenced many times, not
136
+ * interned once — so this keeps the same `Set` of distinct names the
137
+ * non-streaming version used, which is also what makes the chunk overlap
138
+ * cheap to get slightly too generous rather than exactly right: a name
139
+ * re-matched out of the carried tail, because it happened to sit wholly
140
+ * inside the last `OVERLAP_BYTES` of the previous chunk rather than
141
+ * straddling the boundary, is a duplicate insert into a `Set`, not a double
142
+ * count. Only a marker that is never matched in full, in either chunk, would
143
+ * be missed — which is exactly what the overlap exists to prevent.
144
+ */
145
+ export async function countPortholeLabels(filePath) {
146
+ const names = new Set();
147
+ const handle = await open(filePath, "r");
148
+ try {
149
+ const size = (await handle.stat()).size;
150
+ const buffer = Buffer.alloc(CHUNK_BYTES);
151
+ let position = 0;
152
+ let carry = "";
153
+ while (position < size) {
154
+ const toRead = Math.min(CHUNK_BYTES, size - position);
155
+ const { bytesRead } = await handle.read(buffer, 0, toRead, position);
156
+ if (bytesRead === 0)
157
+ break; // defensive: a file truncated out from under this scan, not a loop forever re-reading zero bytes
158
+ const text = carry + buffer.toString("latin1", 0, bytesRead);
159
+ for (const match of text.matchAll(PORTHOLE_MARKER))
160
+ names.add(match[1].trimEnd());
161
+ carry = text.slice(-OVERLAP_BYTES);
162
+ position += bytesRead;
163
+ }
164
+ }
165
+ finally {
166
+ await handle.close();
167
+ }
168
+ return names.size;
169
+ }
170
+ /** One sentence: whether it worked, how big, and whether it is annotated. */
171
+ export function describeCapture(result) {
172
+ const mb = (result.bytes / (1024 * 1024)).toFixed(1);
173
+ const parts = [`Captured ${result.seconds}s to ${result.path} (${mb}MB).`];
174
+ parts.push(result.portholeLabels > 0
175
+ ? `${result.portholeLabels} Porthole track(s) in it, so the app's own navigations, ` +
176
+ "calls and queries are on the timeline."
177
+ : result.apps.length === 0
178
+ ? "No Porthole labels found — either no package was named, so the app tag was never " +
179
+ "enabled, or the app was not running with the runtime attached. The trace is still " +
180
+ "valid, it is just not annotated."
181
+ : // GRA-186: on the Pixel 9 Pro Fold (Android 17) a process already
182
+ // running when the session starts never picks up the newly-enabled
183
+ // app tag — it is consulted once, at process attach, not re-read
184
+ // live. Naming that here, rather than the old generic "package or
185
+ // runtime is wrong" wording, is what turns a false "something is
186
+ // misconfigured" reading into the actual, actionable remedy.
187
+ `No Porthole labels found even though ${result.apps.join(", ")} was targeted — this ` +
188
+ "device/build only reads the app trace tag when its process starts, so a process " +
189
+ "already running before the capture began is never marked (seen on a Pixel 9 Pro " +
190
+ "Fold, Android 17). Pass `restartApp: true`, or launch the app after the capture " +
191
+ "starts, to catch it.");
192
+ if (result.restarted) {
193
+ parts.push("The app was restarted for this capture, so it contains a cold start.");
194
+ }
195
+ parts.push("Open it at ui.perfetto.dev; nothing here reads it for you.");
196
+ return [...parts, ...result.notes].join(" ");
197
+ }
198
+ //# sourceMappingURL=systrace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systrace.js","sourceRoot":"","sources":["../src/systrace.ts"],"names":[],"mappings":"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"}