@agent-relay/utils 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.
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Precompiled Pattern Matching
3
+ *
4
+ * Optimized regex patterns for high-performance message parsing.
5
+ * Inspired by russian-code-ts performance targets (<1ms for pattern matching).
6
+ *
7
+ * Strategies:
8
+ * 1. Precompile patterns at module load (not per-instance)
9
+ * 2. Combine multiple patterns into single regex where possible
10
+ * 3. Use non-capturing groups and atomic patterns
11
+ * 4. Cache compiled patterns by prefix
12
+ */
13
+ const patternCache = new Map();
14
+ /**
15
+ * Escape special regex characters in a string
16
+ */
17
+ function escapeRegex(str) {
18
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
19
+ }
20
+ /**
21
+ * Get or create compiled patterns for a given prefix configuration.
22
+ * Patterns are cached for reuse across parser instances.
23
+ */
24
+ export function getCompiledPatterns(prefix = '->relay:', thinkingPrefix = '->thinking:') {
25
+ const cacheKey = `${prefix}|${thinkingPrefix}`;
26
+ const cached = patternCache.get(cacheKey);
27
+ if (cached) {
28
+ return cached;
29
+ }
30
+ const escapedPrefix = escapeRegex(prefix);
31
+ const escapedThinking = escapeRegex(thinkingPrefix);
32
+ // Combined prompt character class for line start
33
+ // Includes: >, $, %, #, →, ➜, ›, », bullets (●•◦‣⁃-*⏺◆◇○□■), box chars (│┃┆┇┊┋╎╏), sparkle (✦)
34
+ const promptChars = String.raw `[>$%#→➜›»●•◦‣⁃\-*⏺◆◇○□■│┃┆┇┊┋╎╏✦]`;
35
+ const lineStartPrefix = String.raw `^(?:\s*(?:${promptChars}\s*)*)?`;
36
+ // Thread syntax: [thread:id] or [thread:project:id]
37
+ const threadSyntax = String.raw `(?:\s+\[thread:(?:([\w-]+):)?([\w-]+)\])?`;
38
+ const patterns = {
39
+ // Combined inline pattern for both relay and thinking prefixes
40
+ // Groups: 1=prefix type (relay/thinking), 2=target, 3=thread project, 4=thread id, 5=body
41
+ inline: new RegExp(`${lineStartPrefix}(${escapedPrefix}|${escapedThinking})(\\S+)${threadSyntax}\\s+(.+)$`),
42
+ // Combined fenced inline pattern: ->relay:Target <<<
43
+ // Groups: 1=prefix type, 2=target, 3=thread project, 4=thread id
44
+ fencedInline: new RegExp(`${lineStartPrefix}(${escapedPrefix}|${escapedThinking})(\\S+)${threadSyntax}\\s+<<<\\s*$`),
45
+ // Escape pattern for \->relay: or \->thinking:
46
+ escape: new RegExp(`^(\\s*)\\\\(${escapedPrefix}|${escapedThinking})`),
47
+ };
48
+ patternCache.set(cacheKey, patterns);
49
+ return patterns;
50
+ }
51
+ // =============================================================================
52
+ // Combined Instructional Markers (Single Regex)
53
+ // =============================================================================
54
+ /**
55
+ * Combined instructional markers pattern.
56
+ * Instead of testing each pattern separately, we combine into one regex.
57
+ *
58
+ * Original patterns:
59
+ * - /\bSEND:\s*$/i
60
+ * - /\bPROTOCOL:\s*\(\d+\)/i
61
+ * - /\bExample:/i
62
+ * - /\\->relay:/
63
+ * - /\\->thinking:/
64
+ * - /^AgentName\s+/
65
+ * - /^Target\s+/
66
+ * - /\[Agent Relay\]/
67
+ * - /MULTI-LINE:/i
68
+ * - /RECEIVE:/i
69
+ */
70
+ const INSTRUCTIONAL_COMBINED = new RegExp([
71
+ String.raw `\bSEND:\s*$`, // "SEND:" at end (instruction prefix)
72
+ String.raw `\bPROTOCOL:\s*\(\d+\)`, // "PROTOCOL: (1)" - numbered instructions
73
+ String.raw `\bExample:`, // "Example:" marker
74
+ String.raw `\\->relay:`, // Escaped relay prefix (documentation)
75
+ String.raw `\\->thinking:`, // Escaped thinking prefix (documentation)
76
+ String.raw `^AgentName\s+`, // Body starting with "AgentName"
77
+ String.raw `^Target\s+`, // Body starting with "Target"
78
+ String.raw `\[Agent Relay\]`, // Injected instruction header
79
+ String.raw `MULTI-LINE:`, // Multi-line format instruction
80
+ String.raw `RECEIVE:`, // Receive instruction marker
81
+ ].join('|'), 'i' // Case insensitive
82
+ );
83
+ /**
84
+ * Fast check if text matches any instructional pattern.
85
+ * Single regex test instead of array.some().
86
+ */
87
+ export function isInstructionalTextFast(body) {
88
+ return INSTRUCTIONAL_COMBINED.test(body);
89
+ }
90
+ // =============================================================================
91
+ // Placeholder Targets (Set for O(1) Lookup)
92
+ // =============================================================================
93
+ /**
94
+ * Placeholder target names - precomputed lowercase set for fast lookup.
95
+ */
96
+ const PLACEHOLDER_TARGETS_SET = new Set([
97
+ 'agentname',
98
+ 'target',
99
+ 'recipient',
100
+ 'yourtarget',
101
+ 'targetagent',
102
+ 'someagent',
103
+ 'otheragent',
104
+ 'worker',
105
+ ]);
106
+ /**
107
+ * Fast placeholder target check using Set.
108
+ */
109
+ export function isPlaceholderTargetFast(target) {
110
+ return PLACEHOLDER_TARGETS_SET.has(target.toLowerCase());
111
+ }
112
+ // =============================================================================
113
+ // ANSI Stripping (Precompiled)
114
+ // =============================================================================
115
+ /**
116
+ * Precompiled ANSI escape sequence pattern.
117
+ * Global flag for replace operations.
118
+ */
119
+ // eslint-disable-next-line no-control-regex
120
+ const ANSI_PATTERN_COMPILED = /\x1b\[[0-9;?]*[a-zA-Z]|\x1b\].*?(?:\x07|\x1b\\)|\r/g;
121
+ /**
122
+ * Precompiled orphaned CSI pattern.
123
+ */
124
+ const ORPHANED_CSI_COMPILED = /^\s*(\[(?:\?|\d)\d*[A-Za-z])+\s*/g;
125
+ /**
126
+ * Strip ANSI escape codes from a string.
127
+ * Uses precompiled patterns for better performance.
128
+ */
129
+ export function stripAnsiFast(str) {
130
+ // Reset lastIndex for global patterns
131
+ ANSI_PATTERN_COMPILED.lastIndex = 0;
132
+ ORPHANED_CSI_COMPILED.lastIndex = 0;
133
+ let result = str.replace(ANSI_PATTERN_COMPILED, '');
134
+ result = result.replace(ORPHANED_CSI_COMPILED, '');
135
+ return result;
136
+ }
137
+ // =============================================================================
138
+ // Static Patterns (Precompiled)
139
+ // =============================================================================
140
+ /**
141
+ * Precompiled static patterns used across parsing operations.
142
+ */
143
+ export const StaticPatterns = {
144
+ // Block markers
145
+ BLOCK_END: /\[\[\/RELAY\]\]/,
146
+ BLOCK_METADATA_END: /\[\[\/RELAY_METADATA\]\]/,
147
+ CODE_FENCE: /^```/,
148
+ // Fence markers
149
+ FENCE_END_START: /^(?:\s*)?>>>/,
150
+ FENCE_END_LINE: />>>\s*$/,
151
+ FENCE_END: /^(?:\s*)?>>>|>>>\s*$/,
152
+ // Escape patterns
153
+ ESCAPED_FENCE_START: /\\<<</g,
154
+ ESCAPED_FENCE_END: /\\>>>/g,
155
+ ESCAPED_FENCE_END_CHECK: /\\>>>\s*$/,
156
+ ESCAPED_FENCE_START_CHECK: /^(?:\s*)?\\>>>/,
157
+ // Continuation helpers
158
+ BULLET_OR_NUMBERED_LIST: /^[ \t]*([\-*•◦‣⏺◆◇○□■]|[0-9]+[.)])\s+/,
159
+ PROMPTISH_LINE: /^[\s]*[>$%#➜›»][\s]*$/,
160
+ RELAY_INJECTION_PREFIX: /^\s*Relay message from /,
161
+ // Spawn/release commands
162
+ SPAWN_COMMAND: /->relay:spawn\s+\S+/i,
163
+ RELEASE_COMMAND: /->relay:release\s+\S+/i,
164
+ // Claude extended thinking blocks
165
+ THINKING_START: /<thinking>/,
166
+ THINKING_END: /<\/thinking>/,
167
+ // Agent name validation (PascalCase, 2-30 chars)
168
+ AGENT_NAME: /^[A-Z][a-zA-Z0-9]{1,29}$/,
169
+ // CLI prompt patterns by type
170
+ CLI_PROMPTS: {
171
+ claude: /^[>›»]\s*$/,
172
+ gemini: /^[>›»]\s*$/,
173
+ codex: /^[>›»]\s*$/,
174
+ droid: /^[>›»]\s*$/,
175
+ opencode: /^[>›»]\s*$/,
176
+ spawned: /^[>›»]\s*$/,
177
+ other: /^[>$%#➜›»]\s*$/,
178
+ },
179
+ };
180
+ // =============================================================================
181
+ // Pattern Matching Utilities
182
+ // =============================================================================
183
+ /**
184
+ * Check if line is a spawn or release command.
185
+ */
186
+ export function isSpawnOrReleaseCommandFast(line) {
187
+ return StaticPatterns.SPAWN_COMMAND.test(line) ||
188
+ StaticPatterns.RELEASE_COMMAND.test(line);
189
+ }
190
+ /**
191
+ * Check if a line contains an escaped fence end.
192
+ */
193
+ export function isEscapedFenceEndFast(line) {
194
+ return StaticPatterns.ESCAPED_FENCE_END_CHECK.test(line) ||
195
+ StaticPatterns.ESCAPED_FENCE_START_CHECK.test(line);
196
+ }
197
+ /**
198
+ * Unescape fence markers in content.
199
+ */
200
+ export function unescapeFenceMarkersFast(content) {
201
+ StaticPatterns.ESCAPED_FENCE_START.lastIndex = 0;
202
+ StaticPatterns.ESCAPED_FENCE_END.lastIndex = 0;
203
+ return content
204
+ .replace(StaticPatterns.ESCAPED_FENCE_START, '<<<')
205
+ .replace(StaticPatterns.ESCAPED_FENCE_END, '>>>');
206
+ }
207
+ const metrics = new Map();
208
+ /**
209
+ * Track pattern matching performance (for debugging/profiling).
210
+ * Call with pattern name and execution time.
211
+ */
212
+ export function trackPatternPerformance(name, ms) {
213
+ const existing = metrics.get(name);
214
+ if (existing) {
215
+ existing.calls++;
216
+ existing.totalMs += ms;
217
+ existing.maxMs = Math.max(existing.maxMs, ms);
218
+ }
219
+ else {
220
+ metrics.set(name, { calls: 1, totalMs: ms, maxMs: ms });
221
+ }
222
+ }
223
+ /**
224
+ * Get pattern performance metrics.
225
+ */
226
+ export function getPatternMetrics() {
227
+ const result = new Map();
228
+ for (const [name, m] of metrics) {
229
+ result.set(name, {
230
+ ...m,
231
+ avgMs: m.calls > 0 ? m.totalMs / m.calls : 0,
232
+ });
233
+ }
234
+ return result;
235
+ }
236
+ /**
237
+ * Reset pattern performance metrics.
238
+ */
239
+ export function resetPatternMetrics() {
240
+ metrics.clear();
241
+ }
242
+ // =============================================================================
243
+ // Benchmark Utility
244
+ // =============================================================================
245
+ /**
246
+ * Benchmark pattern matching performance.
247
+ * Useful for testing optimization impact.
248
+ */
249
+ export function benchmarkPatterns(iterations = 10000) {
250
+ const testStrings = [
251
+ '->relay:Agent Hello world',
252
+ '->relay:Lead [thread:task-123] Starting work',
253
+ ' > ->relay:Worker <<<',
254
+ 'Some random text without relay',
255
+ '\x1b[32m->relay:Test\x1b[0m message with ANSI',
256
+ '->relay:spawn Worker claude "task"',
257
+ 'ACK: Task received',
258
+ 'SEND: Protocol instruction',
259
+ 'Example: how to use relay',
260
+ ];
261
+ const results = {};
262
+ // Benchmark combined instructional check
263
+ {
264
+ let maxNs = 0;
265
+ const start = process.hrtime.bigint();
266
+ for (let i = 0; i < iterations; i++) {
267
+ for (const str of testStrings) {
268
+ const s = process.hrtime.bigint();
269
+ isInstructionalTextFast(str);
270
+ const elapsed = Number(process.hrtime.bigint() - s);
271
+ if (elapsed > maxNs)
272
+ maxNs = elapsed;
273
+ }
274
+ }
275
+ const totalNs = Number(process.hrtime.bigint() - start);
276
+ results['instructionalCheck'] = {
277
+ avgNs: totalNs / (iterations * testStrings.length),
278
+ maxNs,
279
+ };
280
+ }
281
+ // Benchmark ANSI stripping
282
+ {
283
+ let maxNs = 0;
284
+ const start = process.hrtime.bigint();
285
+ for (let i = 0; i < iterations; i++) {
286
+ for (const str of testStrings) {
287
+ const s = process.hrtime.bigint();
288
+ stripAnsiFast(str);
289
+ const elapsed = Number(process.hrtime.bigint() - s);
290
+ if (elapsed > maxNs)
291
+ maxNs = elapsed;
292
+ }
293
+ }
294
+ const totalNs = Number(process.hrtime.bigint() - start);
295
+ results['ansiStrip'] = {
296
+ avgNs: totalNs / (iterations * testStrings.length),
297
+ maxNs,
298
+ };
299
+ }
300
+ // Benchmark placeholder check
301
+ {
302
+ const targets = ['AgentName', 'Lead', 'Worker', 'target', 'Developer'];
303
+ let maxNs = 0;
304
+ const start = process.hrtime.bigint();
305
+ for (let i = 0; i < iterations; i++) {
306
+ for (const t of targets) {
307
+ const s = process.hrtime.bigint();
308
+ isPlaceholderTargetFast(t);
309
+ const elapsed = Number(process.hrtime.bigint() - s);
310
+ if (elapsed > maxNs)
311
+ maxNs = elapsed;
312
+ }
313
+ }
314
+ const totalNs = Number(process.hrtime.bigint() - start);
315
+ results['placeholderCheck'] = {
316
+ avgNs: totalNs / (iterations * targets.length),
317
+ maxNs,
318
+ };
319
+ }
320
+ return results;
321
+ }
322
+ //# sourceMappingURL=precompiled-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precompiled-patterns.js","sourceRoot":"","sources":["../src/precompiled-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Auto-update checker for agent-relay
3
+ *
4
+ * Checks npm registry for newer versions and notifies users.
5
+ * Caches results to avoid excessive API calls (checks at most once per hour).
6
+ */
7
+ export interface UpdateInfo {
8
+ updateAvailable: boolean;
9
+ currentVersion: string;
10
+ latestVersion: string | null;
11
+ error?: string;
12
+ }
13
+ /**
14
+ * Check for updates (uses cache to avoid excessive API calls)
15
+ */
16
+ export declare function checkForUpdates(currentVersion: string): Promise<UpdateInfo>;
17
+ /**
18
+ * Print update notification to stderr (non-blocking)
19
+ */
20
+ export declare function printUpdateNotification(info: UpdateInfo): void;
21
+ /**
22
+ * Check for updates in the background and print notification if available.
23
+ * This is non-blocking and errors are silently ignored.
24
+ */
25
+ export declare function checkForUpdatesInBackground(currentVersion: string): void;
26
+ //# sourceMappingURL=update-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoGH,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAiDjF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAmB9D;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAWxE"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Auto-update checker for agent-relay
3
+ *
4
+ * Checks npm registry for newer versions and notifies users.
5
+ * Caches results to avoid excessive API calls (checks at most once per hour).
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import https from 'node:https';
10
+ import os from 'node:os';
11
+ import { compare } from 'compare-versions';
12
+ const PACKAGE_NAME = 'agent-relay';
13
+ const CHECK_INTERVAL_MS = 60 * 60 * 1000; // 1 hour
14
+ const NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
15
+ function getCachePath() {
16
+ const cacheDir = path.join(os.homedir(), '.agent-relay');
17
+ return path.join(cacheDir, 'update-cache.json');
18
+ }
19
+ function readCache() {
20
+ try {
21
+ const cachePath = getCachePath();
22
+ if (!fs.existsSync(cachePath))
23
+ return null;
24
+ const data = fs.readFileSync(cachePath, 'utf-8');
25
+ return JSON.parse(data);
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ function writeCache(cache) {
32
+ try {
33
+ const cachePath = getCachePath();
34
+ const cacheDir = path.dirname(cachePath);
35
+ if (!fs.existsSync(cacheDir)) {
36
+ fs.mkdirSync(cacheDir, { recursive: true });
37
+ }
38
+ fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2));
39
+ }
40
+ catch {
41
+ // Silently ignore cache write errors
42
+ }
43
+ }
44
+ function fetchLatestVersion() {
45
+ return new Promise((resolve, reject) => {
46
+ const req = https.get(NPM_REGISTRY_URL, { timeout: 5000 }, (res) => {
47
+ if (res.statusCode === 301 || res.statusCode === 302) {
48
+ // Follow redirect
49
+ const location = res.headers.location;
50
+ if (location) {
51
+ https.get(location, { timeout: 5000 }, (redirectRes) => {
52
+ handleResponse(redirectRes, resolve, reject);
53
+ }).on('error', reject);
54
+ return;
55
+ }
56
+ }
57
+ handleResponse(res, resolve, reject);
58
+ });
59
+ req.on('error', reject);
60
+ req.on('timeout', () => {
61
+ req.destroy();
62
+ reject(new Error('Request timed out'));
63
+ });
64
+ });
65
+ }
66
+ function handleResponse(res, resolve, reject) {
67
+ if (res.statusCode !== 200) {
68
+ reject(new Error(`HTTP ${res.statusCode}`));
69
+ return;
70
+ }
71
+ let data = '';
72
+ res.on('data', (chunk) => { data += chunk.toString(); });
73
+ res.on('end', () => {
74
+ try {
75
+ const json = JSON.parse(data);
76
+ if (json.version) {
77
+ resolve(json.version);
78
+ }
79
+ else {
80
+ reject(new Error('No version in response'));
81
+ }
82
+ }
83
+ catch (err) {
84
+ reject(err);
85
+ }
86
+ });
87
+ res.on('error', reject);
88
+ }
89
+ /**
90
+ * Check for updates (uses cache to avoid excessive API calls)
91
+ */
92
+ export async function checkForUpdates(currentVersion) {
93
+ const cache = readCache();
94
+ const now = Date.now();
95
+ // Return cached result if still valid
96
+ if (cache && (now - cache.lastCheck) < CHECK_INTERVAL_MS) {
97
+ const updateAvailable = cache.latestVersion
98
+ ? compare(cache.latestVersion, currentVersion, '>')
99
+ : false;
100
+ return {
101
+ updateAvailable,
102
+ currentVersion,
103
+ latestVersion: cache.latestVersion,
104
+ error: cache.error,
105
+ };
106
+ }
107
+ // Fetch latest version from npm
108
+ try {
109
+ const latestVersion = await fetchLatestVersion();
110
+ const updateAvailable = compare(latestVersion, currentVersion, '>');
111
+ writeCache({
112
+ lastCheck: now,
113
+ latestVersion,
114
+ });
115
+ return {
116
+ updateAvailable,
117
+ currentVersion,
118
+ latestVersion,
119
+ };
120
+ }
121
+ catch (err) {
122
+ const error = err.message;
123
+ // Cache the error to avoid repeated failed requests
124
+ writeCache({
125
+ lastCheck: now,
126
+ latestVersion: cache?.latestVersion || null,
127
+ error,
128
+ });
129
+ return {
130
+ updateAvailable: false,
131
+ currentVersion,
132
+ latestVersion: cache?.latestVersion || null,
133
+ error,
134
+ };
135
+ }
136
+ }
137
+ /**
138
+ * Print update notification to stderr (non-blocking)
139
+ */
140
+ export function printUpdateNotification(info) {
141
+ if (!info.updateAvailable || !info.latestVersion)
142
+ return;
143
+ const line1 = `Update available: ${info.currentVersion} → ${info.latestVersion}`;
144
+ const line2 = 'Run: npm install -g agent-relay';
145
+ const contentWidth = Math.max(line1.length, line2.length);
146
+ const boxWidth = contentWidth + 4; // 2 chars padding each side
147
+ const top = '╭' + '─'.repeat(boxWidth) + '╮';
148
+ const bottom = '╰' + '─'.repeat(boxWidth) + '╯';
149
+ const row1 = '│ ' + line1.padEnd(contentWidth) + ' │';
150
+ const row2 = '│ ' + line2.padEnd(contentWidth) + ' │';
151
+ console.error('');
152
+ console.error(top);
153
+ console.error(row1);
154
+ console.error(row2);
155
+ console.error(bottom);
156
+ console.error('');
157
+ }
158
+ /**
159
+ * Check for updates in the background and print notification if available.
160
+ * This is non-blocking and errors are silently ignored.
161
+ */
162
+ export function checkForUpdatesInBackground(currentVersion) {
163
+ // Run async check without awaiting
164
+ checkForUpdates(currentVersion)
165
+ .then(info => {
166
+ if (info.updateAvailable) {
167
+ printUpdateNotification(info);
168
+ }
169
+ })
170
+ .catch(() => {
171
+ // Silently ignore errors
172
+ });
173
+ }
174
+ //# sourceMappingURL=update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@agent-relay/utils",
3
+ "version": "0.1.0",
4
+ "description": "Shared utilities for agent-relay: logging, name generation, command resolution, update checking",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./logger": {
14
+ "types": "./dist/logger.d.ts",
15
+ "import": "./dist/logger.js",
16
+ "default": "./dist/logger.js"
17
+ },
18
+ "./name-generator": {
19
+ "types": "./dist/name-generator.d.ts",
20
+ "import": "./dist/name-generator.js",
21
+ "default": "./dist/name-generator.js"
22
+ },
23
+ "./command-resolver": {
24
+ "types": "./dist/command-resolver.d.ts",
25
+ "import": "./dist/command-resolver.js",
26
+ "default": "./dist/command-resolver.js"
27
+ },
28
+ "./update-checker": {
29
+ "types": "./dist/update-checker.d.ts",
30
+ "import": "./dist/update-checker.js",
31
+ "default": "./dist/update-checker.js"
32
+ },
33
+ "./git-remote": {
34
+ "types": "./dist/git-remote.d.ts",
35
+ "import": "./dist/git-remote.js",
36
+ "default": "./dist/git-remote.js"
37
+ },
38
+ "./precompiled-patterns": {
39
+ "types": "./dist/precompiled-patterns.d.ts",
40
+ "import": "./dist/precompiled-patterns.js",
41
+ "default": "./dist/precompiled-patterns.js"
42
+ },
43
+ "./error-tracking": {
44
+ "types": "./dist/error-tracking.d.ts",
45
+ "import": "./dist/error-tracking.js",
46
+ "default": "./dist/error-tracking.js"
47
+ },
48
+ "./model-mapping": {
49
+ "types": "./dist/model-mapping.d.ts",
50
+ "import": "./dist/model-mapping.js",
51
+ "default": "./dist/model-mapping.js"
52
+ }
53
+ },
54
+ "files": [
55
+ "dist",
56
+ "README.md"
57
+ ],
58
+ "scripts": {
59
+ "build": "tsc",
60
+ "clean": "rm -rf dist",
61
+ "test": "vitest run",
62
+ "test:watch": "vitest"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^22.19.3",
66
+ "typescript": "^5.9.3",
67
+ "vitest": "^3.2.4"
68
+ },
69
+ "dependencies": {
70
+ "compare-versions": "^6.1.1"
71
+ },
72
+ "publishConfig": {
73
+ "access": "public"
74
+ }
75
+ }