@stackmemoryai/stackmemory 0.3.6 → 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 (213) 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 +32 -21
  21. package/dist/cli/commands/infinite-storage.js.map +2 -2
  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 +18 -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.map +2 -2
  114. package/dist/core/storage/infinite-storage.js.map +2 -2
  115. package/dist/core/storage/railway-optimized-storage.js +19 -8
  116. package/dist/core/storage/railway-optimized-storage.js.map +2 -2
  117. package/dist/core/storage/remote-storage.js +12 -1
  118. package/dist/core/storage/remote-storage.js.map +2 -2
  119. package/dist/core/trace/cli-trace-wrapper.js +16 -5
  120. package/dist/core/trace/cli-trace-wrapper.js.map +2 -2
  121. package/dist/core/trace/db-trace-wrapper.js.map +2 -2
  122. package/dist/core/trace/debug-trace.js +21 -10
  123. package/dist/core/trace/debug-trace.js.map +2 -2
  124. package/dist/core/trace/index.js +46 -35
  125. package/dist/core/trace/index.js.map +2 -2
  126. package/dist/core/trace/trace-demo.js +12 -1
  127. package/dist/core/trace/trace-demo.js.map +2 -2
  128. package/dist/core/trace/trace-detector.js.map +2 -2
  129. package/dist/core/trace/trace-store.js.map +2 -2
  130. package/dist/core/utils/update-checker.js.map +2 -2
  131. package/dist/core/worktree/worktree-manager.js.map +2 -2
  132. package/dist/features/analytics/api/analytics-api.js.map +2 -2
  133. package/dist/features/analytics/core/analytics-service.js +12 -1
  134. package/dist/features/analytics/core/analytics-service.js.map +2 -2
  135. package/dist/features/analytics/queries/metrics-queries.js.map +2 -2
  136. package/dist/features/tasks/pebbles-task-store.js.map +2 -2
  137. package/dist/features/tui/components/analytics-panel.js.map +2 -2
  138. package/dist/features/tui/components/pr-tracker.js.map +2 -2
  139. package/dist/features/tui/components/session-monitor.js.map +2 -2
  140. package/dist/features/tui/components/subagent-fleet.js.map +2 -2
  141. package/dist/features/tui/components/task-board.js +650 -2
  142. package/dist/features/tui/components/task-board.js.map +2 -2
  143. package/dist/features/tui/index.js +16 -5
  144. package/dist/features/tui/index.js.map +2 -2
  145. package/dist/features/tui/services/data-service.js +25 -14
  146. package/dist/features/tui/services/data-service.js.map +2 -2
  147. package/dist/features/tui/services/linear-task-reader.js.map +2 -2
  148. package/dist/features/tui/services/websocket-client.js +13 -2
  149. package/dist/features/tui/services/websocket-client.js.map +2 -2
  150. package/dist/features/tui/terminal-compat.js +27 -16
  151. package/dist/features/tui/terminal-compat.js.map +2 -2
  152. package/dist/features/web/client/stores/task-store.js.map +2 -2
  153. package/dist/features/web/server/index.js +13 -2
  154. package/dist/features/web/server/index.js.map +2 -2
  155. package/dist/integrations/claude-code/enhanced-pre-clear-hooks.js.map +2 -2
  156. package/dist/integrations/claude-code/lifecycle-hooks.js.map +2 -2
  157. package/dist/integrations/claude-code/post-task-hooks.js.map +2 -2
  158. package/dist/integrations/linear/auth.js +17 -6
  159. package/dist/integrations/linear/auth.js.map +2 -2
  160. package/dist/integrations/linear/auto-sync.js.map +2 -2
  161. package/dist/integrations/linear/client.js.map +2 -2
  162. package/dist/integrations/linear/config.js.map +2 -2
  163. package/dist/integrations/linear/migration.js.map +2 -2
  164. package/dist/integrations/linear/oauth-server.js +13 -2
  165. package/dist/integrations/linear/oauth-server.js.map +2 -2
  166. package/dist/integrations/linear/rest-client.js.map +2 -2
  167. package/dist/integrations/linear/sync-enhanced.js +202 -0
  168. package/dist/integrations/linear/sync-enhanced.js.map +7 -0
  169. package/dist/integrations/linear/sync-manager.js.map +2 -2
  170. package/dist/integrations/linear/sync-service.js +12 -1
  171. package/dist/integrations/linear/sync-service.js.map +2 -2
  172. package/dist/integrations/linear/sync.js +34 -3
  173. package/dist/integrations/linear/sync.js.map +2 -2
  174. package/dist/integrations/linear/unified-sync.js +560 -0
  175. package/dist/integrations/linear/unified-sync.js.map +7 -0
  176. package/dist/integrations/linear/webhook-handler.js +12 -1
  177. package/dist/integrations/linear/webhook-handler.js.map +2 -2
  178. package/dist/integrations/linear/webhook-server.js +14 -3
  179. package/dist/integrations/linear/webhook-server.js.map +2 -2
  180. package/dist/integrations/linear/webhook.js +12 -1
  181. package/dist/integrations/linear/webhook.js.map +2 -2
  182. package/dist/integrations/mcp/handlers/context-handlers.js.map +2 -2
  183. package/dist/integrations/mcp/handlers/linear-handlers.js.map +2 -2
  184. package/dist/integrations/mcp/handlers/skill-handlers.js +13 -2
  185. package/dist/integrations/mcp/handlers/skill-handlers.js.map +2 -2
  186. package/dist/integrations/mcp/handlers/task-handlers.js.map +2 -2
  187. package/dist/integrations/mcp/handlers/trace-handlers.js.map +2 -2
  188. package/dist/integrations/mcp/middleware/tool-scoring.js.map +2 -2
  189. package/dist/integrations/mcp/refactored-server.js +15 -4
  190. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  191. package/dist/integrations/mcp/server.js +12 -1
  192. package/dist/integrations/mcp/server.js.map +2 -2
  193. package/dist/integrations/mcp/tool-definitions.js.map +2 -2
  194. package/dist/integrations/pg-aiguide/embedding-provider.js +13 -2
  195. package/dist/integrations/pg-aiguide/embedding-provider.js.map +2 -2
  196. package/dist/integrations/pg-aiguide/semantic-search.js.map +2 -2
  197. package/dist/mcp/stackmemory-mcp-server.js +12 -1
  198. package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
  199. package/dist/middleware/exponential-rate-limiter.js.map +2 -2
  200. package/dist/servers/production/auth-middleware.js +13 -2
  201. package/dist/servers/production/auth-middleware.js.map +2 -2
  202. package/dist/servers/railway/index.js +22 -11
  203. package/dist/servers/railway/index.js.map +2 -2
  204. package/dist/services/config-service.js.map +2 -2
  205. package/dist/services/context-service.js.map +2 -2
  206. package/dist/skills/claude-skills.js +105 -2
  207. package/dist/skills/claude-skills.js.map +2 -2
  208. package/dist/skills/dashboard-launcher.js.map +2 -2
  209. package/dist/skills/repo-ingestion-skill.js +561 -0
  210. package/dist/skills/repo-ingestion-skill.js.map +7 -0
  211. package/dist/utils/logger.js +12 -1
  212. package/dist/utils/logger.js.map +2 -2
  213. package/package.json +5 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/trace/debug-trace.ts"],
4
- "sourcesContent": ["/**\n * Debug Trace Module - Comprehensive execution tracing for LLM debugging\n * \n * This module provides detailed execution tracing to help LLMs understand\n * exactly what happened during code execution, making debugging much easier.\n */\n\nimport { performance } from 'perf_hooks';\nimport { logger } from '../monitoring/logger.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport interface TraceConfig {\n enabled: boolean;\n verbosity: 'full' | 'errors' | 'summary';\n output: 'console' | 'file' | 'both';\n includeParams: boolean;\n includeResults: boolean;\n maskSensitive: boolean;\n performanceThreshold: number; // ms\n maxDepth: number;\n captureMemory: boolean;\n}\n\ninterface TraceEntry {\n id: string;\n parentId?: string;\n type: 'command' | 'function' | 'step' | 'query' | 'api' | 'error';\n name: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n depth: number;\n params?: any;\n result?: any;\n error?: any;\n memory?: {\n before: NodeJS.MemoryUsage;\n after?: NodeJS.MemoryUsage;\n delta?: {\n rss: number;\n heapUsed: number;\n };\n };\n metadata?: Record<string, any>;\n children: TraceEntry[];\n}\n\nexport class TraceContext {\n private static instance: TraceContext;\n private config: TraceConfig;\n private currentTrace: TraceEntry | null = null;\n private traceStack: TraceEntry[] = [];\n private allTraces: TraceEntry[] = [];\n private outputFile?: string;\n private startTime: number = Date.now();\n private sensitivePatterns: RegExp[] = [\n /api[_-]?key/i,\n /token/i,\n /secret/i,\n /password/i,\n /bearer/i,\n /authorization/i,\n /client[_-]?id/i,\n /client[_-]?secret/i,\n ];\n\n private constructor() {\n this.config = this.loadConfig();\n if (this.config.output === 'file' || this.config.output === 'both') {\n this.initializeOutputFile();\n }\n }\n\n static getInstance(): TraceContext {\n if (!TraceContext.instance) {\n TraceContext.instance = new TraceContext();\n }\n return TraceContext.instance;\n }\n\n private loadConfig(): TraceConfig {\n return {\n enabled: process.env.DEBUG_TRACE === 'true' || process.env.STACKMEMORY_DEBUG === 'true',\n verbosity: (process.env.TRACE_VERBOSITY as any) || 'full',\n output: (process.env.TRACE_OUTPUT as any) || 'console',\n includeParams: process.env.TRACE_PARAMS !== 'false',\n includeResults: process.env.TRACE_RESULTS !== 'false',\n maskSensitive: process.env.TRACE_MASK_SENSITIVE !== 'false',\n performanceThreshold: parseInt(process.env.TRACE_PERF_THRESHOLD || '100'),\n maxDepth: parseInt(process.env.TRACE_MAX_DEPTH || '20'),\n captureMemory: process.env.TRACE_MEMORY === 'true',\n };\n }\n\n private initializeOutputFile(): void {\n const traceDir = path.join(process.env.HOME || '.', '.stackmemory', 'traces');\n if (!fs.existsSync(traceDir)) {\n fs.mkdirSync(traceDir, { recursive: true });\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n this.outputFile = path.join(traceDir, `trace-${timestamp}.jsonl`);\n }\n\n private maskSensitiveData(obj: any): any {\n if (!this.config.maskSensitive) return obj;\n if (typeof obj !== 'object' || obj === null) return obj;\n\n const masked = Array.isArray(obj) ? [...obj] : { ...obj };\n \n for (const key in masked) {\n if (typeof key === 'string') {\n // Check if key matches sensitive patterns\n const isSensitive = this.sensitivePatterns.some(pattern => pattern.test(key));\n if (isSensitive) {\n masked[key] = '[MASKED]';\n } else if (typeof masked[key] === 'object') {\n masked[key] = this.maskSensitiveData(masked[key]);\n } else if (typeof masked[key] === 'string' && masked[key].length > 20) {\n // Check if value looks like a token/key\n if (/^[a-zA-Z0-9_-]{20,}$/.test(masked[key])) {\n masked[key] = masked[key].substring(0, 8) + '...[MASKED]';\n }\n }\n }\n }\n \n return masked;\n }\n\n private captureMemory(): NodeJS.MemoryUsage | undefined {\n if (!this.config.captureMemory) return undefined;\n return process.memoryUsage();\n }\n\n private formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\n return `${(ms / 60000).toFixed(2)}m`;\n }\n\n private formatMemory(bytes: number): string {\n const mb = bytes / 1024 / 1024;\n return `${mb.toFixed(2)}MB`;\n }\n\n private getIndent(depth: number): string {\n return ' '.repeat(depth);\n }\n\n private formatTraceEntry(entry: TraceEntry, includeChildren = true): string {\n const indent = this.getIndent(entry.depth);\n const duration = entry.duration ? ` [${this.formatDuration(entry.duration)}]` : '';\n const memory = entry.memory?.delta \n ? ` (\u0394mem: ${this.formatMemory(entry.memory.delta.heapUsed)})`\n : '';\n \n let output = `${indent}\u2192 [${entry.type.toUpperCase()}:${entry.id.substring(0, 8)}] ${entry.name}${duration}${memory}`;\n \n if (entry.error) {\n output += `\\n${indent} \u2717 ERROR: ${entry.error.message || entry.error}`;\n if (entry.error.stack && this.config.verbosity === 'full') {\n output += `\\n${indent} Stack: ${entry.error.stack.split('\\n')[1]?.trim()}`;\n }\n }\n \n if (this.config.includeParams && entry.params && Object.keys(entry.params).length > 0) {\n const maskedParams = this.maskSensitiveData(entry.params);\n output += `\\n${indent} \u25B8 Params: ${JSON.stringify(maskedParams, null, 2).replace(/\\n/g, '\\n' + indent + ' ')}`;\n }\n \n if (this.config.includeResults && entry.result !== undefined && !entry.error) {\n const maskedResult = this.maskSensitiveData(entry.result);\n const resultStr = JSON.stringify(maskedResult, null, 2);\n if (resultStr.length < 200) {\n output += `\\n${indent} \u25C2 Result: ${resultStr.replace(/\\n/g, '\\n' + indent + ' ')}`;\n } else {\n output += `\\n${indent} \u25C2 Result: [${typeof maskedResult}] ${resultStr.substring(0, 100)}...`;\n }\n }\n \n if (entry.duration && entry.duration > this.config.performanceThreshold) {\n output += `\\n${indent} \u26A0 SLOW: Exceeded ${this.config.performanceThreshold}ms threshold`;\n }\n \n if (includeChildren && entry.children.length > 0) {\n for (const child of entry.children) {\n output += '\\n' + this.formatTraceEntry(child, true);\n }\n }\n \n if (entry.endTime && entry.depth > 0) {\n output += `\\n${indent}\u2190 [${entry.type.toUpperCase()}:${entry.id.substring(0, 8)}] completed`;\n }\n \n return output;\n }\n\n private outputTrace(entry: TraceEntry): void {\n if (!this.config.enabled) return;\n\n const formatted = this.formatTraceEntry(entry, false);\n \n if (this.config.output === 'console' || this.config.output === 'both') {\n console.log(formatted);\n }\n \n if ((this.config.output === 'file' || this.config.output === 'both') && this.outputFile) {\n const jsonLine = JSON.stringify({\n ...entry,\n formatted,\n timestamp: new Date().toISOString(),\n }) + '\\n';\n fs.appendFileSync(this.outputFile, jsonLine);\n }\n }\n\n startTrace(type: TraceEntry['type'], name: string, params?: any, metadata?: Record<string, any>): string {\n if (!this.config.enabled) return '';\n\n const id = uuidv4();\n const parentId = this.currentTrace?.id;\n const depth = this.traceStack.length;\n\n if (depth > this.config.maxDepth) {\n return id; // Prevent infinite recursion\n }\n\n const entry: TraceEntry = {\n id,\n parentId,\n type,\n name,\n startTime: performance.now(),\n depth,\n params: this.config.includeParams ? params : undefined,\n metadata,\n children: [],\n memory: this.captureMemory() ? { before: this.captureMemory()! } : undefined,\n };\n\n if (this.currentTrace) {\n this.currentTrace.children.push(entry);\n } else {\n this.allTraces.push(entry);\n }\n\n this.traceStack.push(entry);\n this.currentTrace = entry;\n\n this.outputTrace(entry);\n\n return id;\n }\n\n endTrace(id: string, result?: any, error?: any): void {\n if (!this.config.enabled) return;\n\n const index = this.traceStack.findIndex(t => t.id === id);\n if (index === -1) return;\n\n const entry = this.traceStack[index];\n entry.endTime = performance.now();\n entry.duration = entry.endTime - entry.startTime;\n entry.result = this.config.includeResults && !error ? result : undefined;\n entry.error = error;\n\n if (entry.memory?.before) {\n entry.memory.after = this.captureMemory();\n if (entry.memory.after) {\n entry.memory.delta = {\n rss: entry.memory.after.rss - entry.memory.before.rss,\n heapUsed: entry.memory.after.heapUsed - entry.memory.before.heapUsed,\n };\n }\n }\n\n this.outputTrace(entry);\n\n // Remove from stack and update current\n this.traceStack.splice(index);\n this.currentTrace = this.traceStack[this.traceStack.length - 1] || null;\n }\n\n async traceAsync<T>(\n type: TraceEntry['type'],\n name: string,\n params: any,\n fn: () => Promise<T>\n ): Promise<T> {\n const id = this.startTrace(type, name, params);\n try {\n const result = await fn();\n this.endTrace(id, result);\n return result;\n } catch (error) {\n this.endTrace(id, undefined, error);\n throw error;\n }\n }\n\n traceSync<T>(\n type: TraceEntry['type'],\n name: string,\n params: any,\n fn: () => T\n ): T {\n const id = this.startTrace(type, name, params);\n try {\n const result = fn();\n this.endTrace(id, result);\n return result;\n } catch (error) {\n this.endTrace(id, undefined, error);\n throw error;\n }\n }\n\n async command<T>(name: string, options: any, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('command', name, options, fn);\n }\n\n async step<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('step', name, undefined, fn);\n }\n\n async query<T>(sql: string, params: any, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('query', sql.substring(0, 50), params, fn);\n }\n\n async api<T>(method: string, url: string, body: any, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('api', `${method} ${url}`, { body }, fn);\n }\n\n getExecutionSummary(): string {\n if (!this.config.enabled) return 'Tracing disabled';\n\n const totalDuration = Date.now() - this.startTime;\n const errorCount = this.countErrors(this.allTraces);\n const slowCount = this.countSlowOperations(this.allTraces);\n\n let summary = `\\n${'='.repeat(80)}\\n`;\n summary += `EXECUTION SUMMARY\\n`;\n summary += `${'='.repeat(80)}\\n`;\n summary += `Total Duration: ${this.formatDuration(totalDuration)}\\n`;\n summary += `Total Operations: ${this.countOperations(this.allTraces)}\\n`;\n summary += `Errors: ${errorCount}\\n`;\n summary += `Slow Operations (>${this.config.performanceThreshold}ms): ${slowCount}\\n`;\n\n if (this.config.captureMemory) {\n const memUsage = process.memoryUsage();\n summary += `Final Memory: RSS=${this.formatMemory(memUsage.rss)}, Heap=${this.formatMemory(memUsage.heapUsed)}\\n`;\n }\n\n if (this.outputFile) {\n summary += `Trace Log: ${this.outputFile}\\n`;\n }\n\n summary += `${'='.repeat(80)}`;\n\n return summary;\n }\n\n private countOperations(traces: TraceEntry[]): number {\n let count = traces.length;\n for (const trace of traces) {\n count += this.countOperations(trace.children);\n }\n return count;\n }\n\n private countErrors(traces: TraceEntry[]): number {\n let count = 0;\n for (const trace of traces) {\n if (trace.error) count++;\n count += this.countErrors(trace.children);\n }\n return count;\n }\n\n private countSlowOperations(traces: TraceEntry[]): number {\n let count = 0;\n for (const trace of traces) {\n if (trace.duration && trace.duration > this.config.performanceThreshold) count++;\n count += this.countSlowOperations(trace.children);\n }\n return count;\n }\n\n getLastError(): TraceEntry | null {\n const findLastError = (traces: TraceEntry[]): TraceEntry | null => {\n for (let i = traces.length - 1; i >= 0; i--) {\n const trace = traces[i];\n if (trace.error) return trace;\n const childError = findLastError(trace.children);\n if (childError) return childError;\n }\n return null;\n };\n return findLastError(this.allTraces);\n }\n\n exportTraces(): TraceEntry[] {\n return this.allTraces;\n }\n\n reset(): void {\n this.currentTrace = null;\n this.traceStack = [];\n this.allTraces = [];\n this.startTime = Date.now();\n }\n}\n\n// Singleton instance\nexport const trace = TraceContext.getInstance();\n\n// Decorator for tracing class methods\nexport function Trace(type: TraceEntry['type'] = 'function') {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n const isAsync = originalMethod.constructor.name === 'AsyncFunction';\n\n if (isAsync) {\n descriptor.value = async function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey}`;\n return trace.traceAsync(type, methodName, args, async () => {\n return originalMethod.apply(this, args);\n });\n };\n } else {\n descriptor.value = function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey}`;\n return trace.traceSync(type, methodName, args, () => {\n return originalMethod.apply(this, args);\n });\n };\n }\n\n return descriptor;\n };\n}\n\n// Decorator for tracing entire classes\nexport function TraceClass(type: TraceEntry['type'] = 'function') {\n return function <T extends { new(...args: any[]): {} }>(constructor: T) {\n const prototype = constructor.prototype;\n const propertyNames = Object.getOwnPropertyNames(prototype);\n\n for (const propertyName of propertyNames) {\n if (propertyName === 'constructor') continue;\n\n const descriptor = Object.getOwnPropertyDescriptor(prototype, propertyName);\n if (!descriptor || typeof descriptor.value !== 'function') continue;\n\n Trace(type)(prototype, propertyName, descriptor);\n Object.defineProperty(prototype, propertyName, descriptor);\n }\n\n return constructor;\n };\n}\n\n// Helper for critical operations\nexport function TraceCritical(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n \n descriptor.value = async function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey} [CRITICAL]`;\n \n // Store context before execution\n const contextBefore = {\n memory: process.memoryUsage(),\n timestamp: new Date().toISOString(),\n args: trace['maskSensitiveData'](args),\n };\n \n try {\n return await trace.traceAsync('function', methodName, contextBefore, async () => {\n return originalMethod.apply(this, args);\n });\n } catch (error: any) {\n // Enhanced error logging for critical operations\n logger.error(`Critical operation failed: ${methodName}`, error, {\n context: contextBefore,\n stack: error.stack,\n });\n throw error;\n }\n };\n \n return descriptor;\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Debug Trace Module - Comprehensive execution tracing for LLM debugging\n * \n * This module provides detailed execution tracing to help LLMs understand\n * exactly what happened during code execution, making debugging much easier.\n */\n\nimport { performance } from 'perf_hooks';\nimport { logger } from '../monitoring/logger.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { v4 as uuidv4 } from 'uuid';\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 TraceConfig {\n enabled: boolean;\n verbosity: 'full' | 'errors' | 'summary';\n output: 'console' | 'file' | 'both';\n includeParams: boolean;\n includeResults: boolean;\n maskSensitive: boolean;\n performanceThreshold: number; // ms\n maxDepth: number;\n captureMemory: boolean;\n}\n\ninterface TraceEntry {\n id: string;\n parentId?: string;\n type: 'command' | 'function' | 'step' | 'query' | 'api' | 'error';\n name: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n depth: number;\n params?: any;\n result?: any;\n error?: any;\n memory?: {\n before: NodeJS.MemoryUsage;\n after?: NodeJS.MemoryUsage;\n delta?: {\n rss: number;\n heapUsed: number;\n };\n };\n metadata?: Record<string, any>;\n children: TraceEntry[];\n}\n\nexport class TraceContext {\n private static instance: TraceContext;\n private config: TraceConfig;\n private currentTrace: TraceEntry | null = null;\n private traceStack: TraceEntry[] = [];\n private allTraces: TraceEntry[] = [];\n private outputFile?: string;\n private startTime: number = Date.now();\n private sensitivePatterns: RegExp[] = [\n /api[_-]?key/i,\n /token/i,\n /secret/i,\n /password/i,\n /bearer/i,\n /authorization/i,\n /client[_-]?id/i,\n /client[_-]?secret/i,\n ];\n\n private constructor() {\n this.config = this.loadConfig();\n if (this.config.output === 'file' || this.config.output === 'both') {\n this.initializeOutputFile();\n }\n }\n\n static getInstance(): TraceContext {\n if (!TraceContext.instance) {\n TraceContext.instance = new TraceContext();\n }\n return TraceContext.instance;\n }\n\n private loadConfig(): TraceConfig {\n return {\n enabled: process.env['DEBUG_TRACE'] === 'true' || process.env['STACKMEMORY_DEBUG'] === 'true',\n verbosity: (process.env['TRACE_VERBOSITY'] as any) || 'full',\n output: (process.env['TRACE_OUTPUT'] as any) || 'console',\n includeParams: process.env['TRACE_PARAMS'] !== 'false',\n includeResults: process.env['TRACE_RESULTS'] !== 'false',\n maskSensitive: process.env['TRACE_MASK_SENSITIVE'] !== 'false',\n performanceThreshold: parseInt(process.env['TRACE_PERF_THRESHOLD'] || '100'),\n maxDepth: parseInt(process.env['TRACE_MAX_DEPTH'] || '20'),\n captureMemory: process.env['TRACE_MEMORY'] === 'true',\n };\n }\n\n private initializeOutputFile(): void {\n const traceDir = path.join(process.env['HOME'] || '.', '.stackmemory', 'traces');\n if (!fs.existsSync(traceDir)) {\n fs.mkdirSync(traceDir, { recursive: true });\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n this.outputFile = path.join(traceDir, `trace-${timestamp}.jsonl`);\n }\n\n private maskSensitiveData(obj: any): any {\n if (!this.config.maskSensitive) return obj;\n if (typeof obj !== 'object' || obj === null) return obj;\n\n const masked = Array.isArray(obj) ? [...obj] : { ...obj };\n \n for (const key in masked) {\n if (typeof key === 'string') {\n // Check if key matches sensitive patterns\n const isSensitive = this.sensitivePatterns.some(pattern => pattern.test(key));\n if (isSensitive) {\n masked[key] = '[MASKED]';\n } else if (typeof masked[key] === 'object') {\n masked[key] = this.maskSensitiveData(masked[key]);\n } else if (typeof masked[key] === 'string' && masked[key].length > 20) {\n // Check if value looks like a token/key\n if (/^[a-zA-Z0-9_-]{20,}$/.test(masked[key])) {\n masked[key] = masked[key].substring(0, 8) + '...[MASKED]';\n }\n }\n }\n }\n \n return masked;\n }\n\n private captureMemory(): NodeJS.MemoryUsage | undefined {\n if (!this.config.captureMemory) return undefined;\n return process.memoryUsage();\n }\n\n private formatDuration(ms: number): string {\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;\n return `${(ms / 60000).toFixed(2)}m`;\n }\n\n private formatMemory(bytes: number): string {\n const mb = bytes / 1024 / 1024;\n return `${mb.toFixed(2)}MB`;\n }\n\n private getIndent(depth: number): string {\n return ' '.repeat(depth);\n }\n\n private formatTraceEntry(entry: TraceEntry, includeChildren = true): string {\n const indent = this.getIndent(entry.depth);\n const duration = entry.duration ? ` [${this.formatDuration(entry.duration)}]` : '';\n const memory = entry.memory?.delta \n ? ` (\u0394mem: ${this.formatMemory(entry.memory.delta.heapUsed)})`\n : '';\n \n let output = `${indent}\u2192 [${entry.type.toUpperCase()}:${entry.id.substring(0, 8)}] ${entry.name}${duration}${memory}`;\n \n if (entry.error) {\n output += `\\n${indent} \u2717 ERROR: ${entry.error.message || entry.error}`;\n if (entry.error.stack && this.config.verbosity === 'full') {\n output += `\\n${indent} Stack: ${entry.error.stack.split('\\n')[1]?.trim()}`;\n }\n }\n \n if (this.config.includeParams && entry.params && Object.keys(entry.params).length > 0) {\n const maskedParams = this.maskSensitiveData(entry.params);\n output += `\\n${indent} \u25B8 Params: ${JSON.stringify(maskedParams, null, 2).replace(/\\n/g, '\\n' + indent + ' ')}`;\n }\n \n if (this.config.includeResults && entry.result !== undefined && !entry.error) {\n const maskedResult = this.maskSensitiveData(entry.result);\n const resultStr = JSON.stringify(maskedResult, null, 2);\n if (resultStr.length < 200) {\n output += `\\n${indent} \u25C2 Result: ${resultStr.replace(/\\n/g, '\\n' + indent + ' ')}`;\n } else {\n output += `\\n${indent} \u25C2 Result: [${typeof maskedResult}] ${resultStr.substring(0, 100)}...`;\n }\n }\n \n if (entry.duration && entry.duration > this.config.performanceThreshold) {\n output += `\\n${indent} \u26A0 SLOW: Exceeded ${this.config.performanceThreshold}ms threshold`;\n }\n \n if (includeChildren && entry.children.length > 0) {\n for (const child of entry.children) {\n output += '\\n' + this.formatTraceEntry(child, true);\n }\n }\n \n if (entry.endTime && entry.depth > 0) {\n output += `\\n${indent}\u2190 [${entry.type.toUpperCase()}:${entry.id.substring(0, 8)}] completed`;\n }\n \n return output;\n }\n\n private outputTrace(entry: TraceEntry): void {\n if (!this.config.enabled) return;\n\n const formatted = this.formatTraceEntry(entry, false);\n \n if (this.config.output === 'console' || this.config.output === 'both') {\n console.log(formatted);\n }\n \n if ((this.config.output === 'file' || this.config.output === 'both') && this.outputFile) {\n const jsonLine = JSON.stringify({\n ...entry,\n formatted,\n timestamp: new Date().toISOString(),\n }) + '\\n';\n fs.appendFileSync(this.outputFile, jsonLine);\n }\n }\n\n startTrace(type: TraceEntry['type'], name: string, params?: any, metadata?: Record<string, any>): string {\n if (!this.config.enabled) return '';\n\n const id = uuidv4();\n const parentId = this.currentTrace?.id;\n const depth = this.traceStack.length;\n\n if (depth > this.config.maxDepth) {\n return id; // Prevent infinite recursion\n }\n\n const entry: TraceEntry = {\n id,\n parentId,\n type,\n name,\n startTime: performance.now(),\n depth,\n params: this.config.includeParams ? params : undefined,\n metadata,\n children: [],\n memory: this.captureMemory() ? { before: this.captureMemory()! } : undefined,\n };\n\n if (this.currentTrace) {\n this.currentTrace.children.push(entry);\n } else {\n this.allTraces.push(entry);\n }\n\n this.traceStack.push(entry);\n this.currentTrace = entry;\n\n this.outputTrace(entry);\n\n return id;\n }\n\n endTrace(id: string, result?: any, error?: any): void {\n if (!this.config.enabled) return;\n\n const index = this.traceStack.findIndex(t => t.id === id);\n if (index === -1) return;\n\n const entry = this.traceStack[index];\n entry.endTime = performance.now();\n entry.duration = entry.endTime - entry.startTime;\n entry.result = this.config.includeResults && !error ? result : undefined;\n entry.error = error;\n\n if (entry.memory?.before) {\n entry.memory.after = this.captureMemory();\n if (entry.memory.after) {\n entry.memory.delta = {\n rss: entry.memory.after.rss - entry.memory.before.rss,\n heapUsed: entry.memory.after.heapUsed - entry.memory.before.heapUsed,\n };\n }\n }\n\n this.outputTrace(entry);\n\n // Remove from stack and update current\n this.traceStack.splice(index);\n this.currentTrace = this.traceStack[this.traceStack.length - 1] || null;\n }\n\n async traceAsync<T>(\n type: TraceEntry['type'],\n name: string,\n params: any,\n fn: () => Promise<T>\n ): Promise<T> {\n const id = this.startTrace(type, name, params);\n try {\n const result = await fn();\n this.endTrace(id, result);\n return result;\n } catch (error: unknown) {\n this.endTrace(id, undefined, error);\n throw error;\n }\n }\n\n traceSync<T>(\n type: TraceEntry['type'],\n name: string,\n params: any,\n fn: () => T\n ): T {\n const id = this.startTrace(type, name, params);\n try {\n const result = fn();\n this.endTrace(id, result);\n return result;\n } catch (error: unknown) {\n this.endTrace(id, undefined, error);\n throw error;\n }\n }\n\n async command<T>(name: string, options: any, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('command', name, options, fn);\n }\n\n async step<T>(name: string, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('step', name, undefined, fn);\n }\n\n async query<T>(sql: string, params: any, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('query', sql.substring(0, 50), params, fn);\n }\n\n async api<T>(method: string, url: string, body: any, fn: () => Promise<T>): Promise<T> {\n return this.traceAsync('api', `${method} ${url}`, { body }, fn);\n }\n\n getExecutionSummary(): string {\n if (!this.config.enabled) return 'Tracing disabled';\n\n const totalDuration = Date.now() - this.startTime;\n const errorCount = this.countErrors(this.allTraces);\n const slowCount = this.countSlowOperations(this.allTraces);\n\n let summary = `\\n${'='.repeat(80)}\\n`;\n summary += `EXECUTION SUMMARY\\n`;\n summary += `${'='.repeat(80)}\\n`;\n summary += `Total Duration: ${this.formatDuration(totalDuration)}\\n`;\n summary += `Total Operations: ${this.countOperations(this.allTraces)}\\n`;\n summary += `Errors: ${errorCount}\\n`;\n summary += `Slow Operations (>${this.config.performanceThreshold}ms): ${slowCount}\\n`;\n\n if (this.config.captureMemory) {\n const memUsage = process.memoryUsage();\n summary += `Final Memory: RSS=${this.formatMemory(memUsage.rss)}, Heap=${this.formatMemory(memUsage.heapUsed)}\\n`;\n }\n\n if (this.outputFile) {\n summary += `Trace Log: ${this.outputFile}\\n`;\n }\n\n summary += `${'='.repeat(80)}`;\n\n return summary;\n }\n\n private countOperations(traces: TraceEntry[]): number {\n let count = traces.length;\n for (const trace of traces) {\n count += this.countOperations(trace.children);\n }\n return count;\n }\n\n private countErrors(traces: TraceEntry[]): number {\n let count = 0;\n for (const trace of traces) {\n if (trace.error) count++;\n count += this.countErrors(trace.children);\n }\n return count;\n }\n\n private countSlowOperations(traces: TraceEntry[]): number {\n let count = 0;\n for (const trace of traces) {\n if (trace.duration && trace.duration > this.config.performanceThreshold) count++;\n count += this.countSlowOperations(trace.children);\n }\n return count;\n }\n\n getLastError(): TraceEntry | null {\n const findLastError = (traces: TraceEntry[]): TraceEntry | null => {\n for (let i = traces.length - 1; i >= 0; i--) {\n const trace = traces[i];\n if (trace.error) return trace;\n const childError = findLastError(trace.children);\n if (childError) return childError;\n }\n return null;\n };\n return findLastError(this.allTraces);\n }\n\n exportTraces(): TraceEntry[] {\n return this.allTraces;\n }\n\n reset(): void {\n this.currentTrace = null;\n this.traceStack = [];\n this.allTraces = [];\n this.startTime = Date.now();\n }\n}\n\n// Singleton instance\nexport const trace = TraceContext.getInstance();\n\n// Decorator for tracing class methods\nexport function Trace(type: TraceEntry['type'] = 'function') {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n const isAsync = originalMethod.constructor.name === 'AsyncFunction';\n\n if (isAsync) {\n descriptor.value = async function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey}`;\n return trace.traceAsync(type, methodName, args, async () => {\n return originalMethod.apply(this, args);\n });\n };\n } else {\n descriptor.value = function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey}`;\n return trace.traceSync(type, methodName, args, () => {\n return originalMethod.apply(this, args);\n });\n };\n }\n\n return descriptor;\n };\n}\n\n// Decorator for tracing entire classes\nexport function TraceClass(type: TraceEntry['type'] = 'function') {\n return function <T extends { new(...args: any[]): {} }>(constructor: T) {\n const prototype = constructor.prototype;\n const propertyNames = Object.getOwnPropertyNames(prototype);\n\n for (const propertyName of propertyNames) {\n if (propertyName === 'constructor') continue;\n\n const descriptor = Object.getOwnPropertyDescriptor(prototype, propertyName);\n if (!descriptor || typeof descriptor.value !== 'function') continue;\n\n Trace(type)(prototype, propertyName, descriptor);\n Object.defineProperty(prototype, propertyName, descriptor);\n }\n\n return constructor;\n };\n}\n\n// Helper for critical operations\nexport function TraceCritical(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n \n descriptor.value = async function (...args: any[]) {\n const className = target.constructor.name;\n const methodName = `${className}.${propertyKey} [CRITICAL]`;\n \n // Store context before execution\n const contextBefore = {\n memory: process.memoryUsage(),\n timestamp: new Date().toISOString(),\n args: trace['maskSensitiveData'](args),\n };\n \n try {\n return await trace.traceAsync('function', methodName, contextBefore, async () => {\n return originalMethod.apply(this, args);\n });\n } catch (error: any) {\n // Enhanced error logging for critical operations\n logger.error(`Critical operation failed: ${methodName}`, error, {\n context: contextBefore,\n stack: error.stack,\n });\n throw error;\n }\n };\n \n return descriptor;\n}"],
5
+ "mappings": "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",
6
6
  "names": ["trace"]
7
7
  }
@@ -1,3 +1,14 @@
1
+ function getEnv(key, defaultValue) {
2
+ const value = process.env[key];
3
+ if (value === void 0) {
4
+ if (defaultValue !== void 0) return defaultValue;
5
+ throw new Error(`Environment variable ${key} is required`);
6
+ }
7
+ return value;
8
+ }
9
+ function getOptionalEnv(key) {
10
+ return process.env[key];
11
+ }
1
12
  import {
2
13
  trace,
3
14
  TraceContext,
@@ -26,36 +37,36 @@ import {
26
37
  function initializeTracing() {
27
38
  const config = {
28
39
  // Main control
29
- DEBUG_TRACE: process.env.DEBUG_TRACE === "true",
30
- STACKMEMORY_DEBUG: process.env.STACKMEMORY_DEBUG === "true",
40
+ DEBUG_TRACE: process.env["DEBUG_TRACE"] === "true",
41
+ STACKMEMORY_DEBUG: process.env["STACKMEMORY_DEBUG"] === "true",
31
42
  // Output control
32
- TRACE_OUTPUT: process.env.TRACE_OUTPUT || "console",
43
+ TRACE_OUTPUT: process.env["TRACE_OUTPUT"] || "console",
33
44
  // console|file|both
34
- TRACE_VERBOSITY: process.env.TRACE_VERBOSITY || "full",
45
+ TRACE_VERBOSITY: process.env["TRACE_VERBOSITY"] || "full",
35
46
  // full|errors|summary
36
47
  // Content control
37
- TRACE_PARAMS: process.env.TRACE_PARAMS !== "false",
48
+ TRACE_PARAMS: process.env["TRACE_PARAMS"] !== "false",
38
49
  // Include parameters
39
- TRACE_RESULTS: process.env.TRACE_RESULTS !== "false",
50
+ TRACE_RESULTS: process.env["TRACE_RESULTS"] !== "false",
40
51
  // Include results
41
- TRACE_MASK_SENSITIVE: process.env.TRACE_MASK_SENSITIVE !== "false",
52
+ TRACE_MASK_SENSITIVE: process.env["TRACE_MASK_SENSITIVE"] !== "false",
42
53
  // Mask sensitive data
43
54
  // Performance
44
- TRACE_PERF_THRESHOLD: parseInt(process.env.TRACE_PERF_THRESHOLD || "100"),
55
+ TRACE_PERF_THRESHOLD: parseInt(process.env["TRACE_PERF_THRESHOLD"] || "100"),
45
56
  // ms
46
- TRACE_MEMORY: process.env.TRACE_MEMORY === "true",
57
+ TRACE_MEMORY: process.env["TRACE_MEMORY"] === "true",
47
58
  // Track memory usage
48
- TRACE_MAX_DEPTH: parseInt(process.env.TRACE_MAX_DEPTH || "20"),
59
+ TRACE_MAX_DEPTH: parseInt(process.env["TRACE_MAX_DEPTH"] || "20"),
49
60
  // Max call depth
50
61
  // Database specific
51
- TRACE_DB: process.env.TRACE_DB === "true",
62
+ TRACE_DB: process.env["TRACE_DB"] === "true",
52
63
  // Enable database tracing
53
- TRACE_DB_SLOW: parseInt(process.env.TRACE_DB_SLOW || "100"),
64
+ TRACE_DB_SLOW: parseInt(process.env["TRACE_DB_SLOW"] || "100"),
54
65
  // Slow query threshold
55
66
  // API specific
56
- TRACE_API: process.env.TRACE_API === "true",
67
+ TRACE_API: process.env["TRACE_API"] === "true",
57
68
  // Enable API tracing
58
- TRACE_API_SLOW: parseInt(process.env.TRACE_API_SLOW || "1000")
69
+ TRACE_API_SLOW: parseInt(process.env["TRACE_API_SLOW"] || "1000")
59
70
  // Slow API threshold
60
71
  };
61
72
  if (config.DEBUG_TRACE || config.STACKMEMORY_DEBUG) {
@@ -81,53 +92,53 @@ function initializeTracing() {
81
92
  }
82
93
  }
83
94
  function withTracing(fn, options) {
84
- const originalEnv = process.env.DEBUG_TRACE;
95
+ const originalEnv = process.env["DEBUG_TRACE"];
85
96
  try {
86
- process.env.DEBUG_TRACE = "true";
97
+ process.env["DEBUG_TRACE"] = "true";
87
98
  if (options) {
88
- if (options.output) process.env.TRACE_OUTPUT = options.output;
89
- if (options.verbosity) process.env.TRACE_VERBOSITY = options.verbosity;
99
+ if (options.output) process.env["TRACE_OUTPUT"] = options.output;
100
+ if (options.verbosity) process.env["TRACE_VERBOSITY"] = options.verbosity;
90
101
  if (options.includeParams !== void 0) {
91
- process.env.TRACE_PARAMS = String(options.includeParams);
102
+ process.env["TRACE_PARAMS"] = String(options.includeParams);
92
103
  }
93
104
  if (options.includeResults !== void 0) {
94
- process.env.TRACE_RESULTS = String(options.includeResults);
105
+ process.env["TRACE_RESULTS"] = String(options.includeResults);
95
106
  }
96
107
  if (options.performanceThreshold !== void 0) {
97
- process.env.TRACE_PERF_THRESHOLD = String(options.performanceThreshold);
108
+ process.env["TRACE_PERF_THRESHOLD"] = String(options.performanceThreshold);
98
109
  }
99
110
  }
100
111
  return fn();
101
112
  } finally {
102
113
  if (originalEnv === void 0) {
103
- delete process.env.DEBUG_TRACE;
114
+ delete process.env["DEBUG_TRACE"];
104
115
  } else {
105
- process.env.DEBUG_TRACE = originalEnv;
116
+ process.env["DEBUG_TRACE"] = originalEnv;
106
117
  }
107
118
  }
108
119
  }
109
120
  const enableTracing = () => {
110
- process.env.DEBUG_TRACE = "true";
121
+ process.env["DEBUG_TRACE"] = "true";
111
122
  console.log("\u2705 Tracing enabled");
112
123
  };
113
124
  const disableTracing = () => {
114
- delete process.env.DEBUG_TRACE;
125
+ delete process.env["DEBUG_TRACE"];
115
126
  console.log("\u274C Tracing disabled");
116
127
  };
117
128
  const enableVerboseTracing = () => {
118
- process.env.DEBUG_TRACE = "true";
119
- process.env.TRACE_VERBOSITY = "full";
120
- process.env.TRACE_PARAMS = "true";
121
- process.env.TRACE_RESULTS = "true";
122
- process.env.TRACE_MEMORY = "true";
129
+ process.env["DEBUG_TRACE"] = "true";
130
+ process.env["TRACE_VERBOSITY"] = "full";
131
+ process.env["TRACE_PARAMS"] = "true";
132
+ process.env["TRACE_RESULTS"] = "true";
133
+ process.env["TRACE_MEMORY"] = "true";
123
134
  console.log("\u2705 Verbose tracing enabled");
124
135
  };
125
136
  const enableMinimalTracing = () => {
126
- process.env.DEBUG_TRACE = "true";
127
- process.env.TRACE_VERBOSITY = "summary";
128
- process.env.TRACE_PARAMS = "false";
129
- process.env.TRACE_RESULTS = "false";
130
- process.env.TRACE_MEMORY = "false";
137
+ process.env["DEBUG_TRACE"] = "true";
138
+ process.env["TRACE_VERBOSITY"] = "summary";
139
+ process.env["TRACE_PARAMS"] = "false";
140
+ process.env["TRACE_RESULTS"] = "false";
141
+ process.env["TRACE_MEMORY"] = "false";
131
142
  console.log("\u2705 Minimal tracing enabled");
132
143
  };
133
144
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/trace/index.ts"],
4
- "sourcesContent": ["/**\n * Trace Module Export\n * Central export for all tracing functionality\n */\n\nimport type { TraceConfig } from './debug-trace.js';\n\nexport {\n trace,\n TraceContext,\n Trace,\n TraceClass,\n TraceCritical,\n type TraceConfig,\n} from './debug-trace.js';\n\nexport {\n wrapCommand,\n wrapProgram,\n traceStep,\n traceQuery,\n traceAPI,\n} from './cli-trace-wrapper.js';\n\nexport {\n createTracedDatabase,\n wrapDatabase,\n getQueryStatistics,\n createTracedTransaction,\n} from './db-trace-wrapper.js';\n\nexport {\n TraceLinearAPI,\n createTracedFetch,\n wrapGraphQLClient,\n} from './linear-api-wrapper.js';\n\n/**\n * Initialize tracing based on environment configuration\n */\nexport function initializeTracing(): void {\n const config = {\n // Main control\n DEBUG_TRACE: process.env.DEBUG_TRACE === 'true',\n STACKMEMORY_DEBUG: process.env.STACKMEMORY_DEBUG === 'true',\n \n // Output control\n TRACE_OUTPUT: process.env.TRACE_OUTPUT || 'console', // console|file|both\n TRACE_VERBOSITY: process.env.TRACE_VERBOSITY || 'full', // full|errors|summary\n \n // Content control\n TRACE_PARAMS: process.env.TRACE_PARAMS !== 'false', // Include parameters\n TRACE_RESULTS: process.env.TRACE_RESULTS !== 'false', // Include results\n TRACE_MASK_SENSITIVE: process.env.TRACE_MASK_SENSITIVE !== 'false', // Mask sensitive data\n \n // Performance\n TRACE_PERF_THRESHOLD: parseInt(process.env.TRACE_PERF_THRESHOLD || '100'), // ms\n TRACE_MEMORY: process.env.TRACE_MEMORY === 'true', // Track memory usage\n TRACE_MAX_DEPTH: parseInt(process.env.TRACE_MAX_DEPTH || '20'), // Max call depth\n \n // Database specific\n TRACE_DB: process.env.TRACE_DB === 'true', // Enable database tracing\n TRACE_DB_SLOW: parseInt(process.env.TRACE_DB_SLOW || '100'), // Slow query threshold\n \n // API specific\n TRACE_API: process.env.TRACE_API === 'true', // Enable API tracing\n TRACE_API_SLOW: parseInt(process.env.TRACE_API_SLOW || '1000'), // Slow API threshold\n };\n \n // Log configuration if debugging is enabled\n if (config.DEBUG_TRACE || config.STACKMEMORY_DEBUG) {\n console.log('\uD83D\uDD0D Trace Configuration:', {\n enabled: true,\n output: config.TRACE_OUTPUT,\n verbosity: config.TRACE_VERBOSITY,\n includeParams: config.TRACE_PARAMS,\n includeResults: config.TRACE_RESULTS,\n maskSensitive: config.TRACE_MASK_SENSITIVE,\n performanceThreshold: config.TRACE_PERF_THRESHOLD,\n captureMemory: config.TRACE_MEMORY,\n maxDepth: config.TRACE_MAX_DEPTH,\n database: {\n enabled: config.TRACE_DB,\n slowThreshold: config.TRACE_DB_SLOW,\n },\n api: {\n enabled: config.TRACE_API,\n slowThreshold: config.TRACE_API_SLOW,\n },\n });\n }\n}\n\n/**\n * Helper to enable tracing for a specific scope\n */\nexport function withTracing<T>(\n fn: () => T,\n options?: Partial<TraceConfig>\n): T {\n const originalEnv = process.env.DEBUG_TRACE;\n \n try {\n // Temporarily enable tracing\n process.env.DEBUG_TRACE = 'true';\n \n // Apply custom options if provided\n if (options) {\n if (options.output) process.env.TRACE_OUTPUT = options.output;\n if (options.verbosity) process.env.TRACE_VERBOSITY = options.verbosity;\n if (options.includeParams !== undefined) {\n process.env.TRACE_PARAMS = String(options.includeParams);\n }\n if (options.includeResults !== undefined) {\n process.env.TRACE_RESULTS = String(options.includeResults);\n }\n if (options.performanceThreshold !== undefined) {\n process.env.TRACE_PERF_THRESHOLD = String(options.performanceThreshold);\n }\n }\n \n return fn();\n } finally {\n // Restore original environment\n if (originalEnv === undefined) {\n delete process.env.DEBUG_TRACE;\n } else {\n process.env.DEBUG_TRACE = originalEnv;\n }\n }\n}\n\n/**\n * Quick enable/disable functions for debugging\n */\nexport const enableTracing = () => {\n process.env.DEBUG_TRACE = 'true';\n console.log('\u2705 Tracing enabled');\n};\n\nexport const disableTracing = () => {\n delete process.env.DEBUG_TRACE;\n console.log('\u274C Tracing disabled');\n};\n\nexport const enableVerboseTracing = () => {\n process.env.DEBUG_TRACE = 'true';\n process.env.TRACE_VERBOSITY = 'full';\n process.env.TRACE_PARAMS = 'true';\n process.env.TRACE_RESULTS = 'true';\n process.env.TRACE_MEMORY = 'true';\n console.log('\u2705 Verbose tracing enabled');\n};\n\nexport const enableMinimalTracing = () => {\n process.env.DEBUG_TRACE = 'true';\n process.env.TRACE_VERBOSITY = 'summary';\n process.env.TRACE_PARAMS = 'false';\n process.env.TRACE_RESULTS = 'false';\n process.env.TRACE_MEMORY = 'false';\n console.log('\u2705 Minimal tracing enabled');\n};"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Trace Module Export\n * Central export for all tracing functionality\n */\n\nimport type { TraceConfig } from './debug-trace.js';\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 {\n trace,\n TraceContext,\n Trace,\n TraceClass,\n TraceCritical,\n type TraceConfig,\n} from './debug-trace.js';\n\nexport {\n wrapCommand,\n wrapProgram,\n traceStep,\n traceQuery,\n traceAPI,\n} from './cli-trace-wrapper.js';\n\nexport {\n createTracedDatabase,\n wrapDatabase,\n getQueryStatistics,\n createTracedTransaction,\n} from './db-trace-wrapper.js';\n\nexport {\n TraceLinearAPI,\n createTracedFetch,\n wrapGraphQLClient,\n} from './linear-api-wrapper.js';\n\n/**\n * Initialize tracing based on environment configuration\n */\nexport function initializeTracing(): void {\n const config = {\n // Main control\n DEBUG_TRACE: process.env['DEBUG_TRACE'] === 'true',\n STACKMEMORY_DEBUG: process.env['STACKMEMORY_DEBUG'] === 'true',\n \n // Output control\n TRACE_OUTPUT: process.env['TRACE_OUTPUT'] || 'console', // console|file|both\n TRACE_VERBOSITY: process.env['TRACE_VERBOSITY'] || 'full', // full|errors|summary\n \n // Content control\n TRACE_PARAMS: process.env['TRACE_PARAMS'] !== 'false', // Include parameters\n TRACE_RESULTS: process.env['TRACE_RESULTS'] !== 'false', // Include results\n TRACE_MASK_SENSITIVE: process.env['TRACE_MASK_SENSITIVE'] !== 'false', // Mask sensitive data\n \n // Performance\n TRACE_PERF_THRESHOLD: parseInt(process.env['TRACE_PERF_THRESHOLD'] || '100'), // ms\n TRACE_MEMORY: process.env['TRACE_MEMORY'] === 'true', // Track memory usage\n TRACE_MAX_DEPTH: parseInt(process.env['TRACE_MAX_DEPTH'] || '20'), // Max call depth\n \n // Database specific\n TRACE_DB: process.env['TRACE_DB'] === 'true', // Enable database tracing\n TRACE_DB_SLOW: parseInt(process.env['TRACE_DB_SLOW'] || '100'), // Slow query threshold\n \n // API specific\n TRACE_API: process.env['TRACE_API'] === 'true', // Enable API tracing\n TRACE_API_SLOW: parseInt(process.env['TRACE_API_SLOW'] || '1000'), // Slow API threshold\n };\n \n // Log configuration if debugging is enabled\n if (config.DEBUG_TRACE || config.STACKMEMORY_DEBUG) {\n console.log('\uD83D\uDD0D Trace Configuration:', {\n enabled: true,\n output: config.TRACE_OUTPUT,\n verbosity: config.TRACE_VERBOSITY,\n includeParams: config.TRACE_PARAMS,\n includeResults: config.TRACE_RESULTS,\n maskSensitive: config.TRACE_MASK_SENSITIVE,\n performanceThreshold: config.TRACE_PERF_THRESHOLD,\n captureMemory: config.TRACE_MEMORY,\n maxDepth: config.TRACE_MAX_DEPTH,\n database: {\n enabled: config.TRACE_DB,\n slowThreshold: config.TRACE_DB_SLOW,\n },\n api: {\n enabled: config.TRACE_API,\n slowThreshold: config.TRACE_API_SLOW,\n },\n });\n }\n}\n\n/**\n * Helper to enable tracing for a specific scope\n */\nexport function withTracing<T>(\n fn: () => T,\n options?: Partial<TraceConfig>\n): T {\n const originalEnv = process.env['DEBUG_TRACE'];\n \n try {\n // Temporarily enable tracing\n process.env['DEBUG_TRACE'] = 'true';\n \n // Apply custom options if provided\n if (options) {\n if (options.output) process.env['TRACE_OUTPUT'] = options.output;\n if (options.verbosity) process.env['TRACE_VERBOSITY'] = options.verbosity;\n if (options.includeParams !== undefined) {\n process.env['TRACE_PARAMS'] = String(options.includeParams);\n }\n if (options.includeResults !== undefined) {\n process.env['TRACE_RESULTS'] = String(options.includeResults);\n }\n if (options.performanceThreshold !== undefined) {\n process.env['TRACE_PERF_THRESHOLD'] = String(options.performanceThreshold);\n }\n }\n \n return fn();\n } finally {\n // Restore original environment\n if (originalEnv === undefined) {\n delete process.env['DEBUG_TRACE'];\n } else {\n process.env['DEBUG_TRACE'] = originalEnv;\n }\n }\n}\n\n/**\n * Quick enable/disable functions for debugging\n */\nexport const enableTracing = () => {\n process.env['DEBUG_TRACE'] = 'true';\n console.log('\u2705 Tracing enabled');\n};\n\nexport const disableTracing = () => {\n delete process.env['DEBUG_TRACE'];\n console.log('\u274C Tracing disabled');\n};\n\nexport const enableVerboseTracing = () => {\n process.env['DEBUG_TRACE'] = 'true';\n process.env['TRACE_VERBOSITY'] = 'full';\n process.env['TRACE_PARAMS'] = 'true';\n process.env['TRACE_RESULTS'] = 'true';\n process.env['TRACE_MEMORY'] = 'true';\n console.log('\u2705 Verbose tracing enabled');\n};\n\nexport const enableMinimalTracing = () => {\n process.env['DEBUG_TRACE'] = 'true';\n process.env['TRACE_VERBOSITY'] = 'summary';\n process.env['TRACE_PARAMS'] = 'false';\n process.env['TRACE_RESULTS'] = 'false';\n process.env['TRACE_MEMORY'] = 'false';\n console.log('\u2705 Minimal tracing enabled');\n};"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -5,6 +5,17 @@ import {
5
5
  createTracedDatabase,
6
6
  traceStep
7
7
  } from "./index.js";
8
+ function getEnv(key, defaultValue) {
9
+ const value = process.env[key];
10
+ if (value === void 0) {
11
+ if (defaultValue !== void 0) return defaultValue;
12
+ throw new Error(`Environment variable ${key} is required`);
13
+ }
14
+ return value;
15
+ }
16
+ function getOptionalEnv(key) {
17
+ return process.env[key];
18
+ }
8
19
  class ExampleService {
9
20
  data = /* @__PURE__ */ new Map();
10
21
  async fetchData(id) {
@@ -73,7 +84,7 @@ async function runDemo() {
73
84
  console.log("\n" + "=".repeat(80));
74
85
  console.log("STACKMEMORY DEBUG TRACE DEMO");
75
86
  console.log("=".repeat(80) + "\n");
76
- if (process.env.DEBUG_TRACE !== "true") {
87
+ if (process.env["DEBUG_TRACE"] !== "true") {
77
88
  console.log("\u{1F4DD} Enabling verbose tracing for this demo...\n");
78
89
  enableVerboseTracing();
79
90
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/trace/trace-demo.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * Trace Demo - Shows how the debug tracing works\n * Run with: DEBUG_TRACE=true npx tsx src/core/trace/trace-demo.ts\n */\n\nimport { \n trace, \n Trace, \n TraceClass,\n enableVerboseTracing,\n createTracedDatabase,\n traceStep,\n} from './index.js';\nimport { logger } from '../monitoring/logger.js';\n\n// Example class with tracing\n// @TraceClass() - decorators not enabled in tsconfig\nclass ExampleService {\n private data: Map<string, any> = new Map();\n\n async fetchData(id: string): Promise<any> {\n // Simulate API call\n await this.delay(50);\n \n if (id === 'error') {\n throw new Error('Simulated API error');\n }\n \n return { id, value: Math.random() };\n }\n\n async processData(data: any): Promise<any> {\n return traceStep('Data validation', async () => {\n await this.delay(20);\n \n if (!data.id) {\n throw new Error('Invalid data: missing ID');\n }\n \n return traceStep('Data transformation', async () => {\n await this.delay(30);\n return {\n ...data,\n processed: true,\n timestamp: Date.now(),\n };\n });\n });\n }\n\n cacheData(key: string, value: any): void {\n trace.traceSync('function', 'cacheData', { key, value }, () => {\n this.data.set(key, value);\n });\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n\n// Example with database operations\nasync function databaseExample() {\n return trace.step('Database operations example', async () => {\n const db = createTracedDatabase(':memory:');\n \n // Create table\n db.exec(`\n CREATE TABLE users (\n id INTEGER PRIMARY KEY,\n name TEXT NOT NULL,\n email TEXT UNIQUE,\n created_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n \n // Insert data\n const insert = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');\n insert.run('Alice', 'alice@example.com');\n insert.run('Bob', 'bob@example.com');\n \n // Query data\n const select = db.prepare('SELECT * FROM users WHERE name = ?');\n const user = select.get('Alice');\n \n // Complex query (will trigger slow query warning if threshold is low)\n const complex = db.prepare(`\n SELECT \n name,\n COUNT(*) as count,\n MAX(created_at) as latest\n FROM users\n GROUP BY name\n HAVING COUNT(*) > 0\n `);\n const results = complex.all();\n \n db.close();\n \n return { user, results };\n });\n}\n\n// Main demo function\nasync function runDemo() {\n console.log('\\n' + '='.repeat(80));\n console.log('STACKMEMORY DEBUG TRACE DEMO');\n console.log('='.repeat(80) + '\\n');\n \n // Enable verbose tracing for the demo\n if (process.env.DEBUG_TRACE !== 'true') {\n console.log('\uD83D\uDCDD Enabling verbose tracing for this demo...\\n');\n enableVerboseTracing();\n }\n \n try {\n // Example 1: Service operations\n await trace.command('demo:service', { example: 'service' }, async () => {\n const service = new ExampleService();\n \n console.log('\\n--- Example 1: Service Operations ---\\n');\n \n // Successful operation\n const data = await service.fetchData('test-1');\n const processed = await service.processData(data);\n service.cacheData('test-1', processed);\n \n console.log('\u2705 Service operation completed\\n');\n });\n \n // Example 2: Database operations\n await trace.command('demo:database', { example: 'database' }, async () => {\n console.log('\\n--- Example 2: Database Operations ---\\n');\n \n const results = await databaseExample();\n \n console.log('\u2705 Database operations completed');\n console.log(' Found user:', results.user);\n console.log(' Query results:', results.results);\n });\n \n // Example 3: Error handling\n await trace.command('demo:errors', { example: 'errors' }, async () => {\n console.log('\\n--- Example 3: Error Handling ---\\n');\n \n const service = new ExampleService();\n \n try {\n await service.fetchData('error');\n } catch (error) {\n console.log('\u2705 Error properly traced and handled\\n');\n }\n });\n \n // Example 4: Performance tracking\n await trace.command('demo:performance', { example: 'performance' }, async () => {\n console.log('\\n--- Example 4: Performance Tracking ---\\n');\n \n // Simulate slow operation\n await trace.step('Slow operation', async () => {\n await new Promise(resolve => setTimeout(resolve, 150));\n });\n \n // Simulate fast operations\n for (let i = 0; i < 3; i++) {\n await trace.step(`Fast operation ${i + 1}`, async () => {\n await new Promise(resolve => setTimeout(resolve, 10));\n });\n }\n \n console.log('\u2705 Performance tracking completed\\n');\n });\n \n } catch (error) {\n console.error('\u274C Demo failed:', error);\n }\n \n // Show execution summary\n console.log('\\n' + trace.getExecutionSummary());\n \n // Export traces for analysis\n const traces = trace.exportTraces();\n console.log(`\\n\uD83D\uDCCA Total traces collected: ${traces.length}`);\n \n // Show example trace entry\n if (traces.length > 0) {\n console.log('\\n\uD83D\uDCCD Example trace entry:');\n console.log(JSON.stringify(traces[0], null, 2));\n }\n}\n\n// Run the demo\nif (import.meta.url === `file://${process.argv[1]}`) {\n runDemo().catch(console.error);\n}\n\nexport { runDemo };"],
5
- "mappings": "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",
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * Trace Demo - Shows how the debug tracing works\n * Run with: DEBUG_TRACE=true npx tsx src/core/trace/trace-demo.ts\n */\n\nimport { \n trace, \n Trace, \n TraceClass,\n enableVerboseTracing,\n createTracedDatabase,\n traceStep,\n} from './index.js';\nimport { logger } from '../monitoring/logger.js';\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\n// Example class with tracing\n// @TraceClass() - decorators not enabled in tsconfig\nclass ExampleService {\n private data: Map<string, any> = new Map();\n\n async fetchData(id: string): Promise<any> {\n // Simulate API call\n await this.delay(50);\n \n if (id === 'error') {\n throw new Error('Simulated API error');\n }\n \n return { id, value: Math.random() };\n }\n\n async processData(data: any): Promise<any> {\n return traceStep('Data validation', async () => {\n await this.delay(20);\n \n if (!data.id) {\n throw new Error('Invalid data: missing ID');\n }\n \n return traceStep('Data transformation', async () => {\n await this.delay(30);\n return {\n ...data,\n processed: true,\n timestamp: Date.now(),\n };\n });\n });\n }\n\n cacheData(key: string, value: any): void {\n trace.traceSync('function', 'cacheData', { key, value }, () => {\n this.data.set(key, value);\n });\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n\n// Example with database operations\nasync function databaseExample() {\n return trace.step('Database operations example', async () => {\n const db = createTracedDatabase(':memory:');\n \n // Create table\n db.exec(`\n CREATE TABLE users (\n id INTEGER PRIMARY KEY,\n name TEXT NOT NULL,\n email TEXT UNIQUE,\n created_at INTEGER DEFAULT (strftime('%s', 'now'))\n )\n `);\n \n // Insert data\n const insert = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)');\n insert.run('Alice', 'alice@example.com');\n insert.run('Bob', 'bob@example.com');\n \n // Query data\n const select = db.prepare('SELECT * FROM users WHERE name = ?');\n const user = select.get('Alice');\n \n // Complex query (will trigger slow query warning if threshold is low)\n const complex = db.prepare(`\n SELECT \n name,\n COUNT(*) as count,\n MAX(created_at) as latest\n FROM users\n GROUP BY name\n HAVING COUNT(*) > 0\n `);\n const results = complex.all();\n \n db.close();\n \n return { user, results };\n });\n}\n\n// Main demo function\nasync function runDemo() {\n console.log('\\n' + '='.repeat(80));\n console.log('STACKMEMORY DEBUG TRACE DEMO');\n console.log('='.repeat(80) + '\\n');\n \n // Enable verbose tracing for the demo\n if (process.env['DEBUG_TRACE'] !== 'true') {\n console.log('\uD83D\uDCDD Enabling verbose tracing for this demo...\\n');\n enableVerboseTracing();\n }\n \n try {\n // Example 1: Service operations\n await trace.command('demo:service', { example: 'service' }, async () => {\n const service = new ExampleService();\n \n console.log('\\n--- Example 1: Service Operations ---\\n');\n \n // Successful operation\n const data = await service.fetchData('test-1');\n const processed = await service.processData(data);\n service.cacheData('test-1', processed);\n \n console.log('\u2705 Service operation completed\\n');\n });\n \n // Example 2: Database operations\n await trace.command('demo:database', { example: 'database' }, async () => {\n console.log('\\n--- Example 2: Database Operations ---\\n');\n \n const results = await databaseExample();\n \n console.log('\u2705 Database operations completed');\n console.log(' Found user:', results.user);\n console.log(' Query results:', results.results);\n });\n \n // Example 3: Error handling\n await trace.command('demo:errors', { example: 'errors' }, async () => {\n console.log('\\n--- Example 3: Error Handling ---\\n');\n \n const service = new ExampleService();\n \n try {\n await service.fetchData('error');\n } catch (error: unknown) {\n console.log('\u2705 Error properly traced and handled\\n');\n }\n });\n \n // Example 4: Performance tracking\n await trace.command('demo:performance', { example: 'performance' }, async () => {\n console.log('\\n--- Example 4: Performance Tracking ---\\n');\n \n // Simulate slow operation\n await trace.step('Slow operation', async () => {\n await new Promise(resolve => setTimeout(resolve, 150));\n });\n \n // Simulate fast operations\n for (let i = 0; i < 3; i++) {\n await trace.step(`Fast operation ${i + 1}`, async () => {\n await new Promise(resolve => setTimeout(resolve, 10));\n });\n }\n \n console.log('\u2705 Performance tracking completed\\n');\n });\n \n } catch (error: unknown) {\n console.error('\u274C Demo failed:', error);\n }\n \n // Show execution summary\n console.log('\\n' + trace.getExecutionSummary());\n \n // Export traces for analysis\n const traces = trace.exportTraces();\n console.log(`\\n\uD83D\uDCCA Total traces collected: ${traces.length}`);\n \n // Show example trace entry\n if (traces.length > 0) {\n console.log('\\n\uD83D\uDCCD Example trace entry:');\n console.log(JSON.stringify(traces[0], null, 2));\n }\n}\n\n// Run the demo\nif (import.meta.url === `file://${process.argv[1]}`) {\n runDemo().catch(console.error);\n}\n\nexport { runDemo };"],
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/trace/trace-detector.ts"],
4
- "sourcesContent": ["/**\n * Trace Detection and Bundling System\n * Identifies chains of related tool calls and bundles them as single traces\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n ToolCall,\n Trace,\n TraceType,\n TraceBoundaryConfig,\n DEFAULT_TRACE_CONFIG,\n TRACE_PATTERNS,\n TraceMetadata,\n TraceScoringFactors,\n CompressedTrace,\n CompressionStrategy,\n} from './types.js';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { TraceStore } from './trace-store.js';\nimport Database from 'better-sqlite3';\n\nexport class TraceDetector {\n private config: TraceBoundaryConfig;\n private activeTrace: ToolCall[] = [];\n private lastToolTime: number = 0;\n private traces: Trace[] = [];\n private configManager: ConfigManager;\n private traceStore?: TraceStore;\n\n constructor(\n config: Partial<TraceBoundaryConfig> = {},\n configManager?: ConfigManager,\n db?: Database.Database\n ) {\n this.config = { ...DEFAULT_TRACE_CONFIG, ...config };\n this.configManager = configManager || new ConfigManager();\n\n if (db) {\n this.traceStore = new TraceStore(db);\n // Load existing traces from database\n this.loadTracesFromStore();\n }\n }\n\n /**\n * Load traces from the database\n */\n private loadTracesFromStore(): void {\n if (!this.traceStore) return;\n\n try {\n // Load recent traces (last 24 hours)\n const recentTraces = this.traceStore.getAllTraces();\n const cutoff = Date.now() - 24 * 60 * 60 * 1000;\n\n this.traces = recentTraces.filter((t) => t.metadata.startTime >= cutoff);\n } catch (error) {\n // If loading fails, start with empty traces\n console.error('Failed to load traces from store:', error);\n this.traces = [];\n }\n }\n\n /**\n * Add a tool call and check if it belongs to current trace\n */\n addToolCall(tool: ToolCall): void {\n const now = Date.now();\n\n // Check if this tool belongs to the current trace\n if (this.shouldStartNewTrace(tool)) {\n // Finalize current trace if it exists\n if (this.activeTrace.length > 0) {\n this.finalizeTrace();\n }\n // Start new trace\n this.activeTrace = [tool];\n } else {\n // Add to current trace\n this.activeTrace.push(tool);\n }\n\n this.lastToolTime = tool.timestamp;\n\n // Check if trace is getting too large\n if (this.activeTrace.length >= this.config.maxTraceSize) {\n this.finalizeTrace();\n }\n }\n\n /**\n * Determine if a tool call should start a new trace\n */\n private shouldStartNewTrace(tool: ToolCall): boolean {\n // First tool always starts a new trace\n if (this.activeTrace.length === 0) {\n return false;\n }\n\n const lastTool = this.activeTrace[this.activeTrace.length - 1];\n\n // Time proximity check\n const timeDiff = tool.timestamp - lastTool.timestamp;\n if (timeDiff > this.config.timeProximityMs) {\n return true;\n }\n\n // Directory check if enabled\n if (this.config.sameDirThreshold) {\n const lastFiles = lastTool.filesAffected || [];\n const currentFiles = tool.filesAffected || [];\n\n if (lastFiles.length > 0 && currentFiles.length > 0) {\n const lastDirs = lastFiles.map((f) => this.getDirectory(f));\n const currentDirs = currentFiles.map((f) => this.getDirectory(f));\n\n const hasCommonDir = lastDirs.some((d) => currentDirs.includes(d));\n if (!hasCommonDir) {\n return true;\n }\n }\n }\n\n // Causal relationship check\n if (this.config.causalRelationship) {\n // If last tool had an error and current tool is not a fix attempt, start new trace\n if (lastTool.error && !this.isFixAttempt(tool, lastTool)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if a tool is attempting to fix an error from previous tool\n */\n private isFixAttempt(current: ToolCall, previous: ToolCall): boolean {\n // Edit after error is likely a fix\n if (\n previous.error &&\n (current.tool === 'edit' || current.tool === 'write')\n ) {\n return true;\n }\n\n // Test after fix is validation\n if (current.tool === 'test' || current.tool === 'bash') {\n return true;\n }\n\n return false;\n }\n\n /**\n * Finalize current trace and add to traces list\n */\n private finalizeTrace(): void {\n if (this.activeTrace.length === 0) return;\n\n const trace = this.createTrace(this.activeTrace);\n this.traces.push(trace);\n\n // Persist to database if store is available\n if (this.traceStore) {\n try {\n this.traceStore.saveTrace(trace);\n } catch (error) {\n console.error('Failed to persist trace:', error);\n }\n }\n\n this.activeTrace = [];\n }\n\n /**\n * Create a trace from a sequence of tool calls\n */\n private createTrace(tools: ToolCall[]): Trace {\n const id = uuidv4();\n const type = this.detectTraceType(tools);\n const metadata = this.extractMetadata(tools);\n const score = this.calculateTraceScore(tools, metadata);\n const summary = this.generateSummary(tools, type, metadata);\n\n const trace: Trace = {\n id,\n type,\n tools,\n score,\n summary,\n metadata,\n };\n\n // Check if trace should be compressed\n const ageHours = (Date.now() - metadata.startTime) / (1000 * 60 * 60);\n if (ageHours > this.config.compressionThreshold) {\n trace.compressed = this.compressTrace(trace);\n }\n\n return trace;\n }\n\n /**\n * Detect the type of trace based on tool patterns\n */\n private detectTraceType(tools: ToolCall[]): TraceType {\n const toolSequence = tools.map((t) => t.tool);\n\n // Check against known patterns\n for (const pattern of TRACE_PATTERNS) {\n if (this.matchesPattern(toolSequence, pattern.pattern)) {\n return pattern.type;\n }\n }\n\n // Heuristic detection\n if (toolSequence.includes('search') || toolSequence.includes('grep')) {\n if (toolSequence.includes('edit')) {\n return TraceType.SEARCH_DRIVEN;\n }\n return TraceType.EXPLORATION;\n }\n\n if (tools.some((t) => t.error)) {\n return TraceType.ERROR_RECOVERY;\n }\n\n if (toolSequence.includes('test')) {\n return TraceType.TESTING;\n }\n\n if (toolSequence.includes('write')) {\n return TraceType.FEATURE_IMPLEMENTATION;\n }\n\n return TraceType.UNKNOWN;\n }\n\n /**\n * Check if tool sequence matches a pattern\n */\n private matchesPattern(\n sequence: string[],\n pattern: RegExp | string[]\n ): boolean {\n if (pattern instanceof RegExp) {\n return pattern.test(sequence.join('\u2192'));\n }\n\n if (Array.isArray(pattern)) {\n // Check if pattern is a subsequence\n let patternIndex = 0;\n for (const tool of sequence) {\n if (tool === pattern[patternIndex]) {\n patternIndex++;\n if (patternIndex >= pattern.length) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * Extract metadata from tool calls\n */\n private extractMetadata(tools: ToolCall[]): TraceMetadata {\n const startTime = tools[0].timestamp;\n const endTime = tools[tools.length - 1].timestamp;\n\n const filesModified = new Set<string>();\n const errorsEncountered: string[] = [];\n const decisionsRecorded: string[] = [];\n\n let hasCausalChain = false;\n\n for (let i = 0; i < tools.length; i++) {\n const tool = tools[i];\n\n // Collect files\n if (tool.filesAffected) {\n tool.filesAffected.forEach((f) => filesModified.add(f));\n }\n\n // Collect errors\n if (tool.error) {\n errorsEncountered.push(tool.error);\n // Check if next tool is a fix attempt\n if (i < tools.length - 1) {\n const nextTool = tools[i + 1];\n if (this.isFixAttempt(nextTool, tool)) {\n hasCausalChain = true;\n }\n }\n }\n\n // Collect decisions (if tool is decision_recording)\n if (tool.tool === 'decision_recording' && tool.arguments?.decision) {\n decisionsRecorded.push(tool.arguments.decision);\n }\n }\n\n return {\n startTime,\n endTime,\n filesModified: Array.from(filesModified),\n errorsEncountered,\n decisionsRecorded,\n causalChain: hasCausalChain,\n };\n }\n\n /**\n * Calculate importance score for a trace\n */\n private calculateTraceScore(\n tools: ToolCall[],\n metadata: TraceMetadata\n ): number {\n // Get individual tool scores\n const toolScores = tools.map((t) =>\n this.configManager.calculateScore(t.tool, {\n filesAffected: t.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(t),\n referenceCount: 0, // Would need to track references\n })\n );\n\n // Use MAX strategy for trace scoring (highest tool determines trace importance)\n const maxScore = Math.max(...toolScores);\n\n // Apply bonuses\n let score = maxScore;\n\n // Bonus for causal chains (error\u2192fix\u2192verify)\n if (metadata.causalChain) {\n score = Math.min(score + 0.1, 1.0);\n }\n\n // Bonus for decisions\n if (metadata.decisionsRecorded.length > 0) {\n score = Math.min(score + 0.05 * metadata.decisionsRecorded.length, 1.0);\n }\n\n // Penalty for errors without fixes\n if (metadata.errorsEncountered.length > 0 && !metadata.causalChain) {\n score = Math.max(score - 0.1, 0);\n }\n\n return score;\n }\n\n /**\n * Check if a tool call represents a permanent change\n */\n private isPermanentChange(tool: ToolCall): boolean {\n const permanentTools = ['write', 'edit', 'decision_recording'];\n return permanentTools.includes(tool.tool);\n }\n\n /**\n * Generate a summary for the trace\n */\n private generateSummary(\n tools: ToolCall[],\n type: TraceType,\n metadata: TraceMetadata\n ): string {\n const toolChain = tools.map((t) => t.tool).join('\u2192');\n\n switch (type) {\n case TraceType.SEARCH_DRIVEN:\n return `Search-driven modification: ${toolChain}`;\n\n case TraceType.ERROR_RECOVERY:\n const error = metadata.errorsEncountered[0] || 'unknown error';\n return `Error recovery: ${error} via ${toolChain}`;\n\n case TraceType.FEATURE_IMPLEMENTATION:\n const files = metadata.filesModified.length;\n return `Feature implementation: ${files} files via ${toolChain}`;\n\n case TraceType.REFACTORING:\n return `Code refactoring: ${toolChain}`;\n\n case TraceType.TESTING:\n return `Test execution: ${toolChain}`;\n\n case TraceType.EXPLORATION:\n return `Codebase exploration: ${toolChain}`;\n\n case TraceType.DEBUGGING:\n return `Debugging session: ${toolChain}`;\n\n case TraceType.BUILD_DEPLOY:\n return `Build and deploy: ${toolChain}`;\n\n default:\n return `Tool sequence: ${toolChain}`;\n }\n }\n\n /**\n * Compress a trace for long-term storage using strategy\n */\n private compressTrace(\n trace: Trace, \n strategy: CompressionStrategy = CompressionStrategy.PATTERN_BASED\n ): CompressedTrace {\n switch (strategy) {\n case CompressionStrategy.SUMMARY_ONLY:\n return this.compressSummaryOnly(trace);\n \n case CompressionStrategy.PATTERN_BASED:\n return this.compressPatternBased(trace);\n \n case CompressionStrategy.SELECTIVE:\n return this.compressSelective(trace);\n \n case CompressionStrategy.FULL_COMPRESSION:\n return this.compressMaximal(trace);\n \n default:\n return this.compressPatternBased(trace);\n }\n }\n \n /**\n * Summary-only compression - minimal data retention\n */\n private compressSummaryOnly(trace: Trace): CompressedTrace {\n return {\n pattern: '', // No pattern stored\n summary: trace.summary.substring(0, 100), // Limit summary\n score: trace.score,\n toolCount: trace.tools.length,\n duration: trace.metadata.endTime - trace.metadata.startTime,\n timestamp: trace.metadata.startTime,\n };\n }\n \n /**\n * Pattern-based compression - keep tool sequence\n */\n private compressPatternBased(trace: Trace): CompressedTrace {\n const pattern = trace.tools.map((t) => t.tool).join('\u2192');\n const duration = trace.metadata.endTime - trace.metadata.startTime;\n\n return {\n pattern,\n summary: trace.summary,\n score: trace.score,\n toolCount: trace.tools.length,\n duration,\n timestamp: trace.metadata.startTime,\n };\n }\n \n /**\n * Selective compression - keep high-score tools only\n */\n private compressSelective(trace: Trace, threshold: number = 0.5): CompressedTrace {\n // Calculate individual tool scores\n const significantTools = trace.tools.filter(tool => {\n const score = this.configManager.calculateScore(tool.tool, {\n filesAffected: tool.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(tool),\n referenceCount: 0,\n });\n return score >= threshold;\n });\n \n const pattern = significantTools.length > 0 \n ? significantTools.map(t => t.tool).join('\u2192')\n : trace.tools.map(t => t.tool).join('\u2192');\n \n return {\n pattern,\n summary: `${trace.summary} [${significantTools.length}/${trace.tools.length} significant]`,\n score: trace.score,\n toolCount: significantTools.length,\n duration: trace.metadata.endTime - trace.metadata.startTime,\n timestamp: trace.metadata.startTime,\n };\n }\n \n /**\n * Maximal compression - absolute minimum data\n */\n private compressMaximal(trace: Trace): CompressedTrace {\n // Compress pattern to type abbreviation\n const typeAbbrev = this.getTraceTypeAbbreviation(trace.type);\n const pattern = `${typeAbbrev}:${trace.tools.length}`;\n \n return {\n pattern,\n summary: trace.type, // Just the type\n score: Math.round(trace.score * 10) / 10, // Round to 1 decimal\n toolCount: trace.tools.length,\n duration: Math.round((trace.metadata.endTime - trace.metadata.startTime) / 1000) * 1000, // Round to seconds\n timestamp: trace.metadata.startTime,\n };\n }\n \n /**\n * Get abbreviated trace type\n */\n private getTraceTypeAbbreviation(type: TraceType): string {\n const abbreviations: Record<TraceType, string> = {\n [TraceType.SEARCH_DRIVEN]: 'SD',\n [TraceType.ERROR_RECOVERY]: 'ER',\n [TraceType.FEATURE_IMPLEMENTATION]: 'FI',\n [TraceType.REFACTORING]: 'RF',\n [TraceType.TESTING]: 'TS',\n [TraceType.EXPLORATION]: 'EX',\n [TraceType.DEBUGGING]: 'DB',\n [TraceType.DOCUMENTATION]: 'DC',\n [TraceType.BUILD_DEPLOY]: 'BD',\n [TraceType.UNKNOWN]: 'UN',\n };\n return abbreviations[type] || 'UN';\n }\n \n /**\n * Choose compression strategy based on trace age and importance\n */\n private selectCompressionStrategy(trace: Trace): CompressionStrategy {\n const ageHours = (Date.now() - trace.metadata.startTime) / (1000 * 60 * 60);\n const score = trace.score;\n \n // Recent and important: pattern-based\n if (ageHours < 24 && score > 0.7) {\n return CompressionStrategy.PATTERN_BASED;\n }\n \n // Recent but less important: selective\n if (ageHours < 24) {\n return CompressionStrategy.SELECTIVE;\n }\n \n // Old and important: selective\n if (ageHours < 168 && score > 0.5) { // 1 week\n return CompressionStrategy.SELECTIVE;\n }\n \n // Old and less important: summary only\n if (ageHours < 720) { // 30 days\n return CompressionStrategy.SUMMARY_ONLY;\n }\n \n // Very old: maximal compression\n return CompressionStrategy.FULL_COMPRESSION;\n }\n\n /**\n * Get directory from file path\n */\n private getDirectory(filePath: string): string {\n const parts = filePath.split('/');\n parts.pop(); // Remove filename\n return parts.join('/');\n }\n\n /**\n * Flush any pending trace\n */\n flush(): void {\n if (this.activeTrace.length > 0) {\n this.finalizeTrace();\n }\n }\n\n /**\n * Get all detected traces\n */\n getTraces(): Trace[] {\n return this.traces;\n }\n\n /**\n * Get traces by type\n */\n getTracesByType(type: TraceType): Trace[] {\n return this.traces.filter((t) => t.type === type);\n }\n\n /**\n * Get high-importance traces\n */\n getHighImportanceTraces(threshold: number = 0.7): Trace[] {\n return this.traces.filter((t) => t.score >= threshold);\n }\n\n /**\n * Compress old traces with intelligent strategy selection\n */\n compressOldTraces(ageHours: number = 24): number {\n let compressed = 0;\n const now = Date.now();\n\n for (const trace of this.traces) {\n const age = (now - trace.metadata.startTime) / (1000 * 60 * 60);\n if (age > ageHours && !trace.compressed) {\n // Select compression strategy based on age and importance\n const strategy = this.selectCompressionStrategy(trace);\n trace.compressed = this.compressTrace(trace, strategy);\n \n // Remove full tool data for older traces to save memory\n if (strategy === CompressionStrategy.FULL_COMPRESSION || \n strategy === CompressionStrategy.SUMMARY_ONLY) {\n trace.tools = []; // Clear tool data for maximum compression\n } else if (strategy === CompressionStrategy.SELECTIVE) {\n // Keep only high-score tools\n trace.tools = trace.tools.filter(tool => {\n const score = this.configManager.calculateScore(tool.tool, {\n filesAffected: tool.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(tool),\n referenceCount: 0,\n });\n return score >= 0.5;\n });\n }\n \n compressed++;\n \n // Update database if available\n if (this.traceStore) {\n try {\n this.traceStore.updateCompression(trace.id, trace.compressed, strategy);\n } catch (error) {\n console.error('Failed to update trace compression in store:', error);\n }\n }\n }\n }\n\n return compressed;\n }\n\n /**\n * Export traces for analysis\n */\n exportTraces(): string {\n return JSON.stringify(this.traces, null, 2);\n }\n\n /**\n * Get statistics about traces\n */\n getStatistics() {\n const stats = {\n totalTraces: this.traces.length,\n tracesByType: {} as Record<string, number>,\n averageScore: 0,\n averageLength: 0,\n compressedCount: 0,\n highImportanceCount: 0,\n };\n\n if (this.traces.length === 0) return stats;\n\n let totalScore = 0;\n let totalLength = 0;\n\n for (const trace of this.traces) {\n // Type distribution\n stats.tracesByType[trace.type] =\n (stats.tracesByType[trace.type] || 0) + 1;\n\n // Scores\n totalScore += trace.score;\n\n // Length\n totalLength += trace.tools.length;\n\n // Compressed\n if (trace.compressed) {\n stats.compressedCount++;\n }\n\n // High importance\n if (trace.score >= 0.7) {\n stats.highImportanceCount++;\n }\n }\n\n stats.averageScore = totalScore / this.traces.length;\n stats.averageLength = totalLength / this.traces.length;\n\n return stats;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Trace Detection and Bundling System\n * Identifies chains of related tool calls and bundles them as single traces\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n ToolCall,\n Trace,\n TraceType,\n TraceBoundaryConfig,\n DEFAULT_TRACE_CONFIG,\n TRACE_PATTERNS,\n TraceMetadata,\n TraceScoringFactors,\n CompressedTrace,\n CompressionStrategy,\n} from './types.js';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { TraceStore } from './trace-store.js';\nimport Database from 'better-sqlite3';\n\nexport class TraceDetector {\n private config: TraceBoundaryConfig;\n private activeTrace: ToolCall[] = [];\n private lastToolTime: number = 0;\n private traces: Trace[] = [];\n private configManager: ConfigManager;\n private traceStore?: TraceStore;\n\n constructor(\n config: Partial<TraceBoundaryConfig> = {},\n configManager?: ConfigManager,\n db?: Database.Database\n ) {\n this.config = { ...DEFAULT_TRACE_CONFIG, ...config };\n this.configManager = configManager || new ConfigManager();\n\n if (db) {\n this.traceStore = new TraceStore(db);\n // Load existing traces from database\n this.loadTracesFromStore();\n }\n }\n\n /**\n * Load traces from the database\n */\n private loadTracesFromStore(): void {\n if (!this.traceStore) return;\n\n try {\n // Load recent traces (last 24 hours)\n const recentTraces = this.traceStore.getAllTraces();\n const cutoff = Date.now() - 24 * 60 * 60 * 1000;\n\n this.traces = recentTraces.filter((t) => t.metadata.startTime >= cutoff);\n } catch (error: unknown) {\n // If loading fails, start with empty traces\n console.error('Failed to load traces from store:', error);\n this.traces = [];\n }\n }\n\n /**\n * Add a tool call and check if it belongs to current trace\n */\n addToolCall(tool: ToolCall): void {\n const now = Date.now();\n\n // Check if this tool belongs to the current trace\n if (this.shouldStartNewTrace(tool)) {\n // Finalize current trace if it exists\n if (this.activeTrace.length > 0) {\n this.finalizeTrace();\n }\n // Start new trace\n this.activeTrace = [tool];\n } else {\n // Add to current trace\n this.activeTrace.push(tool);\n }\n\n this.lastToolTime = tool.timestamp;\n\n // Check if trace is getting too large\n if (this.activeTrace.length >= this.config.maxTraceSize) {\n this.finalizeTrace();\n }\n }\n\n /**\n * Determine if a tool call should start a new trace\n */\n private shouldStartNewTrace(tool: ToolCall): boolean {\n // First tool always starts a new trace\n if (this.activeTrace.length === 0) {\n return false;\n }\n\n const lastTool = this.activeTrace[this.activeTrace.length - 1];\n\n // Time proximity check\n const timeDiff = tool.timestamp - lastTool.timestamp;\n if (timeDiff > this.config.timeProximityMs) {\n return true;\n }\n\n // Directory check if enabled\n if (this.config.sameDirThreshold) {\n const lastFiles = lastTool.filesAffected || [];\n const currentFiles = tool.filesAffected || [];\n\n if (lastFiles.length > 0 && currentFiles.length > 0) {\n const lastDirs = lastFiles.map((f) => this.getDirectory(f));\n const currentDirs = currentFiles.map((f) => this.getDirectory(f));\n\n const hasCommonDir = lastDirs.some((d) => currentDirs.includes(d));\n if (!hasCommonDir) {\n return true;\n }\n }\n }\n\n // Causal relationship check\n if (this.config.causalRelationship) {\n // If last tool had an error and current tool is not a fix attempt, start new trace\n if (lastTool.error && !this.isFixAttempt(tool, lastTool)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Check if a tool is attempting to fix an error from previous tool\n */\n private isFixAttempt(current: ToolCall, previous: ToolCall): boolean {\n // Edit after error is likely a fix\n if (\n previous.error &&\n (current.tool === 'edit' || current.tool === 'write')\n ) {\n return true;\n }\n\n // Test after fix is validation\n if (current.tool === 'test' || current.tool === 'bash') {\n return true;\n }\n\n return false;\n }\n\n /**\n * Finalize current trace and add to traces list\n */\n private finalizeTrace(): void {\n if (this.activeTrace.length === 0) return;\n\n const trace = this.createTrace(this.activeTrace);\n this.traces.push(trace);\n\n // Persist to database if store is available\n if (this.traceStore) {\n try {\n this.traceStore.saveTrace(trace);\n } catch (error: unknown) {\n console.error('Failed to persist trace:', error);\n }\n }\n\n this.activeTrace = [];\n }\n\n /**\n * Create a trace from a sequence of tool calls\n */\n private createTrace(tools: ToolCall[]): Trace {\n const id = uuidv4();\n const type = this.detectTraceType(tools);\n const metadata = this.extractMetadata(tools);\n const score = this.calculateTraceScore(tools, metadata);\n const summary = this.generateSummary(tools, type, metadata);\n\n const trace: Trace = {\n id,\n type,\n tools,\n score,\n summary,\n metadata,\n };\n\n // Check if trace should be compressed\n const ageHours = (Date.now() - metadata.startTime) / (1000 * 60 * 60);\n if (ageHours > this.config.compressionThreshold) {\n trace.compressed = this.compressTrace(trace);\n }\n\n return trace;\n }\n\n /**\n * Detect the type of trace based on tool patterns\n */\n private detectTraceType(tools: ToolCall[]): TraceType {\n const toolSequence = tools.map((t) => t.tool);\n\n // Check against known patterns\n for (const pattern of TRACE_PATTERNS) {\n if (this.matchesPattern(toolSequence, pattern.pattern)) {\n return pattern.type;\n }\n }\n\n // Heuristic detection\n if (toolSequence.includes('search') || toolSequence.includes('grep')) {\n if (toolSequence.includes('edit')) {\n return TraceType.SEARCH_DRIVEN;\n }\n return TraceType.EXPLORATION;\n }\n\n if (tools.some((t) => t.error)) {\n return TraceType.ERROR_RECOVERY;\n }\n\n if (toolSequence.includes('test')) {\n return TraceType.TESTING;\n }\n\n if (toolSequence.includes('write')) {\n return TraceType.FEATURE_IMPLEMENTATION;\n }\n\n return TraceType.UNKNOWN;\n }\n\n /**\n * Check if tool sequence matches a pattern\n */\n private matchesPattern(\n sequence: string[],\n pattern: RegExp | string[]\n ): boolean {\n if (pattern instanceof RegExp) {\n return pattern.test(sequence.join('\u2192'));\n }\n\n if (Array.isArray(pattern)) {\n // Check if pattern is a subsequence\n let patternIndex = 0;\n for (const tool of sequence) {\n if (tool === pattern[patternIndex]) {\n patternIndex++;\n if (patternIndex >= pattern.length) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * Extract metadata from tool calls\n */\n private extractMetadata(tools: ToolCall[]): TraceMetadata {\n const startTime = tools[0].timestamp;\n const endTime = tools[tools.length - 1].timestamp;\n\n const filesModified = new Set<string>();\n const errorsEncountered: string[] = [];\n const decisionsRecorded: string[] = [];\n\n let hasCausalChain = false;\n\n for (let i = 0; i < tools.length; i++) {\n const tool = tools[i];\n\n // Collect files\n if (tool.filesAffected) {\n tool.filesAffected.forEach((f) => filesModified.add(f));\n }\n\n // Collect errors\n if (tool.error) {\n errorsEncountered.push(tool.error);\n // Check if next tool is a fix attempt\n if (i < tools.length - 1) {\n const nextTool = tools[i + 1];\n if (this.isFixAttempt(nextTool, tool)) {\n hasCausalChain = true;\n }\n }\n }\n\n // Collect decisions (if tool is decision_recording)\n if (tool.tool === 'decision_recording' && tool.arguments?.decision) {\n decisionsRecorded.push(tool.arguments.decision);\n }\n }\n\n return {\n startTime,\n endTime,\n filesModified: Array.from(filesModified),\n errorsEncountered,\n decisionsRecorded,\n causalChain: hasCausalChain,\n };\n }\n\n /**\n * Calculate importance score for a trace\n */\n private calculateTraceScore(\n tools: ToolCall[],\n metadata: TraceMetadata\n ): number {\n // Get individual tool scores\n const toolScores = tools.map((t) =>\n this.configManager.calculateScore(t.tool, {\n filesAffected: t.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(t),\n referenceCount: 0, // Would need to track references\n })\n );\n\n // Use MAX strategy for trace scoring (highest tool determines trace importance)\n const maxScore = Math.max(...toolScores);\n\n // Apply bonuses\n let score = maxScore;\n\n // Bonus for causal chains (error\u2192fix\u2192verify)\n if (metadata.causalChain) {\n score = Math.min(score + 0.1, 1.0);\n }\n\n // Bonus for decisions\n if (metadata.decisionsRecorded.length > 0) {\n score = Math.min(score + 0.05 * metadata.decisionsRecorded.length, 1.0);\n }\n\n // Penalty for errors without fixes\n if (metadata.errorsEncountered.length > 0 && !metadata.causalChain) {\n score = Math.max(score - 0.1, 0);\n }\n\n return score;\n }\n\n /**\n * Check if a tool call represents a permanent change\n */\n private isPermanentChange(tool: ToolCall): boolean {\n const permanentTools = ['write', 'edit', 'decision_recording'];\n return permanentTools.includes(tool.tool);\n }\n\n /**\n * Generate a summary for the trace\n */\n private generateSummary(\n tools: ToolCall[],\n type: TraceType,\n metadata: TraceMetadata\n ): string {\n const toolChain = tools.map((t) => t.tool).join('\u2192');\n\n switch (type) {\n case TraceType.SEARCH_DRIVEN:\n return `Search-driven modification: ${toolChain}`;\n\n case TraceType.ERROR_RECOVERY:\n const error = metadata.errorsEncountered[0] || 'unknown error';\n return `Error recovery: ${error} via ${toolChain}`;\n\n case TraceType.FEATURE_IMPLEMENTATION:\n const files = metadata.filesModified.length;\n return `Feature implementation: ${files} files via ${toolChain}`;\n\n case TraceType.REFACTORING:\n return `Code refactoring: ${toolChain}`;\n\n case TraceType.TESTING:\n return `Test execution: ${toolChain}`;\n\n case TraceType.EXPLORATION:\n return `Codebase exploration: ${toolChain}`;\n\n case TraceType.DEBUGGING:\n return `Debugging session: ${toolChain}`;\n\n case TraceType.BUILD_DEPLOY:\n return `Build and deploy: ${toolChain}`;\n\n default:\n return `Tool sequence: ${toolChain}`;\n }\n }\n\n /**\n * Compress a trace for long-term storage using strategy\n */\n private compressTrace(\n trace: Trace, \n strategy: CompressionStrategy = CompressionStrategy.PATTERN_BASED\n ): CompressedTrace {\n switch (strategy) {\n case CompressionStrategy.SUMMARY_ONLY:\n return this.compressSummaryOnly(trace);\n \n case CompressionStrategy.PATTERN_BASED:\n return this.compressPatternBased(trace);\n \n case CompressionStrategy.SELECTIVE:\n return this.compressSelective(trace);\n \n case CompressionStrategy.FULL_COMPRESSION:\n return this.compressMaximal(trace);\n \n default:\n return this.compressPatternBased(trace);\n }\n }\n \n /**\n * Summary-only compression - minimal data retention\n */\n private compressSummaryOnly(trace: Trace): CompressedTrace {\n return {\n pattern: '', // No pattern stored\n summary: trace.summary.substring(0, 100), // Limit summary\n score: trace.score,\n toolCount: trace.tools.length,\n duration: trace.metadata.endTime - trace.metadata.startTime,\n timestamp: trace.metadata.startTime,\n };\n }\n \n /**\n * Pattern-based compression - keep tool sequence\n */\n private compressPatternBased(trace: Trace): CompressedTrace {\n const pattern = trace.tools.map((t) => t.tool).join('\u2192');\n const duration = trace.metadata.endTime - trace.metadata.startTime;\n\n return {\n pattern,\n summary: trace.summary,\n score: trace.score,\n toolCount: trace.tools.length,\n duration,\n timestamp: trace.metadata.startTime,\n };\n }\n \n /**\n * Selective compression - keep high-score tools only\n */\n private compressSelective(trace: Trace, threshold: number = 0.5): CompressedTrace {\n // Calculate individual tool scores\n const significantTools = trace.tools.filter((tool: any) => {\n const score = this.configManager.calculateScore(tool.tool, {\n filesAffected: tool.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(tool),\n referenceCount: 0,\n });\n return score >= threshold;\n });\n \n const pattern = significantTools.length > 0 \n ? significantTools.map((t: any) => t.tool).join('\u2192')\n : trace.tools.map((t: any) => t.tool).join('\u2192');\n \n return {\n pattern,\n summary: `${trace.summary} [${significantTools.length}/${trace.tools.length} significant]`,\n score: trace.score,\n toolCount: significantTools.length,\n duration: trace.metadata.endTime - trace.metadata.startTime,\n timestamp: trace.metadata.startTime,\n };\n }\n \n /**\n * Maximal compression - absolute minimum data\n */\n private compressMaximal(trace: Trace): CompressedTrace {\n // Compress pattern to type abbreviation\n const typeAbbrev = this.getTraceTypeAbbreviation(trace.type);\n const pattern = `${typeAbbrev}:${trace.tools.length}`;\n \n return {\n pattern,\n summary: trace.type, // Just the type\n score: Math.round(trace.score * 10) / 10, // Round to 1 decimal\n toolCount: trace.tools.length,\n duration: Math.round((trace.metadata.endTime - trace.metadata.startTime) / 1000) * 1000, // Round to seconds\n timestamp: trace.metadata.startTime,\n };\n }\n \n /**\n * Get abbreviated trace type\n */\n private getTraceTypeAbbreviation(type: TraceType): string {\n const abbreviations: Record<TraceType, string> = {\n [TraceType.SEARCH_DRIVEN]: 'SD',\n [TraceType.ERROR_RECOVERY]: 'ER',\n [TraceType.FEATURE_IMPLEMENTATION]: 'FI',\n [TraceType.REFACTORING]: 'RF',\n [TraceType.TESTING]: 'TS',\n [TraceType.EXPLORATION]: 'EX',\n [TraceType.DEBUGGING]: 'DB',\n [TraceType.DOCUMENTATION]: 'DC',\n [TraceType.BUILD_DEPLOY]: 'BD',\n [TraceType.UNKNOWN]: 'UN',\n };\n return abbreviations[type] || 'UN';\n }\n \n /**\n * Choose compression strategy based on trace age and importance\n */\n private selectCompressionStrategy(trace: Trace): CompressionStrategy {\n const ageHours = (Date.now() - trace.metadata.startTime) / (1000 * 60 * 60);\n const score = trace.score;\n \n // Recent and important: pattern-based\n if (ageHours < 24 && score > 0.7) {\n return CompressionStrategy.PATTERN_BASED;\n }\n \n // Recent but less important: selective\n if (ageHours < 24) {\n return CompressionStrategy.SELECTIVE;\n }\n \n // Old and important: selective\n if (ageHours < 168 && score > 0.5) { // 1 week\n return CompressionStrategy.SELECTIVE;\n }\n \n // Old and less important: summary only\n if (ageHours < 720) { // 30 days\n return CompressionStrategy.SUMMARY_ONLY;\n }\n \n // Very old: maximal compression\n return CompressionStrategy.FULL_COMPRESSION;\n }\n\n /**\n * Get directory from file path\n */\n private getDirectory(filePath: string): string {\n const parts = filePath.split('/');\n parts.pop(); // Remove filename\n return parts.join('/');\n }\n\n /**\n * Flush any pending trace\n */\n flush(): void {\n if (this.activeTrace.length > 0) {\n this.finalizeTrace();\n }\n }\n\n /**\n * Get all detected traces\n */\n getTraces(): Trace[] {\n return this.traces;\n }\n\n /**\n * Get traces by type\n */\n getTracesByType(type: TraceType): Trace[] {\n return this.traces.filter((t) => t.type === type);\n }\n\n /**\n * Get high-importance traces\n */\n getHighImportanceTraces(threshold: number = 0.7): Trace[] {\n return this.traces.filter((t) => t.score >= threshold);\n }\n\n /**\n * Compress old traces with intelligent strategy selection\n */\n compressOldTraces(ageHours: number = 24): number {\n let compressed = 0;\n const now = Date.now();\n\n for (const trace of this.traces) {\n const age = (now - trace.metadata.startTime) / (1000 * 60 * 60);\n if (age > ageHours && !trace.compressed) {\n // Select compression strategy based on age and importance\n const strategy = this.selectCompressionStrategy(trace);\n trace.compressed = this.compressTrace(trace, strategy);\n \n // Remove full tool data for older traces to save memory\n if (strategy === CompressionStrategy.FULL_COMPRESSION || \n strategy === CompressionStrategy.SUMMARY_ONLY) {\n trace.tools = []; // Clear tool data for maximum compression\n } else if (strategy === CompressionStrategy.SELECTIVE) {\n // Keep only high-score tools\n trace.tools = trace.tools.filter((tool: any) => {\n const score = this.configManager.calculateScore(tool.tool, {\n filesAffected: tool.filesAffected?.length || 0,\n isPermanent: this.isPermanentChange(tool),\n referenceCount: 0,\n });\n return score >= 0.5;\n });\n }\n \n compressed++;\n \n // Update database if available\n if (this.traceStore) {\n try {\n this.traceStore.updateCompression(trace.id, trace.compressed, strategy);\n } catch (error: unknown) {\n console.error('Failed to update trace compression in store:', error);\n }\n }\n }\n }\n\n return compressed;\n }\n\n /**\n * Export traces for analysis\n */\n exportTraces(): string {\n return JSON.stringify(this.traces, null, 2);\n }\n\n /**\n * Get statistics about traces\n */\n getStatistics() {\n const stats = {\n totalTraces: this.traces.length,\n tracesByType: {} as Record<string, number>,\n averageScore: 0,\n averageLength: 0,\n compressedCount: 0,\n highImportanceCount: 0,\n };\n\n if (this.traces.length === 0) return stats;\n\n let totalScore = 0;\n let totalLength = 0;\n\n for (const trace of this.traces) {\n // Type distribution\n stats.tracesByType[trace.type] =\n (stats.tracesByType[trace.type] || 0) + 1;\n\n // Scores\n totalScore += trace.score;\n\n // Length\n totalLength += trace.tools.length;\n\n // Compressed\n if (trace.compressed) {\n stats.compressedCount++;\n }\n\n // High importance\n if (trace.score >= 0.7) {\n stats.highImportanceCount++;\n }\n }\n\n stats.averageScore = totalScore / this.traces.length;\n stats.averageLength = totalLength / this.traces.length;\n\n return stats;\n }\n}\n"],
5
+ "mappings": "AAKA,SAAS,MAAM,cAAc;AAC7B;AAAA,EAGE;AAAA,EAEA;AAAA,EACA;AAAA,EAIA;AAAA,OACK;AACP,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB;AAGpB,MAAM,cAAc;AAAA,EACjB;AAAA,EACA,cAA0B,CAAC;AAAA,EAC3B,eAAuB;AAAA,EACvB,SAAkB,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EAER,YACE,SAAuC,CAAC,GACxC,eACA,IACA;AACA,SAAK,SAAS,EAAE,GAAG,sBAAsB,GAAG,OAAO;AACnD,SAAK,gBAAgB,iBAAiB,IAAI,cAAc;AAExD,QAAI,IAAI;AACN,WAAK,aAAa,IAAI,WAAW,EAAE;AAEnC,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAClC,QAAI,CAAC,KAAK,WAAY;AAEtB,QAAI;AAEF,YAAM,eAAe,KAAK,WAAW,aAAa;AAClD,YAAM,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK;AAE3C,WAAK,SAAS,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,aAAa,MAAM;AAAA,IACzE,SAAS,OAAgB;AAEvB,cAAQ,MAAM,qCAAqC,KAAK;AACxD,WAAK,SAAS,CAAC;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAsB;AAChC,UAAM,MAAM,KAAK,IAAI;AAGrB,QAAI,KAAK,oBAAoB,IAAI,GAAG;AAElC,UAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,aAAK,cAAc;AAAA,MACrB;AAEA,WAAK,cAAc,CAAC,IAAI;AAAA,IAC1B,OAAO;AAEL,WAAK,YAAY,KAAK,IAAI;AAAA,IAC5B;AAEA,SAAK,eAAe,KAAK;AAGzB,QAAI,KAAK,YAAY,UAAU,KAAK,OAAO,cAAc;AACvD,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAyB;AAEnD,QAAI,KAAK,YAAY,WAAW,GAAG;AACjC,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,YAAY,KAAK,YAAY,SAAS,CAAC;AAG7D,UAAM,WAAW,KAAK,YAAY,SAAS;AAC3C,QAAI,WAAW,KAAK,OAAO,iBAAiB;AAC1C,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,OAAO,kBAAkB;AAChC,YAAM,YAAY,SAAS,iBAAiB,CAAC;AAC7C,YAAM,eAAe,KAAK,iBAAiB,CAAC;AAE5C,UAAI,UAAU,SAAS,KAAK,aAAa,SAAS,GAAG;AACnD,cAAM,WAAW,UAAU,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AAC1D,cAAM,cAAc,aAAa,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;AAEhE,cAAM,eAAe,SAAS,KAAK,CAAC,MAAM,YAAY,SAAS,CAAC,CAAC;AACjE,YAAI,CAAC,cAAc;AACjB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,oBAAoB;AAElC,UAAI,SAAS,SAAS,CAAC,KAAK,aAAa,MAAM,QAAQ,GAAG;AACxD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,SAAmB,UAA6B;AAEnE,QACE,SAAS,UACR,QAAQ,SAAS,UAAU,QAAQ,SAAS,UAC7C;AACA,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,QAAQ;AACtD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAsB;AAC5B,QAAI,KAAK,YAAY,WAAW,EAAG;AAEnC,UAAM,QAAQ,KAAK,YAAY,KAAK,WAAW;AAC/C,SAAK,OAAO,KAAK,KAAK;AAGtB,QAAI,KAAK,YAAY;AACnB,UAAI;AACF,aAAK,WAAW,UAAU,KAAK;AAAA,MACjC,SAAS,OAAgB;AACvB,gBAAQ,MAAM,4BAA4B,KAAK;AAAA,MACjD;AAAA,IACF;AAEA,SAAK,cAAc,CAAC;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,OAA0B;AAC5C,UAAM,KAAK,OAAO;AAClB,UAAM,OAAO,KAAK,gBAAgB,KAAK;AACvC,UAAM,WAAW,KAAK,gBAAgB,KAAK;AAC3C,UAAM,QAAQ,KAAK,oBAAoB,OAAO,QAAQ;AACtD,UAAM,UAAU,KAAK,gBAAgB,OAAO,MAAM,QAAQ;AAE1D,UAAM,QAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,IAAI,IAAI,SAAS,cAAc,MAAO,KAAK;AAClE,QAAI,WAAW,KAAK,OAAO,sBAAsB;AAC/C,YAAM,aAAa,KAAK,cAAc,KAAK;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAA8B;AACpD,UAAM,eAAe,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAG5C,eAAW,WAAW,gBAAgB;AACpC,UAAI,KAAK,eAAe,cAAc,QAAQ,OAAO,GAAG;AACtD,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAGA,QAAI,aAAa,SAAS,QAAQ,KAAK,aAAa,SAAS,MAAM,GAAG;AACpE,UAAI,aAAa,SAAS,MAAM,GAAG;AACjC,eAAO,UAAU;AAAA,MACnB;AACA,aAAO,UAAU;AAAA,IACnB;AAEA,QAAI,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG;AAC9B,aAAO,UAAU;AAAA,IACnB;AAEA,QAAI,aAAa,SAAS,MAAM,GAAG;AACjC,aAAO,UAAU;AAAA,IACnB;AAEA,QAAI,aAAa,SAAS,OAAO,GAAG;AAClC,aAAO,UAAU;AAAA,IACnB;AAEA,WAAO,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,UACA,SACS;AACT,QAAI,mBAAmB,QAAQ;AAC7B,aAAO,QAAQ,KAAK,SAAS,KAAK,QAAG,CAAC;AAAA,IACxC;AAEA,QAAI,MAAM,QAAQ,OAAO,GAAG;AAE1B,UAAI,eAAe;AACnB,iBAAW,QAAQ,UAAU;AAC3B,YAAI,SAAS,QAAQ,YAAY,GAAG;AAClC;AACA,cAAI,gBAAgB,QAAQ,QAAQ;AAClC,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAkC;AACxD,UAAM,YAAY,MAAM,CAAC,EAAE;AAC3B,UAAM,UAAU,MAAM,MAAM,SAAS,CAAC,EAAE;AAExC,UAAM,gBAAgB,oBAAI,IAAY;AACtC,UAAM,oBAA8B,CAAC;AACrC,UAAM,oBAA8B,CAAC;AAErC,QAAI,iBAAiB;AAErB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AAGpB,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,QAAQ,CAAC,MAAM,cAAc,IAAI,CAAC,CAAC;AAAA,MACxD;AAGA,UAAI,KAAK,OAAO;AACd,0BAAkB,KAAK,KAAK,KAAK;AAEjC,YAAI,IAAI,MAAM,SAAS,GAAG;AACxB,gBAAM,WAAW,MAAM,IAAI,CAAC;AAC5B,cAAI,KAAK,aAAa,UAAU,IAAI,GAAG;AACrC,6BAAiB;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAGA,UAAI,KAAK,SAAS,wBAAwB,KAAK,WAAW,UAAU;AAClE,0BAAkB,KAAK,KAAK,UAAU,QAAQ;AAAA,MAChD;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,eAAe,MAAM,KAAK,aAAa;AAAA,MACvC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,OACA,UACQ;AAER,UAAM,aAAa,MAAM;AAAA,MAAI,CAAC,MAC5B,KAAK,cAAc,eAAe,EAAE,MAAM;AAAA,QACxC,eAAe,EAAE,eAAe,UAAU;AAAA,QAC1C,aAAa,KAAK,kBAAkB,CAAC;AAAA,QACrC,gBAAgB;AAAA;AAAA,MAClB,CAAC;AAAA,IACH;AAGA,UAAM,WAAW,KAAK,IAAI,GAAG,UAAU;AAGvC,QAAI,QAAQ;AAGZ,QAAI,SAAS,aAAa;AACxB,cAAQ,KAAK,IAAI,QAAQ,KAAK,CAAG;AAAA,IACnC;AAGA,QAAI,SAAS,kBAAkB,SAAS,GAAG;AACzC,cAAQ,KAAK,IAAI,QAAQ,OAAO,SAAS,kBAAkB,QAAQ,CAAG;AAAA,IACxE;AAGA,QAAI,SAAS,kBAAkB,SAAS,KAAK,CAAC,SAAS,aAAa;AAClE,cAAQ,KAAK,IAAI,QAAQ,KAAK,CAAC;AAAA,IACjC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAyB;AACjD,UAAM,iBAAiB,CAAC,SAAS,QAAQ,oBAAoB;AAC7D,WAAO,eAAe,SAAS,KAAK,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,OACA,MACA,UACQ;AACR,UAAM,YAAY,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,QAAG;AAEnD,YAAQ,MAAM;AAAA,MACZ,KAAK,UAAU;AACb,eAAO,+BAA+B,SAAS;AAAA,MAEjD,KAAK,UAAU;AACb,cAAM,QAAQ,SAAS,kBAAkB,CAAC,KAAK;AAC/C,eAAO,mBAAmB,KAAK,QAAQ,SAAS;AAAA,MAElD,KAAK,UAAU;AACb,cAAM,QAAQ,SAAS,cAAc;AACrC,eAAO,2BAA2B,KAAK,cAAc,SAAS;AAAA,MAEhE,KAAK,UAAU;AACb,eAAO,qBAAqB,SAAS;AAAA,MAEvC,KAAK,UAAU;AACb,eAAO,mBAAmB,SAAS;AAAA,MAErC,KAAK,UAAU;AACb,eAAO,yBAAyB,SAAS;AAAA,MAE3C,KAAK,UAAU;AACb,eAAO,sBAAsB,SAAS;AAAA,MAExC,KAAK,UAAU;AACb,eAAO,qBAAqB,SAAS;AAAA,MAEvC;AACE,eAAO,kBAAkB,SAAS;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cACN,OACA,WAAgC,oBAAoB,eACnC;AACjB,YAAQ,UAAU;AAAA,MAChB,KAAK,oBAAoB;AACvB,eAAO,KAAK,oBAAoB,KAAK;AAAA,MAEvC,KAAK,oBAAoB;AACvB,eAAO,KAAK,qBAAqB,KAAK;AAAA,MAExC,KAAK,oBAAoB;AACvB,eAAO,KAAK,kBAAkB,KAAK;AAAA,MAErC,KAAK,oBAAoB;AACvB,eAAO,KAAK,gBAAgB,KAAK;AAAA,MAEnC;AACE,eAAO,KAAK,qBAAqB,KAAK;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAA+B;AACzD,WAAO;AAAA,MACL,SAAS;AAAA;AAAA,MACT,SAAS,MAAM,QAAQ,UAAU,GAAG,GAAG;AAAA;AAAA,MACvC,OAAO,MAAM;AAAA,MACb,WAAW,MAAM,MAAM;AAAA,MACvB,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,MAClD,WAAW,MAAM,SAAS;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAA+B;AAC1D,UAAM,UAAU,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,QAAG;AACvD,UAAM,WAAW,MAAM,SAAS,UAAU,MAAM,SAAS;AAEzD,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,WAAW,MAAM,MAAM;AAAA,MACvB;AAAA,MACA,WAAW,MAAM,SAAS;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,OAAc,YAAoB,KAAsB;AAEhF,UAAM,mBAAmB,MAAM,MAAM,OAAO,CAAC,SAAc;AACzD,YAAM,QAAQ,KAAK,cAAc,eAAe,KAAK,MAAM;AAAA,QACzD,eAAe,KAAK,eAAe,UAAU;AAAA,QAC7C,aAAa,KAAK,kBAAkB,IAAI;AAAA,QACxC,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAO,SAAS;AAAA,IAClB,CAAC;AAED,UAAM,UAAU,iBAAiB,SAAS,IACtC,iBAAiB,IAAI,CAAC,MAAW,EAAE,IAAI,EAAE,KAAK,QAAG,IACjD,MAAM,MAAM,IAAI,CAAC,MAAW,EAAE,IAAI,EAAE,KAAK,QAAG;AAEhD,WAAO;AAAA,MACL;AAAA,MACA,SAAS,GAAG,MAAM,OAAO,KAAK,iBAAiB,MAAM,IAAI,MAAM,MAAM,MAAM;AAAA,MAC3E,OAAO,MAAM;AAAA,MACb,WAAW,iBAAiB;AAAA,MAC5B,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS;AAAA,MAClD,WAAW,MAAM,SAAS;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAA+B;AAErD,UAAM,aAAa,KAAK,yBAAyB,MAAM,IAAI;AAC3D,UAAM,UAAU,GAAG,UAAU,IAAI,MAAM,MAAM,MAAM;AAEnD,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MAAM;AAAA;AAAA,MACf,OAAO,KAAK,MAAM,MAAM,QAAQ,EAAE,IAAI;AAAA;AAAA,MACtC,WAAW,MAAM,MAAM;AAAA,MACvB,UAAU,KAAK,OAAO,MAAM,SAAS,UAAU,MAAM,SAAS,aAAa,GAAI,IAAI;AAAA;AAAA,MACnF,WAAW,MAAM,SAAS;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,MAAyB;AACxD,UAAM,gBAA2C;AAAA,MAC/C,CAAC,UAAU,aAAa,GAAG;AAAA,MAC3B,CAAC,UAAU,cAAc,GAAG;AAAA,MAC5B,CAAC,UAAU,sBAAsB,GAAG;AAAA,MACpC,CAAC,UAAU,WAAW,GAAG;AAAA,MACzB,CAAC,UAAU,OAAO,GAAG;AAAA,MACrB,CAAC,UAAU,WAAW,GAAG;AAAA,MACzB,CAAC,UAAU,SAAS,GAAG;AAAA,MACvB,CAAC,UAAU,aAAa,GAAG;AAAA,MAC3B,CAAC,UAAU,YAAY,GAAG;AAAA,MAC1B,CAAC,UAAU,OAAO,GAAG;AAAA,IACvB;AACA,WAAO,cAAc,IAAI,KAAK;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,0BAA0B,OAAmC;AACnE,UAAM,YAAY,KAAK,IAAI,IAAI,MAAM,SAAS,cAAc,MAAO,KAAK;AACxE,UAAM,QAAQ,MAAM;AAGpB,QAAI,WAAW,MAAM,QAAQ,KAAK;AAChC,aAAO,oBAAoB;AAAA,IAC7B;AAGA,QAAI,WAAW,IAAI;AACjB,aAAO,oBAAoB;AAAA,IAC7B;AAGA,QAAI,WAAW,OAAO,QAAQ,KAAK;AACjC,aAAO,oBAAoB;AAAA,IAC7B;AAGA,QAAI,WAAW,KAAK;AAClB,aAAO,oBAAoB;AAAA,IAC7B;AAGA,WAAO,oBAAoB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,UAA0B;AAC7C,UAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,UAAM,IAAI;AACV,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAA0B;AACxC,WAAO,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,YAAoB,KAAc;AACxD,WAAO,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,WAAmB,IAAY;AAC/C,QAAI,aAAa;AACjB,UAAM,MAAM,KAAK,IAAI;AAErB,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,OAAO,MAAM,MAAM,SAAS,cAAc,MAAO,KAAK;AAC5D,UAAI,MAAM,YAAY,CAAC,MAAM,YAAY;AAEvC,cAAM,WAAW,KAAK,0BAA0B,KAAK;AACrD,cAAM,aAAa,KAAK,cAAc,OAAO,QAAQ;AAGrD,YAAI,aAAa,oBAAoB,oBACjC,aAAa,oBAAoB,cAAc;AACjD,gBAAM,QAAQ,CAAC;AAAA,QACjB,WAAW,aAAa,oBAAoB,WAAW;AAErD,gBAAM,QAAQ,MAAM,MAAM,OAAO,CAAC,SAAc;AAC9C,kBAAM,QAAQ,KAAK,cAAc,eAAe,KAAK,MAAM;AAAA,cACzD,eAAe,KAAK,eAAe,UAAU;AAAA,cAC7C,aAAa,KAAK,kBAAkB,IAAI;AAAA,cACxC,gBAAgB;AAAA,YAClB,CAAC;AACD,mBAAO,SAAS;AAAA,UAClB,CAAC;AAAA,QACH;AAEA;AAGA,YAAI,KAAK,YAAY;AACnB,cAAI;AACF,iBAAK,WAAW,kBAAkB,MAAM,IAAI,MAAM,YAAY,QAAQ;AAAA,UACxE,SAAS,OAAgB;AACvB,oBAAQ,MAAM,gDAAgD,KAAK;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACrB,WAAO,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,UAAM,QAAQ;AAAA,MACZ,aAAa,KAAK,OAAO;AAAA,MACzB,cAAc,CAAC;AAAA,MACf,cAAc;AAAA,MACd,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IACvB;AAEA,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AAErC,QAAI,aAAa;AACjB,QAAI,cAAc;AAElB,eAAW,SAAS,KAAK,QAAQ;AAE/B,YAAM,aAAa,MAAM,IAAI,KAC1B,MAAM,aAAa,MAAM,IAAI,KAAK,KAAK;AAG1C,oBAAc,MAAM;AAGpB,qBAAe,MAAM,MAAM;AAG3B,UAAI,MAAM,YAAY;AACpB,cAAM;AAAA,MACR;AAGA,UAAI,MAAM,SAAS,KAAK;AACtB,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,eAAe,aAAa,KAAK,OAAO;AAC9C,UAAM,gBAAgB,cAAc,KAAK,OAAO;AAEhD,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }