@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
package/dist/cli.js CHANGED
@@ -1,18 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  // Copyright 2026 Gravity Labs
3
3
  // SPDX-License-Identifier: Apache-2.0
4
- import { spawn, spawnSync } from "node:child_process";
5
- import { existsSync } from "node:fs";
6
- import path from "node:path";
4
+ import { spawn } from "node:child_process";
7
5
  import { DeviceClient } from "./device.js";
8
6
  import { TimelineServer } from "./timeline.js";
9
7
  import { capture, compare, parseCapture, report } from "./capture.js";
10
- import { runAdb } from "./adb.js";
8
+ import { resolveProjectRoot, runAdb } from "./adb.js";
9
+ import { bootPortholeServer } from "./index.js";
10
+ import { parseDuration, parseMillis, parsePort, requiredValue } from "./args.js";
11
+ import { sessionsRoot } from "./sessions.js";
12
+ import { listSessionsText, saveFromSessions } from "./save.js";
11
13
  const USAGE = `
12
14
  porthole — a window into a running Android app
13
15
 
14
16
  porthole ui open the live timeline
15
17
  porthole capture --scenario <name> -- <command> record a run to a trace
18
+ porthole save (--since <dur> | --from <ms> --to <ms>) save what already happened
19
+ porthole sessions list what is recorded on disk
16
20
  porthole report <trace.json> what the run is worth looking at
17
21
  porthole compare <base> <trace> regressions against a baseline
18
22
  porthole mcp the MCP server (stdio)
@@ -30,7 +34,13 @@ porthole ui — open the live timeline for a running debug build
30
34
  Needs a device or emulator with the debug build running: the porthole lives inside
31
35
  the app process, and adb forward is what makes its socket reachable from here.
32
36
  `;
33
- function parse(argv) {
37
+ /**
38
+ * Exported so a test can drive the argv loop itself, not just the pure
39
+ * validators it calls. A test that only calls `parsePort` directly cannot
40
+ * tell the difference between this loop checking its result and ignoring it —
41
+ * deleting the `process.exit(2)` branches below left every prior test green.
42
+ */
43
+ export function parse(argv) {
34
44
  const options = {
35
45
  port: 8677,
36
46
  uiPort: 8678,
@@ -39,12 +49,34 @@ function parse(argv) {
39
49
  };
40
50
  for (let i = 0; i < argv.length; i++) {
41
51
  const arg = argv[i];
42
- if (arg === "--port")
43
- options.port = Number(argv[++i]);
44
- else if (arg === "--ui-port")
45
- options.uiPort = Number(argv[++i]);
46
- else if (arg === "--serial")
47
- options.serial = argv[++i];
52
+ if (arg === "--port") {
53
+ const value = parsePort(argv[++i], "--port");
54
+ if (typeof value !== "number") {
55
+ process.stderr.write(`${value.message}\n`);
56
+ process.exit(2);
57
+ }
58
+ options.port = value;
59
+ }
60
+ else if (arg === "--ui-port") {
61
+ const value = parsePort(argv[++i], "--ui-port");
62
+ if (typeof value !== "number") {
63
+ process.stderr.write(`${value.message}\n`);
64
+ process.exit(2);
65
+ }
66
+ options.uiPort = value;
67
+ }
68
+ else if (arg === "--serial") {
69
+ // Previously `argv[++i]` raw: a missing value was consumed silently, and
70
+ // `--serial --port 8677` swallowed "--port" as the serial and left
71
+ // "8677" to be rejected next as a nonsense option — blaming the wrong
72
+ // token for the actual mistake. requiredValue names --serial instead.
73
+ const value = requiredValue(argv[++i], "--serial");
74
+ if (typeof value !== "string") {
75
+ process.stderr.write(`${value.message}\n`);
76
+ process.exit(2);
77
+ }
78
+ options.serial = value;
79
+ }
48
80
  else if (arg === "--no-forward")
49
81
  options.forward = false;
50
82
  else if (arg === "--no-open")
@@ -60,39 +92,99 @@ function parse(argv) {
60
92
  }
61
93
  return options;
62
94
  }
63
- /** adb, in the order a developer would look for it. Mirrors the Gradle plugin. */
64
- function findAdb() {
65
- const binary = process.platform === "win32" ? "adb.exe" : "adb";
66
- for (const variable of ["ANDROID_HOME", "ANDROID_SDK_ROOT"]) {
67
- const root = process.env[variable];
68
- if (!root)
69
- continue;
70
- const candidate = path.join(root, "platform-tools", binary);
71
- if (existsSync(candidate))
72
- return candidate;
95
+ export const SAVE_USAGE = `
96
+ porthole save — turn a window of what already happened into a trace file
97
+
98
+ porthole save (--since <duration> | --from <ms> --to <ms>) [options]
99
+
100
+ --since <duration> how far back to look: 10m, 90s, 2h, or a millisecond count
101
+ --from <ms> absolute start, device uptime clock (quote a finding's window)
102
+ --to <ms> absolute end, same clock
103
+ --scenario <name> what to call it. Defaults to moment-<from>-<to>
104
+ --out <file> where to write the trace. Defaults to .porthole/traces/<scenario>.json
105
+
106
+ Resolves against whichever session on disk was most recently written to —
107
+ there is no running MCP server here to ask "what counts as now" of.
108
+
109
+ porthole sessions list every session recorded on disk
110
+ `;
111
+ /**
112
+ * GRA-54. Same discipline as `parseCapture`/`parse()` above: every value
113
+ * goes through a validator that names the option and refuses rather than
114
+ * silently accepting `NaN` or swallowing the next flag as its own value.
115
+ * Exported, like `parse()`, so a test can drive the argv loop itself and not
116
+ * just the pure validators it calls (deleting the `process.exit(2)`
117
+ * branches below would otherwise leave every prior test green).
118
+ */
119
+ export function parseSave(argv) {
120
+ const options = {};
121
+ for (let i = 0; i < argv.length; i++) {
122
+ const arg = argv[i];
123
+ if (arg === "--scenario") {
124
+ const value = requiredValue(argv[++i], "--scenario");
125
+ if (typeof value !== "string") {
126
+ process.stderr.write(`${value.message}\n`);
127
+ process.exit(2);
128
+ }
129
+ options.scenario = value;
130
+ }
131
+ else if (arg === "--since") {
132
+ const value = parseDuration(argv[++i], "--since");
133
+ if (typeof value !== "number") {
134
+ process.stderr.write(`${value.message}\n`);
135
+ process.exit(2);
136
+ }
137
+ options.sinceMs = value;
138
+ }
139
+ else if (arg === "--from") {
140
+ const value = parseMillis(argv[++i], "--from");
141
+ if (typeof value !== "number") {
142
+ process.stderr.write(`${value.message}\n`);
143
+ process.exit(2);
144
+ }
145
+ options.from = value;
146
+ }
147
+ else if (arg === "--to") {
148
+ const value = parseMillis(argv[++i], "--to");
149
+ if (typeof value !== "number") {
150
+ process.stderr.write(`${value.message}\n`);
151
+ process.exit(2);
152
+ }
153
+ options.to = value;
154
+ }
155
+ else if (arg === "--out") {
156
+ const value = requiredValue(argv[++i], "--out");
157
+ if (typeof value !== "string") {
158
+ process.stderr.write(`${value.message}\n`);
159
+ process.exit(2);
160
+ }
161
+ options.out = value;
162
+ }
163
+ else if (arg === "--help" || arg === "-h") {
164
+ process.stdout.write(SAVE_USAGE);
165
+ process.exit(0);
166
+ }
167
+ else {
168
+ process.stderr.write(`unknown option: ${arg}\n${SAVE_USAGE}`);
169
+ process.exit(2);
170
+ }
73
171
  }
74
- return binary;
75
- }
76
- function forwardPort(options) {
77
- const adb = findAdb();
78
- const args = options.serial ? ["-s", options.serial] : [];
79
- args.push("forward", `tcp:${options.port}`, `tcp:${options.port}`);
80
- const result = spawnSync(adb, args, { encoding: "utf8" });
81
- if (result.error) {
82
- console.error(`Could not run adb (${result.error.message}).\n` +
83
- "Set ANDROID_HOME, or put adb on your PATH, or pass --no-forward if the\n" +
84
- "bridge is already up.");
85
- return;
172
+ const hasSince = options.sinceMs !== undefined;
173
+ const hasFrom = options.from !== undefined;
174
+ const hasTo = options.to !== undefined;
175
+ if (hasSince && (hasFrom || hasTo)) {
176
+ process.stderr.write(`--since cannot be combined with --from/--to\n${SAVE_USAGE}`);
177
+ process.exit(2);
86
178
  }
87
- if (result.status !== 0) {
88
- const message = (result.stderr || result.stdout || "").trim();
89
- console.error(`adb forward failed: ${message}`);
90
- if (message.includes("more than one")) {
91
- console.error("Pass --serial <id>; 'adb devices' lists them.");
92
- }
93
- return;
179
+ if (hasFrom !== hasTo) {
180
+ process.stderr.write(`--from and --to must be given together\n${SAVE_USAGE}`);
181
+ process.exit(2);
94
182
  }
95
- console.error(`forwarded 127.0.0.1:${options.port} to the device`);
183
+ if (!hasSince && !hasFrom) {
184
+ process.stderr.write(`give either --since <duration> or both --from and --to\n${SAVE_USAGE}`);
185
+ process.exit(2);
186
+ }
187
+ return options;
96
188
  }
97
189
  function openBrowser(url) {
98
190
  const [command, args] = process.platform === "win32"
@@ -109,9 +201,27 @@ function openBrowser(url) {
109
201
  }
110
202
  async function ui(argv) {
111
203
  const options = parse(argv);
112
- if (options.forward)
113
- forwardPort(options);
114
- const device = new DeviceClient("127.0.0.1", options.port);
204
+ if (options.forward) {
205
+ // Same call `porthole capture` makes, through the same runAdb: this used to
206
+ // be a second copy of adb discovery and a second copy of the advice to pass
207
+ // --serial, and the copy here was the one that could not find the SDK.
208
+ const forwarded = runAdb(["forward", `tcp:${options.port}`, `tcp:${options.port}`], options.serial);
209
+ if (forwarded.ok) {
210
+ console.error(`forwarded 127.0.0.1:${options.port} to the device`);
211
+ }
212
+ else {
213
+ console.error(forwarded.output);
214
+ console.error("Pass --no-forward if the bridge is already up.");
215
+ }
216
+ }
217
+ // GRA-53: the same sessions root `createPortholeServer` uses (index.ts),
218
+ // so a session started here — `porthole ui` is a real entry point someone
219
+ // launches directly, not only through an agent's MCP server — persists to
220
+ // disk the same as any other. Without this, `porthole ui` silently wrote
221
+ // to nothing: `DeviceClient`'s sessions root defaults to disabled when
222
+ // omitted, and nobody watching a browser tab would notice a feature that
223
+ // fails silent.
224
+ const device = new DeviceClient("127.0.0.1", options.port, sessionsRoot(resolveProjectRoot().directory));
115
225
  const timeline = new TimelineServer(device, options.uiPort, options.serial);
116
226
  device.start();
117
227
  let url;
@@ -119,31 +229,61 @@ async function ui(argv) {
119
229
  url = await timeline.start();
120
230
  }
121
231
  catch (error) {
122
- console.error(`Could not serve the timeline on port ${options.uiPort}: ${error.message}\n` +
123
- "Something else is probably on it; pass --ui-port to move.");
232
+ const problem = error;
233
+ console.error(problem.message);
234
+ // An instance already serving this device is not a failure — it is the
235
+ // thing that was asked for. Point at it and stop.
236
+ if (problem.portholeAlreadyRunning) {
237
+ if (options.open)
238
+ openBrowser(problem.url);
239
+ process.exit(0);
240
+ }
241
+ console.error(`Pass --ui-port to use a port other than ${options.uiPort}.`);
124
242
  process.exit(1);
125
243
  }
126
244
  console.error(`timeline at ${url}`);
127
245
  if (options.open)
128
246
  openBrowser(url);
129
247
  device.on("state", (state) => {
130
- if (state === "connected") {
131
- const hello = device.hello;
132
- console.error(hello ? `connected to ${hello.packageName} on ${hello.device}` : "connected");
133
- }
134
- else if (state === "disconnected") {
135
- // Expected constantly during development: the app gets reinstalled and
136
- // relaunched, and the client reconnects on its own.
137
- console.error("waiting for the app...");
248
+ // GRA-162: was an if/else-if chain with no final else, so "connecting"
249
+ // printed nothing — silently correct, but silently, and a fifth state
250
+ // would have joined it there without tsc ever noticing. A switch with
251
+ // an explicit (still silent) "connecting" case and a never-guarded
252
+ // default gives that same behaviour a name and makes the next state
253
+ // addition fail here instead of joining "connecting" by accident. Same
254
+ // precedent as pendingMessage() in device.ts.
255
+ switch (state) {
256
+ case "handshaking":
257
+ // GRA-157: this fires exactly when the socket comes up, which is the
258
+ // real event the 2-second setTimeout below used to guess at. Printing
259
+ // here instead means the CLI says something true immediately on a
260
+ // slow device and does not need a fixed wait on a fast one — the
261
+ // opposite of what a timer can do.
262
+ console.error("connected, waiting on the app's first check-in...");
263
+ break;
264
+ case "connected": {
265
+ // hello is guaranteed non-null here — DeviceClient does not enter
266
+ // "connected" until it is (see device.ts's setState()) — so this no
267
+ // longer hedges with a ternary the way it had to before that was true.
268
+ const hello = device.hello;
269
+ console.error(`connected to ${hello.packageName} on ${hello.device}`);
270
+ break;
271
+ }
272
+ case "disconnected":
273
+ // Expected constantly during development: the app gets reinstalled and
274
+ // relaunched, and the client reconnects on its own.
275
+ console.error("waiting for the app...");
276
+ break;
277
+ case "connecting":
278
+ // No behaviour change (GRA-162 AC3): the original chain had no
279
+ // branch for "connecting" either, so this stays deliberately silent.
280
+ break;
281
+ default: {
282
+ const exhaustive = state;
283
+ throw new Error(`porthole ui: unhandled ConnectionState '${exhaustive}'`);
284
+ }
138
285
  }
139
286
  });
140
- // The first connect usually lands in well under a second. Printing a
141
- // troubleshooting wall immediately and then "connected" a moment later reads
142
- // like something went wrong when nothing did.
143
- setTimeout(() => {
144
- if (device.state !== "connected")
145
- console.error(device.notConnectedMessage());
146
- }, 2000);
147
287
  const shutdown = () => {
148
288
  device.stop();
149
289
  timeline.stop();
@@ -157,7 +297,13 @@ if (command === "ui") {
157
297
  await ui(rest);
158
298
  }
159
299
  else if (command === "mcp") {
160
- await import("./index.js");
300
+ // Calls the same boot function `node dist/index.js` uses under its own
301
+ // `isMainModule()` guard, rather than `import("./index.js")`ing for the
302
+ // side effect. That side-effect import used to be how this worked, but it
303
+ // silently stopped booting anything once the boot moved behind the guard:
304
+ // `argv[1]` here is `cli.js`, so the guard (correctly) never fires for us.
305
+ // One boot path, two callers.
306
+ await bootPortholeServer();
161
307
  }
162
308
  else if (command === "capture") {
163
309
  const options = parseCapture(rest);
@@ -168,6 +314,19 @@ else if (command === "capture") {
168
314
  }
169
315
  process.exit(await capture(options));
170
316
  }
317
+ else if (command === "save") {
318
+ const options = parseSave(rest);
319
+ const projectRoot = resolveProjectRoot().directory;
320
+ const saveOptions = { root: sessionsRoot(projectRoot), projectRoot, ...options };
321
+ const result = await saveFromSessions(saveOptions);
322
+ process.stderr.write(`${result.message}\n`);
323
+ process.exit(result.code);
324
+ }
325
+ else if (command === "sessions") {
326
+ const result = await listSessionsText(sessionsRoot(resolveProjectRoot().directory));
327
+ process.stdout.write(`${result.message}\n`);
328
+ process.exit(result.code);
329
+ }
171
330
  else if (command === "report") {
172
331
  if (!rest[0]) {
173
332
  process.stderr.write("porthole report <trace.json>\n");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}