@jobshimo/browser-link 0.27.0 → 0.28.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.
Files changed (60) hide show
  1. package/dist/activity/db.d.ts +27 -0
  2. package/dist/activity/db.js +98 -0
  3. package/dist/activity/db.js.map +1 -0
  4. package/dist/activity/extract.d.ts +32 -0
  5. package/dist/activity/extract.js +126 -0
  6. package/dist/activity/extract.js.map +1 -0
  7. package/dist/activity/paths.d.ts +16 -0
  8. package/dist/activity/paths.js +24 -0
  9. package/dist/activity/paths.js.map +1 -0
  10. package/dist/activity/queries.d.ts +100 -0
  11. package/dist/activity/queries.js +286 -0
  12. package/dist/activity/queries.js.map +1 -0
  13. package/dist/activity/types.d.ts +119 -0
  14. package/dist/activity/types.js +41 -0
  15. package/dist/activity/types.js.map +1 -0
  16. package/dist/bridge/ws-bridge.d.ts +18 -1
  17. package/dist/bridge/ws-bridge.js +107 -0
  18. package/dist/bridge/ws-bridge.js.map +1 -1
  19. package/dist/cdp/detached-flows.d.ts +13 -0
  20. package/dist/cdp/detached-flows.js +33 -3
  21. package/dist/cdp/detached-flows.js.map +1 -1
  22. package/dist/cdp/inpage/deep-query.d.ts +1 -1
  23. package/dist/cdp/inpage/deep-query.js +1 -1
  24. package/dist/cdp/inpage/dom-helpers.d.ts +1 -1
  25. package/dist/cdp/inpage/dom-helpers.js +1 -1
  26. package/dist/cdp/transport.js +16 -5
  27. package/dist/cdp/transport.js.map +1 -1
  28. package/dist/cli.js +24 -0
  29. package/dist/cli.js.map +1 -1
  30. package/dist/commands/activity.d.ts +11 -0
  31. package/dist/commands/activity.js +347 -0
  32. package/dist/commands/activity.js.map +1 -0
  33. package/dist/config.d.ts +26 -0
  34. package/dist/config.js.map +1 -1
  35. package/dist/extension/activity.d.ts +201 -0
  36. package/dist/extension/activity.html +662 -0
  37. package/dist/extension/activity.js +555 -0
  38. package/dist/extension/activity.js.map +1 -0
  39. package/dist/extension/background.js +174 -3
  40. package/dist/extension/background.js.map +1 -1
  41. package/dist/extension/flow-registry.d.ts +14 -3
  42. package/dist/extension/flow-registry.js +37 -9
  43. package/dist/extension/flow-registry.js.map +1 -1
  44. package/dist/extension/inpage/deep-query.d.ts +1 -1
  45. package/dist/extension/inpage/deep-query.js +1 -1
  46. package/dist/extension/inpage/dom-helpers.d.ts +1 -1
  47. package/dist/extension/inpage/dom-helpers.js +1 -1
  48. package/dist/extension/manifest.json +3 -2
  49. package/dist/extension/popup.html +58 -0
  50. package/dist/extension/popup.js +11 -0
  51. package/dist/extension/popup.js.map +1 -1
  52. package/dist/messages.d.ts +80 -2
  53. package/dist/server.js +30 -0
  54. package/dist/server.js.map +1 -1
  55. package/dist/tools/browser-definitions.js +50 -2
  56. package/dist/tools/browser-definitions.js.map +1 -1
  57. package/dist/tools/browser-dispatch.d.ts +34 -7
  58. package/dist/tools/browser-dispatch.js +107 -1
  59. package/dist/tools/browser-dispatch.js.map +1 -1
  60. package/package.json +1 -1
@@ -0,0 +1,347 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { formatRelative } from './map.js';
4
+ import { clear, countInRange, exportAll, listAgents, purgeRange, query, redact, stats, } from '../activity/queries.js';
5
+ /**
6
+ * `browser-link activity` — read, export and clear the agent activity trail.
7
+ *
8
+ * The CLI is the trail's answer to "give it to another agent". The extension
9
+ * window is for watching; a file on disk is for handing over, diffing and
10
+ * grepping — no browser in the loop.
11
+ */
12
+ const I18N = {
13
+ en: {
14
+ empty: 'No activity recorded yet.',
15
+ disabledHint: "If this is unexpected, check that `activity.enabled` isn't set to false.",
16
+ showing: (shown, total) => `Showing ${shown} of ${total} recorded actions.`,
17
+ header: ['WHEN', 'AGENT', 'TOOL', 'TARGET', 'RESULT'],
18
+ exported: (n, path) => `Exported ${n} actions to ${path}`,
19
+ exportedRedacted: 'Payloads, titles and query strings were redacted.',
20
+ cleared: (n) => `Removed ${n} actions from the trail.`,
21
+ clearedNone: 'Nothing to remove.',
22
+ confirmClear: 'This deletes the activity trail. Re-run with --yes to confirm, or pass --older-than to keep recent history.',
23
+ agents: 'Agents seen:',
24
+ statRows: 'Actions stored',
25
+ statSize: 'Size on disk',
26
+ statOldest: 'Oldest entry',
27
+ statNewest: 'Newest entry',
28
+ confirmRange: (n) => `This will permanently delete ${n.toLocaleString()} actions. It cannot be undone. Re-run with --yes to confirm.`,
29
+ badFormat: (v) => `Unknown format "${v}". Use json, ndjson or csv.`,
30
+ badOlderThan: (v) => `Could not read "${v}" as a duration. Use forms like 30m, 12h, 7d.`,
31
+ usage: [
32
+ 'browser-link activity [filters] Recent actions (newest first)',
33
+ 'browser-link activity export [options] Write the trail to a file',
34
+ 'browser-link activity stats How big the trail is right now',
35
+ 'browser-link activity clear [options] Delete trail entries',
36
+ '',
37
+ 'Filters:',
38
+ ' --tab <id> Only this browser-link tab id',
39
+ ' --agent <label> Only this agent ("claude-code", "opencode", …)',
40
+ ' --tool <name> Only this tool ("browser.click")',
41
+ ' --flow <id> Only steps belonging to this flow',
42
+ ' --failed Only actions that errored',
43
+ ' --limit <n> Rows to show (default 50, max 500)',
44
+ '',
45
+ 'export options:',
46
+ ' --out <file> Destination (default activity.json in the cwd)',
47
+ ' --format <fmt> json | ndjson | csv (default json)',
48
+ ' --redact Strip payloads, titles and URL query strings',
49
+ '',
50
+ 'clear options:',
51
+ ' --older-than <dur> Only entries older than 30m / 12h / 7d',
52
+ ' --from <YYYY-MM-DD> Start of an inclusive date range',
53
+ ' --to <YYYY-MM-DD> End of an inclusive date range (reclaims disk space)',
54
+ ' --yes Skip the confirmation prompt',
55
+ ].join('\n'),
56
+ },
57
+ es: {
58
+ empty: 'Todavía no hay actividad registrada.',
59
+ disabledHint: 'Si no lo esperabas, comprueba que `activity.enabled` no esté en false.',
60
+ showing: (shown, total) => `Mostrando ${shown} de ${total} acciones registradas.`,
61
+ header: ['CUÁNDO', 'AGENTE', 'HERRAMIENTA', 'OBJETIVO', 'RESULTADO'],
62
+ exported: (n, path) => `Exportadas ${n} acciones a ${path}`,
63
+ exportedRedacted: 'Se han ocultado los payloads, los títulos y las query strings.',
64
+ cleared: (n) => `Eliminadas ${n} acciones del rastro.`,
65
+ clearedNone: 'No hay nada que eliminar.',
66
+ confirmClear: 'Esto borra el rastro de actividad. Vuelve a ejecutarlo con --yes para confirmar, o usa --older-than para conservar lo reciente.',
67
+ agents: 'Agentes vistos:',
68
+ statRows: 'Acciones guardadas',
69
+ statSize: 'Tamaño en disco',
70
+ statOldest: 'Entrada más antigua',
71
+ statNewest: 'Entrada más reciente',
72
+ confirmRange: (n) => `Esto borrará permanentemente ${n.toLocaleString()} acciones. No se puede deshacer. Vuelve a ejecutarlo con --yes para confirmar.`,
73
+ badFormat: (v) => `Formato "${v}" desconocido. Usa json, ndjson o csv.`,
74
+ badOlderThan: (v) => `No se ha podido interpretar "${v}" como duración. Usa formas como 30m, 12h, 7d.`,
75
+ usage: [
76
+ 'browser-link activity [filtros] Acciones recientes (más nuevas primero)',
77
+ 'browser-link activity export [opciones] Escribe el rastro en un fichero',
78
+ 'browser-link activity stats Cuánto ocupa el rastro ahora mismo',
79
+ 'browser-link activity clear [opciones] Borra entradas del rastro',
80
+ '',
81
+ 'Filtros:',
82
+ ' --tab <id> Sólo esta pestaña de browser-link',
83
+ ' --agent <label> Sólo este agente ("claude-code", "opencode", …)',
84
+ ' --tool <nombre> Sólo esta herramienta ("browser.click")',
85
+ ' --flow <id> Sólo los pasos de este flow',
86
+ ' --failed Sólo las acciones que fallaron',
87
+ ' --limit <n> Filas a mostrar (por defecto 50, máximo 500)',
88
+ '',
89
+ 'opciones de export:',
90
+ ' --out <fichero> Destino (por defecto activity.json en el cwd)',
91
+ ' --format <fmt> json | ndjson | csv (por defecto json)',
92
+ ' --redact Quita payloads, títulos y query strings de las URLs',
93
+ '',
94
+ 'opciones de clear:',
95
+ ' --older-than <dur> Sólo entradas más viejas que 30m / 12h / 7d',
96
+ ' --from <YYYY-MM-DD> Inicio de un rango de fechas inclusivo',
97
+ ' --to <YYYY-MM-DD> Fin del rango (además recupera espacio en disco)',
98
+ ' --yes Salta la confirmación',
99
+ ].join('\n'),
100
+ },
101
+ };
102
+ /** Read `--flag value` out of argv. Returns undefined when absent, so a
103
+ * missing flag and an empty one stay distinguishable. */
104
+ function flagValue(argv, name) {
105
+ const index = argv.indexOf(`--${name}`);
106
+ if (index === -1)
107
+ return undefined;
108
+ // `.at()` rather than `[]` for the same reason cli.ts uses it: it types the
109
+ // missing-argument case as `undefined` instead of lying about it under the
110
+ // project's loose index access.
111
+ const value = argv.at(index + 1);
112
+ return value !== undefined && !value.startsWith('--') ? value : undefined;
113
+ }
114
+ function hasFlag(argv, name) {
115
+ return argv.includes(`--${name}`);
116
+ }
117
+ /* ------------------------------------------------------------- time ------
118
+ *
119
+ * SAME ONE RULE as the extension's Activity window:
120
+ *
121
+ * The trail stores UTC. The operator only ever sees, and only ever types,
122
+ * their own local time.
123
+ *
124
+ * `--from 2026-07-31` means "July 31st where I am", not "July 31st in UTC" —
125
+ * anything else would make the same flag select different rows in the terminal
126
+ * than it does in the window, which is a bug nobody would ever think to look
127
+ * for. Exports keep raw UTC: a file handed to another machine must not carry
128
+ * this machine's timezone baked into it.
129
+ */
130
+ /** A local calendar day widened to the UTC instant at its local start or end.
131
+ * Mirrors `localDayToUtc` in the extension's `activity.ts`; duplicated rather
132
+ * than shared for the same reason the wire types are — the two packages do not
133
+ * depend on each other's build. */
134
+ export function localDayToUtc(day, edge) {
135
+ // No `Z` and no offset: the runtime parses this as LOCAL time.
136
+ const suffix = edge === 'start' ? 'T00:00:00.000' : 'T23:59:59.999';
137
+ return new Date(`${day}${suffix}`).toISOString();
138
+ }
139
+ /** A stored UTC instant rendered in the operator's local time. */
140
+ function formatLocal(iso) {
141
+ if (iso === null)
142
+ return '—';
143
+ return new Date(iso).toLocaleString();
144
+ }
145
+ /** Parse `30m` / `12h` / `7d` into milliseconds. Deliberately a tiny closed
146
+ * grammar rather than a date parser: `--older-than 7d` is unambiguous in every
147
+ * locale, `--older-than 03/04` is not. */
148
+ export function parseDuration(value) {
149
+ const match = /^(\d+)([mhd])$/.exec(value.trim());
150
+ if (!match)
151
+ return null;
152
+ const amount = Number(match[1]);
153
+ if (!Number.isFinite(amount) || amount <= 0)
154
+ return null;
155
+ const unit = { m: 60_000, h: 3_600_000, d: 86_400_000 }[match[2]];
156
+ return amount * unit;
157
+ }
158
+ function buildQuery(argv) {
159
+ const limitRaw = flagValue(argv, 'limit');
160
+ const parsedLimit = limitRaw === undefined ? undefined : Number.parseInt(limitRaw, 10);
161
+ return {
162
+ ...(flagValue(argv, 'tab') !== undefined ? { tabId: flagValue(argv, 'tab') } : {}),
163
+ ...(flagValue(argv, 'agent') !== undefined ? { agent: flagValue(argv, 'agent') } : {}),
164
+ ...(flagValue(argv, 'tool') !== undefined ? { tool: flagValue(argv, 'tool') } : {}),
165
+ ...(flagValue(argv, 'flow') !== undefined ? { flowId: flagValue(argv, 'flow') } : {}),
166
+ ...(hasFlag(argv, 'failed') ? { outcome: 'error' } : {}),
167
+ ...(parsedLimit !== undefined && Number.isFinite(parsedLimit) ? { limit: parsedLimit } : {}),
168
+ };
169
+ }
170
+ /** The single most useful thing to show per row after the tool name: what it
171
+ * acted on. Selector when there is one, else the payload, else the URL. */
172
+ function targetOf(record) {
173
+ if (record.selector !== null)
174
+ return record.selector;
175
+ if (record.payload !== null)
176
+ return record.payload;
177
+ if (record.url !== null)
178
+ return record.url;
179
+ return '—';
180
+ }
181
+ function pad(value, width) {
182
+ const clipped = value.length > width ? `${value.slice(0, width - 1)}…` : value;
183
+ return clipped.padEnd(width);
184
+ }
185
+ function renderTable(records, language) {
186
+ const t = I18N[language];
187
+ const lines = [
188
+ [
189
+ pad(t.header[0], 14),
190
+ pad(t.header[1], 14),
191
+ pad(t.header[2], 24),
192
+ pad(t.header[3], 34),
193
+ t.header[4],
194
+ ].join(' '),
195
+ ];
196
+ for (const row of records) {
197
+ lines.push([
198
+ pad(formatRelative(row.at, language), 14),
199
+ pad(row.agent ?? '—', 14),
200
+ pad(row.tool, 24),
201
+ pad(targetOf(row), 34),
202
+ row.outcome === 'ok' ? `ok ${row.durationMs}ms` : `error: ${row.error ?? ''}`,
203
+ ].join(' '));
204
+ }
205
+ return lines.join('\n');
206
+ }
207
+ function toCsv(records) {
208
+ // Every column of an ActivityRecord is a string, a number or null — narrowed
209
+ // explicitly rather than leaning on String(), which would silently turn an
210
+ // unexpected object into "[object Object]" in the middle of an export.
211
+ const escape = (value) => {
212
+ if (value === null)
213
+ return '';
214
+ const text = typeof value === 'number' ? String(value) : value;
215
+ return /[",\n]/.test(text) ? `"${text.replace(/"/g, '""')}"` : text;
216
+ };
217
+ const columns = [
218
+ 'id',
219
+ 'at',
220
+ 'tool',
221
+ 'tabId',
222
+ 'transport',
223
+ 'url',
224
+ 'title',
225
+ 'agent',
226
+ 'agentPid',
227
+ 'selector',
228
+ 'payload',
229
+ 'outcome',
230
+ 'error',
231
+ 'durationMs',
232
+ 'flowId',
233
+ ];
234
+ const lines = [columns.join(',')];
235
+ for (const row of records)
236
+ lines.push(columns.map((c) => escape(row[c])).join(','));
237
+ return lines.join('\n');
238
+ }
239
+ function runExport(argv, language) {
240
+ const t = I18N[language];
241
+ const format = flagValue(argv, 'format') ?? 'json';
242
+ if (format !== 'json' && format !== 'ndjson' && format !== 'csv')
243
+ return t.badFormat(format);
244
+ const shouldRedact = hasFlag(argv, 'redact');
245
+ const filter = buildQuery(argv);
246
+ // `limit` is a display concern; an export takes everything matching.
247
+ delete filter.limit;
248
+ const rows = [];
249
+ for (const row of exportAll(filter))
250
+ rows.push(shouldRedact ? redact(row) : row);
251
+ const defaultName = `activity.${format === 'csv' ? 'csv' : format === 'ndjson' ? 'ndjson' : 'json'}`;
252
+ const out = resolve(flagValue(argv, 'out') ?? defaultName);
253
+ const body = format === 'csv'
254
+ ? toCsv(rows)
255
+ : format === 'ndjson'
256
+ ? rows.map((r) => JSON.stringify(r)).join('\n')
257
+ : JSON.stringify(rows, null, 2);
258
+ writeFileSync(out, `${body}\n`, 'utf8');
259
+ return [t.exported(rows.length, out), ...(shouldRedact ? [t.exportedRedacted] : [])].join('\n');
260
+ }
261
+ /** `browser-link activity stats` — the same figures the extension's usage
262
+ * strip shows, for people who live in a terminal. */
263
+ function runStats(language) {
264
+ const t = I18N[language];
265
+ const s = stats();
266
+ if (s.rows === 0)
267
+ return t.empty;
268
+ return [
269
+ `${t.statRows}: ${s.rows.toLocaleString()} / ${s.maxRows.toLocaleString()}`,
270
+ `${t.statSize}: ${formatBytes(s.bytes)}`,
271
+ `${t.statOldest}: ${formatLocal(s.oldestAt)}`,
272
+ `${t.statNewest}: ${formatLocal(s.newestAt)}`,
273
+ ].join('\n');
274
+ }
275
+ function formatBytes(bytes) {
276
+ if (bytes < 1024)
277
+ return `${bytes} B`;
278
+ const units = ['KB', 'MB', 'GB'];
279
+ let value = bytes / 1024;
280
+ let unit = 0;
281
+ while (value >= 1024 && unit < units.length - 1) {
282
+ value /= 1024;
283
+ unit += 1;
284
+ }
285
+ return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
286
+ }
287
+ function runClear(argv, language) {
288
+ const t = I18N[language];
289
+ const olderThan = flagValue(argv, 'older-than');
290
+ const from = flagValue(argv, 'from');
291
+ const to = flagValue(argv, 'to');
292
+ // Explicit range takes precedence and mirrors the extension's purge panel,
293
+ // including its VACUUM — the point of purging is that the file shrinks.
294
+ if (from !== undefined || to !== undefined) {
295
+ const range = {
296
+ ...(from !== undefined ? { from: localDayToUtc(from, 'start') } : {}),
297
+ ...(to !== undefined ? { to: localDayToUtc(to, 'end') } : {}),
298
+ };
299
+ const willRemove = countInRange(range);
300
+ if (willRemove === 0)
301
+ return t.clearedNone;
302
+ if (!hasFlag(argv, 'yes'))
303
+ return t.confirmRange(willRemove);
304
+ return t.cleared(purgeRange(range));
305
+ }
306
+ if (olderThan !== undefined) {
307
+ const ms = parseDuration(olderThan);
308
+ if (ms === null)
309
+ return t.badOlderThan(olderThan);
310
+ const removed = clear(new Date(Date.now() - ms).toISOString());
311
+ return removed === 0 ? t.clearedNone : t.cleared(removed);
312
+ }
313
+ // Wiping the whole trail is the one destructive path here, and unlike
314
+ // `--older-than` it cannot be partially undone by waiting. Confirmation is
315
+ // required rather than offered.
316
+ if (!hasFlag(argv, 'yes'))
317
+ return t.confirmClear;
318
+ const removed = clear();
319
+ return removed === 0 ? t.clearedNone : t.cleared(removed);
320
+ }
321
+ export function runActivityCommand(argv, language = 'en') {
322
+ const t = I18N[language];
323
+ const sub = argv[0];
324
+ if (sub === 'help' || hasFlag(argv, 'help'))
325
+ return t.usage;
326
+ if (sub === 'stats')
327
+ return runStats(language);
328
+ if (sub === 'export')
329
+ return runExport(argv.slice(1), language);
330
+ if (sub === 'clear')
331
+ return runClear(argv.slice(1), language);
332
+ const page = query(buildQuery(argv).limit === undefined ? { ...buildQuery(argv), limit: 50 } : buildQuery(argv));
333
+ if (page.records.length === 0)
334
+ return `${t.empty}\n${t.disabledHint}`;
335
+ const agents = listAgents();
336
+ return [
337
+ renderTable(page.records, language),
338
+ '',
339
+ t.showing(page.records.length, page.total),
340
+ agents.length > 0
341
+ ? `${t.agents} ${agents.map((a) => `${a.agent} (${a.count})`).join(', ')}`
342
+ : '',
343
+ ]
344
+ .filter((line) => line !== '')
345
+ .join('\n');
346
+ }
347
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/commands/activity.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -94,6 +94,32 @@ export interface BrowserLinkConfig {
94
94
  * `browser-link config set cdp-direct.grant-ttl <minutes|never>`.
95
95
  */
96
96
  cdpDirectGrantTtlMinutes?: number;
97
+ /**
98
+ * Activity trail. Default ON. When true (default), every browser tool an
99
+ * agent dispatches is appended to `activity.db` in the data dir, and the
100
+ * extension's Activity window plus `browser-link activity` can read it back.
101
+ *
102
+ * Set explicitly to false to record nothing at all. The window then shows an
103
+ * empty trail rather than pretending — a silently-disabled audit log is
104
+ * worse than no audit log.
105
+ */
106
+ activityEnabled?: boolean;
107
+ /**
108
+ * Whether trail rows carry the free text an action moved: the string typed
109
+ * by `browser.type`, the expression given to `browser.evaluate`, the URL of
110
+ * a `browser.navigate`. Default ON, because a trail that cannot tell you
111
+ * WHAT the agent typed answers none of the questions people open it for.
112
+ *
113
+ * Set to false to keep the shape of the trail without its contents — every
114
+ * row still records which tool ran, where, by whom and with what outcome.
115
+ *
116
+ * Note this is a RECORDING switch, deliberately separate from the redaction
117
+ * applied by `browser-link activity export --redact`: recording is about
118
+ * what lands on your own disk, redaction about what you hand to someone
119
+ * else. Turning this off cannot be undone after the fact; redacting on
120
+ * export can be decided every time.
121
+ */
122
+ activityRecordPayloads?: boolean;
97
123
  }
98
124
  /** Safety-rail bounds mirrored from the extension's `idle-policy.ts` — kept
99
125
  * as an independent copy (not a shared import) for the same reason
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * The Activity window.
3
+ *
4
+ * A dedicated extension page rather than a section of the 320px popup, for one
5
+ * reason that is not cosmetic: a Chrome action popup closes the moment it loses
6
+ * focus, so it physically cannot be watched while an agent works. This window
7
+ * stays open, and can be parked on a second monitor while the agent runs.
8
+ *
9
+ * It owns no data. Every row comes from the server's `activity.db` through the
10
+ * background service worker (`activityQuery` → WS `activity.query`), so what
11
+ * this page shows survives closing the browser, and closing this page loses
12
+ * nothing.
13
+ */
14
+ /** Row shape as the server serialises it. Structural, not imported: the
15
+ * extension must not take a build dependency on the server package. */
16
+ interface ActivityRecord {
17
+ id: number;
18
+ at: string;
19
+ tool: string;
20
+ tabId: string | null;
21
+ transport: 'extension' | 'cdp' | null;
22
+ url: string | null;
23
+ title: string | null;
24
+ agent: string | null;
25
+ agentPid: number | null;
26
+ selector: string | null;
27
+ payload: string | null;
28
+ outcome: 'ok' | 'error';
29
+ error: string | null;
30
+ durationMs: number;
31
+ flowId: string | null;
32
+ }
33
+ interface ActivityStats {
34
+ rows: number;
35
+ bytes: number;
36
+ oldest_at: string | null;
37
+ newest_at: string | null;
38
+ max_rows: number;
39
+ }
40
+ type QueryReply = {
41
+ ok: true;
42
+ records: ActivityRecord[];
43
+ latest_id: number;
44
+ total: number;
45
+ agents: {
46
+ agent: string;
47
+ count: number;
48
+ }[];
49
+ stats: ActivityStats;
50
+ } | {
51
+ ok: false;
52
+ error: string;
53
+ };
54
+ type PurgeReply = {
55
+ ok: true;
56
+ removed: number;
57
+ dry_run: boolean;
58
+ stats: ActivityStats;
59
+ } | {
60
+ ok: false;
61
+ error: string;
62
+ };
63
+ /** How often the live tail asks for new rows. Two seconds reads as immediate
64
+ * to a human watching an agent work, and costs one small indexed SELECT — far
65
+ * cheaper than the render it usually skips because nothing changed. */
66
+ declare const TAIL_INTERVAL_MS = 2000;
67
+ /** Rows held in the page. Beyond this the oldest are dropped from the DOM (not
68
+ * from the trail — they are still on disk and in any export). A table that
69
+ * grows without bound is how a panel left open overnight eats a gigabyte. */
70
+ declare const MAX_ROWS_IN_VIEW = 1000;
71
+ /** Resolve a required element, failing loudly at load rather than producing a
72
+ * page that silently does nothing when the template and this script drift. */
73
+ declare const el: (id: string) => HTMLElement;
74
+ declare const ui: {
75
+ live: HTMLButtonElement;
76
+ refresh: HTMLButtonElement;
77
+ exportBtn: HTMLButtonElement;
78
+ agent: HTMLSelectElement;
79
+ tool: HTMLSelectElement;
80
+ failed: HTMLButtonElement;
81
+ text: HTMLInputElement;
82
+ reset: HTMLButtonElement;
83
+ count: HTMLElement;
84
+ table: HTMLTableElement;
85
+ rows: HTMLTableSectionElement;
86
+ state: HTMLElement;
87
+ stateTitle: HTMLElement;
88
+ stateDetail: HTMLElement;
89
+ status: HTMLElement;
90
+ usageRows: HTMLElement;
91
+ usageSize: HTMLElement;
92
+ usageSpan: HTMLElement;
93
+ usageMeter: HTMLElement;
94
+ usageFill: HTMLElement;
95
+ usageCap: HTMLElement;
96
+ purgeToggle: HTMLButtonElement;
97
+ purgePanel: HTMLElement;
98
+ purgeFrom: HTMLInputElement;
99
+ purgeTo: HTMLInputElement;
100
+ purgeSummary: HTMLElement;
101
+ purgeCheck: HTMLButtonElement;
102
+ purgeRun: HTMLButtonElement;
103
+ purgeCancel: HTMLButtonElement;
104
+ preset30d: HTMLButtonElement;
105
+ preset7d: HTMLButtonElement;
106
+ presetAll: HTMLButtonElement;
107
+ };
108
+ declare let records: ActivityRecord[];
109
+ declare let lastStats: ActivityStats | null;
110
+ /** Rows the last dry run said the current range would delete. Cleared whenever
111
+ * the range changes, so the red button can never act on a stale count — the
112
+ * user must always be shown a number for the range they are actually about to
113
+ * purge. */
114
+ declare let pendingPurgeCount: number | null;
115
+ declare let live: boolean;
116
+ declare let tailTimer: ReturnType<typeof setInterval> | null;
117
+ /** Tools seen so far, so the filter offers exactly what exists rather than a
118
+ * hardcoded list that goes stale when a tool is added. */
119
+ declare const knownTools: Set<string>;
120
+ declare function ask(query: Record<string, unknown>): Promise<QueryReply>;
121
+ /** Server-side filters. The free-text box is deliberately NOT one of them: it
122
+ * filters what is already loaded, so typing feels instant and never costs a
123
+ * round trip. The dropdowns are, because they change which rows exist. */
124
+ declare function serverFilters(): Record<string, unknown>;
125
+ /** A local calendar day (`2026-07-31` from an `<input type="date">`) widened
126
+ * to the UTC instant at that day's local start or local end.
127
+ *
128
+ * Widening matters: without it, a purge "to Jul 31" would resolve to midnight
129
+ * and silently spare everything that happened during Jul 31. */
130
+ declare function localDayToUtc(day: string, edge: 'start' | 'end'): string;
131
+ /** A Date as the local calendar day the picker expects (`YYYY-MM-DD`).
132
+ * NOT `toISOString().slice(0, 10)` — that is the UTC day, which is the wrong
133
+ * one for anybody whose offset has already rolled the date over. */
134
+ declare function toLocalDay(date: Date): string;
135
+ /** Full local timestamp, for the hover on a relative time. */
136
+ declare function formatExact(iso: string): string;
137
+ /** Bytes as a human reads them. Binary units because that is what a file
138
+ * manager will show for the same file, and two numbers that disagree about the
139
+ * same thing are worse than either alone. */
140
+ declare function formatBytes(bytes: number): string;
141
+ declare function formatDay(iso: string | null): string;
142
+ /**
143
+ * Repaint the always-visible usage strip.
144
+ *
145
+ * Called from every reply — reads and purges alike — so the numbers can never
146
+ * be stale relative to what is on screen beneath them.
147
+ */
148
+ declare function renderStats(stats: ActivityStats): void;
149
+ declare function formatTime(iso: string): string;
150
+ /** What the action acted on, in priority order. A selector says the most; a
151
+ * payload is next; the URL is the fallback for tools that take neither. */
152
+ declare function targetOf(record: ActivityRecord): string;
153
+ declare function matchesText(record: ActivityRecord, needle: string): boolean;
154
+ declare function buildRow(record: ActivityRecord): HTMLTableRowElement;
155
+ declare function showState(title: string, detail?: string): void;
156
+ declare function render(): void;
157
+ declare function refreshAgentOptions(agents: {
158
+ agent: string;
159
+ count: number;
160
+ }[]): void;
161
+ declare function refreshToolOptions(): void;
162
+ /** The two option lists are the only place this page builds markup from a
163
+ * string, and both values are server-owned. Escaped anyway: an agent label is
164
+ * self-declared text, and "it cannot contain a quote today" is not a security
165
+ * boundary. */
166
+ declare function escapeHtml(value: string): string;
167
+ declare function escapeAttr(value: string): string;
168
+ declare function load(): Promise<void>;
169
+ /** Tail: ask only for what is newer than the newest row we hold, then prepend.
170
+ * Cheaper than reloading the page of 300 on every tick, and it keeps the
171
+ * user's scroll position where they left it. */
172
+ declare function tail(): Promise<void>;
173
+ declare function setLive(next: boolean): void;
174
+ /**
175
+ * Download what is on screen as NDJSON.
176
+ *
177
+ * NDJSON rather than JSON because a trail is append-only and line-oriented:
178
+ * it greps, it tails, it diffs, and another agent can stream it without
179
+ * parsing the whole file. Exports exactly the filtered view, because the
180
+ * filter is how the user said what they wanted.
181
+ *
182
+ * Note this is the VISIBLE page. `browser-link activity export` is the tool
183
+ * for the complete trail — and the one with `--redact`.
184
+ */
185
+ declare function exportVisible(): void;
186
+ declare function purgeAsk(input: {
187
+ from?: string;
188
+ to?: string;
189
+ dryRun?: boolean;
190
+ }): Promise<PurgeReply>;
191
+ /** A `<input type="date">` gives a local calendar day; the trail stores UTC
192
+ * instants. Widen each end to cover the whole day the user pointed at, or a
193
+ * purge "to Aug 14" would silently spare everything that happened on Aug 14. */
194
+ declare function rangeFromInputs(): {
195
+ from?: string;
196
+ to?: string;
197
+ };
198
+ declare function describeRange(): string;
199
+ /** Invalidate any resolved count. Called on every change to the range. */
200
+ declare function resetPurgeConfirmation(): void;
201
+ declare function setDaysAgo(days: number): void;