@stackmemoryai/stackmemory 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/agents/verifiers/base-verifier.js.map +2 -2
  2. package/dist/agents/verifiers/formatter-verifier.js.map +2 -2
  3. package/dist/agents/verifiers/llm-judge.js.map +2 -2
  4. package/dist/cli/claude-sm.js +24 -13
  5. package/dist/cli/claude-sm.js.map +2 -2
  6. package/dist/cli/codex-sm.js +24 -13
  7. package/dist/cli/codex-sm.js.map +2 -2
  8. package/dist/cli/commands/agent.js.map +2 -2
  9. package/dist/cli/commands/chromadb.js +217 -32
  10. package/dist/cli/commands/chromadb.js.map +2 -2
  11. package/dist/cli/commands/clear.js +12 -1
  12. package/dist/cli/commands/clear.js.map +2 -2
  13. package/dist/cli/commands/context.js +13 -2
  14. package/dist/cli/commands/context.js.map +2 -2
  15. package/dist/cli/commands/dashboard.js.map +2 -2
  16. package/dist/cli/commands/gc.js +202 -0
  17. package/dist/cli/commands/gc.js.map +7 -0
  18. package/dist/cli/commands/handoff.js +12 -1
  19. package/dist/cli/commands/handoff.js.map +2 -2
  20. package/dist/cli/commands/infinite-storage.js +251 -0
  21. package/dist/cli/commands/infinite-storage.js.map +7 -0
  22. package/dist/cli/commands/linear-create.js +13 -2
  23. package/dist/cli/commands/linear-create.js.map +2 -2
  24. package/dist/cli/commands/linear-list.js +12 -1
  25. package/dist/cli/commands/linear-list.js.map +2 -2
  26. package/dist/cli/commands/linear-migrate.js +12 -1
  27. package/dist/cli/commands/linear-migrate.js.map +2 -2
  28. package/dist/cli/commands/linear-test.js +12 -1
  29. package/dist/cli/commands/linear-test.js.map +2 -2
  30. package/dist/cli/commands/linear-unified.js +262 -0
  31. package/dist/cli/commands/linear-unified.js.map +7 -0
  32. package/dist/cli/commands/linear.js +17 -6
  33. package/dist/cli/commands/linear.js.map +2 -2
  34. package/dist/cli/commands/monitor.js.map +2 -2
  35. package/dist/cli/commands/onboard.js.map +2 -2
  36. package/dist/cli/commands/quality.js.map +2 -2
  37. package/dist/cli/commands/search.js.map +2 -2
  38. package/dist/cli/commands/session.js.map +2 -2
  39. package/dist/cli/commands/skills.js +12 -1
  40. package/dist/cli/commands/skills.js.map +2 -2
  41. package/dist/cli/commands/storage.js +18 -7
  42. package/dist/cli/commands/storage.js.map +2 -2
  43. package/dist/cli/commands/tasks.js.map +2 -2
  44. package/dist/cli/commands/tui.js +13 -2
  45. package/dist/cli/commands/tui.js.map +2 -2
  46. package/dist/cli/commands/webhook.js +14 -3
  47. package/dist/cli/commands/webhook.js.map +2 -2
  48. package/dist/cli/commands/workflow.js +14 -3
  49. package/dist/cli/commands/workflow.js.map +2 -2
  50. package/dist/cli/commands/worktree.js.map +2 -2
  51. package/dist/cli/index.js +20 -5
  52. package/dist/cli/index.js.map +2 -2
  53. package/dist/core/config/config-manager.js.map +2 -2
  54. package/dist/core/context/auto-context.js.map +2 -2
  55. package/dist/core/context/compaction-handler.js.map +2 -2
  56. package/dist/core/context/context-bridge.js.map +2 -2
  57. package/dist/core/context/dual-stack-manager.js.map +2 -2
  58. package/dist/core/context/frame-database.js.map +2 -2
  59. package/dist/core/context/frame-digest.js.map +2 -2
  60. package/dist/core/context/frame-handoff-manager.js.map +2 -2
  61. package/dist/core/context/frame-manager.js +12 -1
  62. package/dist/core/context/frame-manager.js.map +2 -2
  63. package/dist/core/context/frame-stack.js.map +2 -2
  64. package/dist/core/context/incremental-gc.js +279 -0
  65. package/dist/core/context/incremental-gc.js.map +7 -0
  66. package/dist/core/context/permission-manager.js +12 -1
  67. package/dist/core/context/permission-manager.js.map +2 -2
  68. package/dist/core/context/refactored-frame-manager.js.map +2 -2
  69. package/dist/core/context/shared-context-layer.js +12 -1
  70. package/dist/core/context/shared-context-layer.js.map +2 -2
  71. package/dist/core/context/stack-merge-resolver.js.map +2 -2
  72. package/dist/core/context/validation.js.map +2 -2
  73. package/dist/core/database/batch-operations.js.map +2 -2
  74. package/dist/core/database/connection-pool.js.map +2 -2
  75. package/dist/core/database/migration-manager.js.map +2 -2
  76. package/dist/core/database/paradedb-adapter.js.map +2 -2
  77. package/dist/core/database/query-cache.js.map +2 -2
  78. package/dist/core/database/query-router.js.map +2 -2
  79. package/dist/core/database/sqlite-adapter.js.map +2 -2
  80. package/dist/core/digest/enhanced-hybrid-digest.js.map +2 -2
  81. package/dist/core/errors/recovery.js.map +2 -2
  82. package/dist/core/merge/resolution-engine.js.map +2 -2
  83. package/dist/core/monitoring/error-handler.js.map +2 -2
  84. package/dist/core/monitoring/logger.js +14 -3
  85. package/dist/core/monitoring/logger.js.map +2 -2
  86. package/dist/core/monitoring/metrics.js +13 -2
  87. package/dist/core/monitoring/metrics.js.map +2 -2
  88. package/dist/core/monitoring/progress-tracker.js +12 -1
  89. package/dist/core/monitoring/progress-tracker.js.map +2 -2
  90. package/dist/core/monitoring/session-monitor.js.map +2 -2
  91. package/dist/core/performance/context-cache.js.map +2 -2
  92. package/dist/core/performance/lazy-context-loader.js.map +2 -2
  93. package/dist/core/performance/monitor.js.map +2 -2
  94. package/dist/core/performance/optimized-frame-context.js.map +2 -2
  95. package/dist/core/performance/performance-benchmark.js.map +2 -2
  96. package/dist/core/performance/performance-profiler.js +12 -1
  97. package/dist/core/performance/performance-profiler.js.map +2 -2
  98. package/dist/core/performance/streaming-jsonl-parser.js.map +2 -2
  99. package/dist/core/persistence/postgres-adapter.js.map +2 -2
  100. package/dist/core/projects/project-manager.js.map +2 -2
  101. package/dist/core/retrieval/context-retriever.js.map +2 -2
  102. package/dist/core/retrieval/graph-retrieval.js.map +2 -2
  103. package/dist/core/retrieval/llm-context-retrieval.js.map +2 -2
  104. package/dist/core/retrieval/retrieval-benchmarks.js.map +2 -2
  105. package/dist/core/retrieval/summary-generator.js.map +2 -2
  106. package/dist/core/session/clear-survival.js.map +2 -2
  107. package/dist/core/session/handoff-generator.js.map +2 -2
  108. package/dist/core/session/session-manager.js +16 -5
  109. package/dist/core/session/session-manager.js.map +2 -2
  110. package/dist/core/skills/skill-storage.js +13 -2
  111. package/dist/core/skills/skill-storage.js.map +2 -2
  112. package/dist/core/storage/chromadb-adapter.js.map +2 -2
  113. package/dist/core/storage/chromadb-simple.js +160 -0
  114. package/dist/core/storage/chromadb-simple.js.map +7 -0
  115. package/dist/core/storage/infinite-storage.js +443 -0
  116. package/dist/core/storage/infinite-storage.js.map +7 -0
  117. package/dist/core/storage/railway-optimized-storage.js +19 -8
  118. package/dist/core/storage/railway-optimized-storage.js.map +2 -2
  119. package/dist/core/storage/remote-storage.js +12 -1
  120. package/dist/core/storage/remote-storage.js.map +2 -2
  121. package/dist/core/trace/cli-trace-wrapper.js +16 -5
  122. package/dist/core/trace/cli-trace-wrapper.js.map +2 -2
  123. package/dist/core/trace/db-trace-wrapper.js.map +2 -2
  124. package/dist/core/trace/debug-trace.js +21 -10
  125. package/dist/core/trace/debug-trace.js.map +2 -2
  126. package/dist/core/trace/index.js +46 -35
  127. package/dist/core/trace/index.js.map +2 -2
  128. package/dist/core/trace/trace-demo.js +12 -1
  129. package/dist/core/trace/trace-demo.js.map +2 -2
  130. package/dist/core/trace/trace-detector.js.map +2 -2
  131. package/dist/core/trace/trace-store.js.map +2 -2
  132. package/dist/core/utils/compression.js +79 -0
  133. package/dist/core/utils/compression.js.map +7 -0
  134. package/dist/core/utils/update-checker.js.map +2 -2
  135. package/dist/core/worktree/worktree-manager.js.map +2 -2
  136. package/dist/features/analytics/api/analytics-api.js.map +2 -2
  137. package/dist/features/analytics/core/analytics-service.js +12 -1
  138. package/dist/features/analytics/core/analytics-service.js.map +2 -2
  139. package/dist/features/analytics/queries/metrics-queries.js.map +2 -2
  140. package/dist/features/tasks/pebbles-task-store.js.map +2 -2
  141. package/dist/features/tui/components/analytics-panel.js.map +2 -2
  142. package/dist/features/tui/components/pr-tracker.js.map +2 -2
  143. package/dist/features/tui/components/session-monitor.js.map +2 -2
  144. package/dist/features/tui/components/subagent-fleet.js.map +2 -2
  145. package/dist/features/tui/components/task-board.js +650 -2
  146. package/dist/features/tui/components/task-board.js.map +2 -2
  147. package/dist/features/tui/index.js +16 -5
  148. package/dist/features/tui/index.js.map +2 -2
  149. package/dist/features/tui/services/data-service.js +35 -52
  150. package/dist/features/tui/services/data-service.js.map +2 -2
  151. package/dist/features/tui/services/linear-task-reader.js +100 -0
  152. package/dist/features/tui/services/linear-task-reader.js.map +7 -0
  153. package/dist/features/tui/services/websocket-client.js +13 -2
  154. package/dist/features/tui/services/websocket-client.js.map +2 -2
  155. package/dist/features/tui/terminal-compat.js +27 -16
  156. package/dist/features/tui/terminal-compat.js.map +2 -2
  157. package/dist/features/web/client/stores/task-store.js +22 -0
  158. package/dist/features/web/client/stores/task-store.js.map +7 -0
  159. package/dist/features/web/server/index.js +182 -0
  160. package/dist/features/web/server/index.js.map +7 -0
  161. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +2 -2
  162. package/dist/integrations/claude-code/lifecycle-hooks.js.map +2 -2
  163. package/dist/integrations/claude-code/post-task-hooks.js.map +2 -2
  164. package/dist/integrations/linear/auth.js +17 -6
  165. package/dist/integrations/linear/auth.js.map +2 -2
  166. package/dist/integrations/linear/auto-sync.js.map +2 -2
  167. package/dist/integrations/linear/client.js.map +2 -2
  168. package/dist/integrations/linear/config.js.map +2 -2
  169. package/dist/integrations/linear/migration.js.map +2 -2
  170. package/dist/integrations/linear/oauth-server.js +13 -2
  171. package/dist/integrations/linear/oauth-server.js.map +2 -2
  172. package/dist/integrations/linear/rest-client.js.map +2 -2
  173. package/dist/integrations/linear/sync-enhanced.js +202 -0
  174. package/dist/integrations/linear/sync-enhanced.js.map +7 -0
  175. package/dist/integrations/linear/sync-manager.js.map +2 -2
  176. package/dist/integrations/linear/sync-service.js +12 -1
  177. package/dist/integrations/linear/sync-service.js.map +2 -2
  178. package/dist/integrations/linear/sync.js +34 -3
  179. package/dist/integrations/linear/sync.js.map +2 -2
  180. package/dist/integrations/linear/unified-sync.js +560 -0
  181. package/dist/integrations/linear/unified-sync.js.map +7 -0
  182. package/dist/integrations/linear/webhook-handler.js +12 -1
  183. package/dist/integrations/linear/webhook-handler.js.map +2 -2
  184. package/dist/integrations/linear/webhook-server.js +14 -3
  185. package/dist/integrations/linear/webhook-server.js.map +2 -2
  186. package/dist/integrations/linear/webhook.js +12 -1
  187. package/dist/integrations/linear/webhook.js.map +2 -2
  188. package/dist/integrations/mcp/handlers/context-handlers.js.map +2 -2
  189. package/dist/integrations/mcp/handlers/linear-handlers.js.map +2 -2
  190. package/dist/integrations/mcp/handlers/skill-handlers.js +13 -2
  191. package/dist/integrations/mcp/handlers/skill-handlers.js.map +2 -2
  192. package/dist/integrations/mcp/handlers/task-handlers.js.map +2 -2
  193. package/dist/integrations/mcp/handlers/trace-handlers.js.map +2 -2
  194. package/dist/integrations/mcp/middleware/tool-scoring.js.map +2 -2
  195. package/dist/integrations/mcp/refactored-server.js +15 -4
  196. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  197. package/dist/integrations/mcp/server.js +12 -1
  198. package/dist/integrations/mcp/server.js.map +2 -2
  199. package/dist/integrations/mcp/tool-definitions.js.map +2 -2
  200. package/dist/integrations/pg-aiguide/embedding-provider.js +13 -2
  201. package/dist/integrations/pg-aiguide/embedding-provider.js.map +2 -2
  202. package/dist/integrations/pg-aiguide/semantic-search.js.map +2 -2
  203. package/dist/mcp/stackmemory-mcp-server.js +12 -1
  204. package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
  205. package/dist/middleware/exponential-rate-limiter.js.map +2 -2
  206. package/dist/servers/production/auth-middleware.js +13 -2
  207. package/dist/servers/production/auth-middleware.js.map +2 -2
  208. package/dist/servers/railway/index.js +22 -11
  209. package/dist/servers/railway/index.js.map +2 -2
  210. package/dist/services/config-service.js.map +2 -2
  211. package/dist/services/context-service.js.map +2 -2
  212. package/dist/skills/claude-skills.js +150 -1
  213. package/dist/skills/claude-skills.js.map +2 -2
  214. package/dist/skills/dashboard-launcher.js +212 -0
  215. package/dist/skills/dashboard-launcher.js.map +7 -0
  216. package/dist/skills/repo-ingestion-skill.js +561 -0
  217. package/dist/skills/repo-ingestion-skill.js.map +7 -0
  218. package/dist/utils/logger.js +12 -1
  219. package/dist/utils/logger.js.map +2 -2
  220. package/package.json +7 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/performance/context-cache.ts"],
4
- "sourcesContent": ["/**\n * High-Performance Context Cache\n * LRU cache with TTL for frequently accessed context data\n */\n\nimport { EventEmitter } from 'events';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface CacheEntry<T> {\n value: T;\n size: number;\n hits: number;\n createdAt: number;\n lastAccessed: number;\n ttl?: number;\n}\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n evictions: number;\n size: number;\n itemCount: number;\n hitRate: number;\n avgAccessTime: number;\n}\n\nexport interface CacheOptions {\n maxSize?: number; // Max memory in bytes\n maxItems?: number; // Max number of items\n defaultTTL?: number; // Default TTL in ms\n enableStats?: boolean;\n onEvict?: (key: string, entry: CacheEntry<any>) => void;\n}\n\nexport class ContextCache<T = any> extends EventEmitter {\n private cache = new Map<string, CacheEntry<T>>();\n private accessOrder: string[] = [];\n private options: Required<CacheOptions>;\n private stats: CacheStats;\n private currentSize = 0;\n\n constructor(options: CacheOptions = {}) {\n super();\n this.options = {\n maxSize: options.maxSize || 100 * 1024 * 1024, // 100MB default\n maxItems: options.maxItems || 10000,\n defaultTTL: options.defaultTTL || 3600000, // 1 hour default\n enableStats: options.enableStats ?? true,\n onEvict: options.onEvict || (() => {}),\n };\n\n this.stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n size: 0,\n itemCount: 0,\n hitRate: 0,\n avgAccessTime: 0,\n };\n }\n\n /**\n * Get item from cache\n */\n get(key: string): T | undefined {\n const startTime = Date.now();\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.stats.misses++;\n this.updateHitRate();\n return undefined;\n }\n\n // Check TTL\n if (entry.ttl && Date.now() - entry.createdAt > entry.ttl) {\n this.delete(key);\n this.stats.misses++;\n this.updateHitRate();\n return undefined;\n }\n\n // Update access tracking\n entry.hits++;\n entry.lastAccessed = Date.now();\n this.updateAccessOrder(key);\n\n this.stats.hits++;\n this.updateHitRate();\n this.updateAvgAccessTime(Date.now() - startTime);\n\n return entry.value;\n }\n\n /**\n * Set item in cache\n */\n set(key: string, value: T, options: { ttl?: number; size?: number } = {}): void {\n const size = options.size || this.estimateSize(value);\n const ttl = options.ttl ?? this.options.defaultTTL;\n\n // Check if we need to evict\n if (this.cache.size >= this.options.maxItems || \n this.currentSize + size > this.options.maxSize) {\n this.evict(size);\n }\n\n // Remove old entry if exists\n if (this.cache.has(key)) {\n this.delete(key);\n }\n\n const entry: CacheEntry<T> = {\n value,\n size,\n hits: 0,\n createdAt: Date.now(),\n lastAccessed: Date.now(),\n ttl,\n };\n\n this.cache.set(key, entry);\n this.accessOrder.push(key);\n this.currentSize += size;\n this.stats.size = this.currentSize;\n this.stats.itemCount = this.cache.size;\n\n this.emit('set', key, value);\n }\n\n /**\n * Delete item from cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n this.cache.delete(key);\n this.currentSize -= entry.size;\n this.accessOrder = this.accessOrder.filter(k => k !== key);\n \n this.stats.size = this.currentSize;\n this.stats.itemCount = this.cache.size;\n\n this.emit('delete', key);\n return true;\n }\n\n /**\n * Clear entire cache\n */\n clear(): void {\n const oldSize = this.cache.size;\n this.cache.clear();\n this.accessOrder = [];\n this.currentSize = 0;\n \n this.stats.size = 0;\n this.stats.itemCount = 0;\n this.stats.evictions += oldSize;\n\n this.emit('clear');\n }\n\n /**\n * Check if key exists and is valid\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n \n // Check TTL\n if (entry.ttl && Date.now() - entry.createdAt > entry.ttl) {\n this.delete(key);\n return false;\n }\n \n return true;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n return { ...this.stats };\n }\n\n /**\n * Get cache size info\n */\n getSize(): { bytes: number; items: number; utilization: number } {\n return {\n bytes: this.currentSize,\n items: this.cache.size,\n utilization: this.currentSize / this.options.maxSize,\n };\n }\n\n /**\n * Preload multiple items\n */\n preload(entries: Array<{ key: string; value: T; ttl?: number; size?: number }>): void {\n const startTime = Date.now();\n \n for (const entry of entries) {\n this.set(entry.key, entry.value, {\n ttl: entry.ttl,\n size: entry.size,\n });\n }\n\n logger.debug('Cache preload complete', {\n items: entries.length,\n duration: Date.now() - startTime,\n cacheSize: this.currentSize,\n });\n }\n\n /**\n * Get multiple items efficiently\n */\n getMany(keys: string[]): Map<string, T> {\n const results = new Map<string, T>();\n \n for (const key of keys) {\n const value = this.get(key);\n if (value !== undefined) {\n results.set(key, value);\n }\n }\n \n return results;\n }\n\n /**\n * Warm cache with computed values\n */\n async warmUp(\n keys: string[],\n compute: (key: string) => Promise<T>,\n options: { ttl?: number; parallel?: boolean } = {}\n ): Promise<void> {\n const { parallel = true } = options;\n \n if (parallel) {\n const promises = keys.map(async key => {\n if (!this.has(key)) {\n const value = await compute(key);\n this.set(key, value, { ttl: options.ttl });\n }\n });\n await Promise.all(promises);\n } else {\n for (const key of keys) {\n if (!this.has(key)) {\n const value = await compute(key);\n this.set(key, value, { ttl: options.ttl });\n }\n }\n }\n }\n\n /**\n * Get or compute value\n */\n async getOrCompute(\n key: string,\n compute: () => Promise<T>,\n options: { ttl?: number; size?: number } = {}\n ): Promise<T> {\n const cached = this.get(key);\n if (cached !== undefined) {\n return cached;\n }\n\n const value = await compute();\n this.set(key, value, options);\n return value;\n }\n\n // Private methods\n\n private evict(requiredSize: number): void {\n const startEvictions = this.stats.evictions;\n \n // LRU eviction\n while ((this.cache.size >= this.options.maxItems || \n this.currentSize + requiredSize > this.options.maxSize) && \n this.accessOrder.length > 0) {\n const keyToEvict = this.accessOrder.shift()!;\n const entry = this.cache.get(keyToEvict);\n \n if (entry) {\n this.cache.delete(keyToEvict);\n this.currentSize -= entry.size;\n this.stats.evictions++;\n this.options.onEvict(keyToEvict, entry);\n this.emit('evict', keyToEvict, entry);\n }\n }\n\n if (this.stats.evictions > startEvictions) {\n logger.debug('Cache eviction', {\n evicted: this.stats.evictions - startEvictions,\n currentSize: this.currentSize,\n requiredSize,\n });\n }\n }\n\n private updateAccessOrder(key: string): void {\n const index = this.accessOrder.indexOf(key);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n }\n this.accessOrder.push(key);\n }\n\n private estimateSize(value: T): number {\n // Simple size estimation - can be overridden for specific types\n if (typeof value === 'string') {\n return value.length * 2; // UTF-16\n }\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value).length * 2;\n }\n return 8; // Default for primitives\n }\n\n private updateHitRate(): void {\n const total = this.stats.hits + this.stats.misses;\n this.stats.hitRate = total > 0 ? this.stats.hits / total : 0;\n }\n\n private updateAvgAccessTime(time: number): void {\n const alpha = 0.1; // Exponential moving average factor\n this.stats.avgAccessTime = this.stats.avgAccessTime * (1 - alpha) + time * alpha;\n }\n\n /**\n * Cleanup expired entries periodically\n */\n startCleanup(intervalMs: number = 60000): NodeJS.Timeout {\n return setInterval(() => {\n let cleaned = 0;\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ttl && Date.now() - entry.createdAt > entry.ttl) {\n this.delete(key);\n cleaned++;\n }\n }\n if (cleaned > 0) {\n logger.debug('Cache cleanup', { cleaned, remaining: this.cache.size });\n }\n }, intervalMs);\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * High-Performance Context Cache\n * LRU cache with TTL for frequently accessed context data\n */\n\nimport { EventEmitter } from 'events';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface CacheEntry<T> {\n value: T;\n size: number;\n hits: number;\n createdAt: number;\n lastAccessed: number;\n ttl?: number;\n}\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n evictions: number;\n size: number;\n itemCount: number;\n hitRate: number;\n avgAccessTime: number;\n}\n\nexport interface CacheOptions {\n maxSize?: number; // Max memory in bytes\n maxItems?: number; // Max number of items\n defaultTTL?: number; // Default TTL in ms\n enableStats?: boolean;\n onEvict?: (key: string, entry: CacheEntry<any>) => void;\n}\n\nexport class ContextCache<T = any> extends EventEmitter {\n private cache = new Map<string, CacheEntry<T>>();\n private accessOrder: string[] = [];\n private options: Required<CacheOptions>;\n private stats: CacheStats;\n private currentSize = 0;\n\n constructor(options: CacheOptions = {}) {\n super();\n this.options = {\n maxSize: options.maxSize || 100 * 1024 * 1024, // 100MB default\n maxItems: options.maxItems || 10000,\n defaultTTL: options.defaultTTL || 3600000, // 1 hour default\n enableStats: options.enableStats ?? true,\n onEvict: options.onEvict || (() => {}),\n };\n\n this.stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n size: 0,\n itemCount: 0,\n hitRate: 0,\n avgAccessTime: 0,\n };\n }\n\n /**\n * Get item from cache\n */\n get(key: string): T | undefined {\n const startTime = Date.now();\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.stats.misses++;\n this.updateHitRate();\n return undefined;\n }\n\n // Check TTL\n if (entry.ttl && Date.now() - entry.createdAt > entry.ttl) {\n this.delete(key);\n this.stats.misses++;\n this.updateHitRate();\n return undefined;\n }\n\n // Update access tracking\n entry.hits++;\n entry.lastAccessed = Date.now();\n this.updateAccessOrder(key);\n\n this.stats.hits++;\n this.updateHitRate();\n this.updateAvgAccessTime(Date.now() - startTime);\n\n return entry.value;\n }\n\n /**\n * Set item in cache\n */\n set(key: string, value: T, options: { ttl?: number; size?: number } = {}): void {\n const size = options.size || this.estimateSize(value);\n const ttl = options.ttl ?? this.options.defaultTTL;\n\n // Check if we need to evict\n if (this.cache.size >= this.options.maxItems || \n this.currentSize + size > this.options.maxSize) {\n this.evict(size);\n }\n\n // Remove old entry if exists\n if (this.cache.has(key)) {\n this.delete(key);\n }\n\n const entry: CacheEntry<T> = {\n value,\n size,\n hits: 0,\n createdAt: Date.now(),\n lastAccessed: Date.now(),\n ttl,\n };\n\n this.cache.set(key, entry);\n this.accessOrder.push(key);\n this.currentSize += size;\n this.stats.size = this.currentSize;\n this.stats.itemCount = this.cache.size;\n\n this.emit('set', key, value);\n }\n\n /**\n * Delete item from cache\n */\n delete(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n this.cache.delete(key);\n this.currentSize -= entry.size;\n this.accessOrder = this.accessOrder.filter((k: any) => k !== key);\n \n this.stats.size = this.currentSize;\n this.stats.itemCount = this.cache.size;\n\n this.emit('delete', key);\n return true;\n }\n\n /**\n * Clear entire cache\n */\n clear(): void {\n const oldSize = this.cache.size;\n this.cache.clear();\n this.accessOrder = [];\n this.currentSize = 0;\n \n this.stats.size = 0;\n this.stats.itemCount = 0;\n this.stats.evictions += oldSize;\n\n this.emit('clear');\n }\n\n /**\n * Check if key exists and is valid\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n \n // Check TTL\n if (entry.ttl && Date.now() - entry.createdAt > entry.ttl) {\n this.delete(key);\n return false;\n }\n \n return true;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n return { ...this.stats };\n }\n\n /**\n * Get cache size info\n */\n getSize(): { bytes: number; items: number; utilization: number } {\n return {\n bytes: this.currentSize,\n items: this.cache.size,\n utilization: this.currentSize / this.options.maxSize,\n };\n }\n\n /**\n * Preload multiple items\n */\n preload(entries: Array<{ key: string; value: T; ttl?: number; size?: number }>): void {\n const startTime = Date.now();\n \n for (const entry of entries) {\n this.set(entry.key, entry.value, {\n ttl: entry.ttl,\n size: entry.size,\n });\n }\n\n logger.debug('Cache preload complete', {\n items: entries.length,\n duration: Date.now() - startTime,\n cacheSize: this.currentSize,\n });\n }\n\n /**\n * Get multiple items efficiently\n */\n getMany(keys: string[]): Map<string, T> {\n const results = new Map<string, T>();\n \n for (const key of keys) {\n const value = this.get(key);\n if (value !== undefined) {\n results.set(key, value);\n }\n }\n \n return results;\n }\n\n /**\n * Warm cache with computed values\n */\n async warmUp(\n keys: string[],\n compute: (key: string) => Promise<T>,\n options: { ttl?: number; parallel?: boolean } = {}\n ): Promise<void> {\n const { parallel = true } = options;\n \n if (parallel) {\n const promises = keys.map(async key => {\n if (!this.has(key)) {\n const value = await compute(key);\n this.set(key, value, { ttl: options.ttl });\n }\n });\n await Promise.all(promises);\n } else {\n for (const key of keys) {\n if (!this.has(key)) {\n const value = await compute(key);\n this.set(key, value, { ttl: options.ttl });\n }\n }\n }\n }\n\n /**\n * Get or compute value\n */\n async getOrCompute(\n key: string,\n compute: () => Promise<T>,\n options: { ttl?: number; size?: number } = {}\n ): Promise<T> {\n const cached = this.get(key);\n if (cached !== undefined) {\n return cached;\n }\n\n const value = await compute();\n this.set(key, value, options);\n return value;\n }\n\n // Private methods\n\n private evict(requiredSize: number): void {\n const startEvictions = this.stats.evictions;\n \n // LRU eviction\n while ((this.cache.size >= this.options.maxItems || \n this.currentSize + requiredSize > this.options.maxSize) && \n this.accessOrder.length > 0) {\n const keyToEvict = this.accessOrder.shift()!;\n const entry = this.cache.get(keyToEvict);\n \n if (entry) {\n this.cache.delete(keyToEvict);\n this.currentSize -= entry.size;\n this.stats.evictions++;\n this.options.onEvict(keyToEvict, entry);\n this.emit('evict', keyToEvict, entry);\n }\n }\n\n if (this.stats.evictions > startEvictions) {\n logger.debug('Cache eviction', {\n evicted: this.stats.evictions - startEvictions,\n currentSize: this.currentSize,\n requiredSize,\n });\n }\n }\n\n private updateAccessOrder(key: string): void {\n const index = this.accessOrder.indexOf(key);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n }\n this.accessOrder.push(key);\n }\n\n private estimateSize(value: T): number {\n // Simple size estimation - can be overridden for specific types\n if (typeof value === 'string') {\n return value.length * 2; // UTF-16\n }\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value).length * 2;\n }\n return 8; // Default for primitives\n }\n\n private updateHitRate(): void {\n const total = this.stats.hits + this.stats.misses;\n this.stats.hitRate = total > 0 ? this.stats.hits / total : 0;\n }\n\n private updateAvgAccessTime(time: number): void {\n const alpha = 0.1; // Exponential moving average factor\n this.stats.avgAccessTime = this.stats.avgAccessTime * (1 - alpha) + time * alpha;\n }\n\n /**\n * Cleanup expired entries periodically\n */\n startCleanup(intervalMs: number = 60000): NodeJS.Timeout {\n return setInterval(() => {\n let cleaned = 0;\n for (const [key, entry] of this.cache.entries()) {\n if (entry.ttl && Date.now() - entry.createdAt > entry.ttl) {\n this.delete(key);\n cleaned++;\n }\n }\n if (cleaned > 0) {\n logger.debug('Cache cleanup', { cleaned, remaining: this.cache.size });\n }\n }, intervalMs);\n }\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/performance/lazy-context-loader.ts"],
4
- "sourcesContent": ["/**\n * Lazy Context Loader\n * Deferred loading and progressive enhancement for context data\n */\n\nimport Database from 'better-sqlite3';\nimport { Frame, Anchor, Event } from '../context/frame-manager.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface LazyLoadOptions {\n preloadDepth?: number; // How many levels to preload\n chunkSize?: number; // Items per chunk\n priority?: 'recency' | 'relevance' | 'frequency';\n}\n\nexport interface ContextChunk {\n frames: Frame[];\n anchors: Anchor[];\n events: Event[];\n metadata: {\n chunkId: number;\n totalChunks: number;\n hasMore: boolean;\n nextCursor?: string;\n };\n}\n\n/**\n * Lazy proxy for deferred data loading\n */\nexport class LazyProxy<T> {\n private _value?: T;\n private _promise?: Promise<T>;\n private _loader: () => Promise<T>;\n private _loaded = false;\n\n constructor(loader: () => Promise<T>) {\n this._loader = loader;\n }\n\n async get(): Promise<T> {\n if (this._loaded && this._value !== undefined) {\n return this._value;\n }\n\n if (!this._promise) {\n this._promise = this._loader().then(value => {\n this._value = value;\n this._loaded = true;\n return value;\n });\n }\n\n return this._promise;\n }\n\n isLoaded(): boolean {\n return this._loaded;\n }\n\n peek(): T | undefined {\n return this._value;\n }\n\n reset(): void {\n this._value = undefined;\n this._promise = undefined;\n this._loaded = false;\n }\n}\n\nexport class LazyContextLoader {\n private db: Database.Database;\n private projectId: string;\n \n // Lazy loading registries\n private frameLoaders = new Map<string, LazyProxy<Frame>>();\n private anchorLoaders = new Map<string, LazyProxy<Anchor[]>>();\n private eventLoaders = new Map<string, LazyProxy<Event[]>>();\n \n constructor(db: Database.Database, projectId: string) {\n this.db = db;\n this.projectId = projectId;\n }\n\n /**\n * Create a lazy frame reference\n */\n lazyFrame(frameId: string): LazyProxy<Frame> {\n if (!this.frameLoaders.has(frameId)) {\n this.frameLoaders.set(frameId, new LazyProxy(async () => {\n const frame = this.loadFrame(frameId);\n if (!frame) {\n throw new Error(`Frame not found: ${frameId}`);\n }\n return frame;\n }));\n }\n return this.frameLoaders.get(frameId)!;\n }\n\n /**\n * Create lazy anchor references\n */\n lazyAnchors(frameId: string): LazyProxy<Anchor[]> {\n if (!this.anchorLoaders.has(frameId)) {\n this.anchorLoaders.set(frameId, new LazyProxy(async () => {\n return this.loadAnchors(frameId);\n }));\n }\n return this.anchorLoaders.get(frameId)!;\n }\n\n /**\n * Create lazy event references\n */\n lazyEvents(frameId: string, limit = 100): LazyProxy<Event[]> {\n const key = `${frameId}:${limit}`;\n if (!this.eventLoaders.has(key)) {\n this.eventLoaders.set(key, new LazyProxy(async () => {\n return this.loadEvents(frameId, limit);\n }));\n }\n return this.eventLoaders.get(key)!;\n }\n\n /**\n * Progressive context loading with chunking\n */\n async* loadContextProgressive(\n frameIds: string[],\n options: LazyLoadOptions = {}\n ): AsyncGenerator<ContextChunk, void, unknown> {\n const {\n chunkSize = 10,\n priority = 'recency',\n } = options;\n\n // Sort frame IDs by priority\n const sortedIds = this.sortByPriority(frameIds, priority);\n const totalChunks = Math.ceil(sortedIds.length / chunkSize);\n\n for (let i = 0; i < sortedIds.length; i += chunkSize) {\n const chunkIds = sortedIds.slice(i, i + chunkSize);\n const chunkNumber = Math.floor(i / chunkSize) + 1;\n\n const frames: Frame[] = [];\n const anchors: Anchor[] = [];\n const events: Event[] = [];\n\n // Load chunk data\n for (const frameId of chunkIds) {\n const frame = await this.lazyFrame(frameId).get();\n frames.push(frame);\n\n // Load associated data\n const frameAnchors = await this.lazyAnchors(frameId).get();\n anchors.push(...frameAnchors);\n\n const frameEvents = await this.lazyEvents(frameId).get();\n events.push(...frameEvents);\n }\n\n yield {\n frames,\n anchors,\n events,\n metadata: {\n chunkId: chunkNumber,\n totalChunks,\n hasMore: i + chunkSize < sortedIds.length,\n nextCursor: i + chunkSize < sortedIds.length \n ? sortedIds[i + chunkSize] \n : undefined,\n },\n };\n }\n }\n\n /**\n * Preload context data for better performance\n */\n async preloadContext(\n frameIds: string[],\n options: { parallel?: boolean; depth?: number } = {}\n ): Promise<void> {\n const { parallel = true, depth = 1 } = options;\n const startTime = Date.now();\n\n if (parallel) {\n const promises: Promise<any>[] = [];\n \n for (const frameId of frameIds) {\n promises.push(this.lazyFrame(frameId).get());\n \n if (depth > 0) {\n promises.push(this.lazyAnchors(frameId).get());\n }\n \n if (depth > 1) {\n promises.push(this.lazyEvents(frameId).get());\n }\n }\n \n await Promise.all(promises);\n } else {\n for (const frameId of frameIds) {\n await this.lazyFrame(frameId).get();\n \n if (depth > 0) {\n await this.lazyAnchors(frameId).get();\n }\n \n if (depth > 1) {\n await this.lazyEvents(frameId).get();\n }\n }\n }\n\n logger.debug('Context preload complete', {\n frames: frameIds.length,\n depth,\n duration: Date.now() - startTime,\n });\n }\n\n /**\n * Load only frame headers (lightweight)\n */\n async loadFrameHeaders(frameIds: string[]): Promise<Map<string, any>> {\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT id, type, name, state, score, created_at, updated_at\n FROM frames \n WHERE id IN (${placeholders})\n `;\n\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n const headers = new Map<string, any>();\n\n for (const row of rows) {\n headers.set(row.id, {\n id: row.id,\n type: row.type,\n name: row.name,\n state: row.state,\n score: row.score,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n });\n }\n\n return headers;\n }\n\n /**\n * Stream context data for memory efficiency\n */\n async* streamContext(\n query: string,\n params: any[] = []\n ): AsyncGenerator<Frame | Anchor | Event, void, unknown> {\n const stmt = this.db.prepare(query);\n const iterator = stmt.iterate(...params);\n\n for (const row of iterator) {\n yield row as any;\n }\n }\n\n /**\n * Clear lazy loading cache\n */\n clearCache(): void {\n this.frameLoaders.clear();\n this.anchorLoaders.clear();\n this.eventLoaders.clear();\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): {\n frames: number;\n anchors: number;\n events: number;\n loaded: number;\n } {\n let loaded = 0;\n \n for (const loader of this.frameLoaders.values()) {\n if (loader.isLoaded()) loaded++;\n }\n \n for (const loader of this.anchorLoaders.values()) {\n if (loader.isLoaded()) loaded++;\n }\n \n for (const loader of this.eventLoaders.values()) {\n if (loader.isLoaded()) loaded++;\n }\n\n return {\n frames: this.frameLoaders.size,\n anchors: this.anchorLoaders.size,\n events: this.eventLoaders.size,\n loaded,\n };\n }\n\n // Private methods\n\n private loadFrame(frameId: string): Frame | null {\n try {\n const row = this.db.prepare(\n 'SELECT * FROM frames WHERE id = ?'\n ).get(frameId) as any;\n\n if (!row) return null;\n\n return {\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n };\n } catch (error) {\n // Return mock frame if table doesn't exist (for benchmarking)\n if (frameId.startsWith('frame-')) {\n return {\n id: frameId,\n type: 'mock',\n name: `Mock ${frameId}`,\n state: 'open',\n score: 0.5,\n created_at: Date.now(),\n updated_at: Date.now(),\n metadata: {},\n } as any;\n }\n return null;\n }\n }\n\n private loadAnchors(frameId: string): Anchor[] {\n try {\n const rows = this.db.prepare(\n 'SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at DESC'\n ).all(frameId) as any[];\n\n return rows.map(row => ({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n } catch {\n return []; // Return empty array if table doesn't exist\n }\n }\n\n private loadEvents(frameId: string, limit: number): Event[] {\n try {\n const rows = this.db.prepare(\n 'SELECT * FROM events WHERE frame_id = ? ORDER BY timestamp DESC LIMIT ?'\n ).all(frameId, limit) as any[];\n\n return rows.map(row => ({\n ...row,\n data: JSON.parse(row.data || '{}'),\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n } catch {\n return []; // Return empty array if table doesn't exist\n }\n }\n\n private sortByPriority(\n frameIds: string[],\n priority: 'recency' | 'relevance' | 'frequency'\n ): string[] {\n try {\n switch (priority) {\n case 'recency': {\n // Get timestamps and sort\n const query = `\n SELECT id, updated_at FROM frames \n WHERE id IN (${frameIds.map(() => '?').join(',')})\n ORDER BY updated_at DESC\n `;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n return rows.map(r => r.id);\n }\n \n case 'relevance': {\n // Get scores and sort\n const query = `\n SELECT id, score FROM frames \n WHERE id IN (${frameIds.map(() => '?').join(',')})\n ORDER BY score DESC\n `;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n return rows.map(r => r.id);\n }\n \n case 'frequency': {\n // Get event counts and sort\n const query = `\n SELECT f.id, COUNT(e.id) as event_count\n FROM frames f\n LEFT JOIN events e ON f.id = e.frame_id\n WHERE f.id IN (${frameIds.map(() => '?').join(',')})\n GROUP BY f.id\n ORDER BY event_count DESC\n `;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n return rows.map(r => r.id);\n }\n \n default:\n return frameIds;\n }\n } catch {\n // Return original order if tables don't exist\n return frameIds;\n }\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Lazy Context Loader\n * Deferred loading and progressive enhancement for context data\n */\n\nimport Database from 'better-sqlite3';\nimport { Frame, Anchor, Event } from '../context/frame-manager.js';\nimport { logger } from '../monitoring/logger.js';\n\nexport interface LazyLoadOptions {\n preloadDepth?: number; // How many levels to preload\n chunkSize?: number; // Items per chunk\n priority?: 'recency' | 'relevance' | 'frequency';\n}\n\nexport interface ContextChunk {\n frames: Frame[];\n anchors: Anchor[];\n events: Event[];\n metadata: {\n chunkId: number;\n totalChunks: number;\n hasMore: boolean;\n nextCursor?: string;\n };\n}\n\n/**\n * Lazy proxy for deferred data loading\n */\nexport class LazyProxy<T> {\n private _value?: T;\n private _promise?: Promise<T>;\n private _loader: () => Promise<T>;\n private _loaded = false;\n\n constructor(loader: () => Promise<T>) {\n this._loader = loader;\n }\n\n async get(): Promise<T> {\n if (this._loaded && this._value !== undefined) {\n return this._value;\n }\n\n if (!this._promise) {\n this._promise = this._loader().then(value => {\n this._value = value;\n this._loaded = true;\n return value;\n });\n }\n\n return this._promise;\n }\n\n isLoaded(): boolean {\n return this._loaded;\n }\n\n peek(): T | undefined {\n return this._value;\n }\n\n reset(): void {\n this._value = undefined;\n this._promise = undefined;\n this._loaded = false;\n }\n}\n\nexport class LazyContextLoader {\n private db: Database.Database;\n private projectId: string;\n \n // Lazy loading registries\n private frameLoaders = new Map<string, LazyProxy<Frame>>();\n private anchorLoaders = new Map<string, LazyProxy<Anchor[]>>();\n private eventLoaders = new Map<string, LazyProxy<Event[]>>();\n \n constructor(db: Database.Database, projectId: string) {\n this.db = db;\n this.projectId = projectId;\n }\n\n /**\n * Create a lazy frame reference\n */\n lazyFrame(frameId: string): LazyProxy<Frame> {\n if (!this.frameLoaders.has(frameId)) {\n this.frameLoaders.set(frameId, new LazyProxy(async () => {\n const frame = this.loadFrame(frameId);\n if (!frame) {\n throw new Error(`Frame not found: ${frameId}`);\n }\n return frame;\n }));\n }\n return this.frameLoaders.get(frameId)!;\n }\n\n /**\n * Create lazy anchor references\n */\n lazyAnchors(frameId: string): LazyProxy<Anchor[]> {\n if (!this.anchorLoaders.has(frameId)) {\n this.anchorLoaders.set(frameId, new LazyProxy(async () => {\n return this.loadAnchors(frameId);\n }));\n }\n return this.anchorLoaders.get(frameId)!;\n }\n\n /**\n * Create lazy event references\n */\n lazyEvents(frameId: string, limit = 100): LazyProxy<Event[]> {\n const key = `${frameId}:${limit}`;\n if (!this.eventLoaders.has(key)) {\n this.eventLoaders.set(key, new LazyProxy(async () => {\n return this.loadEvents(frameId, limit);\n }));\n }\n return this.eventLoaders.get(key)!;\n }\n\n /**\n * Progressive context loading with chunking\n */\n async* loadContextProgressive(\n frameIds: string[],\n options: LazyLoadOptions = {}\n ): AsyncGenerator<ContextChunk, void, unknown> {\n const {\n chunkSize = 10,\n priority = 'recency',\n } = options;\n\n // Sort frame IDs by priority\n const sortedIds = this.sortByPriority(frameIds, priority);\n const totalChunks = Math.ceil(sortedIds.length / chunkSize);\n\n for (let i = 0; i < sortedIds.length; i += chunkSize) {\n const chunkIds = sortedIds.slice(i, i + chunkSize);\n const chunkNumber = Math.floor(i / chunkSize) + 1;\n\n const frames: Frame[] = [];\n const anchors: Anchor[] = [];\n const events: Event[] = [];\n\n // Load chunk data\n for (const frameId of chunkIds) {\n const frame = await this.lazyFrame(frameId).get();\n frames.push(frame);\n\n // Load associated data\n const frameAnchors = await this.lazyAnchors(frameId).get();\n anchors.push(...frameAnchors);\n\n const frameEvents = await this.lazyEvents(frameId).get();\n events.push(...frameEvents);\n }\n\n yield {\n frames,\n anchors,\n events,\n metadata: {\n chunkId: chunkNumber,\n totalChunks,\n hasMore: i + chunkSize < sortedIds.length,\n nextCursor: i + chunkSize < sortedIds.length \n ? sortedIds[i + chunkSize] \n : undefined,\n },\n };\n }\n }\n\n /**\n * Preload context data for better performance\n */\n async preloadContext(\n frameIds: string[],\n options: { parallel?: boolean; depth?: number } = {}\n ): Promise<void> {\n const { parallel = true, depth = 1 } = options;\n const startTime = Date.now();\n\n if (parallel) {\n const promises: Promise<any>[] = [];\n \n for (const frameId of frameIds) {\n promises.push(this.lazyFrame(frameId).get());\n \n if (depth > 0) {\n promises.push(this.lazyAnchors(frameId).get());\n }\n \n if (depth > 1) {\n promises.push(this.lazyEvents(frameId).get());\n }\n }\n \n await Promise.all(promises);\n } else {\n for (const frameId of frameIds) {\n await this.lazyFrame(frameId).get();\n \n if (depth > 0) {\n await this.lazyAnchors(frameId).get();\n }\n \n if (depth > 1) {\n await this.lazyEvents(frameId).get();\n }\n }\n }\n\n logger.debug('Context preload complete', {\n frames: frameIds.length,\n depth,\n duration: Date.now() - startTime,\n });\n }\n\n /**\n * Load only frame headers (lightweight)\n */\n async loadFrameHeaders(frameIds: string[]): Promise<Map<string, any>> {\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT id, type, name, state, score, created_at, updated_at\n FROM frames \n WHERE id IN (${placeholders})\n `;\n\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n const headers = new Map<string, any>();\n\n for (const row of rows) {\n headers.set(row.id, {\n id: row.id,\n type: row.type,\n name: row.name,\n state: row.state,\n score: row.score,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n });\n }\n\n return headers;\n }\n\n /**\n * Stream context data for memory efficiency\n */\n async* streamContext(\n query: string,\n params: any[] = []\n ): AsyncGenerator<Frame | Anchor | Event, void, unknown> {\n const stmt = this.db.prepare(query);\n const iterator = stmt.iterate(...params);\n\n for (const row of iterator) {\n yield row as any;\n }\n }\n\n /**\n * Clear lazy loading cache\n */\n clearCache(): void {\n this.frameLoaders.clear();\n this.anchorLoaders.clear();\n this.eventLoaders.clear();\n }\n\n /**\n * Get cache statistics\n */\n getCacheStats(): {\n frames: number;\n anchors: number;\n events: number;\n loaded: number;\n } {\n let loaded = 0;\n \n for (const loader of this.frameLoaders.values()) {\n if (loader.isLoaded()) loaded++;\n }\n \n for (const loader of this.anchorLoaders.values()) {\n if (loader.isLoaded()) loaded++;\n }\n \n for (const loader of this.eventLoaders.values()) {\n if (loader.isLoaded()) loaded++;\n }\n\n return {\n frames: this.frameLoaders.size,\n anchors: this.anchorLoaders.size,\n events: this.eventLoaders.size,\n loaded,\n };\n }\n\n // Private methods\n\n private loadFrame(frameId: string): Frame | null {\n try {\n const row = this.db.prepare(\n 'SELECT * FROM frames WHERE id = ?'\n ).get(frameId) as any;\n\n if (!row) return null;\n\n return {\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n };\n } catch (error: unknown) {\n // Return mock frame if table doesn't exist (for benchmarking)\n if (frameId.startsWith('frame-')) {\n return {\n id: frameId,\n type: 'mock',\n name: `Mock ${frameId}`,\n state: 'open',\n score: 0.5,\n created_at: Date.now(),\n updated_at: Date.now(),\n metadata: {},\n } as any;\n }\n return null;\n }\n }\n\n private loadAnchors(frameId: string): Anchor[] {\n try {\n const rows = this.db.prepare(\n 'SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at DESC'\n ).all(frameId) as any[];\n\n return rows.map((row: any) => ({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n } catch {\n return []; // Return empty array if table doesn't exist\n }\n }\n\n private loadEvents(frameId: string, limit: number): Event[] {\n try {\n const rows = this.db.prepare(\n 'SELECT * FROM events WHERE frame_id = ? ORDER BY timestamp DESC LIMIT ?'\n ).all(frameId, limit) as any[];\n\n return rows.map((row: any) => ({\n ...row,\n data: JSON.parse(row.data || '{}'),\n metadata: JSON.parse(row.metadata || '{}'),\n }));\n } catch {\n return []; // Return empty array if table doesn't exist\n }\n }\n\n private sortByPriority(\n frameIds: string[],\n priority: 'recency' | 'relevance' | 'frequency'\n ): string[] {\n try {\n switch (priority) {\n case 'recency': {\n // Get timestamps and sort\n const query = `\n SELECT id, updated_at FROM frames \n WHERE id IN (${frameIds.map(() => '?').join(',')})\n ORDER BY updated_at DESC\n `;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n return rows.map((r: any) => r.id);\n }\n \n case 'relevance': {\n // Get scores and sort\n const query = `\n SELECT id, score FROM frames \n WHERE id IN (${frameIds.map(() => '?').join(',')})\n ORDER BY score DESC\n `;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n return rows.map((r: any) => r.id);\n }\n \n case 'frequency': {\n // Get event counts and sort\n const query = `\n SELECT f.id, COUNT(e.id) as event_count\n FROM frames f\n LEFT JOIN events e ON f.id = e.frame_id\n WHERE f.id IN (${frameIds.map(() => '?').join(',')})\n GROUP BY f.id\n ORDER BY event_count DESC\n `;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n return rows.map((r: any) => r.id);\n }\n \n default:\n return frameIds;\n }\n } catch {\n // Return original order if tables don't exist\n return frameIds;\n }\n }\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/performance/monitor.ts"],
4
- "sourcesContent": ["import { performance } from 'perf_hooks';\nimport { EventEmitter } from 'events';\n\ninterface PerformanceMetrics {\n operation: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n memoryBefore: NodeJS.MemoryUsage;\n memoryAfter?: NodeJS.MemoryUsage;\n memoryDelta?: number;\n metadata?: Record<string, any>;\n}\n\ninterface PerformanceThreshold {\n operation: string;\n maxDuration?: number;\n maxMemory?: number;\n action?: 'warn' | 'error' | 'optimize';\n}\n\nexport class PerformanceMonitor extends EventEmitter {\n private metrics: Map<string, PerformanceMetrics[]> = new Map();\n private activeOperations: Map<string, PerformanceMetrics> = new Map();\n private thresholds: Map<string, PerformanceThreshold> = new Map();\n private isMonitoring: boolean = false;\n private gcInterval?: NodeJS.Timeout;\n\n constructor() {\n super();\n this.setupDefaultThresholds();\n }\n\n private setupDefaultThresholds() {\n this.addThreshold({\n operation: 'digest.process',\n maxDuration: 500,\n maxMemory: 50 * 1024 * 1024,\n action: 'warn',\n });\n\n this.addThreshold({\n operation: 'cache.lookup',\n maxDuration: 10,\n action: 'optimize',\n });\n\n this.addThreshold({\n operation: 'context.save',\n maxDuration: 1000,\n maxMemory: 100 * 1024 * 1024,\n action: 'error',\n });\n }\n\n startMonitoring() {\n if (this.isMonitoring) return;\n\n this.isMonitoring = true;\n\n this.gcInterval = setInterval(() => {\n if (global.gc) {\n const beforeGC = process.memoryUsage();\n global.gc();\n const afterGC = process.memoryUsage();\n\n const freed = beforeGC.heapUsed - afterGC.heapUsed;\n if (freed > 10 * 1024 * 1024) {\n this.emit('gc', {\n freed,\n beforeGC,\n afterGC,\n });\n }\n }\n }, 30000);\n\n this.emit('monitoring.started');\n }\n\n stopMonitoring() {\n if (!this.isMonitoring) return;\n\n this.isMonitoring = false;\n\n if (this.gcInterval) {\n clearInterval(this.gcInterval);\n this.gcInterval = undefined;\n }\n\n this.emit('monitoring.stopped');\n }\n\n startOperation(\n operationId: string,\n operation: string,\n metadata?: Record<string, any>\n ): void {\n const metric: PerformanceMetrics = {\n operation,\n startTime: performance.now(),\n memoryBefore: process.memoryUsage(),\n metadata,\n };\n\n this.activeOperations.set(operationId, metric);\n this.emit('operation.started', { operationId, operation, metadata });\n }\n\n endOperation(\n operationId: string,\n additionalMetadata?: Record<string, any>\n ): PerformanceMetrics | undefined {\n const metric = this.activeOperations.get(operationId);\n if (!metric) {\n console.warn(`Operation ${operationId} not found`);\n return undefined;\n }\n\n metric.endTime = performance.now();\n metric.duration = metric.endTime - metric.startTime;\n metric.memoryAfter = process.memoryUsage();\n metric.memoryDelta =\n metric.memoryAfter.heapUsed - metric.memoryBefore.heapUsed;\n\n if (additionalMetadata) {\n metric.metadata = { ...metric.metadata, ...additionalMetadata };\n }\n\n this.activeOperations.delete(operationId);\n\n if (!this.metrics.has(metric.operation)) {\n this.metrics.set(metric.operation, []);\n }\n this.metrics.get(metric.operation)!.push(metric);\n\n this.checkThresholds(metric);\n this.emit('operation.completed', { operationId, metric });\n\n return metric;\n }\n\n async measureAsync<T>(\n operation: string,\n fn: () => Promise<T>,\n metadata?: Record<string, any>\n ): Promise<T> {\n const operationId = `${operation}-${Date.now()}-${Math.random()}`;\n this.startOperation(operationId, operation, metadata);\n\n try {\n const result = await fn();\n this.endOperation(operationId, { success: true });\n return result;\n } catch (error) {\n this.endOperation(operationId, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n measure<T>(\n operation: string,\n fn: () => T,\n metadata?: Record<string, any>\n ): T {\n const operationId = `${operation}-${Date.now()}-${Math.random()}`;\n this.startOperation(operationId, operation, metadata);\n\n try {\n const result = fn();\n this.endOperation(operationId, { success: true });\n return result;\n } catch (error) {\n this.endOperation(operationId, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n private checkThresholds(metric: PerformanceMetrics) {\n const threshold = this.thresholds.get(metric.operation);\n if (!threshold) return;\n\n const violations: string[] = [];\n\n if (\n threshold.maxDuration &&\n metric.duration &&\n metric.duration > threshold.maxDuration\n ) {\n violations.push(\n `Duration ${metric.duration.toFixed(2)}ms exceeds ${threshold.maxDuration}ms`\n );\n }\n\n if (\n threshold.maxMemory &&\n metric.memoryDelta &&\n metric.memoryDelta > threshold.maxMemory\n ) {\n const memoryMB = (metric.memoryDelta / 1024 / 1024).toFixed(2);\n const thresholdMB = (threshold.maxMemory / 1024 / 1024).toFixed(2);\n violations.push(`Memory ${memoryMB}MB exceeds ${thresholdMB}MB`);\n }\n\n if (violations.length > 0) {\n const message = `Performance threshold violation for ${metric.operation}: ${violations.join(', ')}`;\n\n switch (threshold.action) {\n case 'error':\n this.emit('threshold.error', { metric, violations, message });\n break;\n case 'warn':\n this.emit('threshold.warning', { metric, violations, message });\n break;\n case 'optimize':\n this.emit('threshold.optimize', { metric, violations, message });\n break;\n }\n }\n }\n\n addThreshold(threshold: PerformanceThreshold) {\n this.thresholds.set(threshold.operation, threshold);\n }\n\n getMetrics(operation?: string): PerformanceMetrics[] {\n if (operation) {\n return this.metrics.get(operation) || [];\n }\n\n const allMetrics: PerformanceMetrics[] = [];\n for (const metrics of this.metrics.values()) {\n allMetrics.push(...metrics);\n }\n return allMetrics;\n }\n\n getStatistics(operation: string):\n | {\n count: number;\n avgDuration: number;\n minDuration: number;\n maxDuration: number;\n avgMemory: number;\n successRate: number;\n }\n | undefined {\n const metrics = this.metrics.get(operation);\n if (!metrics || metrics.length === 0) return undefined;\n\n const durations = metrics\n .filter((m) => m.duration !== undefined)\n .map((m) => m.duration!);\n\n const memoryDeltas = metrics\n .filter((m) => m.memoryDelta !== undefined)\n .map((m) => m.memoryDelta!);\n\n const successCount = metrics.filter(\n (m) => m.metadata?.success === true\n ).length;\n\n return {\n count: metrics.length,\n avgDuration:\n durations.length > 0\n ? durations.reduce((a, b) => a + b, 0) / durations.length\n : 0,\n minDuration: durations.length > 0 ? Math.min(...durations) : 0,\n maxDuration: durations.length > 0 ? Math.max(...durations) : 0,\n avgMemory:\n memoryDeltas.length > 0\n ? memoryDeltas.reduce((a, b) => a + b, 0) / memoryDeltas.length\n : 0,\n successRate:\n metrics.length > 0 ? (successCount / metrics.length) * 100 : 0,\n };\n }\n\n clearMetrics(operation?: string) {\n if (operation) {\n this.metrics.delete(operation);\n } else {\n this.metrics.clear();\n }\n }\n\n getActiveOperations(): string[] {\n return Array.from(this.activeOperations.keys());\n }\n\n generateReport(): string {\n const report: string[] = [];\n report.push('Performance Report');\n report.push('='.repeat(60));\n\n for (const [operation] of this.metrics) {\n const stats = this.getStatistics(operation);\n if (!stats) continue;\n\n report.push(`\\nOperation: ${operation}`);\n report.push(` Count: ${stats.count}`);\n report.push(` Avg Duration: ${stats.avgDuration.toFixed(2)}ms`);\n report.push(\n ` Min/Max: ${stats.minDuration.toFixed(2)}ms / ${stats.maxDuration.toFixed(2)}ms`\n );\n report.push(\n ` Avg Memory: ${(stats.avgMemory / 1024 / 1024).toFixed(2)}MB`\n );\n report.push(` Success Rate: ${stats.successRate.toFixed(1)}%`);\n }\n\n return report.join('\\n');\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { performance } from 'perf_hooks';\nimport { EventEmitter } from 'events';\n\ninterface PerformanceMetrics {\n operation: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n memoryBefore: NodeJS.MemoryUsage;\n memoryAfter?: NodeJS.MemoryUsage;\n memoryDelta?: number;\n metadata?: Record<string, any>;\n}\n\ninterface PerformanceThreshold {\n operation: string;\n maxDuration?: number;\n maxMemory?: number;\n action?: 'warn' | 'error' | 'optimize';\n}\n\nexport class PerformanceMonitor extends EventEmitter {\n private metrics: Map<string, PerformanceMetrics[]> = new Map();\n private activeOperations: Map<string, PerformanceMetrics> = new Map();\n private thresholds: Map<string, PerformanceThreshold> = new Map();\n private isMonitoring: boolean = false;\n private gcInterval?: NodeJS.Timeout;\n\n constructor() {\n super();\n this.setupDefaultThresholds();\n }\n\n private setupDefaultThresholds() {\n this.addThreshold({\n operation: 'digest.process',\n maxDuration: 500,\n maxMemory: 50 * 1024 * 1024,\n action: 'warn',\n });\n\n this.addThreshold({\n operation: 'cache.lookup',\n maxDuration: 10,\n action: 'optimize',\n });\n\n this.addThreshold({\n operation: 'context.save',\n maxDuration: 1000,\n maxMemory: 100 * 1024 * 1024,\n action: 'error',\n });\n }\n\n startMonitoring() {\n if (this.isMonitoring) return;\n\n this.isMonitoring = true;\n\n this.gcInterval = setInterval(() => {\n if (global.gc) {\n const beforeGC = process.memoryUsage();\n global.gc();\n const afterGC = process.memoryUsage();\n\n const freed = beforeGC.heapUsed - afterGC.heapUsed;\n if (freed > 10 * 1024 * 1024) {\n this.emit('gc', {\n freed,\n beforeGC,\n afterGC,\n });\n }\n }\n }, 30000);\n\n this.emit('monitoring.started');\n }\n\n stopMonitoring() {\n if (!this.isMonitoring) return;\n\n this.isMonitoring = false;\n\n if (this.gcInterval) {\n clearInterval(this.gcInterval);\n this.gcInterval = undefined;\n }\n\n this.emit('monitoring.stopped');\n }\n\n startOperation(\n operationId: string,\n operation: string,\n metadata?: Record<string, any>\n ): void {\n const metric: PerformanceMetrics = {\n operation,\n startTime: performance.now(),\n memoryBefore: process.memoryUsage(),\n metadata,\n };\n\n this.activeOperations.set(operationId, metric);\n this.emit('operation.started', { operationId, operation, metadata });\n }\n\n endOperation(\n operationId: string,\n additionalMetadata?: Record<string, any>\n ): PerformanceMetrics | undefined {\n const metric = this.activeOperations.get(operationId);\n if (!metric) {\n console.warn(`Operation ${operationId} not found`);\n return undefined;\n }\n\n metric.endTime = performance.now();\n metric.duration = metric.endTime - metric.startTime;\n metric.memoryAfter = process.memoryUsage();\n metric.memoryDelta =\n metric.memoryAfter.heapUsed - metric.memoryBefore.heapUsed;\n\n if (additionalMetadata) {\n metric.metadata = { ...metric.metadata, ...additionalMetadata };\n }\n\n this.activeOperations.delete(operationId);\n\n if (!this.metrics.has(metric.operation)) {\n this.metrics.set(metric.operation, []);\n }\n this.metrics.get(metric.operation)!.push(metric);\n\n this.checkThresholds(metric);\n this.emit('operation.completed', { operationId, metric });\n\n return metric;\n }\n\n async measureAsync<T>(\n operation: string,\n fn: () => Promise<T>,\n metadata?: Record<string, any>\n ): Promise<T> {\n const operationId = `${operation}-${Date.now()}-${Math.random()}`;\n this.startOperation(operationId, operation, metadata);\n\n try {\n const result = await fn();\n this.endOperation(operationId, { success: true });\n return result;\n } catch (error: unknown) {\n this.endOperation(operationId, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n measure<T>(\n operation: string,\n fn: () => T,\n metadata?: Record<string, any>\n ): T {\n const operationId = `${operation}-${Date.now()}-${Math.random()}`;\n this.startOperation(operationId, operation, metadata);\n\n try {\n const result = fn();\n this.endOperation(operationId, { success: true });\n return result;\n } catch (error: unknown) {\n this.endOperation(operationId, {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n private checkThresholds(metric: PerformanceMetrics) {\n const threshold = this.thresholds.get(metric.operation);\n if (!threshold) return;\n\n const violations: string[] = [];\n\n if (\n threshold.maxDuration &&\n metric.duration &&\n metric.duration > threshold.maxDuration\n ) {\n violations.push(\n `Duration ${metric.duration.toFixed(2)}ms exceeds ${threshold.maxDuration}ms`\n );\n }\n\n if (\n threshold.maxMemory &&\n metric.memoryDelta &&\n metric.memoryDelta > threshold.maxMemory\n ) {\n const memoryMB = (metric.memoryDelta / 1024 / 1024).toFixed(2);\n const thresholdMB = (threshold.maxMemory / 1024 / 1024).toFixed(2);\n violations.push(`Memory ${memoryMB}MB exceeds ${thresholdMB}MB`);\n }\n\n if (violations.length > 0) {\n const message = `Performance threshold violation for ${metric.operation}: ${violations.join(', ')}`;\n\n switch (threshold.action) {\n case 'error':\n this.emit('threshold.error', { metric, violations, message });\n break;\n case 'warn':\n this.emit('threshold.warning', { metric, violations, message });\n break;\n case 'optimize':\n this.emit('threshold.optimize', { metric, violations, message });\n break;\n }\n }\n }\n\n addThreshold(threshold: PerformanceThreshold) {\n this.thresholds.set(threshold.operation, threshold);\n }\n\n getMetrics(operation?: string): PerformanceMetrics[] {\n if (operation) {\n return this.metrics.get(operation) || [];\n }\n\n const allMetrics: PerformanceMetrics[] = [];\n for (const metrics of this.metrics.values()) {\n allMetrics.push(...metrics);\n }\n return allMetrics;\n }\n\n getStatistics(operation: string):\n | {\n count: number;\n avgDuration: number;\n minDuration: number;\n maxDuration: number;\n avgMemory: number;\n successRate: number;\n }\n | undefined {\n const metrics = this.metrics.get(operation);\n if (!metrics || metrics.length === 0) return undefined;\n\n const durations = metrics\n .filter((m) => m.duration !== undefined)\n .map((m) => m.duration!);\n\n const memoryDeltas = metrics\n .filter((m) => m.memoryDelta !== undefined)\n .map((m) => m.memoryDelta!);\n\n const successCount = metrics.filter(\n (m) => m.metadata?.success === true\n ).length;\n\n return {\n count: metrics.length,\n avgDuration:\n durations.length > 0\n ? durations.reduce((a, b) => a + b, 0) / durations.length\n : 0,\n minDuration: durations.length > 0 ? Math.min(...durations) : 0,\n maxDuration: durations.length > 0 ? Math.max(...durations) : 0,\n avgMemory:\n memoryDeltas.length > 0\n ? memoryDeltas.reduce((a, b) => a + b, 0) / memoryDeltas.length\n : 0,\n successRate:\n metrics.length > 0 ? (successCount / metrics.length) * 100 : 0,\n };\n }\n\n clearMetrics(operation?: string) {\n if (operation) {\n this.metrics.delete(operation);\n } else {\n this.metrics.clear();\n }\n }\n\n getActiveOperations(): string[] {\n return Array.from(this.activeOperations.keys());\n }\n\n generateReport(): string {\n const report: string[] = [];\n report.push('Performance Report');\n report.push('='.repeat(60));\n\n for (const [operation] of this.metrics) {\n const stats = this.getStatistics(operation);\n if (!stats) continue;\n\n report.push(`\\nOperation: ${operation}`);\n report.push(` Count: ${stats.count}`);\n report.push(` Avg Duration: ${stats.avgDuration.toFixed(2)}ms`);\n report.push(\n ` Min/Max: ${stats.minDuration.toFixed(2)}ms / ${stats.maxDuration.toFixed(2)}ms`\n );\n report.push(\n ` Avg Memory: ${(stats.avgMemory / 1024 / 1024).toFixed(2)}MB`\n );\n report.push(` Success Rate: ${stats.successRate.toFixed(1)}%`);\n }\n\n return report.join('\\n');\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/performance/optimized-frame-context.ts"],
4
- "sourcesContent": ["/**\n * Optimized Frame Context Assembly\n * High-performance context retrieval with caching and batching\n */\n\nimport Database from 'better-sqlite3';\nimport { getQueryCache, createCacheKey } from '../database/query-cache.js';\nimport { logger } from '../monitoring/logger.js';\nimport { Frame, FrameContext, Anchor, Event } from '../context/frame-manager.js';\n\nexport interface ContextAssemblyOptions {\n maxEvents?: number;\n includeClosed?: boolean;\n enableCaching?: boolean;\n batchSize?: number;\n}\n\nexport interface OptimizedFrameContext extends FrameContext {\n performance: {\n assemblyTimeMs: number;\n cacheHits: number;\n dbQueries: number;\n totalRows: number;\n };\n}\n\n/**\n * Optimized context assembly with caching and batching\n */\nexport class OptimizedContextAssembler {\n private db: Database.Database;\n private cache = getQueryCache();\n private preparedStatements = new Map<string, Database.Statement>();\n\n constructor(db: Database.Database) {\n this.db = db;\n this.initializePreparedStatements();\n }\n\n /**\n * Get hot stack context with optimizations\n */\n async getHotStackContext(\n activeStack: string[],\n options: ContextAssemblyOptions = {}\n ): Promise<OptimizedFrameContext[]> {\n const startTime = performance.now();\n const stats = {\n cacheHits: 0,\n dbQueries: 0,\n totalRows: 0,\n };\n\n const {\n maxEvents = 20,\n includeClosed = false,\n enableCaching = true,\n batchSize = 10,\n } = options;\n\n try {\n // Batch process frames for better performance\n const contexts: OptimizedFrameContext[] = [];\n \n for (let i = 0; i < activeStack.length; i += batchSize) {\n const batch = activeStack.slice(i, i + batchSize);\n const batchContexts = await this.processBatch(\n batch,\n maxEvents,\n includeClosed,\n enableCaching,\n stats\n );\n contexts.push(...batchContexts);\n }\n\n const assemblyTimeMs = performance.now() - startTime;\n\n // Add performance stats to each context\n return contexts.map(context => ({\n ...context,\n performance: {\n assemblyTimeMs: assemblyTimeMs / contexts.length,\n ...stats,\n },\n }));\n\n } catch (error) {\n logger.error('Failed to assemble hot stack context', error as Error, {\n activeStack,\n options,\n });\n throw error;\n }\n }\n\n /**\n * Get single frame context with full optimization\n */\n async getFrameContext(\n frameId: string,\n options: ContextAssemblyOptions = {}\n ): Promise<OptimizedFrameContext | null> {\n const startTime = performance.now();\n const stats = { cacheHits: 0, dbQueries: 0, totalRows: 0 };\n\n const {\n maxEvents = 50,\n enableCaching = true,\n } = options;\n\n // Check cache first\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n if (enableCaching) {\n const cached = this.cache.getFrameContext(cacheKey);\n if (cached) {\n stats.cacheHits++;\n return {\n ...cached,\n performance: {\n assemblyTimeMs: performance.now() - startTime,\n ...stats,\n },\n };\n }\n }\n\n try {\n const context = await this.assembleFrameContext(frameId, maxEvents, stats);\n \n if (!context) return null;\n\n // Cache the result\n if (enableCaching) {\n this.cache.cacheFrameContext(cacheKey, context);\n }\n\n const result: OptimizedFrameContext = {\n ...context,\n performance: {\n assemblyTimeMs: performance.now() - startTime,\n ...stats,\n },\n };\n\n return result;\n\n } catch (error) {\n logger.error('Failed to get frame context', error as Error, { frameId });\n throw error;\n }\n }\n\n /**\n * Process a batch of frames efficiently\n */\n private async processBatch(\n frameIds: string[],\n maxEvents: number,\n includeClosed: boolean,\n enableCaching: boolean,\n stats: { cacheHits: number; dbQueries: number; totalRows: number }\n ): Promise<OptimizedFrameContext[]> {\n const contexts: OptimizedFrameContext[] = [];\n \n // Get cached contexts first\n const uncachedIds = [];\n for (const frameId of frameIds) {\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n if (enableCaching) {\n const cached = this.cache.getFrameContext(cacheKey);\n if (cached) {\n stats.cacheHits++;\n contexts.push(cached);\n continue;\n }\n }\n uncachedIds.push(frameId);\n }\n\n if (uncachedIds.length === 0) {\n return contexts;\n }\n\n // Batch fetch uncached frames\n const frames = await this.batchGetFrames(uncachedIds, stats);\n const allEvents = await this.batchGetEvents(uncachedIds, maxEvents, stats);\n const allAnchors = await this.batchGetAnchors(uncachedIds, stats);\n const allArtifacts = await this.batchGetArtifacts(uncachedIds, stats);\n\n // Assemble contexts from batched data\n for (const frameId of uncachedIds) {\n const frame = frames.get(frameId);\n if (!frame || (!includeClosed && frame.state === 'closed')) {\n continue;\n }\n\n const context: FrameContext = {\n frameId,\n header: {\n goal: frame.name,\n constraints: this.extractConstraints(frame.inputs),\n definitions: frame.inputs.definitions,\n },\n anchors: allAnchors.get(frameId) || [],\n recentEvents: allEvents.get(frameId) || [],\n activeArtifacts: allArtifacts.get(frameId) || [],\n };\n\n // Cache the context\n if (enableCaching) {\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n this.cache.cacheFrameContext(cacheKey, context);\n }\n\n contexts.push(context as OptimizedFrameContext);\n }\n\n return contexts;\n }\n\n /**\n * Batch get frames with single query\n */\n private async batchGetFrames(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Frame>> {\n if (frameIds.length === 0) return new Map();\n\n const stmt = this.preparedStatements.get('batch_frames');\n if (!stmt) throw new Error('Prepared statement not found: batch_frames');\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `SELECT * FROM frames WHERE frame_id IN (${placeholders})`;\n \n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const frameMap = new Map<string, Frame>();\n for (const row of rows) {\n frameMap.set(row.frame_id, {\n ...row,\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest_json: JSON.parse(row.digest_json || '{}'),\n });\n }\n\n return frameMap;\n }\n\n /**\n * Batch get events for multiple frames\n */\n private async batchGetEvents(\n frameIds: string[],\n maxEvents: number,\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Event[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT *, ROW_NUMBER() OVER (PARTITION BY frame_id ORDER BY seq DESC) as rn\n FROM events \n WHERE frame_id IN (${placeholders}) \n AND rn <= ${maxEvents}\n ORDER BY frame_id, seq DESC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const eventMap = new Map<string, Event[]>();\n for (const row of rows) {\n if (!eventMap.has(row.frame_id)) {\n eventMap.set(row.frame_id, []);\n }\n eventMap.get(row.frame_id)!.push({\n ...row,\n payload: JSON.parse(row.payload),\n });\n }\n\n return eventMap;\n }\n\n /**\n * Batch get anchors for multiple frames\n */\n private async batchGetAnchors(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Anchor[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT * FROM anchors \n WHERE frame_id IN (${placeholders}) \n ORDER BY frame_id, priority DESC, created_at ASC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const anchorMap = new Map<string, Anchor[]>();\n for (const row of rows) {\n if (!anchorMap.has(row.frame_id)) {\n anchorMap.set(row.frame_id, []);\n }\n anchorMap.get(row.frame_id)!.push({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n });\n }\n\n return anchorMap;\n }\n\n /**\n * Batch get active artifacts for multiple frames\n */\n private async batchGetArtifacts(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, string[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT frame_id, payload\n FROM events \n WHERE frame_id IN (${placeholders}) \n AND event_type = 'artifact'\n ORDER BY frame_id, ts DESC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const artifactMap = new Map<string, string[]>();\n for (const row of rows) {\n const payload = JSON.parse(row.payload);\n if (!artifactMap.has(row.frame_id)) {\n artifactMap.set(row.frame_id, []);\n }\n if (payload.path) {\n artifactMap.get(row.frame_id)!.push(payload.path);\n }\n }\n\n return artifactMap;\n }\n\n /**\n * Assemble single frame context\n */\n private async assembleFrameContext(\n frameId: string,\n maxEvents: number,\n stats: { dbQueries: number; totalRows: number }\n ): Promise<FrameContext | null> {\n // Single frame operations - these could be further optimized with prepared statements\n const frame = await this.batchGetFrames([frameId], stats).then(map => map.get(frameId));\n if (!frame) return null;\n\n const [events, anchors, artifacts] = await Promise.all([\n this.batchGetEvents([frameId], maxEvents, stats).then(map => map.get(frameId) || []),\n this.batchGetAnchors([frameId], stats).then(map => map.get(frameId) || []),\n this.batchGetArtifacts([frameId], stats).then(map => map.get(frameId) || []),\n ]);\n\n return {\n frameId,\n header: {\n goal: frame.name,\n constraints: this.extractConstraints(frame.inputs),\n definitions: frame.inputs.definitions,\n },\n anchors,\n recentEvents: events,\n activeArtifacts: artifacts,\n };\n }\n\n /**\n * Extract constraints from frame inputs\n */\n private extractConstraints(inputs: Record<string, any>): string[] {\n const constraints: string[] = [];\n \n if (inputs.constraints && Array.isArray(inputs.constraints)) {\n constraints.push(...inputs.constraints);\n }\n \n if (inputs.requirements && Array.isArray(inputs.requirements)) {\n constraints.push(...inputs.requirements);\n }\n \n if (inputs.limitations && Array.isArray(inputs.limitations)) {\n constraints.push(...inputs.limitations);\n }\n\n return constraints;\n }\n\n /**\n * Initialize prepared statements for common queries\n */\n private initializePreparedStatements(): void {\n try {\n // Single frame query\n this.preparedStatements.set(\n 'single_frame',\n this.db.prepare('SELECT * FROM frames WHERE frame_id = ?')\n );\n\n // Frame events with limit\n this.preparedStatements.set(\n 'frame_events',\n this.db.prepare('SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?')\n );\n\n // Frame anchors\n this.preparedStatements.set(\n 'frame_anchors',\n this.db.prepare('SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC')\n );\n\n logger.info('Prepared statements initialized for optimized context assembly');\n } catch (error) {\n logger.error('Failed to initialize prepared statements', error as Error);\n throw error;\n }\n }\n\n /**\n * Clear cache and reset prepared statements\n */\n cleanup(): void {\n this.cache.clear();\n // Modern better-sqlite3 automatically handles cleanup\n this.preparedStatements.clear();\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Optimized Frame Context Assembly\n * High-performance context retrieval with caching and batching\n */\n\nimport Database from 'better-sqlite3';\nimport { getQueryCache, createCacheKey } from '../database/query-cache.js';\nimport { logger } from '../monitoring/logger.js';\nimport { Frame, FrameContext, Anchor, Event } from '../context/frame-manager.js';\n\nexport interface ContextAssemblyOptions {\n maxEvents?: number;\n includeClosed?: boolean;\n enableCaching?: boolean;\n batchSize?: number;\n}\n\nexport interface OptimizedFrameContext extends FrameContext {\n performance: {\n assemblyTimeMs: number;\n cacheHits: number;\n dbQueries: number;\n totalRows: number;\n };\n}\n\n/**\n * Optimized context assembly with caching and batching\n */\nexport class OptimizedContextAssembler {\n private db: Database.Database;\n private cache = getQueryCache();\n private preparedStatements = new Map<string, Database.Statement>();\n\n constructor(db: Database.Database) {\n this.db = db;\n this.initializePreparedStatements();\n }\n\n /**\n * Get hot stack context with optimizations\n */\n async getHotStackContext(\n activeStack: string[],\n options: ContextAssemblyOptions = {}\n ): Promise<OptimizedFrameContext[]> {\n const startTime = performance.now();\n const stats = {\n cacheHits: 0,\n dbQueries: 0,\n totalRows: 0,\n };\n\n const {\n maxEvents = 20,\n includeClosed = false,\n enableCaching = true,\n batchSize = 10,\n } = options;\n\n try {\n // Batch process frames for better performance\n const contexts: OptimizedFrameContext[] = [];\n \n for (let i = 0; i < activeStack.length; i += batchSize) {\n const batch = activeStack.slice(i, i + batchSize);\n const batchContexts = await this.processBatch(\n batch,\n maxEvents,\n includeClosed,\n enableCaching,\n stats\n );\n contexts.push(...batchContexts);\n }\n\n const assemblyTimeMs = performance.now() - startTime;\n\n // Add performance stats to each context\n return contexts.map((context: any) => ({\n ...context,\n performance: {\n assemblyTimeMs: assemblyTimeMs / contexts.length,\n ...stats,\n },\n }));\n\n } catch (error: unknown) {\n logger.error('Failed to assemble hot stack context', error as Error, {\n activeStack,\n options,\n });\n throw error;\n }\n }\n\n /**\n * Get single frame context with full optimization\n */\n async getFrameContext(\n frameId: string,\n options: ContextAssemblyOptions = {}\n ): Promise<OptimizedFrameContext | null> {\n const startTime = performance.now();\n const stats = { cacheHits: 0, dbQueries: 0, totalRows: 0 };\n\n const {\n maxEvents = 50,\n enableCaching = true,\n } = options;\n\n // Check cache first\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n if (enableCaching) {\n const cached = this.cache.getFrameContext(cacheKey);\n if (cached) {\n stats.cacheHits++;\n return {\n ...cached,\n performance: {\n assemblyTimeMs: performance.now() - startTime,\n ...stats,\n },\n };\n }\n }\n\n try {\n const context = await this.assembleFrameContext(frameId, maxEvents, stats);\n \n if (!context) return null;\n\n // Cache the result\n if (enableCaching) {\n this.cache.cacheFrameContext(cacheKey, context);\n }\n\n const result: OptimizedFrameContext = {\n ...context,\n performance: {\n assemblyTimeMs: performance.now() - startTime,\n ...stats,\n },\n };\n\n return result;\n\n } catch (error: unknown) {\n logger.error('Failed to get frame context', error as Error, { frameId });\n throw error;\n }\n }\n\n /**\n * Process a batch of frames efficiently\n */\n private async processBatch(\n frameIds: string[],\n maxEvents: number,\n includeClosed: boolean,\n enableCaching: boolean,\n stats: { cacheHits: number; dbQueries: number; totalRows: number }\n ): Promise<OptimizedFrameContext[]> {\n const contexts: OptimizedFrameContext[] = [];\n \n // Get cached contexts first\n const uncachedIds = [];\n for (const frameId of frameIds) {\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n if (enableCaching) {\n const cached = this.cache.getFrameContext(cacheKey);\n if (cached) {\n stats.cacheHits++;\n contexts.push(cached);\n continue;\n }\n }\n uncachedIds.push(frameId);\n }\n\n if (uncachedIds.length === 0) {\n return contexts;\n }\n\n // Batch fetch uncached frames\n const frames = await this.batchGetFrames(uncachedIds, stats);\n const allEvents = await this.batchGetEvents(uncachedIds, maxEvents, stats);\n const allAnchors = await this.batchGetAnchors(uncachedIds, stats);\n const allArtifacts = await this.batchGetArtifacts(uncachedIds, stats);\n\n // Assemble contexts from batched data\n for (const frameId of uncachedIds) {\n const frame = frames.get(frameId);\n if (!frame || (!includeClosed && frame.state === 'closed')) {\n continue;\n }\n\n const context: FrameContext = {\n frameId,\n header: {\n goal: frame.name,\n constraints: this.extractConstraints(frame.inputs),\n definitions: frame.inputs.definitions,\n },\n anchors: allAnchors.get(frameId) || [],\n recentEvents: allEvents.get(frameId) || [],\n activeArtifacts: allArtifacts.get(frameId) || [],\n };\n\n // Cache the context\n if (enableCaching) {\n const cacheKey = createCacheKey('frame_context', [frameId, maxEvents]);\n this.cache.cacheFrameContext(cacheKey, context);\n }\n\n contexts.push(context as OptimizedFrameContext);\n }\n\n return contexts;\n }\n\n /**\n * Batch get frames with single query\n */\n private async batchGetFrames(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Frame>> {\n if (frameIds.length === 0) return new Map();\n\n const stmt = this.preparedStatements.get('batch_frames');\n if (!stmt) throw new Error('Prepared statement not found: batch_frames');\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `SELECT * FROM frames WHERE frame_id IN (${placeholders})`;\n \n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const frameMap = new Map<string, Frame>();\n for (const row of rows) {\n frameMap.set(row.frame_id, {\n ...row,\n inputs: JSON.parse(row.inputs || '{}'),\n outputs: JSON.parse(row.outputs || '{}'),\n digest_json: JSON.parse(row.digest_json || '{}'),\n });\n }\n\n return frameMap;\n }\n\n /**\n * Batch get events for multiple frames\n */\n private async batchGetEvents(\n frameIds: string[],\n maxEvents: number,\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Event[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT *, ROW_NUMBER() OVER (PARTITION BY frame_id ORDER BY seq DESC) as rn\n FROM events \n WHERE frame_id IN (${placeholders}) \n AND rn <= ${maxEvents}\n ORDER BY frame_id, seq DESC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const eventMap = new Map<string, Event[]>();\n for (const row of rows) {\n if (!eventMap.has(row.frame_id)) {\n eventMap.set(row.frame_id, []);\n }\n eventMap.get(row.frame_id)!.push({\n ...row,\n payload: JSON.parse(row.payload),\n });\n }\n\n return eventMap;\n }\n\n /**\n * Batch get anchors for multiple frames\n */\n private async batchGetAnchors(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, Anchor[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT * FROM anchors \n WHERE frame_id IN (${placeholders}) \n ORDER BY frame_id, priority DESC, created_at ASC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const anchorMap = new Map<string, Anchor[]>();\n for (const row of rows) {\n if (!anchorMap.has(row.frame_id)) {\n anchorMap.set(row.frame_id, []);\n }\n anchorMap.get(row.frame_id)!.push({\n ...row,\n metadata: JSON.parse(row.metadata || '{}'),\n });\n }\n\n return anchorMap;\n }\n\n /**\n * Batch get active artifacts for multiple frames\n */\n private async batchGetArtifacts(\n frameIds: string[],\n stats: { dbQueries: number; totalRows: number }\n ): Promise<Map<string, string[]>> {\n if (frameIds.length === 0) return new Map();\n\n const placeholders = frameIds.map(() => '?').join(',');\n const query = `\n SELECT frame_id, payload\n FROM events \n WHERE frame_id IN (${placeholders}) \n AND event_type = 'artifact'\n ORDER BY frame_id, ts DESC\n `;\n\n stats.dbQueries++;\n const rows = this.db.prepare(query).all(...frameIds) as any[];\n stats.totalRows += rows.length;\n\n const artifactMap = new Map<string, string[]>();\n for (const row of rows) {\n const payload = JSON.parse(row.payload);\n if (!artifactMap.has(row.frame_id)) {\n artifactMap.set(row.frame_id, []);\n }\n if (payload.path) {\n artifactMap.get(row.frame_id)!.push(payload.path);\n }\n }\n\n return artifactMap;\n }\n\n /**\n * Assemble single frame context\n */\n private async assembleFrameContext(\n frameId: string,\n maxEvents: number,\n stats: { dbQueries: number; totalRows: number }\n ): Promise<FrameContext | null> {\n // Single frame operations - these could be further optimized with prepared statements\n const frame = await this.batchGetFrames([frameId], stats).then(map => map.get(frameId));\n if (!frame) return null;\n\n const [events, anchors, artifacts] = await Promise.all([\n this.batchGetEvents([frameId], maxEvents, stats).then(map => map.get(frameId) || []),\n this.batchGetAnchors([frameId], stats).then(map => map.get(frameId) || []),\n this.batchGetArtifacts([frameId], stats).then(map => map.get(frameId) || []),\n ]);\n\n return {\n frameId,\n header: {\n goal: frame.name,\n constraints: this.extractConstraints(frame.inputs),\n definitions: frame.inputs.definitions,\n },\n anchors,\n recentEvents: events,\n activeArtifacts: artifacts,\n };\n }\n\n /**\n * Extract constraints from frame inputs\n */\n private extractConstraints(inputs: Record<string, any>): string[] {\n const constraints: string[] = [];\n \n if (inputs.constraints && Array.isArray(inputs.constraints)) {\n constraints.push(...inputs.constraints);\n }\n \n if (inputs.requirements && Array.isArray(inputs.requirements)) {\n constraints.push(...inputs.requirements);\n }\n \n if (inputs.limitations && Array.isArray(inputs.limitations)) {\n constraints.push(...inputs.limitations);\n }\n\n return constraints;\n }\n\n /**\n * Initialize prepared statements for common queries\n */\n private initializePreparedStatements(): void {\n try {\n // Single frame query\n this.preparedStatements.set(\n 'single_frame',\n this.db.prepare('SELECT * FROM frames WHERE frame_id = ?')\n );\n\n // Frame events with limit\n this.preparedStatements.set(\n 'frame_events',\n this.db.prepare('SELECT * FROM events WHERE frame_id = ? ORDER BY seq DESC LIMIT ?')\n );\n\n // Frame anchors\n this.preparedStatements.set(\n 'frame_anchors',\n this.db.prepare('SELECT * FROM anchors WHERE frame_id = ? ORDER BY priority DESC, created_at ASC')\n );\n\n logger.info('Prepared statements initialized for optimized context assembly');\n } catch (error: unknown) {\n logger.error('Failed to initialize prepared statements', error as Error);\n throw error;\n }\n }\n\n /**\n * Clear cache and reset prepared statements\n */\n cleanup(): void {\n this.cache.clear();\n // Modern better-sqlite3 automatically handles cleanup\n this.preparedStatements.clear();\n }\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/performance/performance-benchmark.ts"],
4
- "sourcesContent": ["/**\n * Performance Benchmark Suite\n * Measure improvements from optimization efforts\n */\n\nimport { performance } from 'perf_hooks';\nimport { logger } from '../monitoring/logger.js';\nimport { StreamingJSONLParser } from './streaming-jsonl-parser.js';\nimport { ContextCache } from './context-cache.js';\nimport { LazyContextLoader } from './lazy-context-loader.js';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\n\nexport interface BenchmarkResult {\n name: string;\n duration: number;\n memoryUsed: number;\n itemsProcessed: number;\n throughput: number;\n improvement?: number;\n}\n\nexport interface BenchmarkSuite {\n name: string;\n results: BenchmarkResult[];\n totalDuration: number;\n averageImprovement: number;\n}\n\nexport class PerformanceBenchmark {\n private results: BenchmarkResult[] = [];\n\n /**\n * Benchmark JSONL parsing performance\n */\n async benchmarkJSONLParsing(\n filePath: string,\n iterations = 3\n ): Promise<BenchmarkResult> {\n const parser = new StreamingJSONLParser();\n \n // Baseline: traditional sync parsing\n const baselineStart = performance.now();\n const baselineMemStart = process.memoryUsage().heapUsed;\n \n let baselineCount = 0;\n for (let i = 0; i < iterations; i++) {\n const content = readFileSync(filePath, 'utf8');\n const lines = content.split('\\n').filter(l => l.trim());\n for (const line of lines) {\n try {\n JSON.parse(line);\n baselineCount++;\n } catch {}\n }\n }\n \n const baselineDuration = performance.now() - baselineStart;\n const baselineMemUsed = process.memoryUsage().heapUsed - baselineMemStart;\n \n // Optimized: streaming parser\n const optimizedStart = performance.now();\n const optimizedMemStart = process.memoryUsage().heapUsed;\n \n let optimizedCount = 0;\n for (let i = 0; i < iterations; i++) {\n for await (const batch of parser.parseStream(filePath)) {\n optimizedCount += batch.length;\n }\n }\n \n const optimizedDuration = performance.now() - optimizedStart;\n const optimizedMemUsed = process.memoryUsage().heapUsed - optimizedMemStart;\n \n const improvement = ((baselineDuration - optimizedDuration) / baselineDuration) * 100;\n const memImprovement = ((baselineMemUsed - optimizedMemUsed) / baselineMemUsed) * 100;\n \n const result: BenchmarkResult = {\n name: 'JSONL Parsing',\n duration: optimizedDuration / iterations,\n memoryUsed: optimizedMemUsed,\n itemsProcessed: optimizedCount / iterations,\n throughput: (optimizedCount / iterations) / (optimizedDuration / 1000 / iterations),\n improvement,\n };\n \n logger.info('JSONL Parsing Benchmark', {\n baseline: {\n duration: baselineDuration / iterations,\n memory: baselineMemUsed,\n throughput: (baselineCount / iterations) / (baselineDuration / 1000 / iterations),\n },\n optimized: result,\n improvements: {\n speed: `${improvement.toFixed(1)}%`,\n memory: `${memImprovement.toFixed(1)}%`,\n },\n });\n \n this.results.push(result);\n return result;\n }\n\n /**\n * Benchmark context caching performance\n */\n async benchmarkContextCache(\n itemCount = 1000,\n accessPatterns = 10000\n ): Promise<BenchmarkResult> {\n const cache = new ContextCache<any>({\n maxSize: 50 * 1024 * 1024,\n maxItems: itemCount,\n });\n \n // Prepare test data\n const testData = Array.from({ length: itemCount }, (_, i) => ({\n key: `item-${i}`,\n value: { \n id: i, \n data: 'x'.repeat(Math.floor(Math.random() * 1000)),\n timestamp: Date.now(),\n },\n }));\n \n // Populate cache\n const populateStart = performance.now();\n for (const item of testData) {\n cache.set(item.key, item.value);\n }\n const populateDuration = performance.now() - populateStart;\n \n // Benchmark cache access\n const accessStart = performance.now();\n let hits = 0;\n let misses = 0;\n \n for (let i = 0; i < accessPatterns; i++) {\n const index = Math.floor(Math.random() * itemCount * 1.2); // Some will miss\n const key = `item-${index}`;\n const result = cache.get(key);\n if (result) hits++;\n else misses++;\n }\n \n const accessDuration = performance.now() - accessStart;\n const stats = cache.getStats();\n \n const result: BenchmarkResult = {\n name: 'Context Cache',\n duration: accessDuration,\n memoryUsed: cache.getSize().bytes,\n itemsProcessed: accessPatterns,\n throughput: accessPatterns / (accessDuration / 1000),\n improvement: stats.hitRate * 100,\n };\n \n logger.info('Context Cache Benchmark', {\n populate: {\n duration: populateDuration,\n items: itemCount,\n },\n access: {\n duration: accessDuration,\n patterns: accessPatterns,\n hitRate: `${(stats.hitRate * 100).toFixed(1)}%`,\n },\n performance: {\n throughput: `${result.throughput.toFixed(0)} ops/sec`,\n avgAccessTime: `${stats.avgAccessTime.toFixed(2)}ms`,\n },\n });\n \n this.results.push(result);\n return result;\n }\n\n /**\n * Benchmark lazy loading performance\n */\n async benchmarkLazyLoading(\n db: any,\n projectId: string,\n frameCount = 100\n ): Promise<BenchmarkResult> {\n const loader = new LazyContextLoader(db, projectId);\n \n // Check if frames table exists, if not use a mock test\n let frames: any[] = [];\n try {\n frames = db.prepare(\n 'SELECT id FROM frames ORDER BY updated_at DESC LIMIT ?'\n ).all(frameCount) as any[];\n } catch (error) {\n // Create mock frame IDs if table doesn't exist\n logger.warn('Frames table not found, using mock data for benchmark');\n frames = Array.from({ length: Math.min(frameCount, 10) }, (_, i) => ({\n id: `frame-${i}`,\n }));\n }\n \n const frameIds = frames.map((f: any) => f.id);\n \n // Benchmark eager loading (baseline)\n const eagerStart = performance.now();\n const eagerMemStart = process.memoryUsage().heapUsed;\n \n const eagerData = [];\n for (const id of frameIds) {\n try {\n const frame = db.prepare('SELECT * FROM frames WHERE id = ?').get(id);\n const anchors = db.prepare('SELECT * FROM anchors WHERE frame_id = ?').all(id);\n const events = db.prepare('SELECT * FROM events WHERE frame_id = ? LIMIT 10').all(id);\n eagerData.push({ frame, anchors, events });\n } catch {\n // Use mock data if tables don't exist\n eagerData.push({\n frame: { id, type: 'mock', name: `Mock ${id}` },\n anchors: [],\n events: [],\n });\n }\n }\n \n const eagerDuration = performance.now() - eagerStart;\n const eagerMemUsed = process.memoryUsage().heapUsed - eagerMemStart;\n \n // Benchmark lazy loading\n const lazyStart = performance.now();\n const lazyMemStart = process.memoryUsage().heapUsed;\n \n // Preload with lazy loading\n await loader.preloadContext(frameIds, { parallel: true, depth: 2 });\n \n // Access data lazily\n let accessedCount = 0;\n for (const id of frameIds.slice(0, frameCount / 2)) {\n const frame = await loader.lazyFrame(id).get();\n if (frame) accessedCount++;\n }\n \n const lazyDuration = performance.now() - lazyStart;\n const lazyMemUsed = process.memoryUsage().heapUsed - lazyMemStart;\n \n const improvement = ((eagerDuration - lazyDuration) / eagerDuration) * 100;\n const memImprovement = ((eagerMemUsed - lazyMemUsed) / eagerMemUsed) * 100;\n \n const result: BenchmarkResult = {\n name: 'Lazy Loading',\n duration: lazyDuration,\n memoryUsed: lazyMemUsed,\n itemsProcessed: frameCount,\n throughput: frameCount / (lazyDuration / 1000),\n improvement,\n };\n \n logger.info('Lazy Loading Benchmark', {\n eager: {\n duration: eagerDuration,\n memory: eagerMemUsed,\n },\n lazy: {\n duration: lazyDuration,\n memory: lazyMemUsed,\n accessed: accessedCount,\n },\n improvements: {\n speed: `${improvement.toFixed(1)}%`,\n memory: `${memImprovement.toFixed(1)}%`,\n },\n });\n \n this.results.push(result);\n return result;\n }\n\n /**\n * Run full benchmark suite\n */\n async runFullSuite(\n projectRoot: string,\n db: any,\n projectId: string\n ): Promise<BenchmarkSuite> {\n const suiteStart = performance.now();\n \n logger.info('Starting Performance Benchmark Suite');\n \n // Run benchmarks\n const tasksFile = join(projectRoot, '.stackmemory', 'tasks.jsonl');\n \n const jsonlResult = await this.benchmarkJSONLParsing(tasksFile);\n const cacheResult = await this.benchmarkContextCache();\n const lazyResult = await this.benchmarkLazyLoading(db, projectId);\n \n const totalDuration = performance.now() - suiteStart;\n const averageImprovement = this.results\n .filter(r => r.improvement !== undefined)\n .reduce((sum, r) => sum + (r.improvement || 0), 0) / \n this.results.filter(r => r.improvement !== undefined).length;\n \n const suite: BenchmarkSuite = {\n name: 'Performance Optimization Suite',\n results: this.results,\n totalDuration,\n averageImprovement,\n };\n \n // Generate summary report\n this.generateReport(suite);\n \n return suite;\n }\n\n /**\n * Generate performance report\n */\n private generateReport(suite: BenchmarkSuite): void {\n console.log('\\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557');\n console.log('\u2551 Performance Benchmark Results \u2551');\n console.log('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n');\n \n for (const result of suite.results) {\n console.log(`\uD83D\uDCCA ${result.name}`);\n console.log(` Duration: ${result.duration.toFixed(2)}ms`);\n console.log(` Memory: ${(result.memoryUsed / 1024 / 1024).toFixed(2)}MB`);\n console.log(` Throughput: ${result.throughput.toFixed(0)} items/sec`);\n if (result.improvement !== undefined) {\n const icon = result.improvement > 0 ? '\uD83D\uDE80' : '\u26A0\uFE0F';\n console.log(` ${icon} Improvement: ${result.improvement.toFixed(1)}%`);\n }\n console.log('');\n }\n \n console.log('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550');\n console.log(`\u23F1\uFE0F Total Duration: ${suite.totalDuration.toFixed(2)}ms`);\n console.log(`\uD83D\uDCC8 Average Improvement: ${suite.averageImprovement.toFixed(1)}%`);\n console.log('');\n \n logger.info('Performance Benchmark Complete', {\n suite: suite.name,\n duration: suite.totalDuration,\n avgImprovement: suite.averageImprovement,\n results: suite.results.map(r => ({\n name: r.name,\n improvement: r.improvement,\n throughput: r.throughput,\n })),\n });\n }\n\n /**\n * Get benchmark results\n */\n getResults(): BenchmarkResult[] {\n return this.results;\n }\n\n /**\n * Clear results\n */\n clearResults(): void {\n this.results = [];\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Performance Benchmark Suite\n * Measure improvements from optimization efforts\n */\n\nimport { performance } from 'perf_hooks';\nimport { logger } from '../monitoring/logger.js';\nimport { StreamingJSONLParser } from './streaming-jsonl-parser.js';\nimport { ContextCache } from './context-cache.js';\nimport { LazyContextLoader } from './lazy-context-loader.js';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\n\nexport interface BenchmarkResult {\n name: string;\n duration: number;\n memoryUsed: number;\n itemsProcessed: number;\n throughput: number;\n improvement?: number;\n}\n\nexport interface BenchmarkSuite {\n name: string;\n results: BenchmarkResult[];\n totalDuration: number;\n averageImprovement: number;\n}\n\nexport class PerformanceBenchmark {\n private results: BenchmarkResult[] = [];\n\n /**\n * Benchmark JSONL parsing performance\n */\n async benchmarkJSONLParsing(\n filePath: string,\n iterations = 3\n ): Promise<BenchmarkResult> {\n const parser = new StreamingJSONLParser();\n \n // Baseline: traditional sync parsing\n const baselineStart = performance.now();\n const baselineMemStart = process.memoryUsage().heapUsed;\n \n let baselineCount = 0;\n for (let i = 0; i < iterations; i++) {\n const content = readFileSync(filePath, 'utf8');\n const lines = content.split('\\n').filter((l: any) => l.trim());\n for (const line of lines) {\n try {\n JSON.parse(line);\n baselineCount++;\n } catch {}\n }\n }\n \n const baselineDuration = performance.now() - baselineStart;\n const baselineMemUsed = process.memoryUsage().heapUsed - baselineMemStart;\n \n // Optimized: streaming parser\n const optimizedStart = performance.now();\n const optimizedMemStart = process.memoryUsage().heapUsed;\n \n let optimizedCount = 0;\n for (let i = 0; i < iterations; i++) {\n for await (const batch of parser.parseStream(filePath)) {\n optimizedCount += batch.length;\n }\n }\n \n const optimizedDuration = performance.now() - optimizedStart;\n const optimizedMemUsed = process.memoryUsage().heapUsed - optimizedMemStart;\n \n const improvement = ((baselineDuration - optimizedDuration) / baselineDuration) * 100;\n const memImprovement = ((baselineMemUsed - optimizedMemUsed) / baselineMemUsed) * 100;\n \n const result: BenchmarkResult = {\n name: 'JSONL Parsing',\n duration: optimizedDuration / iterations,\n memoryUsed: optimizedMemUsed,\n itemsProcessed: optimizedCount / iterations,\n throughput: (optimizedCount / iterations) / (optimizedDuration / 1000 / iterations),\n improvement,\n };\n \n logger.info('JSONL Parsing Benchmark', {\n baseline: {\n duration: baselineDuration / iterations,\n memory: baselineMemUsed,\n throughput: (baselineCount / iterations) / (baselineDuration / 1000 / iterations),\n },\n optimized: result,\n improvements: {\n speed: `${improvement.toFixed(1)}%`,\n memory: `${memImprovement.toFixed(1)}%`,\n },\n });\n \n this.results.push(result);\n return result;\n }\n\n /**\n * Benchmark context caching performance\n */\n async benchmarkContextCache(\n itemCount = 1000,\n accessPatterns = 10000\n ): Promise<BenchmarkResult> {\n const cache = new ContextCache<any>({\n maxSize: 50 * 1024 * 1024,\n maxItems: itemCount,\n });\n \n // Prepare test data\n const testData = Array.from({ length: itemCount }, (_, i) => ({\n key: `item-${i}`,\n value: { \n id: i, \n data: 'x'.repeat(Math.floor(Math.random() * 1000)),\n timestamp: Date.now(),\n },\n }));\n \n // Populate cache\n const populateStart = performance.now();\n for (const item of testData) {\n cache.set(item.key, item.value);\n }\n const populateDuration = performance.now() - populateStart;\n \n // Benchmark cache access\n const accessStart = performance.now();\n let hits = 0;\n let misses = 0;\n \n for (let i = 0; i < accessPatterns; i++) {\n const index = Math.floor(Math.random() * itemCount * 1.2); // Some will miss\n const key = `item-${index}`;\n const result = cache.get(key);\n if (result) hits++;\n else misses++;\n }\n \n const accessDuration = performance.now() - accessStart;\n const stats = cache.getStats();\n \n const result: BenchmarkResult = {\n name: 'Context Cache',\n duration: accessDuration,\n memoryUsed: cache.getSize().bytes,\n itemsProcessed: accessPatterns,\n throughput: accessPatterns / (accessDuration / 1000),\n improvement: stats.hitRate * 100,\n };\n \n logger.info('Context Cache Benchmark', {\n populate: {\n duration: populateDuration,\n items: itemCount,\n },\n access: {\n duration: accessDuration,\n patterns: accessPatterns,\n hitRate: `${(stats.hitRate * 100).toFixed(1)}%`,\n },\n performance: {\n throughput: `${result.throughput.toFixed(0)} ops/sec`,\n avgAccessTime: `${stats.avgAccessTime.toFixed(2)}ms`,\n },\n });\n \n this.results.push(result);\n return result;\n }\n\n /**\n * Benchmark lazy loading performance\n */\n async benchmarkLazyLoading(\n db: any,\n projectId: string,\n frameCount = 100\n ): Promise<BenchmarkResult> {\n const loader = new LazyContextLoader(db, projectId);\n \n // Check if frames table exists, if not use a mock test\n let frames: any[] = [];\n try {\n frames = db.prepare(\n 'SELECT id FROM frames ORDER BY updated_at DESC LIMIT ?'\n ).all(frameCount) as any[];\n } catch (error: unknown) {\n // Create mock frame IDs if table doesn't exist\n logger.warn('Frames table not found, using mock data for benchmark');\n frames = Array.from({ length: Math.min(frameCount, 10) }, (_, i) => ({\n id: `frame-${i}`,\n }));\n }\n \n const frameIds = frames.map((f: any) => f.id);\n \n // Benchmark eager loading (baseline)\n const eagerStart = performance.now();\n const eagerMemStart = process.memoryUsage().heapUsed;\n \n const eagerData = [];\n for (const id of frameIds) {\n try {\n const frame = db.prepare('SELECT * FROM frames WHERE id = ?').get(id);\n const anchors = db.prepare('SELECT * FROM anchors WHERE frame_id = ?').all(id);\n const events = db.prepare('SELECT * FROM events WHERE frame_id = ? LIMIT 10').all(id);\n eagerData.push({ frame, anchors, events });\n } catch {\n // Use mock data if tables don't exist\n eagerData.push({\n frame: { id, type: 'mock', name: `Mock ${id}` },\n anchors: [],\n events: [],\n });\n }\n }\n \n const eagerDuration = performance.now() - eagerStart;\n const eagerMemUsed = process.memoryUsage().heapUsed - eagerMemStart;\n \n // Benchmark lazy loading\n const lazyStart = performance.now();\n const lazyMemStart = process.memoryUsage().heapUsed;\n \n // Preload with lazy loading\n await loader.preloadContext(frameIds, { parallel: true, depth: 2 });\n \n // Access data lazily\n let accessedCount = 0;\n for (const id of frameIds.slice(0, frameCount / 2)) {\n const frame = await loader.lazyFrame(id).get();\n if (frame) accessedCount++;\n }\n \n const lazyDuration = performance.now() - lazyStart;\n const lazyMemUsed = process.memoryUsage().heapUsed - lazyMemStart;\n \n const improvement = ((eagerDuration - lazyDuration) / eagerDuration) * 100;\n const memImprovement = ((eagerMemUsed - lazyMemUsed) / eagerMemUsed) * 100;\n \n const result: BenchmarkResult = {\n name: 'Lazy Loading',\n duration: lazyDuration,\n memoryUsed: lazyMemUsed,\n itemsProcessed: frameCount,\n throughput: frameCount / (lazyDuration / 1000),\n improvement,\n };\n \n logger.info('Lazy Loading Benchmark', {\n eager: {\n duration: eagerDuration,\n memory: eagerMemUsed,\n },\n lazy: {\n duration: lazyDuration,\n memory: lazyMemUsed,\n accessed: accessedCount,\n },\n improvements: {\n speed: `${improvement.toFixed(1)}%`,\n memory: `${memImprovement.toFixed(1)}%`,\n },\n });\n \n this.results.push(result);\n return result;\n }\n\n /**\n * Run full benchmark suite\n */\n async runFullSuite(\n projectRoot: string,\n db: any,\n projectId: string\n ): Promise<BenchmarkSuite> {\n const suiteStart = performance.now();\n \n logger.info('Starting Performance Benchmark Suite');\n \n // Run benchmarks\n const tasksFile = join(projectRoot, '.stackmemory', 'tasks.jsonl');\n \n const jsonlResult = await this.benchmarkJSONLParsing(tasksFile);\n const cacheResult = await this.benchmarkContextCache();\n const lazyResult = await this.benchmarkLazyLoading(db, projectId);\n \n const totalDuration = performance.now() - suiteStart;\n const averageImprovement = this.results\n .filter((r: any) => r.improvement !== undefined)\n .reduce((sum, r) => sum + (r.improvement || 0), 0) / \n this.results.filter((r: any) => r.improvement !== undefined).length;\n \n const suite: BenchmarkSuite = {\n name: 'Performance Optimization Suite',\n results: this.results,\n totalDuration,\n averageImprovement,\n };\n \n // Generate summary report\n this.generateReport(suite);\n \n return suite;\n }\n\n /**\n * Generate performance report\n */\n private generateReport(suite: BenchmarkSuite): void {\n console.log('\\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557');\n console.log('\u2551 Performance Benchmark Results \u2551');\n console.log('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D\\n');\n \n for (const result of suite.results) {\n console.log(`\uD83D\uDCCA ${result.name}`);\n console.log(` Duration: ${result.duration.toFixed(2)}ms`);\n console.log(` Memory: ${(result.memoryUsed / 1024 / 1024).toFixed(2)}MB`);\n console.log(` Throughput: ${result.throughput.toFixed(0)} items/sec`);\n if (result.improvement !== undefined) {\n const icon = result.improvement > 0 ? '\uD83D\uDE80' : '\u26A0\uFE0F';\n console.log(` ${icon} Improvement: ${result.improvement.toFixed(1)}%`);\n }\n console.log('');\n }\n \n console.log('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550');\n console.log(`\u23F1\uFE0F Total Duration: ${suite.totalDuration.toFixed(2)}ms`);\n console.log(`\uD83D\uDCC8 Average Improvement: ${suite.averageImprovement.toFixed(1)}%`);\n console.log('');\n \n logger.info('Performance Benchmark Complete', {\n suite: suite.name,\n duration: suite.totalDuration,\n avgImprovement: suite.averageImprovement,\n results: suite.results.map((r: any) => ({\n name: r.name,\n improvement: r.improvement,\n throughput: r.throughput,\n })),\n });\n }\n\n /**\n * Get benchmark results\n */\n getResults(): BenchmarkResult[] {\n return this.results;\n }\n\n /**\n * Clear results\n */\n clearResults(): void {\n this.results = [];\n }\n}"],
5
+ "mappings": "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",
6
6
  "names": ["result"]
7
7
  }
@@ -1,5 +1,16 @@
1
1
  import { logger } from "../monitoring/logger.js";
2
2
  import { getQueryStatistics } from "../trace/db-trace-wrapper.js";
3
+ function getEnv(key, defaultValue) {
4
+ const value = process.env[key];
5
+ if (value === void 0) {
6
+ if (defaultValue !== void 0) return defaultValue;
7
+ throw new Error(`Environment variable ${key} is required`);
8
+ }
9
+ return value;
10
+ }
11
+ function getOptionalEnv(key) {
12
+ return process.env[key];
13
+ }
3
14
  class PerformanceProfiler {
4
15
  metrics = /* @__PURE__ */ new Map();
5
16
  hotPaths = /* @__PURE__ */ new Map();
@@ -242,7 +253,7 @@ let globalProfiler = null;
242
253
  function getProfiler() {
243
254
  if (!globalProfiler) {
244
255
  globalProfiler = new PerformanceProfiler({
245
- enabled: process.env.NODE_ENV !== "production" || process.env.STACKMEMORY_PROFILING === "true"
256
+ enabled: process.env["NODE_ENV"] !== "production" || process.env["STACKMEMORY_PROFILING"] === "true"
246
257
  });
247
258
  }
248
259
  return globalProfiler;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/performance/performance-profiler.ts"],
4
- "sourcesContent": ["/**\n * Performance Profiler\n * Identifies and optimizes hot paths in StackMemory operations\n */\n\nimport { logger } from '../monitoring/logger.js';\nimport { getQueryStatistics } from '../trace/db-trace-wrapper.js';\nimport Database from 'better-sqlite3';\n\nexport interface PerformanceMetrics {\n operationName: string;\n callCount: number;\n totalTimeMs: number;\n avgTimeMs: number;\n minTimeMs: number;\n maxTimeMs: number;\n p95TimeMs: number;\n lastExecuted: number;\n}\n\nexport interface HotPath {\n path: string;\n frequency: number;\n avgDuration: number;\n totalDuration: number;\n lastSeen: number;\n samples: PerformanceSample[];\n}\n\nexport interface PerformanceSample {\n timestamp: number;\n duration: number;\n metadata?: Record<string, any>;\n}\n\nexport interface SystemPerformanceReport {\n timestamp: number;\n hotPaths: HotPath[];\n databaseMetrics: any;\n memoryUsage: {\n heapUsed: number;\n heapTotal: number;\n external: number;\n };\n cacheMetrics: any;\n recommendations: string[];\n}\n\n/**\n * Performance profiler with hot path detection\n */\nexport class PerformanceProfiler {\n private metrics = new Map<string, PerformanceMetrics>();\n private hotPaths = new Map<string, HotPath>();\n private samples = new Map<string, PerformanceSample[]>();\n private isEnabled = true;\n private sampleLimit = 1000;\n private hotPathThreshold = 5; // Operations taking > 5ms are considered hot\n\n constructor(\n options: {\n enabled?: boolean;\n sampleLimit?: number;\n hotPathThreshold?: number;\n } = {}\n ) {\n this.isEnabled = options.enabled ?? true;\n this.sampleLimit = options.sampleLimit ?? 1000;\n this.hotPathThreshold = options.hotPathThreshold ?? 5;\n }\n\n /**\n * Start timing an operation\n */\n startTiming(operationName: string): (metadata?: Record<string, any>) => void {\n if (!this.isEnabled) {\n return () => {}; // No-op\n }\n\n const startTime = performance.now();\n \n return (metadata?: Record<string, any>) => {\n this.endTiming(operationName, startTime, metadata);\n };\n }\n\n /**\n * Time a function execution\n */\n async timeFunction<T>(\n operationName: string,\n fn: () => T | Promise<T>,\n metadata?: Record<string, any>\n ): Promise<T> {\n if (!this.isEnabled) {\n return await fn();\n }\n\n const endTimer = this.startTiming(operationName);\n try {\n const result = await fn();\n endTimer(metadata);\n return result;\n } catch (error) {\n endTimer({ ...metadata, error: true });\n throw error;\n }\n }\n\n /**\n * Record timing manually\n */\n recordTiming(operationName: string, durationMs: number, metadata?: Record<string, any>): void {\n if (!this.isEnabled) return;\n\n this.endTiming(operationName, performance.now() - durationMs, metadata);\n }\n\n /**\n * Get performance metrics for an operation\n */\n getMetrics(operationName: string): PerformanceMetrics | undefined {\n return this.metrics.get(operationName);\n }\n\n /**\n * Get all performance metrics\n */\n getAllMetrics(): Map<string, PerformanceMetrics> {\n return new Map(this.metrics);\n }\n\n /**\n * Get hot paths sorted by impact\n */\n getHotPaths(limit = 10): HotPath[] {\n return Array.from(this.hotPaths.values())\n .sort((a, b) => (b.frequency * b.avgDuration) - (a.frequency * a.avgDuration))\n .slice(0, limit);\n }\n\n /**\n * Generate comprehensive performance report\n */\n generateReport(db?: Database.Database): SystemPerformanceReport {\n const hotPaths = this.getHotPaths(20);\n const recommendations = this.generateRecommendations(hotPaths);\n \n const report: SystemPerformanceReport = {\n timestamp: Date.now(),\n hotPaths,\n databaseMetrics: db ? getQueryStatistics(db) : null,\n memoryUsage: process.memoryUsage(),\n cacheMetrics: null, // Will be filled by query cache if available\n recommendations,\n };\n\n logger.info('Performance report generated', {\n hotPathsCount: hotPaths.length,\n recommendationsCount: recommendations.length,\n topHotPath: hotPaths[0]?.path,\n });\n\n return report;\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n this.metrics.clear();\n this.hotPaths.clear();\n this.samples.clear();\n logger.info('Performance metrics reset');\n }\n\n /**\n * Export metrics to JSON\n */\n exportMetrics(): string {\n const data = {\n timestamp: Date.now(),\n metrics: Object.fromEntries(this.metrics),\n hotPaths: Object.fromEntries(this.hotPaths),\n config: {\n sampleLimit: this.sampleLimit,\n hotPathThreshold: this.hotPathThreshold,\n enabled: this.isEnabled,\n },\n };\n\n return JSON.stringify(data, null, 2);\n }\n\n /**\n * Enable/disable profiling\n */\n setEnabled(enabled: boolean): void {\n this.isEnabled = enabled;\n logger.info(`Performance profiling ${enabled ? 'enabled' : 'disabled'}`);\n }\n\n /**\n * End timing for an operation\n */\n private endTiming(operationName: string, startTime: number, metadata?: Record<string, any>): void {\n const duration = performance.now() - startTime;\n const timestamp = Date.now();\n\n // Update metrics\n this.updateMetrics(operationName, duration, timestamp);\n\n // Track hot paths\n if (duration > this.hotPathThreshold) {\n this.trackHotPath(operationName, duration, timestamp, metadata);\n }\n\n // Store sample\n this.storeSample(operationName, duration, timestamp, metadata);\n }\n\n /**\n * Update performance metrics for an operation\n */\n private updateMetrics(operationName: string, duration: number, timestamp: number): void {\n const existing = this.metrics.get(operationName);\n \n if (!existing) {\n this.metrics.set(operationName, {\n operationName,\n callCount: 1,\n totalTimeMs: duration,\n avgTimeMs: duration,\n minTimeMs: duration,\n maxTimeMs: duration,\n p95TimeMs: duration,\n lastExecuted: timestamp,\n });\n } else {\n existing.callCount++;\n existing.totalTimeMs += duration;\n existing.avgTimeMs = existing.totalTimeMs / existing.callCount;\n existing.minTimeMs = Math.min(existing.minTimeMs, duration);\n existing.maxTimeMs = Math.max(existing.maxTimeMs, duration);\n existing.lastExecuted = timestamp;\n\n // Update p95 from samples\n existing.p95TimeMs = this.calculateP95(operationName);\n }\n }\n\n /**\n * Track hot path\n */\n private trackHotPath(\n operationName: string,\n duration: number,\n timestamp: number,\n metadata?: Record<string, any>\n ): void {\n const existing = this.hotPaths.get(operationName);\n \n if (!existing) {\n this.hotPaths.set(operationName, {\n path: operationName,\n frequency: 1,\n avgDuration: duration,\n totalDuration: duration,\n lastSeen: timestamp,\n samples: [{ timestamp, duration, metadata }],\n });\n } else {\n existing.frequency++;\n existing.totalDuration += duration;\n existing.avgDuration = existing.totalDuration / existing.frequency;\n existing.lastSeen = timestamp;\n \n // Keep limited samples\n existing.samples.push({ timestamp, duration, metadata });\n if (existing.samples.length > 100) {\n existing.samples = existing.samples.slice(-100);\n }\n }\n }\n\n /**\n * Store performance sample\n */\n private storeSample(\n operationName: string,\n duration: number,\n timestamp: number,\n metadata?: Record<string, any>\n ): void {\n if (!this.samples.has(operationName)) {\n this.samples.set(operationName, []);\n }\n\n const samples = this.samples.get(operationName)!;\n samples.push({ timestamp, duration, metadata });\n\n // Limit samples to prevent memory growth\n if (samples.length > this.sampleLimit) {\n samples.splice(0, samples.length - this.sampleLimit);\n }\n }\n\n /**\n * Calculate 95th percentile from samples\n */\n private calculateP95(operationName: string): number {\n const samples = this.samples.get(operationName);\n if (!samples || samples.length === 0) return 0;\n\n const durations = samples.map(s => s.duration).sort((a, b) => a - b);\n const index = Math.floor(durations.length * 0.95);\n return durations[index] || 0;\n }\n\n /**\n * Generate optimization recommendations\n */\n private generateRecommendations(hotPaths: HotPath[]): string[] {\n const recommendations: string[] = [];\n\n for (const hotPath of hotPaths.slice(0, 5)) {\n const impact = hotPath.frequency * hotPath.avgDuration;\n \n if (hotPath.path.includes('getFrameContext') && hotPath.avgDuration > 10) {\n recommendations.push(`Consider caching frame context for ${hotPath.path} (avg: ${hotPath.avgDuration.toFixed(1)}ms)`);\n }\n \n if (hotPath.path.includes('getFrameEvents') && hotPath.frequency > 100) {\n recommendations.push(`High frequency event queries detected in ${hotPath.path} (${hotPath.frequency} calls). Consider pagination or caching.`);\n }\n \n if (hotPath.path.includes('bulkInsert') && hotPath.avgDuration > 50) {\n recommendations.push(`Slow bulk insertion in ${hotPath.path}. Consider increasing batch size or using prepared statements.`);\n }\n \n if (impact > 1000) {\n recommendations.push(`High impact operation: ${hotPath.path} (${impact.toFixed(0)}ms total impact). Consider optimization.`);\n }\n }\n\n // Memory recommendations\n const memUsage = process.memoryUsage();\n if (memUsage.heapUsed / memUsage.heapTotal > 0.8) {\n recommendations.push('High memory usage detected. Consider implementing cleanup routines or reducing cache sizes.');\n }\n\n if (recommendations.length === 0) {\n recommendations.push('No significant performance issues detected.');\n }\n\n return recommendations;\n }\n}\n\n// Global profiler instance\nlet globalProfiler: PerformanceProfiler | null = null;\n\n/**\n * Get or create global profiler\n */\nexport function getProfiler(): PerformanceProfiler {\n if (!globalProfiler) {\n globalProfiler = new PerformanceProfiler({\n enabled: process.env.NODE_ENV !== 'production' || process.env.STACKMEMORY_PROFILING === 'true',\n });\n }\n return globalProfiler;\n}\n\n/**\n * Convenience function to time operations\n */\nexport async function timeOperation<T>(\n operationName: string,\n fn: () => T | Promise<T>,\n metadata?: Record<string, any>\n): Promise<T> {\n return getProfiler().timeFunction(operationName, fn, metadata);\n}\n\n/**\n * Create a performance monitoring decorator\n */\nexport function performanceMonitor(operationName?: string) {\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n const finalOperationName = operationName || `${target.constructor.name}.${propertyKey}`;\n\n descriptor.value = async function (...args: any[]) {\n return getProfiler().timeFunction(finalOperationName, () => originalMethod.apply(this, args));\n };\n\n return descriptor;\n };\n}\n\n/**\n * Monitor specific StackMemory operations\n */\nexport class StackMemoryPerformanceMonitor {\n private profiler = getProfiler();\n \n /**\n * Monitor frame operations\n */\n monitorFrameOperations(frameManager: any): void {\n this.wrapMethod(frameManager, 'getFrame', 'FrameManager.getFrame');\n this.wrapMethod(frameManager, 'getFrameEvents', 'FrameManager.getFrameEvents');\n this.wrapMethod(frameManager, 'getFrameAnchors', 'FrameManager.getFrameAnchors');\n this.wrapMethod(frameManager, 'getHotStackContext', 'FrameManager.getHotStackContext');\n }\n\n /**\n * Monitor database operations \n */\n monitorDatabaseOperations(db: Database.Database): void {\n const originalPrepare = db.prepare;\n db.prepare = function<T = any>(sql: string): Database.Statement<T[], T> {\n const stmt = originalPrepare.call(this, sql);\n return wrapStatement(stmt, sql);\n };\n }\n\n /**\n * Wrap a method with performance monitoring\n */\n private wrapMethod(obj: any, methodName: string, operationName: string): void {\n const original = obj[methodName];\n if (typeof original !== 'function') return;\n\n obj[methodName] = async function (...args: any[]) {\n return getProfiler().timeFunction(operationName, () => original.apply(this, args));\n };\n }\n}\n\n/**\n * Wrap a database statement with performance monitoring\n */\nfunction wrapStatement(stmt: Database.Statement, sql: string): Database.Statement {\n const operationName = `SQL.${sql.trim().split(' ')[0].toUpperCase()}`;\n \n const originalRun = stmt.run;\n const originalGet = stmt.get;\n const originalAll = stmt.all;\n\n stmt.run = function (this: Database.Statement, ...args: any[]) {\n return getProfiler().timeFunction(`${operationName}.run`, () => originalRun.apply(this, args));\n } as any;\n\n stmt.get = function (this: Database.Statement, ...args: any[]) {\n return getProfiler().timeFunction(`${operationName}.get`, () => originalGet.apply(this, args));\n } as any;\n\n stmt.all = function (this: Database.Statement, ...args: any[]) {\n return getProfiler().timeFunction(`${operationName}.all`, () => originalAll.apply(this, args));\n } as any;\n\n return stmt;\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Performance Profiler\n * Identifies and optimizes hot paths in StackMemory operations\n */\n\nimport { logger } from '../monitoring/logger.js';\nimport { getQueryStatistics } from '../trace/db-trace-wrapper.js';\nimport Database from 'better-sqlite3';\n// Type-safe environment variable access\nfunction getEnv(key: string, defaultValue?: string): string {\n const value = process.env[key];\n if (value === undefined) {\n if (defaultValue !== undefined) return defaultValue;\n throw new Error(`Environment variable ${key} is required`);\n }\n return value;\n}\n\nfunction getOptionalEnv(key: string): string | undefined {\n return process.env[key];\n}\n\n\nexport interface PerformanceMetrics {\n operationName: string;\n callCount: number;\n totalTimeMs: number;\n avgTimeMs: number;\n minTimeMs: number;\n maxTimeMs: number;\n p95TimeMs: number;\n lastExecuted: number;\n}\n\nexport interface HotPath {\n path: string;\n frequency: number;\n avgDuration: number;\n totalDuration: number;\n lastSeen: number;\n samples: PerformanceSample[];\n}\n\nexport interface PerformanceSample {\n timestamp: number;\n duration: number;\n metadata?: Record<string, any>;\n}\n\nexport interface SystemPerformanceReport {\n timestamp: number;\n hotPaths: HotPath[];\n databaseMetrics: any;\n memoryUsage: {\n heapUsed: number;\n heapTotal: number;\n external: number;\n };\n cacheMetrics: any;\n recommendations: string[];\n}\n\n/**\n * Performance profiler with hot path detection\n */\nexport class PerformanceProfiler {\n private metrics = new Map<string, PerformanceMetrics>();\n private hotPaths = new Map<string, HotPath>();\n private samples = new Map<string, PerformanceSample[]>();\n private isEnabled = true;\n private sampleLimit = 1000;\n private hotPathThreshold = 5; // Operations taking > 5ms are considered hot\n\n constructor(\n options: {\n enabled?: boolean;\n sampleLimit?: number;\n hotPathThreshold?: number;\n } = {}\n ) {\n this.isEnabled = options.enabled ?? true;\n this.sampleLimit = options.sampleLimit ?? 1000;\n this.hotPathThreshold = options.hotPathThreshold ?? 5;\n }\n\n /**\n * Start timing an operation\n */\n startTiming(operationName: string): (metadata?: Record<string, any>) => void {\n if (!this.isEnabled) {\n return () => {}; // No-op\n }\n\n const startTime = performance.now();\n \n return (metadata?: Record<string, any>) => {\n this.endTiming(operationName, startTime, metadata);\n };\n }\n\n /**\n * Time a function execution\n */\n async timeFunction<T>(\n operationName: string,\n fn: () => T | Promise<T>,\n metadata?: Record<string, any>\n ): Promise<T> {\n if (!this.isEnabled) {\n return await fn();\n }\n\n const endTimer = this.startTiming(operationName);\n try {\n const result = await fn();\n endTimer(metadata);\n return result;\n } catch (error: unknown) {\n endTimer({ ...metadata, error: true });\n throw error;\n }\n }\n\n /**\n * Record timing manually\n */\n recordTiming(operationName: string, durationMs: number, metadata?: Record<string, any>): void {\n if (!this.isEnabled) return;\n\n this.endTiming(operationName, performance.now() - durationMs, metadata);\n }\n\n /**\n * Get performance metrics for an operation\n */\n getMetrics(operationName: string): PerformanceMetrics | undefined {\n return this.metrics.get(operationName);\n }\n\n /**\n * Get all performance metrics\n */\n getAllMetrics(): Map<string, PerformanceMetrics> {\n return new Map(this.metrics);\n }\n\n /**\n * Get hot paths sorted by impact\n */\n getHotPaths(limit = 10): HotPath[] {\n return Array.from(this.hotPaths.values())\n .sort((a, b) => (b.frequency * b.avgDuration) - (a.frequency * a.avgDuration))\n .slice(0, limit);\n }\n\n /**\n * Generate comprehensive performance report\n */\n generateReport(db?: Database.Database): SystemPerformanceReport {\n const hotPaths = this.getHotPaths(20);\n const recommendations = this.generateRecommendations(hotPaths);\n \n const report: SystemPerformanceReport = {\n timestamp: Date.now(),\n hotPaths,\n databaseMetrics: db ? getQueryStatistics(db) : null,\n memoryUsage: process.memoryUsage(),\n cacheMetrics: null, // Will be filled by query cache if available\n recommendations,\n };\n\n logger.info('Performance report generated', {\n hotPathsCount: hotPaths.length,\n recommendationsCount: recommendations.length,\n topHotPath: hotPaths[0]?.path,\n });\n\n return report;\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n this.metrics.clear();\n this.hotPaths.clear();\n this.samples.clear();\n logger.info('Performance metrics reset');\n }\n\n /**\n * Export metrics to JSON\n */\n exportMetrics(): string {\n const data = {\n timestamp: Date.now(),\n metrics: Object.fromEntries(this.metrics),\n hotPaths: Object.fromEntries(this.hotPaths),\n config: {\n sampleLimit: this.sampleLimit,\n hotPathThreshold: this.hotPathThreshold,\n enabled: this.isEnabled,\n },\n };\n\n return JSON.stringify(data, null, 2);\n }\n\n /**\n * Enable/disable profiling\n */\n setEnabled(enabled: boolean): void {\n this.isEnabled = enabled;\n logger.info(`Performance profiling ${enabled ? 'enabled' : 'disabled'}`);\n }\n\n /**\n * End timing for an operation\n */\n private endTiming(operationName: string, startTime: number, metadata?: Record<string, any>): void {\n const duration = performance.now() - startTime;\n const timestamp = Date.now();\n\n // Update metrics\n this.updateMetrics(operationName, duration, timestamp);\n\n // Track hot paths\n if (duration > this.hotPathThreshold) {\n this.trackHotPath(operationName, duration, timestamp, metadata);\n }\n\n // Store sample\n this.storeSample(operationName, duration, timestamp, metadata);\n }\n\n /**\n * Update performance metrics for an operation\n */\n private updateMetrics(operationName: string, duration: number, timestamp: number): void {\n const existing = this.metrics.get(operationName);\n \n if (!existing) {\n this.metrics.set(operationName, {\n operationName,\n callCount: 1,\n totalTimeMs: duration,\n avgTimeMs: duration,\n minTimeMs: duration,\n maxTimeMs: duration,\n p95TimeMs: duration,\n lastExecuted: timestamp,\n });\n } else {\n existing.callCount++;\n existing.totalTimeMs += duration;\n existing.avgTimeMs = existing.totalTimeMs / existing.callCount;\n existing.minTimeMs = Math.min(existing.minTimeMs, duration);\n existing.maxTimeMs = Math.max(existing.maxTimeMs, duration);\n existing.lastExecuted = timestamp;\n\n // Update p95 from samples\n existing.p95TimeMs = this.calculateP95(operationName);\n }\n }\n\n /**\n * Track hot path\n */\n private trackHotPath(\n operationName: string,\n duration: number,\n timestamp: number,\n metadata?: Record<string, any>\n ): void {\n const existing = this.hotPaths.get(operationName);\n \n if (!existing) {\n this.hotPaths.set(operationName, {\n path: operationName,\n frequency: 1,\n avgDuration: duration,\n totalDuration: duration,\n lastSeen: timestamp,\n samples: [{ timestamp, duration, metadata }],\n });\n } else {\n existing.frequency++;\n existing.totalDuration += duration;\n existing.avgDuration = existing.totalDuration / existing.frequency;\n existing.lastSeen = timestamp;\n \n // Keep limited samples\n existing.samples.push({ timestamp, duration, metadata });\n if (existing.samples.length > 100) {\n existing.samples = existing.samples.slice(-100);\n }\n }\n }\n\n /**\n * Store performance sample\n */\n private storeSample(\n operationName: string,\n duration: number,\n timestamp: number,\n metadata?: Record<string, any>\n ): void {\n if (!this.samples.has(operationName)) {\n this.samples.set(operationName, []);\n }\n\n const samples = this.samples.get(operationName)!;\n samples.push({ timestamp, duration, metadata });\n\n // Limit samples to prevent memory growth\n if (samples.length > this.sampleLimit) {\n samples.splice(0, samples.length - this.sampleLimit);\n }\n }\n\n /**\n * Calculate 95th percentile from samples\n */\n private calculateP95(operationName: string): number {\n const samples = this.samples.get(operationName);\n if (!samples || samples.length === 0) return 0;\n\n const durations = samples.map((s: any) => s.duration).sort((a, b) => a - b);\n const index = Math.floor(durations.length * 0.95);\n return durations[index] || 0;\n }\n\n /**\n * Generate optimization recommendations\n */\n private generateRecommendations(hotPaths: HotPath[]): string[] {\n const recommendations: string[] = [];\n\n for (const hotPath of hotPaths.slice(0, 5)) {\n const impact = hotPath.frequency * hotPath.avgDuration;\n \n if (hotPath.path.includes('getFrameContext') && hotPath.avgDuration > 10) {\n recommendations.push(`Consider caching frame context for ${hotPath.path} (avg: ${hotPath.avgDuration.toFixed(1)}ms)`);\n }\n \n if (hotPath.path.includes('getFrameEvents') && hotPath.frequency > 100) {\n recommendations.push(`High frequency event queries detected in ${hotPath.path} (${hotPath.frequency} calls). Consider pagination or caching.`);\n }\n \n if (hotPath.path.includes('bulkInsert') && hotPath.avgDuration > 50) {\n recommendations.push(`Slow bulk insertion in ${hotPath.path}. Consider increasing batch size or using prepared statements.`);\n }\n \n if (impact > 1000) {\n recommendations.push(`High impact operation: ${hotPath.path} (${impact.toFixed(0)}ms total impact). Consider optimization.`);\n }\n }\n\n // Memory recommendations\n const memUsage = process.memoryUsage();\n if (memUsage.heapUsed / memUsage.heapTotal > 0.8) {\n recommendations.push('High memory usage detected. Consider implementing cleanup routines or reducing cache sizes.');\n }\n\n if (recommendations.length === 0) {\n recommendations.push('No significant performance issues detected.');\n }\n\n return recommendations;\n }\n}\n\n// Global profiler instance\nlet globalProfiler: PerformanceProfiler | null = null;\n\n/**\n * Get or create global profiler\n */\nexport function getProfiler(): PerformanceProfiler {\n if (!globalProfiler) {\n globalProfiler = new PerformanceProfiler({\n enabled: process.env['NODE_ENV'] !== 'production' || process.env['STACKMEMORY_PROFILING'] === 'true',\n });\n }\n return globalProfiler;\n}\n\n/**\n * Convenience function to time operations\n */\nexport async function timeOperation<T>(\n operationName: string,\n fn: () => T | Promise<T>,\n metadata?: Record<string, any>\n): Promise<T> {\n return getProfiler().timeFunction(operationName, fn, metadata);\n}\n\n/**\n * Create a performance monitoring decorator\n */\nexport function performanceMonitor(operationName?: string) {\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n const finalOperationName = operationName || `${target.constructor.name}.${propertyKey}`;\n\n descriptor.value = async function (...args: any[]) {\n return getProfiler().timeFunction(finalOperationName, () => originalMethod.apply(this, args));\n };\n\n return descriptor;\n };\n}\n\n/**\n * Monitor specific StackMemory operations\n */\nexport class StackMemoryPerformanceMonitor {\n private profiler = getProfiler();\n \n /**\n * Monitor frame operations\n */\n monitorFrameOperations(frameManager: any): void {\n this.wrapMethod(frameManager, 'getFrame', 'FrameManager.getFrame');\n this.wrapMethod(frameManager, 'getFrameEvents', 'FrameManager.getFrameEvents');\n this.wrapMethod(frameManager, 'getFrameAnchors', 'FrameManager.getFrameAnchors');\n this.wrapMethod(frameManager, 'getHotStackContext', 'FrameManager.getHotStackContext');\n }\n\n /**\n * Monitor database operations \n */\n monitorDatabaseOperations(db: Database.Database): void {\n const originalPrepare = db.prepare;\n db.prepare = function<T = any>(sql: string): Database.Statement<T[], T> {\n const stmt = originalPrepare.call(this, sql);\n return wrapStatement(stmt, sql);\n };\n }\n\n /**\n * Wrap a method with performance monitoring\n */\n private wrapMethod(obj: any, methodName: string, operationName: string): void {\n const original = obj[methodName];\n if (typeof original !== 'function') return;\n\n obj[methodName] = async function (...args: any[]) {\n return getProfiler().timeFunction(operationName, () => original.apply(this, args));\n };\n }\n}\n\n/**\n * Wrap a database statement with performance monitoring\n */\nfunction wrapStatement(stmt: Database.Statement, sql: string): Database.Statement {\n const operationName = `SQL.${sql.trim().split(' ')[0].toUpperCase()}`;\n \n const originalRun = stmt.run;\n const originalGet = stmt.get;\n const originalAll = stmt.all;\n\n stmt.run = function (this: Database.Statement, ...args: any[]) {\n return getProfiler().timeFunction(`${operationName}.run`, () => originalRun.apply(this, args));\n } as any;\n\n stmt.get = function (this: Database.Statement, ...args: any[]) {\n return getProfiler().timeFunction(`${operationName}.get`, () => originalGet.apply(this, args));\n } as any;\n\n stmt.all = function (this: Database.Statement, ...args: any[]) {\n return getProfiler().timeFunction(`${operationName}.all`, () => originalAll.apply(this, args));\n } as any;\n\n return stmt;\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }