vouchington-tooling 0.0.21 → 0.1.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 (44) hide show
  1. package/README.md +28 -0
  2. package/dist/browser-session-runner/attempt.d.mts +2 -0
  3. package/dist/browser-session-runner/attempt.mjs +195 -0
  4. package/dist/browser-session-runner/index.d.mts +4 -0
  5. package/dist/browser-session-runner/index.mjs +64 -0
  6. package/dist/browser-session-runner/process-group.d.mts +5 -0
  7. package/dist/browser-session-runner/process-group.mjs +23 -0
  8. package/dist/browser-session-runner/result.d.mts +2 -0
  9. package/dist/browser-session-runner/result.mjs +11 -0
  10. package/dist/browser-session-runner/tail-queue.d.mts +8 -0
  11. package/dist/browser-session-runner/tail-queue.mjs +30 -0
  12. package/dist/browser-session-runner/tail.d.mts +1 -0
  13. package/dist/browser-session-runner/tail.mjs +12 -0
  14. package/dist/browser-session-runner/types.d.mts +53 -0
  15. package/dist/browser-session-runner/types.mjs +1 -0
  16. package/dist/cli/commands/retrospective-transcript.d.mts +1 -0
  17. package/dist/cli/commands/retrospective-transcript.mjs +31 -0
  18. package/dist/cli/index.mjs +3 -0
  19. package/dist/cli/parse.d.mts +3 -0
  20. package/dist/cli/parse.mjs +2 -0
  21. package/dist/cli/usage.d.mts +1 -1
  22. package/dist/cli/usage.mjs +2 -0
  23. package/dist/coverage-transport/outcome.mjs +3 -1
  24. package/dist/index.d.mts +6 -0
  25. package/dist/index.mjs +3 -0
  26. package/dist/retrospective-transcript/claude.d.mts +2 -0
  27. package/dist/retrospective-transcript/claude.mjs +67 -0
  28. package/dist/retrospective-transcript/codex.d.mts +11 -0
  29. package/dist/retrospective-transcript/codex.mjs +174 -0
  30. package/dist/retrospective-transcript/format.d.mts +4 -0
  31. package/dist/retrospective-transcript/format.mjs +22 -0
  32. package/dist/retrospective-transcript/index.d.mts +22 -0
  33. package/dist/retrospective-transcript/index.mjs +151 -0
  34. package/dist/retrospective-transcript/javascript-command.d.mts +1 -0
  35. package/dist/retrospective-transcript/javascript-command.mjs +25 -0
  36. package/dist/retrospective-transcript/shared.d.mts +31 -0
  37. package/dist/retrospective-transcript/shared.mjs +213 -0
  38. package/dist/vitest-diagnostics/directory.d.mts +12 -0
  39. package/dist/vitest-diagnostics/directory.mjs +44 -0
  40. package/dist/vitest-diagnostics/index.d.mts +22 -0
  41. package/dist/vitest-diagnostics/index.mjs +123 -0
  42. package/dist/vitest-diagnostics/read-file.d.mts +2 -0
  43. package/dist/vitest-diagnostics/read-file.mjs +37 -0
  44. package/package.json +16 -1
@@ -0,0 +1,213 @@
1
+ export const emptyTokens = () => ({
2
+ input: 0,
3
+ output: 0,
4
+ cacheRead: 0,
5
+ cacheCreation: 0,
6
+ });
7
+ export const emptyFacts = () => ({
8
+ userPrompts: 0,
9
+ assistantResponses: 0,
10
+ toolCalls: 0,
11
+ failedToolCalls: 0,
12
+ noMistakesInvocations: 0,
13
+ advisorCalls: 0,
14
+ pushCommandAttempts: 0,
15
+ compactions: 0,
16
+ tokens: emptyTokens(),
17
+ subagentToolCalls: 0,
18
+ subagentTokens: emptyTokens(),
19
+ });
20
+ export function asRecord(value) {
21
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
22
+ ? value
23
+ : undefined;
24
+ }
25
+ export const asNumber = (value) => typeof value === 'number' && Number.isFinite(value) ? value : 0;
26
+ export function parseLines(lines) {
27
+ const records = [];
28
+ for (const line of lines) {
29
+ if (!line.trim())
30
+ continue;
31
+ try {
32
+ const record = asRecord(JSON.parse(line));
33
+ if (record)
34
+ records.push(record);
35
+ }
36
+ catch {
37
+ // Keep valid records before a partially written final line.
38
+ }
39
+ }
40
+ return records;
41
+ }
42
+ export function hasMalformedInteriorRecord(lines) {
43
+ const nonblank = lines.filter((line) => line.trim());
44
+ const complete = lines.at(-1)?.trim() ? nonblank.slice(0, -1) : nonblank;
45
+ return complete.some((line) => {
46
+ try {
47
+ return !asRecord(JSON.parse(line));
48
+ }
49
+ catch {
50
+ return true;
51
+ }
52
+ });
53
+ }
54
+ function hereDocs(tokens) {
55
+ return tokens.flatMap((token, index) => {
56
+ if (token.startsWith('<<<'))
57
+ return [];
58
+ const match = token.match(/^<<(-?)(.*)$/);
59
+ const delimiter = match?.[2] || (match ? tokens[index + 1] : undefined);
60
+ return delimiter ? [{ delimiter, stripTabs: match?.[1] === '-' }] : [];
61
+ });
62
+ }
63
+ function segments(command) {
64
+ const result = [];
65
+ let segment = [];
66
+ let word = '';
67
+ let quote;
68
+ let escaped = false, comment = false;
69
+ const pending = [];
70
+ let hereDocLine = '';
71
+ const flush = () => {
72
+ if (word)
73
+ segment.push(word);
74
+ word = '';
75
+ };
76
+ const end = (newline = false) => {
77
+ flush();
78
+ if (newline)
79
+ pending.push(...hereDocs(segment));
80
+ if (segment.length)
81
+ result.push(segment);
82
+ segment = [];
83
+ };
84
+ for (let index = 0; index < command.length; index++) {
85
+ const char = command[index];
86
+ const next = command[index + 1] ?? '';
87
+ const canEscape = quote === '"' ? /[\\"$`\n]/.test(next) : quote === undefined && /[\\'";#&|\n]/.test(next);
88
+ if (pending.length) {
89
+ if (char === '\n') {
90
+ const current = pending[0];
91
+ const line = current.stripTabs ? hereDocLine.replace(/^\t+/, '') : hereDocLine;
92
+ if (line === current.delimiter)
93
+ pending.shift();
94
+ hereDocLine = '';
95
+ }
96
+ else
97
+ hereDocLine += char;
98
+ }
99
+ else if (comment) {
100
+ if (char === '\n') {
101
+ comment = false;
102
+ end(true);
103
+ }
104
+ }
105
+ else if (quote === "'") {
106
+ if (char === quote)
107
+ quote = undefined;
108
+ else
109
+ word += char;
110
+ }
111
+ else if (escaped) {
112
+ if (char !== '\n')
113
+ word += char;
114
+ escaped = false;
115
+ }
116
+ else if (char === '\\' && next !== '' && canEscape)
117
+ escaped = true;
118
+ else if (char === '\\')
119
+ word += char;
120
+ else if (quote) {
121
+ if (char === quote)
122
+ quote = undefined;
123
+ else
124
+ word += char;
125
+ }
126
+ else if (char === '"' || char === "'")
127
+ quote = char;
128
+ else if (char === '#' && !word)
129
+ comment = true;
130
+ else if (char === ';' || char === '&' || char === '|' || char === '\n')
131
+ end(char === '\n');
132
+ else if (/\s/.test(char))
133
+ flush();
134
+ else
135
+ word += char;
136
+ }
137
+ if (!quote)
138
+ end();
139
+ return result;
140
+ }
141
+ function commandAfterAssignments(segment) {
142
+ const index = segment.findIndex((token) => !/^[A-Za-z_][A-Za-z0-9_]*=/.test(token));
143
+ let tokens = index === -1 ? [] : segment.slice(index);
144
+ while (/(^|[\\/])env(?:\.exe)?$/i.test(tokens[0] ?? '')) {
145
+ let next = 1, options = true;
146
+ while (next < tokens.length) {
147
+ const token = tokens[next];
148
+ if (token === '--') {
149
+ options = false;
150
+ next++;
151
+ }
152
+ else if (/^[A-Za-z_][A-Za-z0-9_]*=/.test(token))
153
+ next++;
154
+ else if (options &&
155
+ ['-u', '--unset', '-C', '--chdir', '-S', '--split-string'].includes(token))
156
+ next += 2;
157
+ else if (options && token.startsWith('-'))
158
+ next++;
159
+ else
160
+ break;
161
+ }
162
+ tokens = tokens.slice(next);
163
+ }
164
+ return tokens;
165
+ }
166
+ const NO_MISTAKES = /(^|[\\/])no-mistakes(?:\.(?:cmd|exe|bat))?$/i;
167
+ function containsNoMistakesTarget(tokens) {
168
+ for (let index = 0; index < tokens.length; index++) {
169
+ const token = tokens[index];
170
+ if (token === '--')
171
+ continue;
172
+ if (token === '-c' || token === '--call')
173
+ return segments(tokens[index + 1] ?? '').some(isNoMistakes);
174
+ if (token === '--package' || token === '-p') {
175
+ index++;
176
+ continue;
177
+ }
178
+ if (token.startsWith('-'))
179
+ continue;
180
+ return NO_MISTAKES.test(token);
181
+ }
182
+ return false;
183
+ }
184
+ function isNoMistakes(segment) {
185
+ const tokens = commandAfterAssignments(segment);
186
+ const [command, second] = tokens;
187
+ if (NO_MISTAKES.test(command ?? ''))
188
+ return true;
189
+ if (!['npm', 'npx', 'pnpm', 'pnpx', 'yarn'].includes(command ?? ''))
190
+ return false;
191
+ const offset = second === 'run' || second === 'exec' || second === 'dlx' ? 2 : 1;
192
+ return containsNoMistakesTarget(tokens.slice(offset));
193
+ }
194
+ function isPush(segment) {
195
+ const tokens = commandAfterAssignments(segment);
196
+ if (!/(^|[\\/])git(?:\.exe)?$/i.test(tokens[0] ?? ''))
197
+ return false;
198
+ for (let index = 1; index < tokens.length; index++) {
199
+ if (['-C', '-c', '--git-dir', '--work-tree'].includes(tokens[index]))
200
+ index++;
201
+ else if (!tokens[index]?.startsWith('-'))
202
+ return tokens[index] === 'push';
203
+ }
204
+ return false;
205
+ }
206
+ export function applyCommand(command, facts) {
207
+ for (const segment of segments(command)) {
208
+ if (isNoMistakes(segment))
209
+ facts.noMistakesInvocations++;
210
+ if (isPush(segment))
211
+ facts.pushCommandAttempts++;
212
+ }
213
+ }
@@ -0,0 +1,12 @@
1
+ export declare const HARD_MAX_DIAGNOSTIC_DIRECTORY_ENTRIES = 10000;
2
+ interface DirectoryIdentity {
3
+ dev: number;
4
+ ino: number;
5
+ }
6
+ export interface DiagnosticReportDirectory {
7
+ filenames: string[];
8
+ identity: DirectoryIdentity;
9
+ }
10
+ export declare function isDiagnosticReportDirectoryCurrent(directory: string, identity: DirectoryIdentity): boolean;
11
+ export declare function readDiagnosticReportDirectory(directory: string): DiagnosticReportDirectory | undefined;
12
+ export {};
@@ -0,0 +1,44 @@
1
+ import { lstatSync, opendirSync } from 'node:fs';
2
+ export const HARD_MAX_DIAGNOSTIC_DIRECTORY_ENTRIES = 10_000;
3
+ function directoryIdentity(directory) {
4
+ const stats = lstatSync(directory);
5
+ return stats.isDirectory() ? { dev: stats.dev, ino: stats.ino } : undefined;
6
+ }
7
+ export function isDiagnosticReportDirectoryCurrent(directory, identity) {
8
+ try {
9
+ const current = directoryIdentity(directory);
10
+ return current?.dev === identity.dev && current.ino === identity.ino;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export function readDiagnosticReportDirectory(directory) {
17
+ try {
18
+ const identity = directoryIdentity(directory);
19
+ if (identity === undefined)
20
+ return undefined;
21
+ const filenames = [];
22
+ const handle = opendirSync(directory);
23
+ try {
24
+ for (let scanned = 0;; scanned += 1) {
25
+ const entry = handle.readSync();
26
+ if (entry === null)
27
+ break;
28
+ if (scanned >= HARD_MAX_DIAGNOSTIC_DIRECTORY_ENTRIES)
29
+ return undefined;
30
+ if (entry.name.endsWith('.json'))
31
+ filenames.push(entry.name);
32
+ }
33
+ }
34
+ finally {
35
+ handle.closeSync();
36
+ }
37
+ if (!isDiagnosticReportDirectoryCurrent(directory, identity))
38
+ return undefined;
39
+ return { filenames, identity };
40
+ }
41
+ catch {
42
+ return undefined;
43
+ }
44
+ }
@@ -0,0 +1,22 @@
1
+ export { MAX_DIAGNOSTIC_REPORT_BYTES } from './read-file.mts';
2
+ export declare const DEFAULT_MAX_DIAGNOSTIC_REPORTS = 100;
3
+ export declare const DEFAULT_MAX_FORMATTED_DIAGNOSTIC_REPORTS = 20;
4
+ export declare const HARD_MAX_DIAGNOSTIC_REPORTS = 100;
5
+ export { HARD_MAX_DIAGNOSTIC_DIRECTORY_ENTRIES } from './directory.mts';
6
+ export interface DiagnosticReportSummary {
7
+ file: string;
8
+ trigger: string;
9
+ event: string;
10
+ threadId: number | null;
11
+ heapUsedMB: string;
12
+ heapTotalMB: string;
13
+ heapLimitMB: string;
14
+ maxRssMB: string;
15
+ topNativeFrameModule: string | null;
16
+ }
17
+ export interface DiagnosticReportLimitOptions {
18
+ maxReports?: number;
19
+ }
20
+ export declare function summarizeDiagnosticReport(file: string, report: unknown): DiagnosticReportSummary;
21
+ export declare function readDiagnosticReportSummaries(directory: string, options?: DiagnosticReportLimitOptions): DiagnosticReportSummary[];
22
+ export declare function formatDiagnosticReportSummaries(summaries: readonly unknown[], options?: DiagnosticReportLimitOptions): string;
@@ -0,0 +1,123 @@
1
+ import { join, posix, win32 } from 'node:path';
2
+ import { isDiagnosticReportDirectoryCurrent, readDiagnosticReportDirectory } from './directory.mjs';
3
+ import { readBoundedRegularFile } from './read-file.mjs';
4
+ export { MAX_DIAGNOSTIC_REPORT_BYTES } from './read-file.mjs';
5
+ export const DEFAULT_MAX_DIAGNOSTIC_REPORTS = 100;
6
+ export const DEFAULT_MAX_FORMATTED_DIAGNOSTIC_REPORTS = 20;
7
+ export const HARD_MAX_DIAGNOSTIC_REPORTS = 100;
8
+ export { HARD_MAX_DIAGNOSTIC_DIRECTORY_ENTRIES } from './directory.mjs';
9
+ const TEXT_LIMIT = 200;
10
+ const PATH_LIMIT = 240;
11
+ function objectValue(value) {
12
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
13
+ ? value
14
+ : {};
15
+ }
16
+ function boundedText(value, fallback, limit) {
17
+ if (typeof value !== 'string')
18
+ return fallback;
19
+ const normalized = value
20
+ .slice(0, limit * 4)
21
+ .replace(/[\p{Cc}\p{Cf}]/gu, ' ')
22
+ .replace(/\s+/g, ' ')
23
+ .trim();
24
+ return normalized.length === 0 ? fallback : normalized.slice(0, limit);
25
+ }
26
+ function formatMebibytes(value) {
27
+ const bytes = typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : 0;
28
+ return (bytes / 1024 / 1024).toFixed(1);
29
+ }
30
+ function threadId(value) {
31
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : null;
32
+ }
33
+ function nativeModulePath(value) {
34
+ const module = boundedText(value, '', PATH_LIMIT);
35
+ return posix.isAbsolute(module) || win32.isAbsolute(module) ? module : null;
36
+ }
37
+ function topNativeFrameModule(value) {
38
+ if (!Array.isArray(value))
39
+ return null;
40
+ const symbol = objectValue(value[0]).symbol;
41
+ if (typeof symbol !== 'string')
42
+ return null;
43
+ const tail = symbol.slice(-PATH_LIMIT * 2).trimEnd();
44
+ if (!tail.endsWith(']'))
45
+ return null;
46
+ const opening = tail.lastIndexOf('[');
47
+ if (opening < 0)
48
+ return null;
49
+ return nativeModulePath(tail.slice(opening + 1, -1));
50
+ }
51
+ function reportLimit(value, fallback) {
52
+ if (value === undefined)
53
+ return fallback;
54
+ if (!Number.isFinite(value))
55
+ return fallback;
56
+ return Math.min(Math.max(Math.floor(value), 0), HARD_MAX_DIAGNOSTIC_REPORTS);
57
+ }
58
+ export function summarizeDiagnosticReport(file, report) {
59
+ const root = objectValue(report);
60
+ const header = objectValue(root.header);
61
+ const heap = objectValue(root.javascriptHeap);
62
+ const resourceUsage = objectValue(root.resourceUsage);
63
+ return {
64
+ file: boundedText(file, 'unknown', PATH_LIMIT),
65
+ trigger: boundedText(header.trigger, 'unknown', TEXT_LIMIT),
66
+ event: boundedText(header.event, 'unknown', TEXT_LIMIT),
67
+ threadId: threadId(header.threadId),
68
+ heapUsedMB: formatMebibytes(heap.usedMemory),
69
+ heapTotalMB: formatMebibytes(heap.totalMemory),
70
+ heapLimitMB: formatMebibytes(heap.memoryLimit),
71
+ maxRssMB: formatMebibytes(resourceUsage.maxRss),
72
+ topNativeFrameModule: topNativeFrameModule(root.nativeStack),
73
+ };
74
+ }
75
+ export function readDiagnosticReportSummaries(directory, options = {}) {
76
+ const maxReports = reportLimit(options.maxReports, DEFAULT_MAX_DIAGNOSTIC_REPORTS);
77
+ if (maxReports === 0)
78
+ return [];
79
+ const reportsDirectory = readDiagnosticReportDirectory(directory);
80
+ if (reportsDirectory === undefined)
81
+ return [];
82
+ const filenames = reportsDirectory.filenames.sort();
83
+ const selected = filenames.slice(-maxReports);
84
+ const summaries = [];
85
+ for (const filename of selected) {
86
+ try {
87
+ if (!isDiagnosticReportDirectoryCurrent(directory, reportsDirectory.identity))
88
+ return [];
89
+ const contents = readBoundedRegularFile(join(directory, filename));
90
+ if (!isDiagnosticReportDirectoryCurrent(directory, reportsDirectory.identity))
91
+ return [];
92
+ if (contents === undefined)
93
+ continue;
94
+ const report = JSON.parse(contents);
95
+ summaries.push(summarizeDiagnosticReport(filename, report));
96
+ }
97
+ catch {
98
+ // Node can leave a partial report if the process exits while writing it.
99
+ }
100
+ }
101
+ return summaries;
102
+ }
103
+ export function formatDiagnosticReportSummaries(summaries, options = {}) {
104
+ const maxReports = reportLimit(options.maxReports, DEFAULT_MAX_FORMATTED_DIAGNOSTIC_REPORTS);
105
+ const lines = ['[vitest-diagnostics]', `reports provided: ${summaries.length}`];
106
+ if (summaries.length === 0)
107
+ lines.push(' (none recorded)');
108
+ for (const value of summaries.slice(0, maxReports)) {
109
+ const summary = objectValue(value);
110
+ lines.push(` - file=${boundedText(summary.file, 'unknown', PATH_LIMIT)} ` +
111
+ `trigger=${boundedText(summary.trigger, 'unknown', TEXT_LIMIT)} ` +
112
+ `event=${boundedText(summary.event, 'unknown', TEXT_LIMIT)} ` +
113
+ `threadId=${threadId(summary.threadId) ?? 'unknown'} ` +
114
+ `heapUsedMB=${boundedText(summary.heapUsedMB, '0.0', TEXT_LIMIT)} ` +
115
+ `heapTotalMB=${boundedText(summary.heapTotalMB, '0.0', TEXT_LIMIT)} ` +
116
+ `heapLimitMB=${boundedText(summary.heapLimitMB, '0.0', TEXT_LIMIT)} ` +
117
+ `maxRssMB=${boundedText(summary.maxRssMB, '0.0', TEXT_LIMIT)} ` +
118
+ `topNativeFrameModule=${nativeModulePath(summary.topNativeFrameModule) ?? 'none'}`);
119
+ }
120
+ if (summaries.length > maxReports)
121
+ lines.push(` ... ${summaries.length - maxReports} more`);
122
+ return `${lines.join('\n')}\n`;
123
+ }
@@ -0,0 +1,2 @@
1
+ export declare const MAX_DIAGNOSTIC_REPORT_BYTES: number;
2
+ export declare function readBoundedRegularFile(path: string): string | undefined;
@@ -0,0 +1,37 @@
1
+ import { closeSync, constants, fstatSync, lstatSync, openSync, readSync } from 'node:fs';
2
+ export const MAX_DIAGNOSTIC_REPORT_BYTES = 5 * 1024 * 1024;
3
+ export function readBoundedRegularFile(path) {
4
+ const entryStats = lstatSync(path);
5
+ if (!entryStats.isFile() || entryStats.isSymbolicLink())
6
+ return undefined;
7
+ const descriptor = openSync(path, constants.O_RDONLY | constants.O_NONBLOCK | constants.O_NOFOLLOW);
8
+ try {
9
+ const stats = fstatSync(descriptor);
10
+ const currentEntryStats = lstatSync(path);
11
+ if (!stats.isFile() ||
12
+ currentEntryStats.isSymbolicLink() ||
13
+ !currentEntryStats.isFile() ||
14
+ currentEntryStats.dev !== stats.dev ||
15
+ currentEntryStats.ino !== stats.ino ||
16
+ stats.size > MAX_DIAGNOSTIC_REPORT_BYTES)
17
+ return undefined;
18
+ const chunks = [];
19
+ let length = 0;
20
+ while (length <= MAX_DIAGNOSTIC_REPORT_BYTES) {
21
+ const remaining = MAX_DIAGNOSTIC_REPORT_BYTES + 1 - length;
22
+ const expected = length < stats.size ? stats.size - length : length === stats.size ? 1 : 65_536;
23
+ const bytes = Buffer.allocUnsafe(Math.min(expected, remaining, 65_536));
24
+ const read = readSync(descriptor, bytes, 0, bytes.length, null);
25
+ if (read === 0)
26
+ break;
27
+ chunks.push(bytes.subarray(0, read));
28
+ length += read;
29
+ }
30
+ return length > MAX_DIAGNOSTIC_REPORT_BYTES
31
+ ? undefined
32
+ : Buffer.concat(chunks, length).toString('utf8');
33
+ }
34
+ finally {
35
+ closeSync(descriptor);
36
+ }
37
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vouchington-tooling",
3
- "version": "0.0.21",
3
+ "version": "0.1.0",
4
4
  "description": "Vouchington CLI and extractable tooling libraries.",
5
5
  "homepage": "https://github.com/vouchington/vouchington-tooling/tree/main/packages/vouchington-tooling#readme",
6
6
  "bugs": {
@@ -35,6 +35,11 @@
35
35
  "import": "./dist/runner-port-policy/index.mjs",
36
36
  "default": "./dist/runner-port-policy/index.mjs"
37
37
  },
38
+ "./retrospective-transcript": {
39
+ "types": "./dist/retrospective-transcript/index.d.mts",
40
+ "import": "./dist/retrospective-transcript/index.mjs",
41
+ "default": "./dist/retrospective-transcript/index.mjs"
42
+ },
38
43
  "./sql-ast": {
39
44
  "types": "./dist/sql-ast/index.d.mts",
40
45
  "import": "./dist/sql-ast/index.mjs",
@@ -90,6 +95,11 @@
90
95
  "import": "./dist/process-line-buffer/index.mjs",
91
96
  "default": "./dist/process-line-buffer/index.mjs"
92
97
  },
98
+ "./browser-session-runner": {
99
+ "types": "./dist/browser-session-runner/index.d.mts",
100
+ "import": "./dist/browser-session-runner/index.mjs",
101
+ "default": "./dist/browser-session-runner/index.mjs"
102
+ },
93
103
  "./pg-schema-snapshot": {
94
104
  "types": "./dist/pg-schema-snapshot/index.d.mts",
95
105
  "import": "./dist/pg-schema-snapshot/index.mjs",
@@ -195,6 +205,11 @@
195
205
  "import": "./dist/swift-resolved-pin-delta/index.mjs",
196
206
  "default": "./dist/swift-resolved-pin-delta/index.mjs"
197
207
  },
208
+ "./vitest-diagnostics": {
209
+ "types": "./dist/vitest-diagnostics/index.d.mts",
210
+ "import": "./dist/vitest-diagnostics/index.mjs",
211
+ "default": "./dist/vitest-diagnostics/index.mjs"
212
+ },
198
213
  "./package.json": "./package.json"
199
214
  },
200
215
  "publishConfig": {