@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.
- package/README.md +123 -0
- package/dist/adb.js +430 -21
- package/dist/adb.js.map +1 -1
- package/dist/args.js +144 -0
- package/dist/args.js.map +1 -0
- package/dist/capture.js +139 -30
- package/dist/capture.js.map +1 -1
- package/dist/cli.js +221 -62
- package/dist/cli.js.map +1 -1
- package/dist/device.js +337 -4
- package/dist/device.js.map +1 -1
- package/dist/index.js +2030 -377
- package/dist/index.js.map +1 -1
- package/dist/moment.js +240 -0
- package/dist/moment.js.map +1 -0
- package/dist/perfetto.js +826 -0
- package/dist/perfetto.js.map +1 -0
- package/dist/report.js +68 -7
- package/dist/report.js.map +1 -1
- package/dist/save.js +252 -0
- package/dist/save.js.map +1 -0
- package/dist/sessions.js +704 -0
- package/dist/sessions.js.map +1 -0
- package/dist/system.js +169 -0
- package/dist/system.js.map +1 -0
- package/dist/systrace.js +198 -0
- package/dist/systrace.js.map +1 -0
- package/dist/timeline.js +731 -29
- package/dist/timeline.js.map +1 -1
- package/dist/trace.js +317 -27
- package/dist/trace.js.map +1 -1
- package/dist/watermark.js +220 -0
- package/dist/watermark.js.map +1 -0
- package/package.json +10 -4
- package/src/adb.ts +583 -0
- package/src/args.ts +177 -0
- package/src/capture.ts +292 -0
- package/src/cli.ts +367 -0
- package/src/device.ts +635 -0
- package/src/index.ts +2545 -0
- package/src/moment.ts +306 -0
- package/src/perfetto.ts +972 -0
- package/src/report.ts +285 -0
- package/src/save.ts +322 -0
- package/src/sessions.ts +894 -0
- package/src/system.ts +221 -0
- package/src/systrace.ts +258 -0
- package/src/timeline.ts +1036 -0
- package/src/trace.ts +769 -0
- package/src/watermark.ts +337 -0
- package/ui/dist/assets/index-DtnyBXCM.css +1 -0
- package/ui/dist/assets/index-h7VNB9Fl.js +70 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index--1mlZuNZ.css +0 -1
- package/ui/dist/assets/index-BeVGHRFm.js +0 -68
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perfetto.js","sourceRoot":"","sources":["../src/perfetto.ts"],"names":[],"mappings":"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"}
|
package/dist/report.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { frameBudgetMs } from "./trace.js";
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Lanes a reader should be told were checked and found quiet.
|
|
4
|
+
*
|
|
5
|
+
* Every key a lane can raise a finding from has to be listed here, or the
|
|
6
|
+
* footer ends up contradicting the list above it: a capture with three wedged
|
|
7
|
+
* HTTP calls printed "quiet: http" directly beneath the warning that named
|
|
8
|
+
* them, because the lane keyed on `http.failed` alone and a call that never
|
|
9
|
+
* returns never fails. The two must be added together, so a new lane metric is
|
|
10
|
+
* only half-added until it appears in this table.
|
|
11
|
+
*/
|
|
3
12
|
const CHECKED = [
|
|
4
|
-
{ label: "http", keys: ["http.failed"] },
|
|
5
|
-
{ label: "db", keys: ["db.onMainThread"] },
|
|
13
|
+
{ label: "http", keys: ["http.failed", "http.stillOpen"] },
|
|
14
|
+
{ label: "db", keys: ["db.onMainThread", "db.stillOpen"] },
|
|
6
15
|
{ label: "main thread", keys: ["mainThread.stalls"] },
|
|
7
16
|
{ label: "frames", keys: ["frames.missed"] },
|
|
8
|
-
{ label: "work", keys: ["work.retries", "work.failures"] },
|
|
17
|
+
{ label: "work", keys: ["work.retries", "work.failures", "work.stillOpen"] },
|
|
9
18
|
{ label: "memory", keys: ["memory.blockingGcMs"] },
|
|
10
19
|
];
|
|
11
20
|
const LABEL = {
|
|
@@ -13,7 +22,58 @@ const LABEL = {
|
|
|
13
22
|
warning: "WARNING",
|
|
14
23
|
note: "NOTE ",
|
|
15
24
|
};
|
|
16
|
-
|
|
25
|
+
// Raw ANSI SGR codes — no dependency, for four escape sequences. Reset is a
|
|
26
|
+
// full SGR reset (`\x1b[0m`) rather than a scoped "un-bold"/"un-dim" code so
|
|
27
|
+
// that wrapping never depends on which attribute was opened.
|
|
28
|
+
const ANSI_RESET = "\x1b[0m";
|
|
29
|
+
const ANSI_RED = "\x1b[31m";
|
|
30
|
+
const ANSI_YELLOW = "\x1b[33m";
|
|
31
|
+
const ANSI_DIM = "\x1b[2m";
|
|
32
|
+
const SEVERITY_COLOR = {
|
|
33
|
+
error: ANSI_RED,
|
|
34
|
+
warning: ANSI_YELLOW,
|
|
35
|
+
note: ANSI_DIM,
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Whether the severity token in a rendered report should carry colour.
|
|
39
|
+
*
|
|
40
|
+
* Colour belongs on the TTY path a human reads — never on a pipe, CI, or the
|
|
41
|
+
* MCP tool result text an agent reads, where escape bytes are just noise a
|
|
42
|
+
* model has to see past. So this is a question about one output stream, not
|
|
43
|
+
* a global: `porthole capture` writes its summary to stderr while `porthole
|
|
44
|
+
* report` writes to stdout, and the two can disagree about whether they are
|
|
45
|
+
* a terminal (`cmd | less` redirects stdout but leaves stderr a TTY).
|
|
46
|
+
* Callers pass the stream they are about to write to.
|
|
47
|
+
*
|
|
48
|
+
* NO_COLOR (https://no-color.org) is honoured unconditionally when set to
|
|
49
|
+
* anything, including an empty string — the convention is "the variable is
|
|
50
|
+
* present", not "the variable is truthy", so this checks `undefined` rather
|
|
51
|
+
* than falsiness.
|
|
52
|
+
*/
|
|
53
|
+
export function shouldColor(stream = process.stdout, env = process.env) {
|
|
54
|
+
return Boolean(stream.isTTY) && env.NO_COLOR === undefined;
|
|
55
|
+
}
|
|
56
|
+
function colorSeverity(severity, color) {
|
|
57
|
+
const label = LABEL[severity];
|
|
58
|
+
return color ? `${SEVERITY_COLOR[severity]}${label}${ANSI_RESET}` : label;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* One of the footer counts, saying how many of them never finished.
|
|
62
|
+
*
|
|
63
|
+
* The counts deliberately include spans that were still open when the capture
|
|
64
|
+
* ended — a query that never came back still happened and still cost the wait.
|
|
65
|
+
* But "40 queries" reads as forty completions to anyone who does not know that,
|
|
66
|
+
* and this line is the part of the report people quote. The qualifier travels
|
|
67
|
+
* with the number, the same way `atLeastMs` carries its own. It is left off
|
|
68
|
+
* entirely when nothing was open, which is almost every run.
|
|
69
|
+
*/
|
|
70
|
+
function counted(trace, total, open, noun) {
|
|
71
|
+
const stillOpen = trace.metrics[open] ?? 0;
|
|
72
|
+
const suffix = stillOpen > 0 ? ` (${stillOpen} still open)` : "";
|
|
73
|
+
return `${trace.metrics[total]} ${noun}${suffix}`;
|
|
74
|
+
}
|
|
75
|
+
export function renderReport(trace, options = {}) {
|
|
76
|
+
const color = options.color ?? false;
|
|
17
77
|
const lines = [];
|
|
18
78
|
const device = trace.device;
|
|
19
79
|
const hz = Number(device.refreshHz) || 60;
|
|
@@ -33,7 +93,7 @@ export function renderReport(trace) {
|
|
|
33
93
|
// marked run, where it drops an ERROR below two WARNINGs and defeats the one
|
|
34
94
|
// job of a prioritised list. The mark rides along on the line instead.
|
|
35
95
|
for (const finding of trace.findings) {
|
|
36
|
-
lines.push(` ${
|
|
96
|
+
lines.push(` ${colorSeverity(finding.severity, color)} ${finding.title}`);
|
|
37
97
|
if (finding.during)
|
|
38
98
|
lines.push(` during "${finding.during}"`);
|
|
39
99
|
if (finding.detail)
|
|
@@ -50,7 +110,8 @@ export function renderReport(trace) {
|
|
|
50
110
|
lines.push("");
|
|
51
111
|
lines.push(` frame budget ${frameBudgetMs(hz)}ms · ` +
|
|
52
112
|
`${trace.metrics["recompose.total"]} recompositions · ` +
|
|
53
|
-
`${trace
|
|
113
|
+
`${counted(trace, "http.calls", "http.stillOpen", "calls")} · ` +
|
|
114
|
+
`${counted(trace, "db.queries", "db.stillOpen", "queries")}`);
|
|
54
115
|
if (trace.marks.length > 0)
|
|
55
116
|
lines.push(` ${trace.marks.length} marks`);
|
|
56
117
|
if (trace.driver)
|
package/dist/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
package/dist/save.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// Copyright 2026 Gravity Labs
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { buildTrace, resolveProfile } from "./trace.js";
|
|
6
|
+
import { clippedMsOf, fillWindowFromDisk, listAllSessions, sessionSizeBytes, } from "./sessions.js";
|
|
7
|
+
/**
|
|
8
|
+
* GRA-54: turning a slice of what already happened into a named artifact,
|
|
9
|
+
* after the fact.
|
|
10
|
+
*
|
|
11
|
+
* Every other way Porthole produces a durable trace requires deciding to
|
|
12
|
+
* record in advance — `capture` wraps a command, `capture_system_trace`
|
|
13
|
+
* blocks for a fixed duration. Once GRA-53 put sessions on disk, the
|
|
14
|
+
* material for "something bad just happened, keep it" already exists; this
|
|
15
|
+
* module is the one place that turns a window someone already asked about
|
|
16
|
+
* (through `findings`, say) into a trace file, called from both the MCP tool
|
|
17
|
+
* `save_moment` (index.ts, which already has a live device's identity and a
|
|
18
|
+
* merged view to hand in) and the CLI's `porthole save` (which has neither,
|
|
19
|
+
* and resolves both from disk alone — see `saveFromSessions` below).
|
|
20
|
+
*
|
|
21
|
+
* Deliberately thin, on purpose, twice over:
|
|
22
|
+
*
|
|
23
|
+
* - `buildTrace` (trace.ts) is the exact analyser `capture` and the live
|
|
24
|
+
* `findings` tool both call. Byte-compatibility with `capture`'s output
|
|
25
|
+
* is therefore a consequence of calling the same function, not a goal
|
|
26
|
+
* pursued separately here — nothing in this module reimplements a
|
|
27
|
+
* metric, a finding, or a percentile.
|
|
28
|
+
* - The events handed to `buildSavedTrace` always already come from
|
|
29
|
+
* `fillWindowFromDisk` (sessions.ts) — the same merge `findings`,
|
|
30
|
+
* `what_was_happening` and `timeline` all use. This module does not read
|
|
31
|
+
* `events.ndjson` itself and does not merge live and disk data a second
|
|
32
|
+
* way; `saveFromSessions`'s own disk-only use of that same function is
|
|
33
|
+
* the CLI's one exception to "always has a live device", not a new
|
|
34
|
+
* mechanism.
|
|
35
|
+
*/
|
|
36
|
+
/** Recorded on every trace this module builds, so a reader can tell it apart from a live `capture`. Ruling 3. */
|
|
37
|
+
export const SAVE_DRIVER = "session";
|
|
38
|
+
/**
|
|
39
|
+
* Ruling 1 / EM's open-question-2, ratified by the coordinator: a saved
|
|
40
|
+
* moment gets a name even when nobody gave it one, because a required
|
|
41
|
+
* `--scenario`/`scenario` is friction the ticket exists to remove. On the
|
|
42
|
+
* uptime clock the window itself is already expressed in, so two saves of
|
|
43
|
+
* the same window land on the same default name rather than one that
|
|
44
|
+
* depends on wall-clock time nobody asked about.
|
|
45
|
+
*/
|
|
46
|
+
export function defaultScenarioName(from, to) {
|
|
47
|
+
return `moment-${from}-${to}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Ruling 1: the default output path — the same `.porthole/traces/`
|
|
51
|
+
* directory `capture_system_trace` already writes under, so a saved moment
|
|
52
|
+
* and a system trace from the same investigation land next to each other.
|
|
53
|
+
*/
|
|
54
|
+
export function defaultOutPath(projectRoot, scenario) {
|
|
55
|
+
return path.join(projectRoot, ".porthole", "traces", `${validateScenario(scenario)}.json`);
|
|
56
|
+
}
|
|
57
|
+
/** Thrown by [validateScenario]; callers turn it into their own refusal (400, `fail()`, exit 2). */
|
|
58
|
+
export class InvalidScenarioError extends Error {
|
|
59
|
+
constructor(message) {
|
|
60
|
+
super(message);
|
|
61
|
+
this.name = "InvalidScenarioError";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The scenario becomes a file name under `.porthole/traces/`, and it arrives
|
|
66
|
+
* from a POST body, a tool argument or a CLI flag — none of which is trusted
|
|
67
|
+
* to stay inside that directory on its own. GRA-116's QA showed
|
|
68
|
+
* `"../../../../tmp/evil"` escaping it. Letters, digits, space, dot, dash
|
|
69
|
+
* and underscore only; no separators of either kind; no name made of dots;
|
|
70
|
+
* a length that still fits a file name comfortably.
|
|
71
|
+
*/
|
|
72
|
+
export function validateScenario(scenario) {
|
|
73
|
+
const trimmed = scenario.trim();
|
|
74
|
+
if (trimmed === "")
|
|
75
|
+
throw new InvalidScenarioError("scenario must not be empty.");
|
|
76
|
+
if (trimmed.length > 120)
|
|
77
|
+
throw new InvalidScenarioError("scenario must be 120 characters or fewer.");
|
|
78
|
+
if (!/^[A-Za-z0-9 ._-]+$/.test(trimmed)) {
|
|
79
|
+
throw new InvalidScenarioError("scenario may contain only letters, digits, spaces, dots, dashes and underscores — no path separators.");
|
|
80
|
+
}
|
|
81
|
+
if (/^\.+$/.test(trimmed))
|
|
82
|
+
throw new InvalidScenarioError("scenario must not be made of dots only.");
|
|
83
|
+
return trimmed;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Ruling 3: calls `buildTrace` exactly as `capture` does, with
|
|
87
|
+
* `driver: "session"` and `withEvents: false` always — `--with-events` is
|
|
88
|
+
* cut from this ticket (the EM's own recommendation, taken): a saved moment
|
|
89
|
+
* sits right next to the session file it came from on disk, so embedding a
|
|
90
|
+
* copy of the same events inside the trace would only double the bytes to
|
|
91
|
+
* hand back something already there.
|
|
92
|
+
*
|
|
93
|
+
* Ruling 4: `clippedMs` is computed by the exact function `findings` uses
|
|
94
|
+
* (`clippedMsOf`, sessions.ts) — not a second, hand-rolled copy of the same
|
|
95
|
+
* formula.
|
|
96
|
+
*/
|
|
97
|
+
export function buildSavedTrace(options) {
|
|
98
|
+
const trace = buildTrace({
|
|
99
|
+
scenario: options.scenario,
|
|
100
|
+
driver: SAVE_DRIVER,
|
|
101
|
+
events: options.events,
|
|
102
|
+
hello: options.hello,
|
|
103
|
+
durationMs: Math.max(0, options.window.to - options.window.from),
|
|
104
|
+
withEvents: false,
|
|
105
|
+
profile: options.profile,
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
...trace,
|
|
109
|
+
clippedMs: clippedMsOf(options.window.from, options.window.to, options.coveredFrom, options.coveredTo),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Writes the trace to `outPath`, creating the directory if it does not exist yet. */
|
|
113
|
+
export async function writeSavedTrace(trace, outPath) {
|
|
114
|
+
await mkdir(path.dirname(outPath), { recursive: true });
|
|
115
|
+
await writeFile(outPath, JSON.stringify(trace, null, 2));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Ruling 4: "the tool's summary line states the coverage in words when it
|
|
119
|
+
* is not complete." One sentence, or "" when the window was fully covered
|
|
120
|
+
* — left off entirely rather than a hollow "0.0s was not recorded", the
|
|
121
|
+
* same convention `findings`' own `missing` string in index.ts already
|
|
122
|
+
* uses.
|
|
123
|
+
*/
|
|
124
|
+
export function coverageNote(clipped) {
|
|
125
|
+
const shortfallMs = clipped.start + clipped.end;
|
|
126
|
+
if (shortfallMs <= 0)
|
|
127
|
+
return "";
|
|
128
|
+
const seconds = Math.round(shortfallMs / 100) / 10;
|
|
129
|
+
return ` ${seconds}s of the requested window was never recorded and is not in this trace.`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* `porthole save`'s implementation. Unlike `save_moment` (index.ts), a
|
|
133
|
+
* fresh CLI invocation has no live device and no live buffer to ask "what
|
|
134
|
+
* does --since count back from" of — so both the identity to search and,
|
|
135
|
+
* for `--since`, the anchor the lookback counts from, are resolved from
|
|
136
|
+
* whichever session on disk was most recently written to. That is a real
|
|
137
|
+
* limitation worth naming plainly: with more than one app or device
|
|
138
|
+
* recording into the same sessions root, this picks the busiest one, not
|
|
139
|
+
* necessarily the one the caller meant. `--from`/`--to` (quoted from an
|
|
140
|
+
* earlier `findings` result) sidestep the ambiguity for the window itself,
|
|
141
|
+
* but still use the same most-recently-active session to decide *whose*
|
|
142
|
+
* sessions to search — there is no `--package`/`--device` flag on this
|
|
143
|
+
* command to disambiguate further (not asked for by the ticket, and adding
|
|
144
|
+
* one is a decision, not a bug fix).
|
|
145
|
+
*/
|
|
146
|
+
export async function saveFromSessions(options) {
|
|
147
|
+
const sessions = await listAllSessions(options.root);
|
|
148
|
+
const withData = sessions.filter((session) => session.firstT !== null && session.lastT !== null);
|
|
149
|
+
if (withData.length === 0) {
|
|
150
|
+
return {
|
|
151
|
+
code: 1,
|
|
152
|
+
message: "No sessions recorded on disk yet. Run `porthole ui` or `porthole mcp` against the app first.",
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// Most recently *active*, not most recently *started* — a session open
|
|
156
|
+
// for hours with a fresh event just now is the one worth calling "now",
|
|
157
|
+
// regardless of when it began.
|
|
158
|
+
const latest = withData.reduce((a, b) => (b.lastT > a.lastT ? b : a));
|
|
159
|
+
const identity = { packageName: latest.packageName, deviceId: latest.deviceId };
|
|
160
|
+
const to = options.to ?? latest.lastT;
|
|
161
|
+
const from = options.from ?? (options.sinceMs !== undefined ? to - options.sinceMs : latest.firstT);
|
|
162
|
+
const merged = await fillWindowFromDisk({
|
|
163
|
+
root: options.root,
|
|
164
|
+
identity,
|
|
165
|
+
buffered: [],
|
|
166
|
+
currentSessionDir: null,
|
|
167
|
+
from,
|
|
168
|
+
to,
|
|
169
|
+
});
|
|
170
|
+
let scenario;
|
|
171
|
+
let outPath;
|
|
172
|
+
try {
|
|
173
|
+
scenario = options.scenario === undefined ? defaultScenarioName(from, to) : validateScenario(options.scenario);
|
|
174
|
+
outPath = options.out ?? defaultOutPath(options.projectRoot, scenario);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (error instanceof InvalidScenarioError)
|
|
178
|
+
return { code: 2, message: `porthole save: ${error.message}` };
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
const hello = {
|
|
182
|
+
packageName: latest.packageName,
|
|
183
|
+
versionName: latest.versionName,
|
|
184
|
+
device: latest.device,
|
|
185
|
+
sdkInt: latest.sdkInt,
|
|
186
|
+
};
|
|
187
|
+
// GRA-185: no live buffer here — this is the CLI's disk-only path — so the
|
|
188
|
+
// only source `resolveProfile` has beyond the 60Hz fallback is whatever
|
|
189
|
+
// `latest`'s own `meta.json` recorded (`SessionWriter.append` captured it
|
|
190
|
+
// when the session was written, if it was written after that existed).
|
|
191
|
+
const profile = resolveProfile({
|
|
192
|
+
liveEvents: [],
|
|
193
|
+
windowTo: to,
|
|
194
|
+
sessionProfile: latest.profile ?? null,
|
|
195
|
+
hello,
|
|
196
|
+
});
|
|
197
|
+
const trace = buildSavedTrace({
|
|
198
|
+
events: merged.events,
|
|
199
|
+
hello,
|
|
200
|
+
window: { from, to },
|
|
201
|
+
coveredFrom: merged.coveredFrom,
|
|
202
|
+
coveredTo: merged.coveredTo,
|
|
203
|
+
scenario,
|
|
204
|
+
profile,
|
|
205
|
+
});
|
|
206
|
+
await writeSavedTrace(trace, outPath);
|
|
207
|
+
return {
|
|
208
|
+
code: 0,
|
|
209
|
+
message: `saved "${scenario}" (${trace.findings.length} finding(s)) to ${outPath}.${coverageNote(trace.clippedMs)}`,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// `porthole sessions`
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
function formatBytes(bytes) {
|
|
216
|
+
if (bytes < 1024)
|
|
217
|
+
return `${bytes}B`;
|
|
218
|
+
if (bytes < 1024 * 1024)
|
|
219
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
220
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
221
|
+
}
|
|
222
|
+
function eventCount(session) {
|
|
223
|
+
return Object.values(session.eventCounts).reduce((sum, n) => sum + n, 0);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* `porthole sessions`'s implementation. "current" is whichever session was
|
|
227
|
+
* most recently written to (greatest `updatedAt`) — purely a fact about
|
|
228
|
+
* what is on disk, deliberately not "is a device connected right now": a
|
|
229
|
+
* one-shot CLI invocation with no live `DeviceClient` has no cheap, honest
|
|
230
|
+
* way to answer that question without opening a socket and waiting on a
|
|
231
|
+
* device that may not even be plugged in, which is a different (and
|
|
232
|
+
* heavier) command than "list what is already recorded".
|
|
233
|
+
*/
|
|
234
|
+
export async function listSessionsText(root) {
|
|
235
|
+
const sessions = await listAllSessions(root);
|
|
236
|
+
if (sessions.length === 0) {
|
|
237
|
+
return { code: 0, message: "No sessions recorded on disk yet." };
|
|
238
|
+
}
|
|
239
|
+
const current = sessions.reduce((a, b) => (b.updatedAt > a.updatedAt ? b : a));
|
|
240
|
+
const lines = [];
|
|
241
|
+
for (const session of sessions) {
|
|
242
|
+
const marker = session.dir === current.dir ? "*" : " ";
|
|
243
|
+
const started = new Date(session.createdAt).toISOString();
|
|
244
|
+
const firstT = session.firstT ?? "-";
|
|
245
|
+
const lastT = session.lastT ?? "-";
|
|
246
|
+
const bytes = await sessionSizeBytes(session.dir);
|
|
247
|
+
lines.push(`${marker} ${session.packageName} ${session.deviceId} started ${started} ` +
|
|
248
|
+
`t=[${firstT},${lastT}] events=${eventCount(session)} ${formatBytes(bytes)} ${session.dir}`);
|
|
249
|
+
}
|
|
250
|
+
return { code: 0, message: lines.join("\n") };
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=save.js.map
|
package/dist/save.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
|