@stackmemoryai/stackmemory 0.3.10 → 0.3.11

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 (60) hide show
  1. package/README.md +1 -0
  2. package/dist/agents/core/agent-task-manager.js.map +2 -2
  3. package/dist/cli/browser-test.js +4 -4
  4. package/dist/cli/browser-test.js.map +2 -2
  5. package/dist/cli/codex-sm.js +3 -3
  6. package/dist/cli/codex-sm.js.map +2 -2
  7. package/dist/cli/commands/agent.js +3 -3
  8. package/dist/cli/commands/agent.js.map +2 -2
  9. package/dist/cli/commands/handoff.js +2 -2
  10. package/dist/cli/commands/handoff.js.map +2 -2
  11. package/dist/cli/commands/linear-unified.js +3 -3
  12. package/dist/cli/commands/linear-unified.js.map +2 -2
  13. package/dist/cli/commands/linear.js +2 -2
  14. package/dist/cli/commands/linear.js.map +2 -2
  15. package/dist/cli/commands/skills.js +2 -2
  16. package/dist/cli/commands/skills.js.map +2 -2
  17. package/dist/cli/commands/tasks.js +3 -3
  18. package/dist/cli/commands/tasks.js.map +2 -2
  19. package/dist/cli/index.js +3 -3
  20. package/dist/cli/index.js.map +2 -2
  21. package/dist/cli/utils/viewer.js +9 -9
  22. package/dist/cli/utils/viewer.js.map +2 -2
  23. package/dist/core/context/frame-handoff-manager.js +4 -4
  24. package/dist/core/context/frame-handoff-manager.js.map +1 -1
  25. package/dist/core/projects/project-isolation.js +197 -0
  26. package/dist/core/projects/project-isolation.js.map +7 -0
  27. package/dist/core/trace/debug-trace.js +1 -1
  28. package/dist/core/trace/debug-trace.js.map +2 -2
  29. package/dist/core/trace/index.js +4 -4
  30. package/dist/core/trace/index.js.map +2 -2
  31. package/dist/core/trace/trace-demo.js +8 -8
  32. package/dist/core/trace/trace-demo.js.map +2 -2
  33. package/dist/core/trace/trace-detector.demo.js +5 -5
  34. package/dist/core/trace/trace-detector.demo.js.map +2 -2
  35. package/dist/features/analytics/core/analytics-service.js +2 -2
  36. package/dist/features/analytics/core/analytics-service.js.map +2 -2
  37. package/dist/features/tasks/linear-task-manager.js +483 -0
  38. package/dist/features/tasks/linear-task-manager.js.map +7 -0
  39. package/dist/integrations/linear/auto-sync.js +2 -2
  40. package/dist/integrations/linear/auto-sync.js.map +2 -2
  41. package/dist/integrations/linear/config.js +12 -1
  42. package/dist/integrations/linear/config.js.map +2 -2
  43. package/dist/integrations/linear/sync-manager.js.map +1 -1
  44. package/dist/integrations/linear/sync.js.map +1 -1
  45. package/dist/integrations/linear/unified-sync.js.map +1 -1
  46. package/dist/integrations/linear/webhook-handler.js.map +2 -2
  47. package/dist/integrations/linear/webhook.js.map +2 -2
  48. package/dist/integrations/mcp/handlers/linear-handlers.js.map +1 -1
  49. package/dist/integrations/mcp/handlers/task-handlers.js.map +1 -1
  50. package/dist/integrations/mcp/refactored-server.js +2 -2
  51. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  52. package/dist/integrations/mcp/server.js +3 -3
  53. package/dist/integrations/mcp/server.js.map +2 -2
  54. package/dist/mcp/stackmemory-mcp-server.js +3 -3
  55. package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
  56. package/dist/skills/claude-skills.js +2 -2
  57. package/dist/skills/claude-skills.js.map +2 -2
  58. package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
  59. package/dist/skills/unified-rlm-orchestrator.js.map +1 -1
  60. package/package.json +2 -4
@@ -72,7 +72,7 @@ function initializeTracing() {
72
72
  // Slow API threshold
73
73
  };
74
74
  if (config.DEBUG_TRACE || config.STACKMEMORY_DEBUG) {
75
- console.log("\u{1F50D} Trace Configuration:", {
75
+ console.log("Trace Configuration:", {
76
76
  enabled: true,
77
77
  output: config.TRACE_OUTPUT,
78
78
  verbosity: config.TRACE_VERBOSITY,
@@ -123,11 +123,11 @@ function withTracing(fn, options) {
123
123
  }
124
124
  const enableTracing = () => {
125
125
  process.env["DEBUG_TRACE"] = "true";
126
- console.log("\u2705 Tracing enabled");
126
+ console.log("Tracing enabled");
127
127
  };
128
128
  const disableTracing = () => {
129
129
  delete process.env["DEBUG_TRACE"];
130
- console.log("\u274C Tracing disabled");
130
+ console.log("Tracing disabled");
131
131
  };
132
132
  const enableVerboseTracing = () => {
133
133
  process.env["DEBUG_TRACE"] = "true";
@@ -135,7 +135,7 @@ const enableVerboseTracing = () => {
135
135
  process.env["TRACE_PARAMS"] = "true";
136
136
  process.env["TRACE_RESULTS"] = "true";
137
137
  process.env["TRACE_MEMORY"] = "true";
138
- console.log("\u2705 Verbose tracing enabled");
138
+ console.log("Verbose tracing enabled");
139
139
  };
140
140
  const enableMinimalTracing = () => {
141
141
  process.env["DEBUG_TRACE"] = "true";
@@ -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// 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\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(\n process.env['TRACE_PERF_THRESHOLD'] || '100'\n ), // 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>(fn: () => T, options?: Partial<TraceConfig>): 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(\n options.performanceThreshold\n );\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};\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\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(\n process.env['TRACE_PERF_THRESHOLD'] || '100'\n ), // 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('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>(fn: () => T, options?: Partial<TraceConfig>): 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(\n options.performanceThreshold\n );\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('Tracing enabled');\n};\n\nexport const disableTracing = () => {\n delete process.env['DEBUG_TRACE'];\n console.log('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('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};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -85,7 +85,7 @@ async function runDemo() {
85
85
  console.log("STACKMEMORY DEBUG TRACE DEMO");
86
86
  console.log("=".repeat(80) + "\n");
87
87
  if (process.env["DEBUG_TRACE"] !== "true") {
88
- console.log("\u{1F4DD} Enabling verbose tracing for this demo...\n");
88
+ console.log("Enabling verbose tracing for this demo...\n");
89
89
  enableVerboseTracing();
90
90
  }
91
91
  try {
@@ -95,12 +95,12 @@ async function runDemo() {
95
95
  const data = await service.fetchData("test-1");
96
96
  const processed = await service.processData(data);
97
97
  service.cacheData("test-1", processed);
98
- console.log("\u2705 Service operation completed\n");
98
+ console.log("Service operation completed\n");
99
99
  });
100
100
  await trace.command("demo:database", { example: "database" }, async () => {
101
101
  console.log("\n--- Example 2: Database Operations ---\n");
102
102
  const results = await databaseExample();
103
- console.log("\u2705 Database operations completed");
103
+ console.log("Database operations completed");
104
104
  console.log(" Found user:", results.user);
105
105
  console.log(" Query results:", results.results);
106
106
  });
@@ -110,7 +110,7 @@ async function runDemo() {
110
110
  try {
111
111
  await service.fetchData("error");
112
112
  } catch (error) {
113
- console.log("\u2705 Error properly traced and handled\n");
113
+ console.log("Error properly traced and handled\n");
114
114
  }
115
115
  });
116
116
  await trace.command(
@@ -126,18 +126,18 @@ async function runDemo() {
126
126
  await new Promise((resolve) => setTimeout(resolve, 10));
127
127
  });
128
128
  }
129
- console.log("\u2705 Performance tracking completed\n");
129
+ console.log("Performance tracking completed\n");
130
130
  }
131
131
  );
132
132
  } catch (error) {
133
- console.error("\u274C Demo failed:", error);
133
+ console.error("Demo failed:", error);
134
134
  }
135
135
  console.log("\n" + trace.getExecutionSummary());
136
136
  const traces = trace.exportTraces();
137
137
  console.log(`
138
- \u{1F4CA} Total traces collected: ${traces.length}`);
138
+ Total traces collected: ${traces.length}`);
139
139
  if (traces.length > 0) {
140
- console.log("\n\u{1F4CD} Example trace entry:");
140
+ console.log("\nExample trace entry:");
141
141
  console.log(JSON.stringify(traces[0], null, 2));
142
142
  }
143
143
  }
@@ -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// 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// 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(\n 'demo:performance',\n { example: 'performance' },\n 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 };\n"],
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// 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('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('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('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('Error properly traced and handled\\n');\n }\n });\n\n // Example 4: Performance tracking\n await trace.command(\n 'demo:performance',\n { example: 'performance' },\n 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('Performance tracking completed\\n');\n }\n );\n } catch (error: unknown) {\n console.error('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(`\\nTotal traces collected: ${traces.length}`);\n\n // Show example trace entry\n if (traces.length > 0) {\n console.log('\\nExample 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 };\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import { TraceDetector } from "./trace-detector.js";
2
2
  import { v4 as uuidv4 } from "uuid";
3
3
  const detector = new TraceDetector();
4
- console.log("\u{1F50D} Trace Detection Demo\n");
4
+ console.log("Trace Detection Demo\n");
5
5
  console.log("=".repeat(50));
6
6
  console.log("\n\u{1F4CB} Simulating Search-Driven Modification:");
7
7
  const baseTime = Date.now();
@@ -35,7 +35,7 @@ searchDrivenTools.forEach((tool) => {
35
35
  detector.addToolCall(tool);
36
36
  console.log(` Added: ${tool.tool}`);
37
37
  });
38
- console.log("\n\u{1F527} Simulating Error Recovery:");
38
+ console.log("\nSimulating Error Recovery:");
39
39
  const errorTime = baseTime + 4e4;
40
40
  const errorRecoveryTools = [
41
41
  {
@@ -90,7 +90,7 @@ featureTools.forEach((tool) => {
90
90
  console.log(` Added: ${tool.tool}`);
91
91
  });
92
92
  detector.flush();
93
- console.log("\n\u{1F4CA} Trace Statistics:");
93
+ console.log("\nTrace Statistics:");
94
94
  console.log("=".repeat(50));
95
95
  const stats = detector.getStatistics();
96
96
  console.log(`Total Traces: ${stats.totalTraces}`);
@@ -101,7 +101,7 @@ console.log("\nTrace Types:");
101
101
  Object.entries(stats.tracesByType).forEach(([type, count]) => {
102
102
  console.log(` ${type}: ${count}`);
103
103
  });
104
- console.log("\n\u{1F4DD} Detected Traces:");
104
+ console.log("\nDetected Traces:");
105
105
  console.log("=".repeat(50));
106
106
  const traces = detector.getTraces();
107
107
  traces.forEach((trace, index) => {
@@ -134,5 +134,5 @@ highImportance.forEach((trace) => {
134
134
  console.log("\n\u{1F4BE} Exporting traces to JSON...");
135
135
  const exported = detector.exportTraces();
136
136
  console.log(`Exported ${exported.length} characters of JSON data`);
137
- console.log("\n\u2705 Demo complete!");
137
+ console.log("\nDemo complete!");
138
138
  //# sourceMappingURL=trace-detector.demo.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/trace/trace-detector.demo.ts"],
4
- "sourcesContent": ["/**\n * Demo script to showcase Trace Detection functionality\n */\n\nimport { TraceDetector } from './trace-detector.js';\nimport { ToolCall } from './types.js';\nimport { v4 as uuidv4 } from 'uuid';\n\n// Create a new trace detector\nconst detector = new TraceDetector();\n\nconsole.log('\uD83D\uDD0D Trace Detection Demo\\n');\nconsole.log('='.repeat(50));\n\n// Simulate a search-driven modification trace\nconsole.log('\\n\uD83D\uDCCB Simulating Search-Driven Modification:');\nconst baseTime = Date.now();\n\nconst searchDrivenTools: ToolCall[] = [\n {\n id: uuidv4(),\n tool: 'search',\n timestamp: baseTime,\n arguments: { query: 'authentication bug' },\n },\n {\n id: uuidv4(),\n tool: 'grep',\n timestamp: baseTime + 1000,\n arguments: { pattern: 'auth.*error' },\n },\n {\n id: uuidv4(),\n tool: 'read',\n timestamp: baseTime + 2000,\n filesAffected: ['/src/auth/login.ts'],\n },\n {\n id: uuidv4(),\n tool: 'edit',\n timestamp: baseTime + 3000,\n filesAffected: ['/src/auth/login.ts'],\n },\n];\n\nsearchDrivenTools.forEach((tool) => {\n detector.addToolCall(tool);\n console.log(` Added: ${tool.tool}`);\n});\n\n// Simulate an error recovery trace (separate due to time gap)\nconsole.log('\\n\uD83D\uDD27 Simulating Error Recovery:');\nconst errorTime = baseTime + 40000; // 40 seconds later\n\nconst errorRecoveryTools: ToolCall[] = [\n {\n id: uuidv4(),\n tool: 'bash',\n timestamp: errorTime,\n arguments: { command: 'npm test' },\n error: 'Test failed: TypeError',\n },\n {\n id: uuidv4(),\n tool: 'edit',\n timestamp: errorTime + 1000,\n filesAffected: ['/src/utils/validator.ts'],\n },\n {\n id: uuidv4(),\n tool: 'bash',\n timestamp: errorTime + 2000,\n arguments: { command: 'npm test' },\n result: 'All tests passing',\n },\n];\n\nerrorRecoveryTools.forEach((tool) => {\n detector.addToolCall(tool);\n console.log(` Added: ${tool.tool}${tool.error ? ' (with error)' : ''}`);\n});\n\n// Simulate a feature implementation trace\nconsole.log('\\n\u2728 Simulating Feature Implementation:');\nconst featureTime = baseTime + 80000; // 80 seconds later\n\nconst featureTools: ToolCall[] = [\n {\n id: uuidv4(),\n tool: 'write',\n timestamp: featureTime,\n filesAffected: ['/src/components/Dashboard.tsx'],\n },\n {\n id: uuidv4(),\n tool: 'edit',\n timestamp: featureTime + 1000,\n filesAffected: ['/src/components/Dashboard.tsx'],\n },\n {\n id: uuidv4(),\n tool: 'test',\n timestamp: featureTime + 2000,\n arguments: { file: 'Dashboard.test.tsx' },\n },\n];\n\nfeatureTools.forEach((tool) => {\n detector.addToolCall(tool);\n console.log(` Added: ${tool.tool}`);\n});\n\n// Flush any pending traces\ndetector.flush();\n\n// Get statistics\nconsole.log('\\n\uD83D\uDCCA Trace Statistics:');\nconsole.log('='.repeat(50));\nconst stats = detector.getStatistics();\nconsole.log(`Total Traces: ${stats.totalTraces}`);\nconsole.log(`Average Score: ${stats.averageScore.toFixed(2)}`);\nconsole.log(`Average Length: ${stats.averageLength.toFixed(1)} tools`);\nconsole.log(`High Importance (>0.7): ${stats.highImportanceCount}`);\n\nconsole.log('\\nTrace Types:');\nObject.entries(stats.tracesByType).forEach(([type, count]) => {\n console.log(` ${type}: ${count}`);\n});\n\n// Display all traces\nconsole.log('\\n\uD83D\uDCDD Detected Traces:');\nconsole.log('='.repeat(50));\nconst traces = detector.getTraces();\ntraces.forEach((trace, index) => {\n console.log(`\\nTrace ${index + 1}:`);\n console.log(` Type: ${trace.type}`);\n console.log(` Score: ${trace.score.toFixed(2)}`);\n console.log(` Tools: ${trace.tools.map((t) => t.tool).join(' \u2192 ')}`);\n console.log(` Summary: ${trace.summary}`);\n console.log(\n ` Duration: ${((trace.metadata.endTime - trace.metadata.startTime) / 1000).toFixed(1)}s`\n );\n\n if (trace.metadata.filesModified.length > 0) {\n console.log(` Files Modified: ${trace.metadata.filesModified.join(', ')}`);\n }\n\n if (trace.metadata.errorsEncountered.length > 0) {\n console.log(` Errors: ${trace.metadata.errorsEncountered.join(', ')}`);\n }\n\n if (trace.metadata.causalChain) {\n console.log(` \u2713 Causal Chain Detected (error\u2192fix\u2192verify)`);\n }\n});\n\n// Test high-importance trace filtering\nconsole.log('\\n\u2B50 High Importance Traces (score > 0.3):');\nconst highImportance = detector.getHighImportanceTraces(0.3);\nhighImportance.forEach((trace) => {\n console.log(\n ` [${trace.type}] Score: ${trace.score.toFixed(2)} - ${trace.summary}`\n );\n});\n\n// Export traces as JSON\nconsole.log('\\n\uD83D\uDCBE Exporting traces to JSON...');\nconst exported = detector.exportTraces();\nconsole.log(`Exported ${exported.length} characters of JSON data`);\n\nconsole.log('\\n\u2705 Demo complete!');\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Demo script to showcase Trace Detection functionality\n */\n\nimport { TraceDetector } from './trace-detector.js';\nimport { ToolCall } from './types.js';\nimport { v4 as uuidv4 } from 'uuid';\n\n// Create a new trace detector\nconst detector = new TraceDetector();\n\nconsole.log('Trace Detection Demo\\n');\nconsole.log('='.repeat(50));\n\n// Simulate a search-driven modification trace\nconsole.log('\\n\uD83D\uDCCB Simulating Search-Driven Modification:');\nconst baseTime = Date.now();\n\nconst searchDrivenTools: ToolCall[] = [\n {\n id: uuidv4(),\n tool: 'search',\n timestamp: baseTime,\n arguments: { query: 'authentication bug' },\n },\n {\n id: uuidv4(),\n tool: 'grep',\n timestamp: baseTime + 1000,\n arguments: { pattern: 'auth.*error' },\n },\n {\n id: uuidv4(),\n tool: 'read',\n timestamp: baseTime + 2000,\n filesAffected: ['/src/auth/login.ts'],\n },\n {\n id: uuidv4(),\n tool: 'edit',\n timestamp: baseTime + 3000,\n filesAffected: ['/src/auth/login.ts'],\n },\n];\n\nsearchDrivenTools.forEach((tool) => {\n detector.addToolCall(tool);\n console.log(` Added: ${tool.tool}`);\n});\n\n// Simulate an error recovery trace (separate due to time gap)\nconsole.log('\\nSimulating Error Recovery:');\nconst errorTime = baseTime + 40000; // 40 seconds later\n\nconst errorRecoveryTools: ToolCall[] = [\n {\n id: uuidv4(),\n tool: 'bash',\n timestamp: errorTime,\n arguments: { command: 'npm test' },\n error: 'Test failed: TypeError',\n },\n {\n id: uuidv4(),\n tool: 'edit',\n timestamp: errorTime + 1000,\n filesAffected: ['/src/utils/validator.ts'],\n },\n {\n id: uuidv4(),\n tool: 'bash',\n timestamp: errorTime + 2000,\n arguments: { command: 'npm test' },\n result: 'All tests passing',\n },\n];\n\nerrorRecoveryTools.forEach((tool) => {\n detector.addToolCall(tool);\n console.log(` Added: ${tool.tool}${tool.error ? ' (with error)' : ''}`);\n});\n\n// Simulate a feature implementation trace\nconsole.log('\\n\u2728 Simulating Feature Implementation:');\nconst featureTime = baseTime + 80000; // 80 seconds later\n\nconst featureTools: ToolCall[] = [\n {\n id: uuidv4(),\n tool: 'write',\n timestamp: featureTime,\n filesAffected: ['/src/components/Dashboard.tsx'],\n },\n {\n id: uuidv4(),\n tool: 'edit',\n timestamp: featureTime + 1000,\n filesAffected: ['/src/components/Dashboard.tsx'],\n },\n {\n id: uuidv4(),\n tool: 'test',\n timestamp: featureTime + 2000,\n arguments: { file: 'Dashboard.test.tsx' },\n },\n];\n\nfeatureTools.forEach((tool) => {\n detector.addToolCall(tool);\n console.log(` Added: ${tool.tool}`);\n});\n\n// Flush any pending traces\ndetector.flush();\n\n// Get statistics\nconsole.log('\\nTrace Statistics:');\nconsole.log('='.repeat(50));\nconst stats = detector.getStatistics();\nconsole.log(`Total Traces: ${stats.totalTraces}`);\nconsole.log(`Average Score: ${stats.averageScore.toFixed(2)}`);\nconsole.log(`Average Length: ${stats.averageLength.toFixed(1)} tools`);\nconsole.log(`High Importance (>0.7): ${stats.highImportanceCount}`);\n\nconsole.log('\\nTrace Types:');\nObject.entries(stats.tracesByType).forEach(([type, count]) => {\n console.log(` ${type}: ${count}`);\n});\n\n// Display all traces\nconsole.log('\\nDetected Traces:');\nconsole.log('='.repeat(50));\nconst traces = detector.getTraces();\ntraces.forEach((trace, index) => {\n console.log(`\\nTrace ${index + 1}:`);\n console.log(` Type: ${trace.type}`);\n console.log(` Score: ${trace.score.toFixed(2)}`);\n console.log(` Tools: ${trace.tools.map((t) => t.tool).join(' \u2192 ')}`);\n console.log(` Summary: ${trace.summary}`);\n console.log(\n ` Duration: ${((trace.metadata.endTime - trace.metadata.startTime) / 1000).toFixed(1)}s`\n );\n\n if (trace.metadata.filesModified.length > 0) {\n console.log(` Files Modified: ${trace.metadata.filesModified.join(', ')}`);\n }\n\n if (trace.metadata.errorsEncountered.length > 0) {\n console.log(` Errors: ${trace.metadata.errorsEncountered.join(', ')}`);\n }\n\n if (trace.metadata.causalChain) {\n console.log(` \u2713 Causal Chain Detected (error\u2192fix\u2192verify)`);\n }\n});\n\n// Test high-importance trace filtering\nconsole.log('\\n\u2B50 High Importance Traces (score > 0.3):');\nconst highImportance = detector.getHighImportanceTraces(0.3);\nhighImportance.forEach((trace) => {\n console.log(\n ` [${trace.type}] Score: ${trace.score.toFixed(2)} - ${trace.summary}`\n );\n});\n\n// Export traces as JSON\nconsole.log('\\n\uD83D\uDCBE Exporting traces to JSON...');\nconst exported = detector.exportTraces();\nconsole.log(`Exported ${exported.length} characters of JSON data`);\n\nconsole.log('\\nDemo complete!');\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import { MetricsQueries } from "../queries/metrics-queries.js";
2
2
  import { LinearClient } from "../../../integrations/linear/client.js";
3
- import { PebblesTaskStore } from "../../tasks/pebbles-task-store.js";
3
+ import { LinearTaskManager } from "../../tasks/linear-task-manager.js";
4
4
  import Database from "better-sqlite3";
5
5
  import path from "path";
6
6
  import fs from "fs";
@@ -42,7 +42,7 @@ class AnalyticsService {
42
42
  );
43
43
  if (fs.existsSync(contextDbPath)) {
44
44
  const db = new Database(contextDbPath);
45
- this.taskStore = new PebblesTaskStore(this.projectPath, db);
45
+ this.taskStore = new LinearTaskManager(this.projectPath, db);
46
46
  }
47
47
  } catch (error) {
48
48
  console.error("Failed to initialize task store:", error);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/features/analytics/core/analytics-service.ts"],
4
- "sourcesContent": ["import { MetricsQueries } from '../queries/metrics-queries.js';\nimport { LinearClient } from '../../../integrations/linear/client.js';\nimport { PebblesTaskStore } from '../../tasks/pebbles-task-store.js';\nimport Database from 'better-sqlite3';\nimport {\n TaskMetrics,\n TeamMetrics,\n TaskAnalytics,\n DashboardState,\n TimeRange,\n AnalyticsQuery,\n} from '../types/metrics.js';\nimport path from 'path';\nimport fs from 'fs';\nimport os from 'os';\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\nexport class AnalyticsService {\n private metricsQueries: MetricsQueries;\n private linearClient?: LinearClient;\n private taskStore?: PebblesTaskStore;\n private dbPath: string;\n private projectPath: string;\n private updateCallbacks: Set<(state: DashboardState) => void> = new Set();\n\n constructor(projectPath?: string) {\n this.projectPath = projectPath || process.cwd();\n this.dbPath = path.join(this.projectPath, '.stackmemory', 'analytics.db');\n\n this.ensureDirectoryExists();\n this.metricsQueries = new MetricsQueries(this.dbPath);\n\n // Initialize task store for syncing\n this.initializeTaskStore();\n\n if (process.env['LINEAR_API_KEY']) {\n this.initializeLinearIntegration();\n }\n }\n\n private initializeTaskStore(): void {\n try {\n const contextDbPath = path.join(\n this.projectPath,\n '.stackmemory',\n 'context.db'\n );\n if (fs.existsSync(contextDbPath)) {\n const db = new Database(contextDbPath);\n this.taskStore = new PebblesTaskStore(this.projectPath, db);\n }\n } catch (error: unknown) {\n console.error('Failed to initialize task store:', error);\n }\n }\n\n private ensureDirectoryExists(): void {\n const dir = path.dirname(this.dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n private async initializeLinearIntegration(): Promise<void> {\n try {\n const configPath = path.join(\n os.homedir(),\n '.stackmemory',\n 'linear-config.json'\n );\n if (fs.existsSync(configPath)) {\n const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n this.linearClient = new LinearClient(config);\n await this.syncLinearTasks();\n }\n } catch (error: unknown) {\n console.error('Failed to initialize Linear integration:', error);\n }\n }\n\n async syncLinearTasks(): Promise<void> {\n // First sync from task store (which includes Linear-synced tasks)\n await this.syncFromTaskStore();\n\n // Then try direct Linear sync if client available\n if (this.linearClient) {\n try {\n const issues = await this.linearClient.getIssues({ limit: 100 });\n for (const issue of issues) {\n const task: TaskAnalytics = {\n id: issue.id,\n title: issue.title,\n state: this.mapLinearState(issue.state.type),\n createdAt: new Date(issue.createdAt),\n completedAt:\n issue.state.type === 'completed'\n ? new Date(issue.updatedAt)\n : undefined,\n estimatedEffort: issue.estimate ? issue.estimate * 60 : undefined,\n assigneeId: issue.assignee?.id,\n priority: this.mapLinearPriority(issue.priority),\n labels: Array.isArray(issue.labels)\n ? issue.labels.map((l: any) => l.name)\n : (issue.labels as any)?.nodes?.map((l: any) => l.name) || [],\n blockingIssues: [],\n };\n this.metricsQueries.upsertTask(task);\n }\n } catch (error: unknown) {\n console.error('Failed to sync from Linear API:', error);\n }\n }\n\n await this.notifyUpdate();\n }\n\n async syncFromTaskStore(): Promise<number> {\n if (!this.taskStore) return 0;\n\n try {\n // Get all tasks including completed ones\n const allTasks = this.getAllTasksFromStore();\n let synced = 0;\n\n for (const task of allTasks) {\n const analyticsTask: TaskAnalytics = {\n id: task.id,\n title: task.title,\n state: this.mapTaskStatus(task.status),\n createdAt: new Date(task.created_at * 1000),\n completedAt: task.completed_at\n ? new Date(task.completed_at * 1000)\n : undefined,\n estimatedEffort: task.estimated_effort,\n actualEffort: task.actual_effort,\n assigneeId: task.assignee,\n priority: task.priority as TaskAnalytics['priority'],\n labels: task.tags || [],\n blockingIssues: task.depends_on || [],\n };\n this.metricsQueries.upsertTask(analyticsTask);\n synced++;\n }\n\n return synced;\n } catch (error: unknown) {\n console.error('Failed to sync from task store:', error);\n return 0;\n }\n }\n\n private getAllTasksFromStore(): any[] {\n if (!this.taskStore) return [];\n\n try {\n // Access the db directly to get ALL tasks including completed\n const contextDbPath = path.join(\n this.projectPath,\n '.stackmemory',\n 'context.db'\n );\n const db = new Database(contextDbPath);\n\n const rows = db\n .prepare(\n `\n SELECT * FROM task_cache \n ORDER BY created_at DESC\n `\n )\n .all() as any[];\n\n db.close();\n\n // Hydrate the rows\n return rows.map((row) => ({\n id: row.id,\n title: row.title,\n description: row.description,\n status: row.status,\n priority: row.priority,\n created_at: row.created_at,\n completed_at: row.completed_at,\n estimated_effort: row.estimated_effort,\n actual_effort: row.actual_effort,\n assignee: row.assignee,\n tags: JSON.parse(row.tags || '[]'),\n depends_on: JSON.parse(row.depends_on || '[]'),\n }));\n } catch (error: unknown) {\n console.error('Failed to get all tasks:', error);\n return [];\n }\n }\n\n private mapTaskStatus(status: string): TaskAnalytics['state'] {\n const statusMap: Record<string, TaskAnalytics['state']> = {\n pending: 'todo',\n in_progress: 'in_progress',\n completed: 'completed',\n blocked: 'blocked',\n cancelled: 'blocked',\n };\n return statusMap[status] || 'todo';\n }\n\n private mapLinearState(linearState: string): TaskAnalytics['state'] {\n const stateMap: Record<string, TaskAnalytics['state']> = {\n backlog: 'todo',\n unstarted: 'todo',\n started: 'in_progress',\n completed: 'completed',\n done: 'completed',\n canceled: 'blocked',\n };\n return stateMap[linearState.toLowerCase()] || 'todo';\n }\n\n private mapLinearPriority(priority: number): TaskAnalytics['priority'] {\n if (priority === 1) return 'urgent';\n if (priority === 2) return 'high';\n if (priority === 3) return 'medium';\n return 'low';\n }\n\n async getDashboardState(query: AnalyticsQuery = {}): Promise<DashboardState> {\n const timeRange = query.timeRange || this.getDefaultTimeRange();\n\n const metrics = this.metricsQueries.getTaskMetrics({\n ...query,\n timeRange,\n });\n\n const recentTasks = this.metricsQueries.getRecentTasks({\n ...query,\n limit: 20,\n });\n\n const teamMetrics = await this.getTeamMetrics(query);\n\n return {\n metrics,\n teamMetrics,\n recentTasks,\n timeRange,\n teamFilter: query.userIds || [],\n isLive: this.updateCallbacks.size > 0,\n lastUpdated: new Date(),\n };\n }\n\n private async getTeamMetrics(query: AnalyticsQuery): Promise<TeamMetrics[]> {\n const uniqueUserIds = new Set<string>();\n const tasks = this.metricsQueries.getRecentTasks({ limit: 1000 });\n\n tasks.forEach((task) => {\n if (task.assigneeId) {\n uniqueUserIds.add(task.assigneeId);\n }\n });\n\n const teamMetrics: TeamMetrics[] = [];\n const totalCompleted = tasks.filter((t) => t.state === 'completed').length;\n\n for (const userId of uniqueUserIds) {\n const userQuery = { ...query, userIds: [userId] };\n const individualMetrics = this.metricsQueries.getTaskMetrics(userQuery);\n\n teamMetrics.push({\n userId,\n userName: await this.getUserName(userId),\n individualMetrics,\n contributionPercentage:\n totalCompleted > 0\n ? (individualMetrics.completedTasks / totalCompleted) * 100\n : 0,\n lastActive: new Date(),\n });\n }\n\n return teamMetrics.sort(\n (a, b) => b.contributionPercentage - a.contributionPercentage\n );\n }\n\n private async getUserName(userId: string): Promise<string> {\n // Stub for now - would need LinearClient to expose user query method\n return userId;\n }\n\n private getDefaultTimeRange(): TimeRange {\n const end = new Date();\n const start = new Date();\n start.setDate(start.getDate() - 7);\n\n return {\n start,\n end,\n preset: '7d',\n };\n }\n\n subscribeToUpdates(callback: (state: DashboardState) => void): () => void {\n this.updateCallbacks.add(callback);\n\n return () => {\n this.updateCallbacks.delete(callback);\n };\n }\n\n private async notifyUpdate(): Promise<void> {\n const state = await this.getDashboardState();\n this.updateCallbacks.forEach((callback) => callback(state));\n }\n\n async addTask(task: TaskAnalytics): Promise<void> {\n this.metricsQueries.upsertTask(task);\n await this.notifyUpdate();\n }\n\n async updateTask(\n taskId: string,\n updates: Partial<TaskAnalytics>\n ): Promise<void> {\n const tasks = this.metricsQueries.getRecentTasks({ limit: 1 });\n const existingTask = tasks.find((t) => t.id === taskId);\n\n if (existingTask) {\n const updatedTask = { ...existingTask, ...updates };\n this.metricsQueries.upsertTask(updatedTask);\n await this.notifyUpdate();\n }\n }\n\n close(): void {\n this.metricsQueries.close();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { MetricsQueries } from '../queries/metrics-queries.js';\nimport { LinearClient } from '../../../integrations/linear/client.js';\nimport { LinearTaskManager } from '../../tasks/linear-task-manager.js';\nimport Database from 'better-sqlite3';\nimport {\n TaskMetrics,\n TeamMetrics,\n TaskAnalytics,\n DashboardState,\n TimeRange,\n AnalyticsQuery,\n} from '../types/metrics.js';\nimport path from 'path';\nimport fs from 'fs';\nimport os from 'os';\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\nexport class AnalyticsService {\n private metricsQueries: MetricsQueries;\n private linearClient?: LinearClient;\n private taskStore?: LinearTaskManager;\n private dbPath: string;\n private projectPath: string;\n private updateCallbacks: Set<(state: DashboardState) => void> = new Set();\n\n constructor(projectPath?: string) {\n this.projectPath = projectPath || process.cwd();\n this.dbPath = path.join(this.projectPath, '.stackmemory', 'analytics.db');\n\n this.ensureDirectoryExists();\n this.metricsQueries = new MetricsQueries(this.dbPath);\n\n // Initialize task store for syncing\n this.initializeTaskStore();\n\n if (process.env['LINEAR_API_KEY']) {\n this.initializeLinearIntegration();\n }\n }\n\n private initializeTaskStore(): void {\n try {\n const contextDbPath = path.join(\n this.projectPath,\n '.stackmemory',\n 'context.db'\n );\n if (fs.existsSync(contextDbPath)) {\n const db = new Database(contextDbPath);\n this.taskStore = new LinearTaskManager(this.projectPath, db);\n }\n } catch (error: unknown) {\n console.error('Failed to initialize task store:', error);\n }\n }\n\n private ensureDirectoryExists(): void {\n const dir = path.dirname(this.dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n private async initializeLinearIntegration(): Promise<void> {\n try {\n const configPath = path.join(\n os.homedir(),\n '.stackmemory',\n 'linear-config.json'\n );\n if (fs.existsSync(configPath)) {\n const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n this.linearClient = new LinearClient(config);\n await this.syncLinearTasks();\n }\n } catch (error: unknown) {\n console.error('Failed to initialize Linear integration:', error);\n }\n }\n\n async syncLinearTasks(): Promise<void> {\n // First sync from task store (which includes Linear-synced tasks)\n await this.syncFromTaskStore();\n\n // Then try direct Linear sync if client available\n if (this.linearClient) {\n try {\n const issues = await this.linearClient.getIssues({ limit: 100 });\n for (const issue of issues) {\n const task: TaskAnalytics = {\n id: issue.id,\n title: issue.title,\n state: this.mapLinearState(issue.state.type),\n createdAt: new Date(issue.createdAt),\n completedAt:\n issue.state.type === 'completed'\n ? new Date(issue.updatedAt)\n : undefined,\n estimatedEffort: issue.estimate ? issue.estimate * 60 : undefined,\n assigneeId: issue.assignee?.id,\n priority: this.mapLinearPriority(issue.priority),\n labels: Array.isArray(issue.labels)\n ? issue.labels.map((l: any) => l.name)\n : (issue.labels as any)?.nodes?.map((l: any) => l.name) || [],\n blockingIssues: [],\n };\n this.metricsQueries.upsertTask(task);\n }\n } catch (error: unknown) {\n console.error('Failed to sync from Linear API:', error);\n }\n }\n\n await this.notifyUpdate();\n }\n\n async syncFromTaskStore(): Promise<number> {\n if (!this.taskStore) return 0;\n\n try {\n // Get all tasks including completed ones\n const allTasks = this.getAllTasksFromStore();\n let synced = 0;\n\n for (const task of allTasks) {\n const analyticsTask: TaskAnalytics = {\n id: task.id,\n title: task.title,\n state: this.mapTaskStatus(task.status),\n createdAt: new Date(task.created_at * 1000),\n completedAt: task.completed_at\n ? new Date(task.completed_at * 1000)\n : undefined,\n estimatedEffort: task.estimated_effort,\n actualEffort: task.actual_effort,\n assigneeId: task.assignee,\n priority: task.priority as TaskAnalytics['priority'],\n labels: task.tags || [],\n blockingIssues: task.depends_on || [],\n };\n this.metricsQueries.upsertTask(analyticsTask);\n synced++;\n }\n\n return synced;\n } catch (error: unknown) {\n console.error('Failed to sync from task store:', error);\n return 0;\n }\n }\n\n private getAllTasksFromStore(): any[] {\n if (!this.taskStore) return [];\n\n try {\n // Access the db directly to get ALL tasks including completed\n const contextDbPath = path.join(\n this.projectPath,\n '.stackmemory',\n 'context.db'\n );\n const db = new Database(contextDbPath);\n\n const rows = db\n .prepare(\n `\n SELECT * FROM task_cache \n ORDER BY created_at DESC\n `\n )\n .all() as any[];\n\n db.close();\n\n // Hydrate the rows\n return rows.map((row) => ({\n id: row.id,\n title: row.title,\n description: row.description,\n status: row.status,\n priority: row.priority,\n created_at: row.created_at,\n completed_at: row.completed_at,\n estimated_effort: row.estimated_effort,\n actual_effort: row.actual_effort,\n assignee: row.assignee,\n tags: JSON.parse(row.tags || '[]'),\n depends_on: JSON.parse(row.depends_on || '[]'),\n }));\n } catch (error: unknown) {\n console.error('Failed to get all tasks:', error);\n return [];\n }\n }\n\n private mapTaskStatus(status: string): TaskAnalytics['state'] {\n const statusMap: Record<string, TaskAnalytics['state']> = {\n pending: 'todo',\n in_progress: 'in_progress',\n completed: 'completed',\n blocked: 'blocked',\n cancelled: 'blocked',\n };\n return statusMap[status] || 'todo';\n }\n\n private mapLinearState(linearState: string): TaskAnalytics['state'] {\n const stateMap: Record<string, TaskAnalytics['state']> = {\n backlog: 'todo',\n unstarted: 'todo',\n started: 'in_progress',\n completed: 'completed',\n done: 'completed',\n canceled: 'blocked',\n };\n return stateMap[linearState.toLowerCase()] || 'todo';\n }\n\n private mapLinearPriority(priority: number): TaskAnalytics['priority'] {\n if (priority === 1) return 'urgent';\n if (priority === 2) return 'high';\n if (priority === 3) return 'medium';\n return 'low';\n }\n\n async getDashboardState(query: AnalyticsQuery = {}): Promise<DashboardState> {\n const timeRange = query.timeRange || this.getDefaultTimeRange();\n\n const metrics = this.metricsQueries.getTaskMetrics({\n ...query,\n timeRange,\n });\n\n const recentTasks = this.metricsQueries.getRecentTasks({\n ...query,\n limit: 20,\n });\n\n const teamMetrics = await this.getTeamMetrics(query);\n\n return {\n metrics,\n teamMetrics,\n recentTasks,\n timeRange,\n teamFilter: query.userIds || [],\n isLive: this.updateCallbacks.size > 0,\n lastUpdated: new Date(),\n };\n }\n\n private async getTeamMetrics(query: AnalyticsQuery): Promise<TeamMetrics[]> {\n const uniqueUserIds = new Set<string>();\n const tasks = this.metricsQueries.getRecentTasks({ limit: 1000 });\n\n tasks.forEach((task) => {\n if (task.assigneeId) {\n uniqueUserIds.add(task.assigneeId);\n }\n });\n\n const teamMetrics: TeamMetrics[] = [];\n const totalCompleted = tasks.filter((t) => t.state === 'completed').length;\n\n for (const userId of uniqueUserIds) {\n const userQuery = { ...query, userIds: [userId] };\n const individualMetrics = this.metricsQueries.getTaskMetrics(userQuery);\n\n teamMetrics.push({\n userId,\n userName: await this.getUserName(userId),\n individualMetrics,\n contributionPercentage:\n totalCompleted > 0\n ? (individualMetrics.completedTasks / totalCompleted) * 100\n : 0,\n lastActive: new Date(),\n });\n }\n\n return teamMetrics.sort(\n (a, b) => b.contributionPercentage - a.contributionPercentage\n );\n }\n\n private async getUserName(userId: string): Promise<string> {\n // Stub for now - would need LinearClient to expose user query method\n return userId;\n }\n\n private getDefaultTimeRange(): TimeRange {\n const end = new Date();\n const start = new Date();\n start.setDate(start.getDate() - 7);\n\n return {\n start,\n end,\n preset: '7d',\n };\n }\n\n subscribeToUpdates(callback: (state: DashboardState) => void): () => void {\n this.updateCallbacks.add(callback);\n\n return () => {\n this.updateCallbacks.delete(callback);\n };\n }\n\n private async notifyUpdate(): Promise<void> {\n const state = await this.getDashboardState();\n this.updateCallbacks.forEach((callback) => callback(state));\n }\n\n async addTask(task: TaskAnalytics): Promise<void> {\n this.metricsQueries.upsertTask(task);\n await this.notifyUpdate();\n }\n\n async updateTask(\n taskId: string,\n updates: Partial<TaskAnalytics>\n ): Promise<void> {\n const tasks = this.metricsQueries.getRecentTasks({ limit: 1 });\n const existingTask = tasks.find((t) => t.id === taskId);\n\n if (existingTask) {\n const updatedTask = { ...existingTask, ...updates };\n this.metricsQueries.upsertTask(updatedTask);\n await this.notifyUpdate();\n }\n }\n\n close(): void {\n this.metricsQueries.close();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }