@petukhovart/agent-view 0.10.1 → 0.11.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 (52) hide show
  1. package/.claude-plugin/plugin.json +2 -2
  2. package/README.md +38 -3
  3. package/dist/cdp/transport.d.ts +3 -0
  4. package/dist/cdp/transport.d.ts.map +1 -1
  5. package/dist/cdp/transport.js +139 -13
  6. package/dist/cdp/transport.js.map +1 -1
  7. package/dist/cdp/types.d.ts +12 -1
  8. package/dist/cdp/types.d.ts.map +1 -1
  9. package/dist/cdp/types.js.map +1 -1
  10. package/dist/cli/client.d.ts +10 -1
  11. package/dist/cli/client.d.ts.map +1 -1
  12. package/dist/cli/client.js +83 -22
  13. package/dist/cli/client.js.map +1 -1
  14. package/dist/cli/commands/launch.js +1 -1
  15. package/dist/cli/commands/launch.js.map +1 -1
  16. package/dist/cli/commands/logs.d.ts +15 -0
  17. package/dist/cli/commands/logs.d.ts.map +1 -0
  18. package/dist/cli/commands/logs.js +51 -0
  19. package/dist/cli/commands/logs.js.map +1 -0
  20. package/dist/cli/commands/screenshot.d.ts +1 -0
  21. package/dist/cli/commands/screenshot.d.ts.map +1 -1
  22. package/dist/cli/commands/screenshot.js +2 -0
  23. package/dist/cli/commands/screenshot.js.map +1 -1
  24. package/dist/cli/commands/watch.d.ts.map +1 -1
  25. package/dist/cli/commands/watch.js +1 -45
  26. package/dist/cli/commands/watch.js.map +1 -1
  27. package/dist/cli/index.js +91 -6
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/config/manager.d.ts +9 -0
  30. package/dist/config/manager.d.ts.map +1 -1
  31. package/dist/config/manager.js +24 -1
  32. package/dist/config/manager.js.map +1 -1
  33. package/dist/config/types.d.ts +4 -0
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/server/log-recorder.d.ts +135 -0
  36. package/dist/server/log-recorder.d.ts.map +1 -0
  37. package/dist/server/log-recorder.js +348 -0
  38. package/dist/server/log-recorder.js.map +1 -0
  39. package/dist/server/pattern.d.ts +3 -0
  40. package/dist/server/pattern.d.ts.map +1 -0
  41. package/dist/server/pattern.js +10 -0
  42. package/dist/server/pattern.js.map +1 -0
  43. package/dist/server/server.d.ts +48 -1
  44. package/dist/server/server.d.ts.map +1 -1
  45. package/dist/server/server.js +399 -60
  46. package/dist/server/server.js.map +1 -1
  47. package/dist/types.d.ts +3 -1
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -1
  51. package/package.json +1 -1
  52. package/skills/verify/SKILL.md +41 -0
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAKjD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAS9D;AAqCD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAuB3D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAGtE"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAKjD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAS9D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS5F;AAyCD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAuB3D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAGtE"}
@@ -1,5 +1,5 @@
1
1
  import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
- import { join } from 'node:path';
2
+ import { join, dirname, resolve } from 'node:path';
3
3
  import { RuntimeType, WebGLEngine } from '../types.js';
4
4
  const CONFIG_FILENAME = 'agent-view.config.json';
5
5
  export function readConfig(cwd) {
@@ -13,6 +13,23 @@ export function readConfig(cwd) {
13
13
  }
14
14
  return parsed;
15
15
  }
16
+ /**
17
+ * Walk up from `startDir` to the filesystem root looking for the config, like git does
18
+ * for `.git`. Returns the directory that owns it — the CLI treats that as the project
19
+ * root so a command run from a subdirectory (or a sibling package) still resolves.
20
+ */
21
+ export function findConfig(startDir) {
22
+ let dir = resolve(startDir);
23
+ for (;;) {
24
+ const config = readConfig(dir);
25
+ if (config)
26
+ return { config, dir };
27
+ const parent = dirname(dir);
28
+ if (parent === dir)
29
+ return null;
30
+ dir = parent;
31
+ }
32
+ }
16
33
  function isValidConfig(obj) {
17
34
  if (!obj || typeof obj !== 'object')
18
35
  return false;
@@ -49,6 +66,12 @@ function isValidConfig(obj) {
49
66
  if (typeof c.networkBufferSize !== 'number' || c.networkBufferSize < 1)
50
67
  return false;
51
68
  }
69
+ if (c.logFile !== undefined && typeof c.logFile !== 'string')
70
+ return false;
71
+ if (c.logMaxBytes !== undefined) {
72
+ if (typeof c.logMaxBytes !== 'number' || c.logMaxBytes < 1024)
73
+ return false;
74
+ }
52
75
  return true;
53
76
  }
54
77
  export function generateConfig(cwd) {
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
@@ -25,5 +25,9 @@ export type AgentViewConfig = {
25
25
  captureBody?: boolean;
26
26
  /** Per-target network ring capacity. Default 200 (smaller than console — entries are heavier). */
27
27
  networkBufferSize?: number;
28
+ /** Feed file for `agent-view logs`. Relative paths resolve against the project root. Default `.agent-view/console.log`. */
29
+ logFile?: string;
30
+ /** Feed size cap in bytes. On overflow the feed rotates once to `<file>.prev`. Default 8 MB. */
31
+ logMaxBytes?: number;
28
32
  };
29
33
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,WAAW,CAAA;KACpB,CAAA;IACD;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IAC1C;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,kGAAkG;IAClG,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,WAAW,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,WAAW,CAAA;KACpB,CAAA;IACD;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IAC1C;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,kGAAkG;IAClG,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2HAA2H;IAC3H,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gGAAgG;IAChG,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA"}
@@ -0,0 +1,135 @@
1
+ import { ConsoleLevel, type RuntimeSession } from '../cdp/types.js';
2
+ import type { StampedConsoleMessage } from '../cdp/_tests/console-stream.js';
3
+ export declare const DEFAULT_LOG_FILE = ".agent-view/console.log";
4
+ export declare const DEFAULT_RESCAN_MS = 3000;
5
+ export declare const MIN_RESCAN_MS = 500;
6
+ export declare const DEFAULT_LOG_MAX_BYTES: number;
7
+ export declare const DEFAULT_TAIL_LINES = 200;
8
+ /** Tail/grep never scans more than this from the end of the feed. */
9
+ export declare const DEFAULT_SCAN_BYTES: number;
10
+ /** A probe is arbitrary JS re-evaluated in every newly discovered target — `allowEval` territory. */
11
+ export type ProbeSpec = {
12
+ name: string;
13
+ source: string;
14
+ /** Restricts the probe to targets whose type/title/url/id contains this (case-insensitive). */
15
+ targetQuery?: string;
16
+ };
17
+ export type LogRecorderOptions = {
18
+ /** Absolute path of the feed file. */
19
+ file: string;
20
+ levels?: ReadonlySet<ConsoleLevel>;
21
+ targetId?: string;
22
+ rescanMs?: number;
23
+ /** Per-rescan budget. Default `max(2 × rescanMs, 10s)`. */
24
+ tickTimeoutMs?: number;
25
+ maxBytes?: number;
26
+ truncate?: boolean;
27
+ probes?: ProbeSpec[];
28
+ /** Attach every matching target and return the sessions the console feed now reads. */
29
+ rescan: () => Promise<RuntimeSession[]>;
30
+ subscribe: (handler: (msg: StampedConsoleMessage) => void) => () => void;
31
+ };
32
+ export type RecorderStatus = {
33
+ file: string;
34
+ startedAt: number;
35
+ lines: number;
36
+ bytes: number;
37
+ rotations: number;
38
+ attached: string[];
39
+ levels: string[] | null;
40
+ targetId: string | null;
41
+ rescanMs: number;
42
+ ticks: number;
43
+ lastTickAt: number | null;
44
+ probes: {
45
+ name: string;
46
+ targetQuery?: string;
47
+ injections: number;
48
+ }[];
49
+ lastError: string | null;
50
+ };
51
+ export declare function localStamp(ts: number): string;
52
+ /**
53
+ * One record is exactly one physical line — newlines in the message (stacks, JSON payloads)
54
+ * become a literal `\n`. Wrapped records break every line-oriented filter, ours and the
55
+ * agent's `grep`/`awk` alike, so the escaping is a contract of the feed format.
56
+ */
57
+ export declare function formatLogRecord(msg: StampedConsoleMessage): string;
58
+ export declare function escapeRecord(text: string): string;
59
+ export type TailFilter = {
60
+ grep?: string;
61
+ /** `HH:MM:SS.mmm` clock string, as produced by `parseSinceToken`. */
62
+ since?: string;
63
+ level?: ReadonlySet<ConsoleLevel>;
64
+ limit?: number;
65
+ };
66
+ /** Keeps the newest `limit` matches, so a tail stays a tail even with filters on. */
67
+ export declare function filterLogLines(lines: string[], filter?: TailFilter): string[];
68
+ /**
69
+ * `--since` accepts `-5m` / `-30s` / `-2h`, a clock time (`09:31`, `09:31:02.500`), or an
70
+ * ISO timestamp. Returns the `HH:MM:SS.mmm` local-clock string the feed is compared against,
71
+ * or null when the token is unparseable. Comparison is clock-only: a feed spanning midnight
72
+ * needs the file itself, not `--since`.
73
+ */
74
+ export declare function parseSinceToken(token: string, now?: Date): string | null;
75
+ export declare function resolveLogFile(projectDir: string, configured?: string): string;
76
+ export declare function readFeedLines(file: string, maxScanBytes?: number): {
77
+ lines: string[];
78
+ scanTruncated: boolean;
79
+ };
80
+ /**
81
+ * Appends the console feed of every attached target to one file, and keeps discovering
82
+ * targets while it runs: a page reload keeps its target id, but a worker restart produces
83
+ * a new one, so without the rescan the feed silently loses the worker it was recording.
84
+ * Writes are synchronous fd appends — a single writer, and rotation needs no flush dance.
85
+ */
86
+ export declare class LogRecorder {
87
+ private readonly opts;
88
+ readonly file: string;
89
+ readonly startedAt: number;
90
+ private readonly rescanMs;
91
+ private readonly tickTimeoutMs;
92
+ private readonly maxBytes;
93
+ private readonly probes;
94
+ private fd;
95
+ private bytes;
96
+ private lines;
97
+ private rotations;
98
+ private unsubscribe;
99
+ private timer;
100
+ private stopped;
101
+ private attached;
102
+ private ticks;
103
+ private lastTickAt;
104
+ private probeFailures;
105
+ private injections;
106
+ private lastError;
107
+ constructor(opts: LogRecorderOptions);
108
+ start(): Promise<void>;
109
+ stop(reason: string): void;
110
+ /** `logs clear`: truncate the feed in place, keeping the recording alive. */
111
+ clearFeed(): void;
112
+ status(): RecorderStatus;
113
+ private onMessage;
114
+ /**
115
+ * A rescan that never settles is the worst outcome: the feed keeps its current targets and
116
+ * silently stops picking up new ones, which reads exactly like "the app went quiet". Bound
117
+ * the tick and always reschedule.
118
+ */
119
+ private tick;
120
+ private schedule;
121
+ /**
122
+ * Re-inject by *presence check*, not by target id: a page reload keeps its target id but
123
+ * wipes every global, so an id-keyed "already injected" set would leave the feed with a
124
+ * probe that no longer exists. The marker lives in the target, which is the only place
125
+ * that knows whether the context survived.
126
+ */
127
+ private injectProbes;
128
+ private open;
129
+ private write;
130
+ private append;
131
+ private rotate;
132
+ private mark;
133
+ private fail;
134
+ }
135
+ //# sourceMappingURL=log-recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-recorder.d.ts","sourceRoot":"","sources":["../../src/server/log-recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,348 @@
1
+ import { closeSync, mkdirSync, openSync, readSync, renameSync, statSync, writeSync } from 'node:fs';
2
+ import { basename, dirname, isAbsolute, join } from 'node:path';
3
+ import { ConsoleLevel } from '../cdp/types.js';
4
+ import { buildMatcher } from './pattern.js';
5
+ export const DEFAULT_LOG_FILE = '.agent-view/console.log';
6
+ export const DEFAULT_RESCAN_MS = 3_000;
7
+ export const MIN_RESCAN_MS = 500;
8
+ export const DEFAULT_LOG_MAX_BYTES = 8 * 1024 * 1024;
9
+ export const DEFAULT_TAIL_LINES = 200;
10
+ /** Tail/grep never scans more than this from the end of the feed. */
11
+ export const DEFAULT_SCAN_BYTES = 8 * 1024 * 1024;
12
+ const RECORD_CAP = 4_000;
13
+ const RECORDER_ORIGIN = 'recorder';
14
+ /** After this many failed injections into one target the probe is dropped for it. */
15
+ const PROBE_MAX_FAILURES = 3;
16
+ const PROBE_REGISTRY = 'globalThis.__avProbes';
17
+ export function localStamp(ts) {
18
+ const d = new Date(ts);
19
+ return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${pad(d.getMilliseconds(), 3)}`;
20
+ }
21
+ /**
22
+ * One record is exactly one physical line — newlines in the message (stacks, JSON payloads)
23
+ * become a literal `\n`. Wrapped records break every line-oriented filter, ours and the
24
+ * agent's `grep`/`awk` alike, so the escaping is a contract of the feed format.
25
+ */
26
+ export function formatLogRecord(msg) {
27
+ const origin = `${msg.targetType}:${msg.targetId.slice(0, 8)}`;
28
+ const body = msg.stack ? `${msg.text}\n${msg.stack}` : msg.text;
29
+ return `${localStamp(msg.ts)} [${msg.level}] [${origin}] ${escapeRecord(body)}`;
30
+ }
31
+ export function escapeRecord(text) {
32
+ const flat = text.replace(/\r\n|\r|\n/g, '\\n');
33
+ if (flat.length <= RECORD_CAP)
34
+ return flat;
35
+ return `${flat.slice(0, RECORD_CAP)}…(+${flat.length - RECORD_CAP} chars)`;
36
+ }
37
+ const RECORD_HEAD = /^(\d{2}:\d{2}:\d{2}\.\d{3}) \[([a-z]+)\] /;
38
+ /** Keeps the newest `limit` matches, so a tail stays a tail even with filters on. */
39
+ export function filterLogLines(lines, filter = {}) {
40
+ const matcher = filter.grep ? buildMatcher(filter.grep) : null;
41
+ const out = [];
42
+ for (const line of lines) {
43
+ if (!line)
44
+ continue;
45
+ const head = RECORD_HEAD.exec(line);
46
+ if (filter.since !== undefined && (!head || head[1] < filter.since))
47
+ continue;
48
+ if (filter.level && (!head || !filter.level.has(head[2])))
49
+ continue;
50
+ if (matcher && !matcher(line))
51
+ continue;
52
+ out.push(line);
53
+ }
54
+ const limit = filter.limit ?? DEFAULT_TAIL_LINES;
55
+ return out.length > limit ? out.slice(out.length - limit) : out;
56
+ }
57
+ /**
58
+ * `--since` accepts `-5m` / `-30s` / `-2h`, a clock time (`09:31`, `09:31:02.500`), or an
59
+ * ISO timestamp. Returns the `HH:MM:SS.mmm` local-clock string the feed is compared against,
60
+ * or null when the token is unparseable. Comparison is clock-only: a feed spanning midnight
61
+ * needs the file itself, not `--since`.
62
+ */
63
+ export function parseSinceToken(token, now = new Date()) {
64
+ const raw = token.trim();
65
+ const relative = /^-(\d+)(s|m|h)$/i.exec(raw);
66
+ if (relative) {
67
+ const unit = relative[2].toLowerCase();
68
+ const factor = unit === 's' ? 1_000 : unit === 'm' ? 60_000 : 3_600_000;
69
+ return localStamp(now.getTime() - Number(relative[1]) * factor);
70
+ }
71
+ const clock = /^(\d{1,2}):(\d{2})(?::(\d{2}))?(?:\.(\d{1,3}))?$/.exec(raw);
72
+ if (clock) {
73
+ const hours = Number(clock[1]);
74
+ if (hours > 23)
75
+ return null;
76
+ return `${pad(hours)}:${clock[2]}:${clock[3] ?? '00'}.${(clock[4] ?? '').padEnd(3, '0')}`;
77
+ }
78
+ const parsed = Date.parse(raw);
79
+ return Number.isNaN(parsed) ? null : localStamp(parsed);
80
+ }
81
+ export function resolveLogFile(projectDir, configured) {
82
+ const raw = configured?.trim() ? configured.trim() : DEFAULT_LOG_FILE;
83
+ return isAbsolute(raw) ? raw : join(projectDir, raw);
84
+ }
85
+ export function readFeedLines(file, maxScanBytes = DEFAULT_SCAN_BYTES) {
86
+ const size = statSync(file).size;
87
+ const start = size > maxScanBytes ? size - maxScanBytes : 0;
88
+ const length = size - start;
89
+ if (length === 0)
90
+ return { lines: [], scanTruncated: false };
91
+ const fd = openSync(file, 'r');
92
+ let text;
93
+ try {
94
+ const buf = Buffer.allocUnsafe(length);
95
+ readSync(fd, buf, 0, length, start);
96
+ text = buf.toString('utf8');
97
+ }
98
+ finally {
99
+ closeSync(fd);
100
+ }
101
+ if (start > 0) {
102
+ // The scan window starts mid-record (and possibly mid-codepoint) — drop that fragment.
103
+ const firstBreak = text.indexOf('\n');
104
+ text = firstBreak === -1 ? '' : text.slice(firstBreak + 1);
105
+ }
106
+ return { lines: text.split('\n').filter(l => l.length > 0), scanTruncated: start > 0 };
107
+ }
108
+ /**
109
+ * Appends the console feed of every attached target to one file, and keeps discovering
110
+ * targets while it runs: a page reload keeps its target id, but a worker restart produces
111
+ * a new one, so without the rescan the feed silently loses the worker it was recording.
112
+ * Writes are synchronous fd appends — a single writer, and rotation needs no flush dance.
113
+ */
114
+ export class LogRecorder {
115
+ opts;
116
+ file;
117
+ startedAt = Date.now();
118
+ rescanMs;
119
+ tickTimeoutMs;
120
+ maxBytes;
121
+ probes;
122
+ fd = null;
123
+ bytes = 0;
124
+ lines = 0;
125
+ rotations = 0;
126
+ unsubscribe = null;
127
+ timer = null;
128
+ stopped = false;
129
+ attached = [];
130
+ ticks = 0;
131
+ lastTickAt = null;
132
+ probeFailures = new Map();
133
+ injections = new Map();
134
+ lastError = null;
135
+ constructor(opts) {
136
+ this.opts = opts;
137
+ this.file = opts.file;
138
+ this.rescanMs = Math.max(MIN_RESCAN_MS, opts.rescanMs ?? DEFAULT_RESCAN_MS);
139
+ this.tickTimeoutMs = opts.tickTimeoutMs ?? Math.max(2 * this.rescanMs, 10_000);
140
+ this.maxBytes = opts.maxBytes ?? DEFAULT_LOG_MAX_BYTES;
141
+ this.probes = opts.probes ?? [];
142
+ }
143
+ async start() {
144
+ mkdirSync(dirname(this.file), { recursive: true });
145
+ this.open(this.opts.truncate ?? false);
146
+ this.mark(`recording started (rescan ${this.rescanMs}ms, cap ${Math.round(this.maxBytes / 1024)}KB)`);
147
+ this.unsubscribe = this.opts.subscribe((msg) => this.onMessage(msg));
148
+ await this.tick();
149
+ }
150
+ stop(reason) {
151
+ if (this.stopped)
152
+ return;
153
+ this.stopped = true;
154
+ if (this.timer) {
155
+ clearTimeout(this.timer);
156
+ this.timer = null;
157
+ }
158
+ this.unsubscribe?.();
159
+ this.unsubscribe = null;
160
+ this.mark(`recording stopped (${reason}) — ${this.lines} lines`);
161
+ if (this.fd !== null) {
162
+ closeSync(this.fd);
163
+ this.fd = null;
164
+ }
165
+ }
166
+ /** `logs clear`: truncate the feed in place, keeping the recording alive. */
167
+ clearFeed() {
168
+ if (this.fd !== null) {
169
+ closeSync(this.fd);
170
+ this.fd = null;
171
+ }
172
+ this.open(true);
173
+ this.lines = 0;
174
+ this.mark('feed cleared');
175
+ }
176
+ status() {
177
+ return {
178
+ file: this.file,
179
+ startedAt: this.startedAt,
180
+ lines: this.lines,
181
+ bytes: this.bytes,
182
+ rotations: this.rotations,
183
+ attached: [...this.attached],
184
+ levels: this.opts.levels ? [...this.opts.levels] : null,
185
+ targetId: this.opts.targetId ?? null,
186
+ rescanMs: this.rescanMs,
187
+ ticks: this.ticks,
188
+ lastTickAt: this.lastTickAt,
189
+ probes: this.probes.map(p => ({
190
+ name: p.name,
191
+ targetQuery: p.targetQuery,
192
+ injections: this.injections.get(p.name) ?? 0,
193
+ })),
194
+ lastError: this.lastError,
195
+ };
196
+ }
197
+ onMessage(msg) {
198
+ if (this.opts.targetId && msg.targetId !== this.opts.targetId)
199
+ return;
200
+ if (this.opts.levels && !this.opts.levels.has(msg.level))
201
+ return;
202
+ this.write(formatLogRecord(msg));
203
+ }
204
+ /**
205
+ * A rescan that never settles is the worst outcome: the feed keeps its current targets and
206
+ * silently stops picking up new ones, which reads exactly like "the app went quiet". Bound
207
+ * the tick and always reschedule.
208
+ */
209
+ async tick() {
210
+ if (this.stopped)
211
+ return;
212
+ try {
213
+ const sessions = await withDeadline(this.opts.rescan(), this.tickTimeoutMs, 'rescan');
214
+ await withDeadline(this.injectProbes(sessions), this.tickTimeoutMs, 'probe injection');
215
+ this.attached = sessions.map(s => `${s.target.type}:${s.target.id.slice(0, 8)}`);
216
+ }
217
+ catch (err) {
218
+ this.fail(`rescan failed: ${errorText(err)}`);
219
+ }
220
+ this.ticks++;
221
+ this.lastTickAt = Date.now();
222
+ this.schedule();
223
+ }
224
+ schedule() {
225
+ if (this.stopped)
226
+ return;
227
+ this.timer = setTimeout(() => { void this.tick(); }, this.rescanMs);
228
+ }
229
+ /**
230
+ * Re-inject by *presence check*, not by target id: a page reload keeps its target id but
231
+ * wipes every global, so an id-keyed "already injected" set would leave the feed with a
232
+ * probe that no longer exists. The marker lives in the target, which is the only place
233
+ * that knows whether the context survived.
234
+ */
235
+ async injectProbes(sessions) {
236
+ for (const session of sessions) {
237
+ for (const probe of this.probes) {
238
+ if (!targetMatchesProbe(session, probe))
239
+ continue;
240
+ const key = `${session.target.id}:${probe.name}`;
241
+ if ((this.probeFailures.get(key) ?? 0) >= PROBE_MAX_FAILURES)
242
+ continue;
243
+ const origin = `${session.target.type}:${session.target.id.slice(0, 8)}`;
244
+ try {
245
+ const present = await session.evaluate(probeMarkerCheck(probe.name), { returnByValue: true });
246
+ if (present === true)
247
+ continue;
248
+ await session.evaluate(probeWithMarker(probe), { awaitPromise: true, returnByValue: true });
249
+ this.injections.set(probe.name, (this.injections.get(probe.name) ?? 0) + 1);
250
+ this.mark(`probe ${probe.name} injected into ${origin}`);
251
+ }
252
+ catch (err) {
253
+ const failures = (this.probeFailures.get(key) ?? 0) + 1;
254
+ this.probeFailures.set(key, failures);
255
+ const giveUp = failures >= PROBE_MAX_FAILURES ? ' — giving up on this target' : '';
256
+ this.fail(`probe ${probe.name} failed in ${origin}: ${errorText(err)}${giveUp}`);
257
+ }
258
+ }
259
+ }
260
+ }
261
+ open(truncate) {
262
+ this.fd = openSync(this.file, truncate ? 'w' : 'a');
263
+ this.bytes = truncate ? 0 : fileSize(this.file);
264
+ }
265
+ write(line) {
266
+ if (this.fd === null)
267
+ return;
268
+ const buf = Buffer.from(`${line}\n`, 'utf8');
269
+ if (this.bytes + buf.length > this.maxBytes)
270
+ this.rotate();
271
+ this.append(buf);
272
+ }
273
+ append(buf) {
274
+ if (this.fd === null)
275
+ return;
276
+ try {
277
+ writeSync(this.fd, buf);
278
+ this.bytes += buf.length;
279
+ this.lines++;
280
+ }
281
+ catch (err) {
282
+ this.lastError = `write failed: ${errorText(err)}`;
283
+ }
284
+ }
285
+ rotate() {
286
+ if (this.fd !== null) {
287
+ closeSync(this.fd);
288
+ this.fd = null;
289
+ }
290
+ try {
291
+ renameSync(this.file, `${this.file}.prev`);
292
+ }
293
+ catch (err) {
294
+ this.lastError = `rotate failed: ${errorText(err)}`;
295
+ }
296
+ this.rotations++;
297
+ this.open(true);
298
+ this.append(Buffer.from(`${markerLine(`rotated — previous feed is ${basename(this.file)}.prev`)}\n`, 'utf8'));
299
+ }
300
+ mark(text) {
301
+ this.write(markerLine(text));
302
+ }
303
+ fail(text) {
304
+ this.lastError = text;
305
+ this.mark(text);
306
+ }
307
+ }
308
+ function markerLine(text) {
309
+ return `${localStamp(Date.now())} [${ConsoleLevel.Info}] [${RECORDER_ORIGIN}] ${escapeRecord(text)}`;
310
+ }
311
+ function probeMarkerCheck(name) {
312
+ return `!!(${PROBE_REGISTRY} && ${PROBE_REGISTRY}[${JSON.stringify(name)}])`;
313
+ }
314
+ /** Marker is set by a plain statement, not `eval` — a strict CSP must not break probes. */
315
+ function probeWithMarker(probe) {
316
+ return `${probe.source}\n;${PROBE_REGISTRY} = ${PROBE_REGISTRY} || {};\n${PROBE_REGISTRY}[${JSON.stringify(probe.name)}] = 1;`;
317
+ }
318
+ function targetMatchesProbe(session, probe) {
319
+ if (!probe.targetQuery)
320
+ return true;
321
+ const q = probe.targetQuery.toLowerCase();
322
+ const { id, type, title, url } = session.target;
323
+ return type.toLowerCase().includes(q)
324
+ || id.toLowerCase().startsWith(q)
325
+ || title.toLowerCase().includes(q)
326
+ || url.toLowerCase().includes(q);
327
+ }
328
+ function fileSize(file) {
329
+ try {
330
+ return statSync(file).size;
331
+ }
332
+ catch {
333
+ return 0;
334
+ }
335
+ }
336
+ function withDeadline(promise, ms, what) {
337
+ return new Promise((resolve, reject) => {
338
+ const timer = setTimeout(() => reject(new Error(`${what} timed out after ${Math.round(ms / 1000)}s`)), ms);
339
+ promise.then((value) => { clearTimeout(timer); resolve(value); }, (err) => { clearTimeout(timer); reject(err instanceof Error ? err : new Error(String(err))); });
340
+ });
341
+ }
342
+ function errorText(err) {
343
+ return err instanceof Error ? err.message : String(err);
344
+ }
345
+ function pad(n, width = 2) {
346
+ return String(n).padStart(width, '0');
347
+ }
348
+ //# sourceMappingURL=log-recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-recorder.js","sourceRoot":"","sources":["../../src/server/log-recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** `--until` / `--grep` pattern: `/re/flags` compiles to a regex, anything else is a substring. */
2
+ export declare function buildMatcher(pattern: string): (text: string) => boolean;
3
+ //# sourceMappingURL=pattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/server/pattern.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAOvE"}
@@ -0,0 +1,10 @@
1
+ /** `--until` / `--grep` pattern: `/re/flags` compiles to a regex, anything else is a substring. */
2
+ export function buildMatcher(pattern) {
3
+ const regexMatch = /^\/(.+)\/([gimsuy]*)$/.exec(pattern);
4
+ if (regexMatch) {
5
+ const re = new RegExp(regexMatch[1], regexMatch[2]);
6
+ return (text) => re.test(text);
7
+ }
8
+ return (text) => text.includes(pattern);
9
+ }
10
+ //# sourceMappingURL=pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/server/pattern.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QACnD,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AACzC,CAAC"}