@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.
- package/dist/command-resolver.d.ts +17 -0
- package/dist/command-resolver.d.ts.map +1 -0
- package/dist/command-resolver.js +80 -0
- package/dist/command-resolver.js.map +1 -0
- package/dist/error-tracking.d.ts +103 -0
- package/dist/error-tracking.d.ts.map +1 -0
- package/dist/error-tracking.js +149 -0
- package/dist/error-tracking.js.map +1 -0
- package/dist/git-remote.d.ts +47 -0
- package/dist/git-remote.d.ts.map +1 -0
- package/dist/git-remote.js +125 -0
- package/dist/git-remote.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +40 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +84 -0
- package/dist/logger.js.map +1 -0
- package/dist/model-mapping.d.ts +28 -0
- package/dist/model-mapping.d.ts.map +1 -0
- package/dist/model-mapping.js +55 -0
- package/dist/model-mapping.js.map +1 -0
- package/dist/name-generator.d.ts +17 -0
- package/dist/name-generator.d.ts.map +1 -0
- package/dist/name-generator.js +52 -0
- package/dist/name-generator.js.map +1 -0
- package/dist/precompiled-patterns.d.ts +110 -0
- package/dist/precompiled-patterns.d.ts.map +1 -0
- package/dist/precompiled-patterns.js +322 -0
- package/dist/precompiled-patterns.js.map +1 -0
- package/dist/update-checker.d.ts +26 -0
- package/dist/update-checker.d.ts.map +1 -0
- package/dist/update-checker.js +174 -0
- package/dist/update-checker.js.map +1 -0
- package/package.json +75 -0
|
@@ -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
|
+
}
|