@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/logger.js ADDED
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Lightweight DIY Logger for Agent Relay
3
+ *
4
+ * Minimal logging utility (~50 lines) with:
5
+ * - JSON output for easy parsing with jq
6
+ * - Configurable via environment variables
7
+ * - Debug-only verbose logging
8
+ * - No external dependencies
9
+ */
10
+ import fs from 'node:fs';
11
+ import path from 'node:path';
12
+ // Configuration from environment
13
+ const LOG_FILE = process.env.AGENT_RELAY_LOG_FILE;
14
+ const LOG_LEVEL = (process.env.AGENT_RELAY_LOG_LEVEL ?? 'INFO').toUpperCase();
15
+ const LOG_JSON = process.env.AGENT_RELAY_LOG_JSON === '1';
16
+ const _DEBUG = process.env.DEBUG === '1' || LOG_LEVEL === 'DEBUG';
17
+ const LEVEL_PRIORITY = {
18
+ DEBUG: 0,
19
+ INFO: 1,
20
+ WARN: 2,
21
+ ERROR: 3,
22
+ };
23
+ // Ensure log directory exists if file logging enabled
24
+ if (LOG_FILE) {
25
+ const logDir = path.dirname(LOG_FILE);
26
+ if (!fs.existsSync(logDir)) {
27
+ fs.mkdirSync(logDir, { recursive: true });
28
+ }
29
+ }
30
+ function shouldLog(level) {
31
+ return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[LOG_LEVEL];
32
+ }
33
+ function formatMessage(entry) {
34
+ if (LOG_JSON) {
35
+ return JSON.stringify(entry);
36
+ }
37
+ const { ts, level, component, msg, ...extra } = entry;
38
+ const extraStr = Object.keys(extra).length > 0
39
+ ? ' ' + Object.entries(extra).map(([k, v]) => `${k}=${v}`).join(' ')
40
+ : '';
41
+ return `${ts} [${level}] [${component}] ${msg}${extraStr}`;
42
+ }
43
+ function log(level, component, msg, extra) {
44
+ if (!shouldLog(level))
45
+ return;
46
+ const entry = {
47
+ ts: new Date().toISOString(),
48
+ level,
49
+ component,
50
+ msg,
51
+ ...extra,
52
+ };
53
+ const formatted = formatMessage(entry);
54
+ // Write to file if configured
55
+ if (LOG_FILE) {
56
+ fs.appendFileSync(LOG_FILE, formatted + '\n');
57
+ }
58
+ // Write to console (stderr for WARN/ERROR)
59
+ if (level === 'ERROR' || level === 'WARN') {
60
+ console.error(formatted);
61
+ }
62
+ else {
63
+ console.log(formatted);
64
+ }
65
+ }
66
+ /**
67
+ * Create a logger for a specific component.
68
+ * @param component - Component name (e.g., 'daemon', 'router', 'connection')
69
+ */
70
+ export function createLogger(component) {
71
+ return {
72
+ debug: (msg, extra) => log('DEBUG', component, msg, extra),
73
+ info: (msg, extra) => log('INFO', component, msg, extra),
74
+ warn: (msg, extra) => log('WARN', component, msg, extra),
75
+ error: (msg, extra) => log('ERROR', component, msg, extra),
76
+ };
77
+ }
78
+ // Pre-created loggers for common components
79
+ export const daemonLog = createLogger('daemon');
80
+ export const routerLog = createLogger('router');
81
+ export const connectionLog = createLogger('connection');
82
+ // Default export for simple usage
83
+ export default createLogger;
84
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAY7B,iCAAiC;AACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAClD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,MAAM,CAAC,CAAC,WAAW,EAAc,CAAC;AAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,CAAC;AAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,SAAS,KAAK,OAAO,CAAC;AAElE,MAAM,cAAc,GAA6B;IAC/C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,sDAAsD;AACtD,IAAI,QAAQ,EAAE,CAAC;IACb,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,aAAa,CAAC,KAAe;IACpC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;QAC5C,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACpE,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,GAAG,EAAE,KAAK,KAAK,MAAM,SAAS,KAAK,GAAG,GAAG,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,GAAG,CAAC,KAAe,EAAE,SAAiB,EAAE,GAAW,EAAE,KAA+B;IAC3F,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,KAAK,GAAa;QACtB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK;QACL,SAAS;QACT,GAAG;QACH,GAAG,KAAK;KACT,CAAC;IAEF,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEvC,8BAA8B;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACb,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,2CAA2C;IAC3C,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO;QACL,KAAK,EAAE,CAAC,GAAW,EAAE,KAA+B,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC;QAC5F,IAAI,EAAE,CAAC,GAAW,EAAE,KAA+B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC;QAC1F,IAAI,EAAE,CAAC,GAAW,EAAE,KAA+B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC;QAC1F,KAAK,EAAE,CAAC,GAAW,EAAE,KAA+B,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC;KAC7F,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAExD,kCAAkC;AAClC,eAAe,YAAY,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Model Mapping
3
+ *
4
+ * Maps agent profile model identifiers to CLI variants.
5
+ * Used for cost tracking and model selection when spawning agents.
6
+ */
7
+ /**
8
+ * Convert a model identifier into the CLI command variant.
9
+ * Defaults to 'claude:sonnet' when no match is found.
10
+ *
11
+ * @param model - Model identifier from agent profile (e.g., 'claude-opus-4', 'sonnet')
12
+ * @returns CLI command variant (e.g., 'claude:opus', 'claude:sonnet')
13
+ *
14
+ * @example
15
+ * mapModelToCli('claude-opus-4') // Returns 'claude:opus'
16
+ * mapModelToCli('sonnet') // Returns 'claude:sonnet'
17
+ * mapModelToCli('gpt-4o') // Returns 'codex'
18
+ * mapModelToCli(undefined) // Returns 'claude:sonnet'
19
+ */
20
+ export declare function mapModelToCli(model?: string): string;
21
+ /**
22
+ * Extract the base CLI name from a model-mapped CLI variant.
23
+ *
24
+ * @param cliVariant - CLI variant (e.g., 'claude:opus', 'claude', 'codex')
25
+ * @returns Base CLI name (e.g., 'claude', 'codex')
26
+ */
27
+ export declare function getBaseCli(cliVariant: string): string;
28
+ //# sourceMappingURL=model-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-mapping.d.ts","sourceRoot":"","sources":["../src/model-mapping.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Model Mapping
3
+ *
4
+ * Maps agent profile model identifiers to CLI variants.
5
+ * Used for cost tracking and model selection when spawning agents.
6
+ */
7
+ /**
8
+ * Mapping from model identifiers to CLI command variants.
9
+ * Keys are normalized model names, values are CLI command variants.
10
+ */
11
+ const MODEL_TO_CLI = {
12
+ // Claude models
13
+ 'claude-sonnet-4': 'claude:sonnet',
14
+ 'claude-opus-4': 'claude:opus',
15
+ 'claude-opus-4.5': 'claude:opus',
16
+ 'sonnet': 'claude:sonnet',
17
+ 'opus': 'claude:opus',
18
+ 'haiku': 'claude:haiku',
19
+ // Codex (OpenAI)
20
+ 'codex': 'codex',
21
+ 'gpt-4o': 'codex',
22
+ // Gemini (Google)
23
+ 'gemini': 'gemini',
24
+ 'gemini-2.0-flash': 'gemini',
25
+ };
26
+ /**
27
+ * Convert a model identifier into the CLI command variant.
28
+ * Defaults to 'claude:sonnet' when no match is found.
29
+ *
30
+ * @param model - Model identifier from agent profile (e.g., 'claude-opus-4', 'sonnet')
31
+ * @returns CLI command variant (e.g., 'claude:opus', 'claude:sonnet')
32
+ *
33
+ * @example
34
+ * mapModelToCli('claude-opus-4') // Returns 'claude:opus'
35
+ * mapModelToCli('sonnet') // Returns 'claude:sonnet'
36
+ * mapModelToCli('gpt-4o') // Returns 'codex'
37
+ * mapModelToCli(undefined) // Returns 'claude:sonnet'
38
+ */
39
+ export function mapModelToCli(model) {
40
+ if (!model) {
41
+ return 'claude:sonnet';
42
+ }
43
+ const normalized = model.trim().toLowerCase();
44
+ return MODEL_TO_CLI[normalized] ?? 'claude:sonnet';
45
+ }
46
+ /**
47
+ * Extract the base CLI name from a model-mapped CLI variant.
48
+ *
49
+ * @param cliVariant - CLI variant (e.g., 'claude:opus', 'claude', 'codex')
50
+ * @returns Base CLI name (e.g., 'claude', 'codex')
51
+ */
52
+ export function getBaseCli(cliVariant) {
53
+ return cliVariant.split(':')[0];
54
+ }
55
+ //# sourceMappingURL=model-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-mapping.js","sourceRoot":"","sources":["../src/model-mapping.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,YAAY,GAA2B;IAC3C,gBAAgB;IAChB,iBAAiB,EAAE,eAAe;IAClC,eAAe,EAAE,aAAa;IAC9B,iBAAiB,EAAE,aAAa;IAChC,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,cAAc;IACvB,iBAAiB;IACjB,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,OAAO;IACjB,kBAAkB;IAClB,QAAQ,EAAE,QAAQ;IAClB,kBAAkB,EAAE,QAAQ;CAC7B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,OAAO,YAAY,CAAC,UAAU,CAAC,IAAI,eAAe,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,UAAkB;IAC3C,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Auto-generate memorable agent names using adjective+noun combinations.
3
+ * Inspired by mcp_agent_mail's approach.
4
+ */
5
+ /**
6
+ * Generate a random agent name (AdjectiveNoun format).
7
+ */
8
+ export declare function generateAgentName(): string;
9
+ /**
10
+ * Generate a unique agent name, checking against existing names.
11
+ */
12
+ export declare function generateUniqueAgentName(existingNames: Set<string>, maxAttempts?: number): string;
13
+ /**
14
+ * Validate an agent name (must be alphanumeric, 2-32 chars).
15
+ */
16
+ export declare function isValidAgentName(name: string): boolean;
17
+ //# sourceMappingURL=name-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name-generator.d.ts","sourceRoot":"","sources":["../src/name-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,SAAM,GAAG,MAAM,CAS7F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Auto-generate memorable agent names using adjective+noun combinations.
3
+ * Inspired by mcp_agent_mail's approach.
4
+ */
5
+ const ADJECTIVES = [
6
+ 'Blue', 'Green', 'Red', 'Purple', 'Golden', 'Silver', 'Crystal', 'Amber',
7
+ 'Coral', 'Jade', 'Ruby', 'Sapphire', 'Emerald', 'Onyx', 'Pearl', 'Copper',
8
+ 'Bronze', 'Iron', 'Steel', 'Velvet', 'Silk', 'Cotton', 'Linen', 'Marble',
9
+ 'Granite', 'Cobalt', 'Crimson', 'Azure', 'Indigo', 'Scarlet', 'Violet',
10
+ 'Olive', 'Teal', 'Cyan', 'Magenta', 'Ochre', 'Rustic', 'Misty', 'Stormy',
11
+ 'Sunny', 'Frosty', 'Dusty', 'Mossy', 'Rocky', 'Sandy', 'Snowy', 'Windy',
12
+ 'Swift', 'Calm', 'Bold', 'Brave', 'Clever', 'Eager', 'Gentle', 'Happy',
13
+ 'Jolly', 'Kind', 'Lively', 'Merry', 'Noble', 'Proud', 'Quick', 'Quiet',
14
+ ];
15
+ const NOUNS = [
16
+ 'Mountain', 'River', 'Forest', 'Ocean', 'Valley', 'Canyon', 'Desert', 'Island',
17
+ 'Lake', 'Meadow', 'Prairie', 'Glacier', 'Volcano', 'Waterfall', 'Creek', 'Pond',
18
+ 'Hill', 'Peak', 'Ridge', 'Cliff', 'Cave', 'Reef', 'Marsh', 'Grove',
19
+ 'Fox', 'Wolf', 'Bear', 'Eagle', 'Hawk', 'Owl', 'Deer', 'Elk',
20
+ 'Falcon', 'Raven', 'Swan', 'Crane', 'Heron', 'Otter', 'Beaver', 'Badger',
21
+ 'Castle', 'Tower', 'Bridge', 'Harbor', 'Haven', 'Shelter', 'Beacon', 'Anchor',
22
+ 'Stone', 'Pebble', 'Boulder', 'Crystal', 'Gem', 'Prism', 'Spark', 'Ember',
23
+ 'Star', 'Moon', 'Sun', 'Comet', 'Cloud', 'Storm', 'Thunder', 'Lightning',
24
+ ];
25
+ /**
26
+ * Generate a random agent name (AdjectiveNoun format).
27
+ */
28
+ export function generateAgentName() {
29
+ const adjective = ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)];
30
+ const noun = NOUNS[Math.floor(Math.random() * NOUNS.length)];
31
+ return `${adjective}${noun}`;
32
+ }
33
+ /**
34
+ * Generate a unique agent name, checking against existing names.
35
+ */
36
+ export function generateUniqueAgentName(existingNames, maxAttempts = 100) {
37
+ for (let i = 0; i < maxAttempts; i++) {
38
+ const name = generateAgentName();
39
+ if (!existingNames.has(name)) {
40
+ return name;
41
+ }
42
+ }
43
+ // Fallback: append random suffix
44
+ return `${generateAgentName()}${Math.floor(Math.random() * 1000)}`;
45
+ }
46
+ /**
47
+ * Validate an agent name (must be alphanumeric, 2-32 chars).
48
+ */
49
+ export function isValidAgentName(name) {
50
+ return /^[a-zA-Z][a-zA-Z0-9_-]{1,31}$/.test(name);
51
+ }
52
+ //# sourceMappingURL=name-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name-generator.js","sourceRoot":"","sources":["../src/name-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
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
+ export interface CompiledPatterns {
14
+ inline: RegExp;
15
+ fencedInline: RegExp;
16
+ escape: RegExp;
17
+ }
18
+ /**
19
+ * Get or create compiled patterns for a given prefix configuration.
20
+ * Patterns are cached for reuse across parser instances.
21
+ */
22
+ export declare function getCompiledPatterns(prefix?: string, thinkingPrefix?: string): CompiledPatterns;
23
+ /**
24
+ * Fast check if text matches any instructional pattern.
25
+ * Single regex test instead of array.some().
26
+ */
27
+ export declare function isInstructionalTextFast(body: string): boolean;
28
+ /**
29
+ * Fast placeholder target check using Set.
30
+ */
31
+ export declare function isPlaceholderTargetFast(target: string): boolean;
32
+ /**
33
+ * Strip ANSI escape codes from a string.
34
+ * Uses precompiled patterns for better performance.
35
+ */
36
+ export declare function stripAnsiFast(str: string): string;
37
+ /**
38
+ * Precompiled static patterns used across parsing operations.
39
+ */
40
+ export declare const StaticPatterns: {
41
+ readonly BLOCK_END: RegExp;
42
+ readonly BLOCK_METADATA_END: RegExp;
43
+ readonly CODE_FENCE: RegExp;
44
+ readonly FENCE_END_START: RegExp;
45
+ readonly FENCE_END_LINE: RegExp;
46
+ readonly FENCE_END: RegExp;
47
+ readonly ESCAPED_FENCE_START: RegExp;
48
+ readonly ESCAPED_FENCE_END: RegExp;
49
+ readonly ESCAPED_FENCE_END_CHECK: RegExp;
50
+ readonly ESCAPED_FENCE_START_CHECK: RegExp;
51
+ readonly BULLET_OR_NUMBERED_LIST: RegExp;
52
+ readonly PROMPTISH_LINE: RegExp;
53
+ readonly RELAY_INJECTION_PREFIX: RegExp;
54
+ readonly SPAWN_COMMAND: RegExp;
55
+ readonly RELEASE_COMMAND: RegExp;
56
+ readonly THINKING_START: RegExp;
57
+ readonly THINKING_END: RegExp;
58
+ readonly AGENT_NAME: RegExp;
59
+ readonly CLI_PROMPTS: {
60
+ readonly claude: RegExp;
61
+ readonly gemini: RegExp;
62
+ readonly codex: RegExp;
63
+ readonly droid: RegExp;
64
+ readonly opencode: RegExp;
65
+ readonly spawned: RegExp;
66
+ readonly other: RegExp;
67
+ };
68
+ };
69
+ /**
70
+ * Check if line is a spawn or release command.
71
+ */
72
+ export declare function isSpawnOrReleaseCommandFast(line: string): boolean;
73
+ /**
74
+ * Check if a line contains an escaped fence end.
75
+ */
76
+ export declare function isEscapedFenceEndFast(line: string): boolean;
77
+ /**
78
+ * Unescape fence markers in content.
79
+ */
80
+ export declare function unescapeFenceMarkersFast(content: string): string;
81
+ interface PatternMetrics {
82
+ calls: number;
83
+ totalMs: number;
84
+ maxMs: number;
85
+ }
86
+ /**
87
+ * Track pattern matching performance (for debugging/profiling).
88
+ * Call with pattern name and execution time.
89
+ */
90
+ export declare function trackPatternPerformance(name: string, ms: number): void;
91
+ /**
92
+ * Get pattern performance metrics.
93
+ */
94
+ export declare function getPatternMetrics(): Map<string, PatternMetrics & {
95
+ avgMs: number;
96
+ }>;
97
+ /**
98
+ * Reset pattern performance metrics.
99
+ */
100
+ export declare function resetPatternMetrics(): void;
101
+ /**
102
+ * Benchmark pattern matching performance.
103
+ * Useful for testing optimization impact.
104
+ */
105
+ export declare function benchmarkPatterns(iterations?: number): Record<string, {
106
+ avgNs: number;
107
+ maxNs: number;
108
+ }>;
109
+ export {};
110
+ //# sourceMappingURL=precompiled-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precompiled-patterns.d.ts","sourceRoot":"","sources":["../src/precompiled-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,GAAE,MAAmB,EAC3B,cAAc,GAAE,MAAsB,GACrC,gBAAgB,CAsClB;AAsCD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAoBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE/D;AAkBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQjD;AAMD;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CjB,CAAC;AAMX;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOhE;AAMD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAStE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CASnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,GAAE,MAAc,GACzB,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA0ElD"}