@mondaydotcomorg/atp-providers 0.19.7 → 0.19.8
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/index.cjs +1171 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +1151 -8
- package/dist/index.js.map +1 -1
- package/package.json +12 -7
- package/project.json +1 -2
- package/tsup.config.ts +17 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cache/memory.ts","../src/cache/redis.ts","../src/cache/file.ts","../src/auth/env.ts","../src/oauth/scope-checkers.ts","../src/audit/jsonl.ts","../src/audit/otel-metrics.ts","../src/audit/opentelemetry.ts"],"names":["MemoryCache","name","cache","maxKeys","defaultTTL","constructor","options","Map","get","key","entry","expiresAt","Date","now","delete","set","value","ttl","size","has","firstKey","keys","next","clear","pattern","regex","RegExp","replace","test","mget","Promise","all","map","mset","entries","disconnect","getStats","utilization","RedisCache","redis","keyPrefix","getFullKey","JSON","parse","error","log","Error","message","serialized","stringify","fullKey","effectiveTTL","setex","del","exists","fullPattern","length","fullKeys","values","pipeline","exec","quit","FileCache","cacheDir","cleanupInterval","cleanupTimer","initPromise","path","join","os","tmpdir","initialize","fs","mkdir","recursive","startCleanup","ensureInitialized","getFilePath","sanitizedKey","setInterval","cleanExpired","catch","unref","files","readdir","file","endsWith","filePath","content","readFile","unlink","enforceMaxKeys","jsonFiles","filter","f","fileStats","stats","stat","mtime","getTime","sort","a","b","toDelete","slice","item","code","writeFile","keyBase","clearInterval","undefined","totalSize","sizeBytes","cleanup","EnvAuthProvider","prefix","credentials","Object","getCredential","envValue","process","env","setCredential","_ttl","deleteCredential","listCredentials","Set","add","startsWith","substring","Array","from","ScopeCheckerRegistry","checkers","scopeCache","maxCacheSize","pendingChecks","cleanupExpiredCache","stopCleanup","cleaned","entriesToRemove","i","debug","register","checker","provider","hasChecker","getChecker","checkScopes","token","cacheTTL","cacheKey","hashToken","cached","scopes","pending","checkPromise","check","validateToken","validate","getTokenInfo","valid","resolve","clearCache","createHash","update","digest","JSONLAuditSink","sanitizeSecrets","buffer","flushInterval","batchSize","dir","dirname","existsSync","err","flushIntervalMs","flush","write","event","sanitized","sanitizeEvent","line","appendFile","writeBatch","events","e","lines","query","split","trim","clientId","userId","timestamp","to","resource","eventType","types","isArray","includes","status","statuses","minRiskScore","riskScore","offset","limit","sanitizeString","input","sanitizeObject","output","str","patterns","source","obj","secretPatterns","lowerKey","toLowerCase","some","OTelCounter","OTelHistogram","OTelSpan","OTelAttribute","METRIC_CONFIGS","description","unit","OTEL_SERVICE_NAME","OTEL_TRACER_NAME","OTEL_METER_NAME","ATTRIBUTE_PREFIX_TOOL","ATTRIBUTE_PREFIX_METADATA","OpenTelemetryAuditSink","tracer","trace","getTracer","meter","metrics","getMeter","executionCounter","createCounter","EXECUTIONS_TOTAL","toolCallCounter","TOOLS_CALLS","llmCallCounter","LLM_CALLS","approvalCounter","APPROVALS_TOTAL","executionDuration","createHistogram","EXECUTION_DURATION","toolDuration","TOOL_DURATION","span","startSpan","action","attributes","buildAttributes","context","with","setSpan","active","handleEvent","recordMetrics","setStatus","SpanStatusCode","OK","ERROR","recordException","end","attrs","EVENT_ID","eventId","EVENT_TYPE","EVENT_ACTION","TIMESTAMP","CLIENT_ID","STATUS","USER_ID","ipAddress","IP_ADDRESS","userAgent","USER_AGENT","RESOURCE","resourceId","RESOURCE_ID","toolName","TOOL_NAME","apiGroup","API_GROUP","duration","DURATION_MS","memoryUsed","MEMORY_BYTES","llmCallsCount","httpCallsCount","HTTP_CALLS","RISK_SCORE","securityEvents","SECURITY_EVENTS","SECURITY_EVENTS_COUNT","ERROR_MESSAGE","ERROR_CODE","stack","ERROR_STACK","annotations","assign","flattenObject","metadata","addEvent","duration_ms","llm_calls","setAttribute","TOOL_INPUT_SIZE","TOOL_OUTPUT_SIZE","secEvent","commonAttrs","client_id","event_type","record","tool_name","api_group","securityEventCounter","risk_score","result"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CacheProvider } from '@mondaydotcomorg/atp-protocol';\n\ninterface CacheEntry {\n\tvalue: unknown;\n\texpiresAt: number;\n}\n\n/**\n * In-memory cache provider with LRU eviction\n * Good for development and single-server deployments\n */\nexport class MemoryCache implements CacheProvider {\n\tname = 'memory';\n\tprivate cache: Map<string, CacheEntry>;\n\tprivate maxKeys: number;\n\tprivate defaultTTL: number;\n\n\tconstructor(options: { maxKeys?: number; defaultTTL?: number } = {}) {\n\t\tthis.cache = new Map();\n\t\tthis.maxKeys = options.maxKeys || 1000;\n\t\tthis.defaultTTL = options.defaultTTL || 3600;\n\t}\n\n\tasync get<T>(key: string): Promise<T | null> {\n\t\tconst entry = this.cache.get(key);\n\n\t\tif (!entry) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (entry.expiresAt !== -1 && Date.now() > entry.expiresAt) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.cache.delete(key);\n\t\tthis.cache.set(key, entry);\n\n\t\treturn entry.value as T;\n\t}\n\n\tasync set(key: string, value: unknown, ttl?: number): Promise<void> {\n\t\tif (this.cache.size >= this.maxKeys && !this.cache.has(key)) {\n\t\t\tconst firstKey = this.cache.keys().next().value;\n\t\t\tif (firstKey) {\n\t\t\t\tthis.cache.delete(firstKey);\n\t\t\t}\n\t\t}\n\n\t\tconst expiresAt = ttl\n\t\t\t? Date.now() + ttl * 1000\n\t\t\t: this.defaultTTL > 0\n\t\t\t\t? Date.now() + this.defaultTTL * 1000\n\t\t\t\t: -1;\n\n\t\tthis.cache.set(key, { value, expiresAt });\n\t}\n\n\tasync delete(key: string): Promise<void> {\n\t\tthis.cache.delete(key);\n\t}\n\n\tasync has(key: string): Promise<boolean> {\n\t\tconst value = await this.get(key);\n\t\treturn value !== null;\n\t}\n\n\tasync clear(pattern?: string): Promise<void> {\n\t\tif (!pattern) {\n\t\t\tthis.cache.clear();\n\t\t\treturn;\n\t\t}\n\n\t\tconst regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$');\n\n\t\tfor (const key of this.cache.keys()) {\n\t\t\tif (regex.test(key)) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync mget(keys: string[]): Promise<Array<unknown | null>> {\n\t\treturn Promise.all(keys.map((key) => this.get(key)));\n\t}\n\n\tasync mset(entries: Array<[string, unknown, number?]>): Promise<void> {\n\t\tfor (const [key, value, ttl] of entries) {\n\t\t\tawait this.set(key, value, ttl);\n\t\t}\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tthis.cache.clear();\n\t}\n\n\t/** Get cache statistics */\n\tgetStats() {\n\t\treturn {\n\t\t\tkeys: this.cache.size,\n\t\t\tmaxKeys: this.maxKeys,\n\t\t\tutilization: (this.cache.size / this.maxKeys) * 100,\n\t\t};\n\t}\n}\n","import type { CacheProvider } from '@mondaydotcomorg/atp-protocol';\nimport { log } from '@mondaydotcomorg/atp-runtime';\nimport type Redis from 'ioredis';\n\nexport interface RedisCacheOptions {\n\tredis: Redis;\n\tkeyPrefix?: string;\n\tdefaultTTL?: number;\n}\n\n/**\n * Redis-backed cache provider for distributed systems\n * Enables cross-pod state sharing and resume capabilities\n */\nexport class RedisCache implements CacheProvider {\n\tname = 'redis';\n\tprivate redis: Redis;\n\tprivate keyPrefix: string;\n\tprivate defaultTTL?: number;\n\n\tconstructor(options: RedisCacheOptions) {\n\t\tthis.redis = options.redis;\n\t\tthis.keyPrefix = options.keyPrefix || 'atp:cache:';\n\t\tthis.defaultTTL = options.defaultTTL;\n\t}\n\n\tprivate getFullKey(key: string): string {\n\t\treturn `${this.keyPrefix}${key}`;\n\t}\n\n\tasync get<T>(key: string): Promise<T | null> {\n\t\ttry {\n\t\t\tconst value = await this.redis.get(this.getFullKey(key));\n\t\t\tif (!value) return null;\n\t\t\treturn JSON.parse(value) as T;\n\t\t} catch (error) {\n\t\t\tlog.error('RedisCache failed to get key', {\n\t\t\t\tkey,\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync set(key: string, value: unknown, ttl?: number): Promise<void> {\n\t\ttry {\n\t\t\tconst serialized = JSON.stringify(value);\n\t\t\tconst fullKey = this.getFullKey(key);\n\t\t\tconst effectiveTTL = ttl ?? this.defaultTTL;\n\n\t\t\tif (effectiveTTL) {\n\t\t\t\tawait this.redis.setex(fullKey, effectiveTTL, serialized);\n\t\t\t} else {\n\t\t\t\tawait this.redis.set(fullKey, serialized);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlog.error('RedisCache failed to set key', {\n\t\t\t\tkey,\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync delete(key: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.redis.del(this.getFullKey(key));\n\t\t} catch (error) {\n\t\t\tlog.error('RedisCache failed to delete key', {\n\t\t\t\tkey,\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync has(key: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst exists = await this.redis.exists(this.getFullKey(key));\n\t\t\treturn exists === 1;\n\t\t} catch (error) {\n\t\t\tlog.error('RedisCache failed to check key', {\n\t\t\t\tkey,\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync clear(pattern?: string): Promise<void> {\n\t\ttry {\n\t\t\tif (pattern) {\n\t\t\t\tconst fullPattern = this.getFullKey(pattern);\n\t\t\t\tconst keys = await this.redis.keys(fullPattern);\n\t\t\t\tif (keys.length > 0) {\n\t\t\t\t\tawait this.redis.del(...keys);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst keys = await this.redis.keys(this.getFullKey('*'));\n\t\t\t\tif (keys.length > 0) {\n\t\t\t\t\tawait this.redis.del(...keys);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlog.error('RedisCache failed to clear cache', {\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync mget(keys: string[]): Promise<Array<unknown | null>> {\n\t\ttry {\n\t\t\tconst fullKeys = keys.map((key) => this.getFullKey(key));\n\t\t\tconst values = await this.redis.mget(...fullKeys);\n\t\t\treturn values.map((value) => (value ? JSON.parse(value) : null));\n\t\t} catch (error) {\n\t\t\tlog.error('RedisCache failed to mget keys', {\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t\treturn keys.map(() => null);\n\t\t}\n\t}\n\n\tasync mset(entries: Array<[string, unknown, number?]>): Promise<void> {\n\t\ttry {\n\t\t\tconst pipeline = this.redis.pipeline();\n\t\t\tfor (const [key, value, ttl] of entries) {\n\t\t\t\tconst serialized = JSON.stringify(value);\n\t\t\t\tconst fullKey = this.getFullKey(key);\n\t\t\t\tconst effectiveTTL = ttl ?? this.defaultTTL;\n\n\t\t\t\tif (effectiveTTL) {\n\t\t\t\t\tpipeline.setex(fullKey, effectiveTTL, serialized);\n\t\t\t\t} else {\n\t\t\t\t\tpipeline.set(fullKey, serialized);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait pipeline.exec();\n\t\t} catch (error) {\n\t\t\tlog.error('RedisCache failed to mset entries', {\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.redis.quit();\n\t\t} catch (error) {\n\t\t\tlog.error('RedisCache failed to disconnect', {\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { CacheProvider } from '@mondaydotcomorg/atp-protocol';\nimport { log } from '@mondaydotcomorg/atp-runtime';\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport os from 'os';\n\ninterface CacheEntry {\n\tvalue: unknown;\n\texpiresAt: number;\n}\n\nexport interface FileCacheOptions {\n\tcacheDir?: string;\n\tmaxKeys?: number;\n\tdefaultTTL?: number;\n\tcleanupInterval?: number;\n}\n\n/**\n * File-based cache provider for persistent local caching\n * Good for single-server deployments that need persistence across restarts\n * Supports cross-pod scenarios when using a shared filesystem (NFS, EFS, etc.)\n */\nexport class FileCache implements CacheProvider {\n\tname = 'file';\n\tprivate cacheDir: string;\n\tprivate maxKeys: number;\n\tprivate defaultTTL: number;\n\tprivate cleanupInterval: number;\n\tprivate cleanupTimer?: NodeJS.Timeout;\n\tprivate initPromise?: Promise<void>;\n\n\tconstructor(options: FileCacheOptions = {}) {\n\t\tthis.cacheDir = options.cacheDir || path.join(os.tmpdir(), 'atp-cache');\n\t\tthis.maxKeys = options.maxKeys || 1000;\n\t\tthis.defaultTTL = options.defaultTTL || 3600;\n\t\tthis.cleanupInterval = options.cleanupInterval || 300; // 5 minutes\n\n\t\t// Initialize asynchronously\n\t\tthis.initPromise = this.initialize();\n\t}\n\n\tprivate async initialize(): Promise<void> {\n\t\ttry {\n\t\t\tawait fs.mkdir(this.cacheDir, { recursive: true });\n\t\t\t// Start periodic cleanup\n\t\t\tthis.startCleanup();\n\t\t} catch (error) {\n\t\t\tlog.error('FileCache failed to initialize cache directory', {\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async ensureInitialized(): Promise<void> {\n\t\tif (this.initPromise) {\n\t\t\tawait this.initPromise;\n\t\t}\n\t}\n\n\tprivate getFilePath(key: string): string {\n\t\t// Sanitize key to be filesystem-safe\n\t\tconst sanitizedKey = key.replace(/[^a-zA-Z0-9_-]/g, '_');\n\t\treturn path.join(this.cacheDir, `${sanitizedKey}.json`);\n\t}\n\n\tprivate startCleanup(): void {\n\t\tif (this.cleanupInterval > 0) {\n\t\t\tthis.cleanupTimer = setInterval(() => {\n\t\t\t\tthis.cleanExpired().catch((error) => {\n\t\t\t\t\tlog.error('FileCache cleanup error', { error });\n\t\t\t\t});\n\t\t\t}, this.cleanupInterval * 1000);\n\n\t\t\t// Don't prevent process exit\n\t\t\tif (this.cleanupTimer.unref) {\n\t\t\t\tthis.cleanupTimer.unref();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async cleanExpired(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.ensureInitialized();\n\t\t\tconst files = await fs.readdir(this.cacheDir);\n\t\t\tconst now = Date.now();\n\n\t\t\tfor (const file of files) {\n\t\t\t\tif (!file.endsWith('.json')) continue;\n\n\t\t\t\tconst filePath = path.join(this.cacheDir, file);\n\t\t\t\ttry {\n\t\t\t\t\tconst content = await fs.readFile(filePath, 'utf-8');\n\t\t\t\t\tconst entry: CacheEntry = JSON.parse(content);\n\n\t\t\t\t\tif (entry.expiresAt !== -1 && now > entry.expiresAt) {\n\t\t\t\t\t\tawait fs.unlink(filePath);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// If we can't read or parse a file, delete it\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait fs.unlink(filePath);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore deletion errors\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Enforce max keys limit\n\t\t\tawait this.enforceMaxKeys();\n\t\t} catch (error) {\n\t\t\tlog.error('FileCache failed to clean expired entries', {\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async enforceMaxKeys(): Promise<void> {\n\t\ttry {\n\t\t\tconst files = await fs.readdir(this.cacheDir);\n\t\t\tconst jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n\t\t\tif (jsonFiles.length > this.maxKeys) {\n\t\t\t\t// Sort by modification time and remove oldest\n\t\t\t\tconst fileStats = await Promise.all(\n\t\t\t\t\tjsonFiles.map(async (file) => {\n\t\t\t\t\t\tconst filePath = path.join(this.cacheDir, file);\n\t\t\t\t\t\tconst stats = await fs.stat(filePath);\n\t\t\t\t\t\treturn { file, mtime: stats.mtime.getTime() };\n\t\t\t\t\t})\n\t\t\t\t);\n\n\t\t\t\tfileStats.sort((a, b) => a.mtime - b.mtime);\n\n\t\t\t\tconst toDelete = fileStats.slice(0, jsonFiles.length - this.maxKeys);\n\t\t\t\tawait Promise.all(\n\t\t\t\t\ttoDelete.map((item) => {\n\t\t\t\t\t\tconst filePath = path.join(this.cacheDir, item.file);\n\t\t\t\t\t\treturn fs.unlink(filePath).catch(() => {\n\t\t\t\t\t\t\t// Ignore errors\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlog.error('FileCache failed to enforce max keys', {\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync get<T>(key: string): Promise<T | null> {\n\t\ttry {\n\t\t\tawait this.ensureInitialized();\n\t\t\tconst filePath = this.getFilePath(key);\n\t\t\tconst content = await fs.readFile(filePath, 'utf-8');\n\t\t\tconst entry: CacheEntry = JSON.parse(content);\n\n\t\t\tif (entry.expiresAt !== -1 && Date.now() > entry.expiresAt) {\n\t\t\t\tawait this.delete(key);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn entry.value as T;\n\t\t} catch (error: any) {\n\t\t\tif (error.code === 'ENOENT') {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tlog.error('FileCache failed to get key', {\n\t\t\t\tkey,\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync set(key: string, value: unknown, ttl?: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.ensureInitialized();\n\t\t\tawait this.enforceMaxKeys();\n\n\t\t\tconst expiresAt = ttl\n\t\t\t\t? Date.now() + ttl * 1000\n\t\t\t\t: this.defaultTTL > 0\n\t\t\t\t\t? Date.now() + this.defaultTTL * 1000\n\t\t\t\t\t: -1;\n\n\t\t\tconst entry: CacheEntry = { value, expiresAt };\n\t\t\tconst filePath = this.getFilePath(key);\n\n\t\t\tawait fs.writeFile(filePath, JSON.stringify(entry), 'utf-8');\n\t\t} catch (error) {\n\t\t\tlog.error('FileCache failed to set key', {\n\t\t\t\tkey,\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync delete(key: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.ensureInitialized();\n\t\t\tconst filePath = this.getFilePath(key);\n\t\t\tawait fs.unlink(filePath);\n\t\t} catch (error: any) {\n\t\t\tif (error.code !== 'ENOENT') {\n\t\t\t\tlog.error('FileCache failed to delete key', {\n\t\t\t\t\tkey,\n\t\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync has(key: string): Promise<boolean> {\n\t\tconst value = await this.get(key);\n\t\treturn value !== null;\n\t}\n\n\tasync clear(pattern?: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.ensureInitialized();\n\t\t\tconst files = await fs.readdir(this.cacheDir);\n\n\t\t\tif (!pattern) {\n\t\t\t\t// Clear all cache files\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tfiles\n\t\t\t\t\t\t.filter((f) => f.endsWith('.json'))\n\t\t\t\t\t\t.map((file) => {\n\t\t\t\t\t\t\tconst filePath = path.join(this.cacheDir, file);\n\t\t\t\t\t\t\treturn fs.unlink(filePath).catch(() => {\n\t\t\t\t\t\t\t\t// Ignore errors\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Convert glob pattern to regex\n\t\t\tconst regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$');\n\n\t\t\t// Read all files and check if they match the pattern\n\t\t\tfor (const file of files) {\n\t\t\t\tif (!file.endsWith('.json')) continue;\n\n\t\t\t\t// Extract original key from filename (reverse sanitization is approximate)\n\t\t\t\tconst keyBase = file.replace('.json', '');\n\n\t\t\t\t// We need to read the file to get the original key\n\t\t\t\t// For now, use a simple pattern match on the sanitized filename\n\t\t\t\tif (regex.test(keyBase)) {\n\t\t\t\t\tconst filePath = path.join(this.cacheDir, file);\n\t\t\t\t\tawait fs.unlink(filePath).catch(() => {\n\t\t\t\t\t\t// Ignore errors\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlog.error('FileCache failed to clear cache', {\n\t\t\t\terror: error instanceof Error ? error.message : error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync mget(keys: string[]): Promise<Array<unknown | null>> {\n\t\treturn Promise.all(keys.map((key) => this.get(key)));\n\t}\n\n\tasync mset(entries: Array<[string, unknown, number?]>): Promise<void> {\n\t\tawait Promise.all(entries.map(([key, value, ttl]) => this.set(key, value, ttl)));\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.cleanupTimer) {\n\t\t\tclearInterval(this.cleanupTimer);\n\t\t\tthis.cleanupTimer = undefined;\n\t\t}\n\t\t// Don't delete cache files on disconnect - they should persist\n\t}\n\n\t/** Get cache statistics */\n\tasync getStats() {\n\t\ttry {\n\t\t\tawait this.ensureInitialized();\n\t\t\tconst files = await fs.readdir(this.cacheDir);\n\t\t\tconst jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n\t\t\t// Calculate total size\n\t\t\tlet totalSize = 0;\n\t\t\tfor (const file of jsonFiles) {\n\t\t\t\tconst filePath = path.join(this.cacheDir, file);\n\t\t\t\ttry {\n\t\t\t\t\tconst stats = await fs.stat(filePath);\n\t\t\t\t\ttotalSize += stats.size;\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkeys: jsonFiles.length,\n\t\t\t\tmaxKeys: this.maxKeys,\n\t\t\t\tutilization: (jsonFiles.length / this.maxKeys) * 100,\n\t\t\t\tsizeBytes: totalSize,\n\t\t\t\tcacheDir: this.cacheDir,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tlog.error('[FileCache] Failed to get stats:', error);\n\t\t\treturn {\n\t\t\t\tkeys: 0,\n\t\t\t\tmaxKeys: this.maxKeys,\n\t\t\t\tutilization: 0,\n\t\t\t\tsizeBytes: 0,\n\t\t\t\tcacheDir: this.cacheDir,\n\t\t\t};\n\t\t}\n\t}\n\n\t/** Manually trigger cleanup of expired entries */\n\tasync cleanup(): Promise<void> {\n\t\tawait this.cleanExpired();\n\t}\n}\n","import type { AuthProvider } from '@mondaydotcomorg/atp-protocol';\n\n/**\n * Environment variable based auth provider\n * Simple provider that reads credentials from process.env\n * Good for development and simple deployments\n */\nexport class EnvAuthProvider implements AuthProvider {\n\tname = 'env';\n\tprivate prefix: string;\n\tprivate credentials: Map<string, string>;\n\n\tconstructor(\n\t\toptions: {\n\t\t\tprefix?: string;\n\t\t\tcredentials?: Record<string, string>;\n\t\t} = {}\n\t) {\n\t\tthis.prefix = options.prefix || 'ATP_';\n\t\tthis.credentials = new Map();\n\n\t\tif (options.credentials) {\n\t\t\tfor (const [key, value] of Object.entries(options.credentials)) {\n\t\t\t\tthis.credentials.set(key, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync getCredential(key: string): Promise<string | null> {\n\t\tif (this.credentials.has(key)) {\n\t\t\treturn this.credentials.get(key) || null;\n\t\t}\n\n\t\tconst envValue = process.env[key] || process.env[`${this.prefix}${key}`];\n\t\treturn envValue || null;\n\t}\n\n\tasync setCredential(key: string, value: string, _ttl?: number): Promise<void> {\n\t\tthis.credentials.set(key, value);\n\t}\n\n\tasync deleteCredential(key: string): Promise<void> {\n\t\tthis.credentials.delete(key);\n\t}\n\n\tasync listCredentials(): Promise<string[]> {\n\t\tconst keys = new Set<string>();\n\n\t\tfor (const key of this.credentials.keys()) {\n\t\t\tkeys.add(key);\n\t\t}\n\n\t\tfor (const key of Object.keys(process.env)) {\n\t\t\tif (key.startsWith(this.prefix)) {\n\t\t\t\tkeys.add(key.substring(this.prefix.length));\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(keys);\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tthis.credentials.clear();\n\t}\n}\n","import type { ScopeChecker, TokenInfo } from '@mondaydotcomorg/atp-protocol';\nimport { log } from '@mondaydotcomorg/atp-runtime';\nimport { createHash } from 'node:crypto';\n\n/**\n * Scope checker registry\n * Manages scope checkers for different OAuth providers\n */\nexport class ScopeCheckerRegistry {\n\tprivate checkers = new Map<string, ScopeChecker>();\n\tprivate scopeCache = new Map<string, { scopes: string[]; expiresAt: number }>();\n\tprivate cleanupInterval?: NodeJS.Timeout;\n\tprivate maxCacheSize = 10000;\n\tprivate pendingChecks = new Map<string, Promise<string[]>>();\n\n\tconstructor() {\n\t\tthis.startCleanup();\n\t}\n\n\t/**\n\t * Start periodic cache cleanup\n\t */\n\tprivate startCleanup(): void {\n\t\tthis.cleanupInterval = setInterval(\n\t\t\t() => {\n\t\t\t\tthis.cleanupExpiredCache();\n\t\t\t},\n\t\t\t5 * 60 * 1000\n\t\t);\n\n\t\tif (this.cleanupInterval.unref) {\n\t\t\tthis.cleanupInterval.unref();\n\t\t}\n\t}\n\n\t/**\n\t * Stop periodic cache cleanup (for testing or shutdown)\n\t */\n\tstopCleanup(): void {\n\t\tif (this.cleanupInterval) {\n\t\t\tclearInterval(this.cleanupInterval);\n\t\t\tthis.cleanupInterval = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Remove expired entries from cache\n\t */\n\tprivate cleanupExpiredCache(): void {\n\t\tconst now = Date.now();\n\t\tlet cleaned = 0;\n\n\t\tfor (const [key, value] of this.scopeCache.entries()) {\n\t\t\tif (value.expiresAt <= now) {\n\t\t\t\tthis.scopeCache.delete(key);\n\t\t\t\tcleaned++;\n\t\t\t}\n\t\t}\n\n\t\tif (this.scopeCache.size > this.maxCacheSize) {\n\t\t\tconst entriesToRemove = this.scopeCache.size - this.maxCacheSize;\n\t\t\tconst entries = Array.from(this.scopeCache.entries());\n\n\t\t\tentries.sort((a, b) => a[1].expiresAt - b[1].expiresAt);\n\n\t\t\tfor (let i = 0; i < entriesToRemove; i++) {\n\t\t\t\tconst entry = entries[i];\n\t\t\t\tif (entry) {\n\t\t\t\t\tthis.scopeCache.delete(entry[0]);\n\t\t\t\t\tcleaned++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (cleaned > 0) {\n\t\t\tlog.debug(`Cleaned ${cleaned} expired/old scope cache entries`);\n\t\t}\n\t}\n\n\t/**\n\t * Register a custom scope checker\n\t */\n\tregister(checker: ScopeChecker): void {\n\t\tthis.checkers.set(checker.provider, checker);\n\t}\n\n\t/**\n\t * Check if a scope checker is available for a provider\n\t */\n\thasChecker(provider: string): boolean {\n\t\treturn this.checkers.has(provider);\n\t}\n\n\t/**\n\t * Get scope checker for a provider\n\t */\n\tgetChecker(provider: string): ScopeChecker | undefined {\n\t\treturn this.checkers.get(provider);\n\t}\n\n\t/**\n\t * Check what scopes a token has (with caching and deduplication)\n\t * @param provider - Provider name\n\t * @param token - Access token\n\t * @param cacheTTL - Cache TTL in seconds (default: 3600 = 1 hour)\n\t */\n\tasync checkScopes(provider: string, token: string, cacheTTL = 3600): Promise<string[]> {\n\t\tconst cacheKey = `${provider}:${this.hashToken(token)}`;\n\n\t\tconst cached = this.scopeCache.get(cacheKey);\n\t\tif (cached && cached.expiresAt > Date.now()) {\n\t\t\treturn cached.scopes;\n\t\t}\n\n\t\tconst pending = this.pendingChecks.get(cacheKey);\n\t\tif (pending) {\n\t\t\treturn pending;\n\t\t}\n\n\t\tconst checker = this.checkers.get(provider);\n\t\tif (!checker) {\n\t\t\tthrow new Error(`No scope checker registered for provider: ${provider}`);\n\t\t}\n\n\t\tconst checkPromise = (async () => {\n\t\t\ttry {\n\t\t\t\tconst scopes = await checker.check(token);\n\n\t\t\t\tthis.scopeCache.set(cacheKey, {\n\t\t\t\t\tscopes,\n\t\t\t\t\texpiresAt: Date.now() + cacheTTL * 1000,\n\t\t\t\t});\n\n\t\t\t\treturn scopes;\n\t\t\t} finally {\n\t\t\t\tthis.pendingChecks.delete(cacheKey);\n\t\t\t}\n\t\t})();\n\n\t\tthis.pendingChecks.set(cacheKey, checkPromise);\n\t\treturn checkPromise;\n\t}\n\n\t/**\n\t * Validate if a token is still valid\n\t */\n\tasync validateToken(provider: string, token: string): Promise<boolean> {\n\t\tconst checker = this.checkers.get(provider);\n\t\tif (!checker || !checker.validate) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn await checker.validate(token);\n\t}\n\n\t/**\n\t * Get complete token information\n\t */\n\tasync getTokenInfo(provider: string, token: string): Promise<TokenInfo> {\n\t\tconst checker = this.checkers.get(provider);\n\t\tif (!checker) {\n\t\t\tthrow new Error(`No scope checker registered for provider: ${provider}`);\n\t\t}\n\n\t\tconst [scopes, valid] = await Promise.all([\n\t\t\tchecker.check(token),\n\t\t\tchecker.validate ? checker.validate(token) : Promise.resolve(true),\n\t\t]);\n\n\t\treturn {\n\t\t\tvalid,\n\t\t\tscopes,\n\t\t};\n\t}\n\n\t/**\n\t * Clear cached scopes\n\t */\n\tclearCache(provider?: string): void {\n\t\tif (provider) {\n\t\t\tfor (const key of this.scopeCache.keys()) {\n\t\t\t\tif (key.startsWith(`${provider}:`)) {\n\t\t\t\t\tthis.scopeCache.delete(key);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.scopeCache.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Hash token for cache key (SHA-256, first 16 chars)\n\t */\n\tprivate hashToken(token: string): string {\n\t\treturn createHash('sha256').update(token).digest('hex').substring(0, 16);\n\t}\n}\n","import type { AuditEvent, AuditFilter, AuditSink } from '@mondaydotcomorg/atp-protocol';\nimport { log } from '@mondaydotcomorg/atp-runtime';\nimport { appendFile, readFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\n/**\n * JSONL (JSON Lines) audit sink\n * Writes audit events to a file, one JSON object per line\n * Simple, append-only, easy to parse with standard tools\n */\nexport class JSONLAuditSink implements AuditSink {\n\tname = 'jsonl';\n\tprivate filePath: string;\n\tprivate sanitizeSecrets: boolean;\n\tprivate buffer: AuditEvent[] = [];\n\tprivate flushInterval: NodeJS.Timeout | null = null;\n\tprivate batchSize: number;\n\n\tconstructor(options: {\n\t\tfilePath: string;\n\t\tsanitizeSecrets?: boolean;\n\t\tbatchSize?: number;\n\t\tflushIntervalMs?: number;\n\t}) {\n\t\tthis.filePath = options.filePath;\n\t\tthis.sanitizeSecrets = options.sanitizeSecrets ?? true;\n\t\tthis.batchSize = options.batchSize || 10;\n\n\t\tconst dir = dirname(this.filePath);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdir(dir, { recursive: true }).catch((err) => {\n\t\t\t\tlog.error('Failed to create audit directory', { error: err.message });\n\t\t\t});\n\t\t}\n\n\t\tif (options.flushIntervalMs) {\n\t\t\tthis.flushInterval = setInterval(() => {\n\t\t\t\tif (this.buffer.length > 0) {\n\t\t\t\t\tthis.flush().catch((err) => {\n\t\t\t\t\t\tlog.error('Failed to flush audit buffer', { error: err.message });\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, options.flushIntervalMs);\n\t\t}\n\t}\n\n\tasync write(event: AuditEvent): Promise<void> {\n\t\tconst sanitized = this.sanitizeSecrets ? this.sanitizeEvent(event) : event;\n\t\tconst line = JSON.stringify(sanitized) + '\\n';\n\n\t\ttry {\n\t\t\tawait appendFile(this.filePath, line, 'utf8');\n\t\t} catch (error) {\n\t\t\tlog.error('Failed to write audit event', { error: (error as Error).message });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync writeBatch(events: AuditEvent[]): Promise<void> {\n\t\tconst sanitized = this.sanitizeSecrets ? events.map((e) => this.sanitizeEvent(e)) : events;\n\n\t\tconst lines = sanitized.map((e) => JSON.stringify(e)).join('\\n') + '\\n';\n\n\t\ttry {\n\t\t\tawait appendFile(this.filePath, lines, 'utf8');\n\t\t} catch (error) {\n\t\t\tlog.error('Failed to write audit batch', { error: (error as Error).message });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync query(filter: AuditFilter): Promise<AuditEvent[]> {\n\t\ttry {\n\t\t\tconst content = await readFile(this.filePath, 'utf8');\n\t\t\tconst lines = content.split('\\n').filter((line) => line.trim());\n\t\t\tconst events: AuditEvent[] = lines.map((line) => JSON.parse(line));\n\n\t\t\treturn events\n\t\t\t\t.filter((event) => {\n\t\t\t\t\tif (filter.clientId && event.clientId !== filter.clientId) return false;\n\t\t\t\t\tif (filter.userId && event.userId !== filter.userId) return false;\n\t\t\t\t\tif (filter.from && event.timestamp < filter.from) return false;\n\t\t\t\t\tif (filter.to && event.timestamp > filter.to) return false;\n\t\t\t\t\tif (filter.resource && event.resource !== filter.resource) return false;\n\n\t\t\t\t\tif (filter.eventType) {\n\t\t\t\t\t\tconst types = Array.isArray(filter.eventType) ? filter.eventType : [filter.eventType];\n\t\t\t\t\t\tif (!types.includes(event.eventType)) return false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (filter.status) {\n\t\t\t\t\t\tconst statuses = Array.isArray(filter.status) ? filter.status : [filter.status];\n\t\t\t\t\t\tif (!statuses.includes(event.status)) return false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (filter.minRiskScore && (event.riskScore || 0) < filter.minRiskScore) return false;\n\n\t\t\t\t\treturn true;\n\t\t\t\t})\n\t\t\t\t.slice(filter.offset || 0, (filter.offset || 0) + (filter.limit || 100));\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.flushInterval) {\n\t\t\tclearInterval(this.flushInterval);\n\t\t}\n\n\t\tif (this.buffer.length > 0) {\n\t\t\tawait this.flush();\n\t\t}\n\t}\n\n\tprivate async flush(): Promise<void> {\n\t\tif (this.buffer.length === 0) return;\n\n\t\tawait this.writeBatch([...this.buffer]);\n\t\tthis.buffer = [];\n\t}\n\n\tprivate sanitizeEvent(event: AuditEvent): AuditEvent {\n\t\tconst sanitized = { ...event };\n\n\t\tif (sanitized.code) {\n\t\t\tsanitized.code = this.sanitizeString(sanitized.code);\n\t\t}\n\n\t\tif (sanitized.input) {\n\t\t\tsanitized.input = this.sanitizeObject(sanitized.input);\n\t\t}\n\t\tif (sanitized.output) {\n\t\t\tsanitized.output = this.sanitizeObject(sanitized.output);\n\t\t}\n\n\t\treturn sanitized;\n\t}\n\n\tprivate sanitizeString(str: string): string {\n\t\tconst patterns = [\n\t\t\t/api[_-]?key/gi,\n\t\t\t/secret/gi,\n\t\t\t/token/gi,\n\t\t\t/password/gi,\n\t\t\t/bearer/gi,\n\t\t\t/authorization/gi,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tstr = str.replace(\n\t\t\t\tnew RegExp(`(${pattern.source})\\\\s*[:=]\\\\s*['\\\"]?([^'\\\"\\\\s]+)`, 'gi'),\n\t\t\t\t'$1: [REDACTED]'\n\t\t\t);\n\t\t}\n\n\t\treturn str;\n\t}\n\n\tprivate sanitizeObject(obj: unknown): unknown {\n\t\tif (typeof obj !== 'object' || obj === null) {\n\t\t\treturn obj;\n\t\t}\n\n\t\tif (Array.isArray(obj)) {\n\t\t\treturn obj.map((item) => this.sanitizeObject(item));\n\t\t}\n\n\t\tconst sanitized: Record<string, unknown> = {};\n\t\tconst secretPatterns = ['key', 'secret', 'token', 'password', 'bearer', 'auth'];\n\n\t\tfor (const [key, value] of Object.entries(obj)) {\n\t\t\tconst lowerKey = key.toLowerCase();\n\n\t\t\tif (secretPatterns.some((pattern) => lowerKey.includes(pattern))) {\n\t\t\t\tsanitized[key] = '[REDACTED]';\n\t\t\t} else if (typeof value === 'object') {\n\t\t\t\tsanitized[key] = this.sanitizeObject(value);\n\t\t\t} else {\n\t\t\t\tsanitized[key] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn sanitized;\n\t}\n}\n","/**\n * OpenTelemetry Metrics Definitions\n\n/**\n * Counter metric names\n */\nexport enum OTelCounter {\n\tEXECUTIONS_TOTAL = 'atp.executions.total',\n\tTOOLS_CALLS = 'atp.tools.calls',\n\tLLM_CALLS = 'atp.llm.calls',\n\tAPPROVALS_TOTAL = 'atp.approvals.total',\n\tSECURITY_EVENTS = 'atp.security.events',\n}\n\n/**\n * Histogram metric names\n */\nexport enum OTelHistogram {\n\tEXECUTION_DURATION = 'atp.execution.duration',\n\tTOOL_DURATION = 'atp.tool.duration',\n}\n\n/**\n * Span/trace names\n */\nexport enum OTelSpan {\n\tEXECUTION_START = 'atp.execution.start',\n\tEXECUTION_COMPLETE = 'atp.execution.complete',\n\tEXECUTION_PAUSE = 'atp.execution.pause',\n\tEXECUTION_RESUME = 'atp.execution.resume',\n\tEXECUTION_ERROR = 'atp.execution.error',\n\tTOOL_CALL = 'atp.tool_call',\n\tLLM_CALL = 'atp.llm_call',\n\tAPPROVAL_REQUEST = 'atp.approval.request',\n\tAPPROVAL_RESPONSE = 'atp.approval.response',\n\tCLIENT_INIT = 'atp.client_init',\n\tERROR = 'atp.error',\n}\n\n/**\n * Attribute names (for consistent span/metric attributes)\n */\nexport enum OTelAttribute {\n\tEVENT_ID = 'atp.event.id',\n\tEVENT_TYPE = 'atp.event.type',\n\tEVENT_ACTION = 'atp.event.action',\n\tTIMESTAMP = 'atp.timestamp',\n\n\tCLIENT_ID = 'atp.client.id',\n\tUSER_ID = 'atp.user.id',\n\tIP_ADDRESS = 'atp.ip_address',\n\tUSER_AGENT = 'atp.user_agent',\n\tSTATUS = 'atp.status',\n\n\tRESOURCE = 'atp.resource',\n\tRESOURCE_ID = 'atp.resource.id',\n\n\tTOOL_NAME = 'atp.tool.name',\n\tTOOL_INPUT_SIZE = 'tool.input_size',\n\tTOOL_OUTPUT_SIZE = 'tool.output_size',\n\tAPI_GROUP = 'atp.api.group',\n\n\tDURATION_MS = 'atp.duration_ms',\n\tMEMORY_BYTES = 'atp.memory_bytes',\n\tLLM_CALLS = 'atp.llm_calls',\n\tHTTP_CALLS = 'atp.http_calls',\n\n\tRISK_SCORE = 'atp.security.risk_score',\n\tSECURITY_EVENTS = 'atp.security.events',\n\tSECURITY_EVENTS_COUNT = 'atp.security.events_count',\n\n\tERROR_MESSAGE = 'atp.error.message',\n\tERROR_CODE = 'atp.error.code',\n\tERROR_STACK = 'atp.error.stack',\n}\n\n/**\n * Metric configurations\n */\nexport const METRIC_CONFIGS = {\n\t[OTelCounter.EXECUTIONS_TOTAL]: {\n\t\tdescription: 'Total number of executions',\n\t\tunit: '1',\n\t},\n\t[OTelCounter.TOOLS_CALLS]: {\n\t\tdescription: 'Tool call count',\n\t\tunit: '1',\n\t},\n\t[OTelCounter.LLM_CALLS]: {\n\t\tdescription: 'LLM call count',\n\t\tunit: '1',\n\t},\n\t[OTelCounter.APPROVALS_TOTAL]: {\n\t\tdescription: 'Approval request count',\n\t\tunit: '1',\n\t},\n\t[OTelCounter.SECURITY_EVENTS]: {\n\t\tdescription: 'Security events count',\n\t\tunit: '1',\n\t},\n\t[OTelHistogram.EXECUTION_DURATION]: {\n\t\tdescription: 'Execution duration in milliseconds',\n\t\tunit: 'ms',\n\t},\n\t[OTelHistogram.TOOL_DURATION]: {\n\t\tdescription: 'Tool execution duration',\n\t\tunit: 'ms',\n\t},\n} as const;\n\n/**\n * OpenTelemetry tracer and meter names\n */\nexport const OTEL_SERVICE_NAME = 'agent-tool-protocol';\nexport const OTEL_TRACER_NAME = 'agent-tool-protocol';\nexport const OTEL_METER_NAME = 'agent-tool-protocol';\n\n/**\n * Attribute prefixes for custom metadata\n */\nexport const ATTRIBUTE_PREFIX_TOOL = 'atp.tool';\nexport const ATTRIBUTE_PREFIX_METADATA = 'atp.metadata';\n","import { trace, context, SpanStatusCode, metrics, Span } from '@opentelemetry/api';\nimport type { AuditSink, AuditEvent } from '@mondaydotcomorg/atp-protocol';\nimport {\n\tOTelCounter,\n\tOTelHistogram,\n\tOTelAttribute,\n\tMETRIC_CONFIGS,\n\tOTEL_TRACER_NAME,\n\tOTEL_METER_NAME,\n\tATTRIBUTE_PREFIX_TOOL,\n\tATTRIBUTE_PREFIX_METADATA,\n} from './otel-metrics.js';\n\n/**\n * OpenTelemetry-based audit sink\n * Provides industry-standard observability with distributed tracing and metrics\n */\nexport class OpenTelemetryAuditSink implements AuditSink {\n\tname = 'opentelemetry';\n\tprivate tracer = trace.getTracer(OTEL_TRACER_NAME);\n\tprivate meter = metrics.getMeter(OTEL_METER_NAME);\n\n\tprivate executionCounter = this.meter.createCounter(\n\t\tOTelCounter.EXECUTIONS_TOTAL,\n\t\tMETRIC_CONFIGS[OTelCounter.EXECUTIONS_TOTAL]\n\t);\n\n\tprivate toolCallCounter = this.meter.createCounter(\n\t\tOTelCounter.TOOLS_CALLS,\n\t\tMETRIC_CONFIGS[OTelCounter.TOOLS_CALLS]\n\t);\n\n\tprivate llmCallCounter = this.meter.createCounter(\n\t\tOTelCounter.LLM_CALLS,\n\t\tMETRIC_CONFIGS[OTelCounter.LLM_CALLS]\n\t);\n\n\tprivate approvalCounter = this.meter.createCounter(\n\t\tOTelCounter.APPROVALS_TOTAL,\n\t\tMETRIC_CONFIGS[OTelCounter.APPROVALS_TOTAL]\n\t);\n\n\tprivate executionDuration = this.meter.createHistogram(\n\t\tOTelHistogram.EXECUTION_DURATION,\n\t\tMETRIC_CONFIGS[OTelHistogram.EXECUTION_DURATION]\n\t);\n\n\tprivate toolDuration = this.meter.createHistogram(\n\t\tOTelHistogram.TOOL_DURATION,\n\t\tMETRIC_CONFIGS[OTelHistogram.TOOL_DURATION]\n\t);\n\n\tasync write(event: AuditEvent): Promise<void> {\n\t\tconst span = this.tracer.startSpan(`atp.${event.eventType}.${event.action}`, {\n\t\t\tattributes: this.buildAttributes(event),\n\t\t});\n\n\t\tawait context.with(trace.setSpan(context.active(), span), async () => {\n\t\t\ttry {\n\t\t\t\tthis.handleEvent(span, event);\n\t\t\t\tthis.recordMetrics(event);\n\t\t\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t\t\t} catch (error: any) {\n\t\t\t\tspan.setStatus({\n\t\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t});\n\t\t\t\tspan.recordException(error);\n\t\t\t} finally {\n\t\t\t\tspan.end();\n\t\t\t}\n\t\t});\n\t}\n\n\tasync writeBatch(events: AuditEvent[]): Promise<void> {\n\t\tawait Promise.all(events.map((event) => this.write(event)));\n\t}\n\n\tprivate buildAttributes(event: AuditEvent): Record<string, any> {\n\t\tconst attrs: Record<string, any> = {\n\t\t\t[OTelAttribute.EVENT_ID]: event.eventId,\n\t\t\t[OTelAttribute.EVENT_TYPE]: event.eventType,\n\t\t\t[OTelAttribute.EVENT_ACTION]: event.action,\n\t\t\t[OTelAttribute.TIMESTAMP]: event.timestamp,\n\n\t\t\t[OTelAttribute.CLIENT_ID]: event.clientId,\n\t\t\t[OTelAttribute.STATUS]: event.status,\n\t\t};\n\n\t\tif (event.userId) attrs[OTelAttribute.USER_ID] = event.userId;\n\t\tif (event.ipAddress) attrs[OTelAttribute.IP_ADDRESS] = event.ipAddress;\n\t\tif (event.userAgent) attrs[OTelAttribute.USER_AGENT] = event.userAgent;\n\n\t\tif (event.resource) attrs[OTelAttribute.RESOURCE] = event.resource;\n\t\tif (event.resourceId) attrs[OTelAttribute.RESOURCE_ID] = event.resourceId;\n\n\t\tif (event.toolName) attrs[OTelAttribute.TOOL_NAME] = event.toolName;\n\t\tif (event.apiGroup) attrs[OTelAttribute.API_GROUP] = event.apiGroup;\n\n\t\tif (event.duration !== undefined) attrs[OTelAttribute.DURATION_MS] = event.duration;\n\t\tif (event.memoryUsed !== undefined) attrs[OTelAttribute.MEMORY_BYTES] = event.memoryUsed;\n\t\tif (event.llmCallsCount !== undefined) attrs[OTelAttribute.LLM_CALLS] = event.llmCallsCount;\n\t\tif (event.httpCallsCount !== undefined) attrs[OTelAttribute.HTTP_CALLS] = event.httpCallsCount;\n\n\t\tif (event.riskScore !== undefined) attrs[OTelAttribute.RISK_SCORE] = event.riskScore;\n\t\tif (event.securityEvents && event.securityEvents.length > 0) {\n\t\t\tattrs[OTelAttribute.SECURITY_EVENTS] = JSON.stringify(event.securityEvents);\n\t\t\tattrs[OTelAttribute.SECURITY_EVENTS_COUNT] = event.securityEvents.length;\n\t\t}\n\n\t\tif (event.error) {\n\t\t\tattrs[OTelAttribute.ERROR_MESSAGE] = event.error.message;\n\t\t\tif (event.error.code) attrs[OTelAttribute.ERROR_CODE] = event.error.code;\n\t\t\tif (event.error.stack) attrs[OTelAttribute.ERROR_STACK] = event.error.stack;\n\t\t}\n\n\t\tif (event.annotations) {\n\t\t\tObject.assign(attrs, this.flattenObject(event.annotations, ATTRIBUTE_PREFIX_TOOL));\n\t\t}\n\n\t\tif (event.metadata) {\n\t\t\tObject.assign(attrs, this.flattenObject(event.metadata, ATTRIBUTE_PREFIX_METADATA));\n\t\t}\n\n\t\treturn attrs;\n\t}\n\n\tprivate handleEvent(span: Span, event: AuditEvent): void {\n\t\tswitch (event.eventType) {\n\t\t\tcase 'execution':\n\t\t\t\tif (event.action === 'start') {\n\t\t\t\t\tspan.addEvent('Execution started', {\n\t\t\t\t\t\t'client.id': event.clientId,\n\t\t\t\t\t\t'resource.id': event.resourceId,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.action === 'complete') {\n\t\t\t\t\tspan.addEvent('Execution completed', {\n\t\t\t\t\t\tduration_ms: event.duration,\n\t\t\t\t\t\tstatus: event.status,\n\t\t\t\t\t\tllm_calls: event.llmCallsCount,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.action === 'pause') {\n\t\t\t\t\tspan.addEvent('Execution paused', {\n\t\t\t\t\t\tstatus: event.status,\n\t\t\t\t\t});\n\t\t\t\t} else if (event.action === 'resume') {\n\t\t\t\t\tspan.addEvent('Execution resumed', {\n\t\t\t\t\t\t'resource.id': event.resourceId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'tool_call':\n\t\t\t\tspan.addEvent(`Tool ${event.action}`, {\n\t\t\t\t\t'tool.name': event.toolName,\n\t\t\t\t\t'api.group': event.apiGroup,\n\t\t\t\t\tduration_ms: event.duration,\n\t\t\t\t});\n\t\t\t\tif (event.input) {\n\t\t\t\t\tspan.setAttribute(OTelAttribute.TOOL_INPUT_SIZE, JSON.stringify(event.input).length);\n\t\t\t\t}\n\t\t\t\tif (event.output) {\n\t\t\t\t\tspan.setAttribute(OTelAttribute.TOOL_OUTPUT_SIZE, JSON.stringify(event.output).length);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'llm_call':\n\t\t\t\tspan.addEvent('LLM call', {\n\t\t\t\t\tduration_ms: event.duration,\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase 'approval':\n\t\t\t\tspan.addEvent(`Approval ${event.action}`, {\n\t\t\t\t\t'tool.name': event.toolName,\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase 'error':\n\t\t\t\tif (event.error) {\n\t\t\t\t\tspan.addEvent('Error occurred', {\n\t\t\t\t\t\t'error.message': event.error.message,\n\t\t\t\t\t\t'error.code': event.error.code,\n\t\t\t\t\t});\n\t\t\t\t\tspan.recordException(new Error(event.error.message));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'client_init':\n\t\t\t\tspan.addEvent('Client initialized', {\n\t\t\t\t\t'client.id': event.clientId,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (event.securityEvents && event.securityEvents.length > 0) {\n\t\t\tfor (const secEvent of event.securityEvents) {\n\t\t\t\tspan.addEvent('Security event', {\n\t\t\t\t\t'security.event': secEvent,\n\t\t\t\t\t'security.risk_score': event.riskScore,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate recordMetrics(event: AuditEvent): void {\n\t\tconst commonAttrs: Record<string, any> = {\n\t\t\tclient_id: event.clientId,\n\t\t\tevent_type: event.eventType,\n\t\t\tstatus: event.status,\n\t\t};\n\n\t\tswitch (event.eventType) {\n\t\t\tcase 'execution':\n\t\t\t\tthis.executionCounter.add(1, {\n\t\t\t\t\t...commonAttrs,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\n\t\t\t\tif (event.duration !== undefined) {\n\t\t\t\t\tthis.executionDuration.record(event.duration, {\n\t\t\t\t\t\t...commonAttrs,\n\t\t\t\t\t\taction: event.action,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'tool_call':\n\t\t\t\tthis.toolCallCounter.add(1, {\n\t\t\t\t\t...commonAttrs,\n\t\t\t\t\ttool_name: event.toolName,\n\t\t\t\t\tapi_group: event.apiGroup,\n\t\t\t\t});\n\n\t\t\t\tif (event.duration !== undefined) {\n\t\t\t\t\tthis.toolDuration.record(event.duration, {\n\t\t\t\t\t\t...commonAttrs,\n\t\t\t\t\t\ttool_name: event.toolName,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'llm_call':\n\t\t\t\tthis.llmCallCounter.add(1, commonAttrs);\n\t\t\t\tbreak;\n\n\t\t\tcase 'approval':\n\t\t\t\tthis.approvalCounter.add(1, {\n\t\t\t\t\t...commonAttrs,\n\t\t\t\t\taction: event.action,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (event.securityEvents && event.securityEvents.length > 0) {\n\t\t\tconst securityEventCounter = this.meter.createCounter(\n\t\t\t\tOTelCounter.SECURITY_EVENTS,\n\t\t\t\tMETRIC_CONFIGS[OTelCounter.SECURITY_EVENTS]\n\t\t\t);\n\t\t\tsecurityEventCounter.add(event.securityEvents.length, {\n\t\t\t\t...commonAttrs,\n\t\t\t\trisk_score: event.riskScore,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate flattenObject(obj: any, prefix: string): Record<string, any> {\n\t\tconst result: Record<string, any> = {};\n\t\tif (!obj || typeof obj !== 'object') return result;\n\n\t\tfor (const [key, value] of Object.entries(obj)) {\n\t\t\tconst fullKey = `${prefix}.${key}`;\n\t\t\tif (value === null || value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t\tObject.assign(result, this.flattenObject(value, fullKey));\n\t\t\t} else if (Array.isArray(value)) {\n\t\t\t\tresult[fullKey] = JSON.stringify(value);\n\t\t\t} else {\n\t\t\t\tresult[fullKey] = value;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n"]}
|