@stackmemoryai/stackmemory 0.3.9 → 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 (86) hide show
  1. package/README.md +54 -0
  2. package/dist/agents/core/agent-task-manager.js +12 -1
  3. package/dist/agents/core/agent-task-manager.js.map +3 -3
  4. package/dist/agents/testing-agent.js +610 -0
  5. package/dist/agents/testing-agent.js.map +7 -0
  6. package/dist/cli/browser-test.js +4 -4
  7. package/dist/cli/browser-test.js.map +2 -2
  8. package/dist/cli/claude-sm.js +2 -2
  9. package/dist/cli/claude-sm.js.map +2 -2
  10. package/dist/cli/codex-sm.js +5 -5
  11. package/dist/cli/codex-sm.js.map +2 -2
  12. package/dist/cli/commands/agent.js +3 -3
  13. package/dist/cli/commands/agent.js.map +2 -2
  14. package/dist/cli/commands/handoff.js +67 -20
  15. package/dist/cli/commands/handoff.js.map +3 -3
  16. package/dist/cli/commands/linear-unified.js +3 -3
  17. package/dist/cli/commands/linear-unified.js.map +2 -2
  18. package/dist/cli/commands/linear.js +2 -2
  19. package/dist/cli/commands/linear.js.map +2 -2
  20. package/dist/cli/commands/onboard.js +3 -3
  21. package/dist/cli/commands/onboard.js.map +2 -2
  22. package/dist/cli/commands/quality.js +2 -2
  23. package/dist/cli/commands/quality.js.map +2 -2
  24. package/dist/cli/commands/skills.js +113 -28
  25. package/dist/cli/commands/skills.js.map +2 -2
  26. package/dist/cli/commands/tasks.js +3 -3
  27. package/dist/cli/commands/tasks.js.map +2 -2
  28. package/dist/cli/commands/test.js +282 -0
  29. package/dist/cli/commands/test.js.map +7 -0
  30. package/dist/cli/commands/worktree.js +28 -10
  31. package/dist/cli/commands/worktree.js.map +2 -2
  32. package/dist/cli/index.js +5 -3
  33. package/dist/cli/index.js.map +2 -2
  34. package/dist/cli/utils/viewer.js +9 -9
  35. package/dist/cli/utils/viewer.js.map +2 -2
  36. package/dist/core/config/config-manager.js +26 -0
  37. package/dist/core/config/config-manager.js.map +3 -3
  38. package/dist/core/context/frame-handoff-manager.js +4 -4
  39. package/dist/core/context/frame-handoff-manager.js.map +1 -1
  40. package/dist/core/context/frame-manager.js +139 -0
  41. package/dist/core/context/frame-manager.js.map +2 -2
  42. package/dist/core/context/refactored-frame-manager.js +180 -1
  43. package/dist/core/context/refactored-frame-manager.js.map +2 -2
  44. package/dist/core/projects/project-isolation.js +197 -0
  45. package/dist/core/projects/project-isolation.js.map +7 -0
  46. package/dist/core/trace/debug-trace.js +1 -1
  47. package/dist/core/trace/debug-trace.js.map +2 -2
  48. package/dist/core/trace/index.js +4 -4
  49. package/dist/core/trace/index.js.map +2 -2
  50. package/dist/core/trace/trace-demo.js +8 -8
  51. package/dist/core/trace/trace-demo.js.map +2 -2
  52. package/dist/core/trace/trace-detector.demo.js +5 -5
  53. package/dist/core/trace/trace-detector.demo.js.map +2 -2
  54. package/dist/core/utils/update-checker.js +2 -2
  55. package/dist/core/utils/update-checker.js.map +2 -2
  56. package/dist/features/analytics/core/analytics-service.js +2 -2
  57. package/dist/features/analytics/core/analytics-service.js.map +2 -2
  58. package/dist/features/tasks/linear-task-manager.js +483 -0
  59. package/dist/features/tasks/linear-task-manager.js.map +7 -0
  60. package/dist/integrations/claude-code/subagent-client-stub.js +16 -0
  61. package/dist/integrations/claude-code/subagent-client-stub.js.map +7 -0
  62. package/dist/integrations/linear/auto-sync.js +2 -2
  63. package/dist/integrations/linear/auto-sync.js.map +2 -2
  64. package/dist/integrations/linear/config.js +12 -1
  65. package/dist/integrations/linear/config.js.map +2 -2
  66. package/dist/integrations/linear/sync-manager.js.map +1 -1
  67. package/dist/integrations/linear/sync.js.map +1 -1
  68. package/dist/integrations/linear/unified-sync.js.map +1 -1
  69. package/dist/integrations/linear/webhook-handler.js.map +2 -2
  70. package/dist/integrations/linear/webhook.js.map +2 -2
  71. package/dist/integrations/mcp/handlers/linear-handlers.js.map +1 -1
  72. package/dist/integrations/mcp/handlers/task-handlers.js.map +1 -1
  73. package/dist/integrations/mcp/refactored-server.js +2 -2
  74. package/dist/integrations/mcp/refactored-server.js.map +2 -2
  75. package/dist/integrations/mcp/server.js +3 -3
  76. package/dist/integrations/mcp/server.js.map +2 -2
  77. package/dist/mcp/stackmemory-mcp-server.js +3 -3
  78. package/dist/mcp/stackmemory-mcp-server.js.map +2 -2
  79. package/dist/skills/claude-skills.js +99 -5
  80. package/dist/skills/claude-skills.js.map +2 -2
  81. package/dist/skills/recursive-agent-orchestrator.js.map +1 -1
  82. package/dist/skills/security-secrets-scanner.js +21 -6
  83. package/dist/skills/security-secrets-scanner.js.map +2 -2
  84. package/dist/skills/unified-rlm-orchestrator.js +400 -0
  85. package/dist/skills/unified-rlm-orchestrator.js.map +7 -0
  86. package/package.json +4 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/integrations/mcp/server.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * StackMemory MCP Server - Local Instance\n * This runs locally and provides context to Claude Code\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport Database from 'better-sqlite3';\nimport { readFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { execSync } from 'child_process';\nimport { FrameManager, FrameType } from '../../core/context/frame-manager.js';\nimport {\n PebblesTaskStore,\n TaskPriority,\n TaskStatus,\n} from '../../features/tasks/pebbles-task-store.js';\nimport { LinearAuthManager, LinearOAuthSetup } from '../linear/auth.js';\nimport { LinearSyncEngine, DEFAULT_SYNC_CONFIG } from '../linear/sync.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { BrowserMCPIntegration } from '../../features/browser/browser-mcp.js';\nimport { TraceDetector } from '../../core/trace/trace-detector.js';\nimport { ToolCall, Trace } from '../../core/trace/types.js';\nimport { LLMContextRetrieval } from '../../core/retrieval/index.js';\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\n// ============================================\n// Simple Local MCP Server\n// ============================================\n\nclass LocalStackMemoryMCP {\n private server: Server;\n private db: Database.Database;\n private projectRoot: string;\n private frameManager: FrameManager;\n private taskStore: PebblesTaskStore;\n private linearAuthManager: LinearAuthManager;\n private linearSync: LinearSyncEngine;\n private projectId: string;\n private contexts: Map<string, any> = new Map();\n private browserMCP: BrowserMCPIntegration;\n private traceDetector: TraceDetector;\n private contextRetrieval: LLMContextRetrieval;\n\n constructor() {\n // Find project root (where .git is)\n this.projectRoot = this.findProjectRoot();\n this.projectId = this.getProjectId();\n\n // Ensure .stackmemory directory exists\n const dbDir = join(this.projectRoot, '.stackmemory');\n if (!existsSync(dbDir)) {\n mkdirSync(dbDir, { recursive: true });\n }\n\n // Initialize database\n const dbPath = join(dbDir, 'context.db');\n this.db = new Database(dbPath);\n this.initDB();\n\n // Initialize frame manager\n this.frameManager = new FrameManager(this.db, this.projectId);\n\n // Initialize task store\n this.taskStore = new PebblesTaskStore(this.projectRoot, this.db);\n\n // Initialize Linear integration\n this.linearAuthManager = new LinearAuthManager(this.projectRoot);\n this.linearSync = new LinearSyncEngine(\n this.taskStore,\n this.linearAuthManager,\n DEFAULT_SYNC_CONFIG\n );\n\n // Initialize MCP server\n this.server = new Server(\n {\n name: 'stackmemory-local',\n version: '0.1.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Initialize Browser MCP integration\n this.browserMCP = new BrowserMCPIntegration({\n headless: process.env['BROWSER_HEADLESS'] !== 'false',\n defaultViewport: { width: 1280, height: 720 },\n });\n\n // Initialize Trace Detector with database persistence\n this.traceDetector = new TraceDetector({}, undefined, this.db);\n\n // Initialize LLM Context Retrieval\n this.contextRetrieval = new LLMContextRetrieval(\n this.db,\n this.frameManager,\n this.projectId\n );\n\n this.setupHandlers();\n this.loadInitialContext();\n\n // Initialize Browser MCP with this server\n this.browserMCP.initialize(this.server).catch((error) => {\n logger.error('Failed to initialize Browser MCP', error);\n });\n\n logger.info('StackMemory MCP Server initialized', {\n projectRoot: this.projectRoot,\n projectId: this.projectId,\n });\n }\n\n private findProjectRoot(): string {\n let dir = process.cwd();\n while (dir !== '/') {\n if (existsSync(join(dir, '.git'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return process.cwd();\n }\n\n private initDB() {\n // Note: Don't create frames table here - FrameManager handles the schema\n // with the full run_id, project_id, parent_frame_id columns\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS contexts (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n importance REAL DEFAULT 0.5,\n created_at INTEGER DEFAULT (unixepoch()),\n last_accessed INTEGER DEFAULT (unixepoch()),\n access_count INTEGER DEFAULT 1\n );\n\n CREATE TABLE IF NOT EXISTS attention_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n context_id TEXT,\n query TEXT,\n response TEXT,\n influence_score REAL,\n timestamp INTEGER DEFAULT (unixepoch())\n );\n `);\n }\n\n private loadInitialContext() {\n // Load project information\n const projectInfo = this.getProjectInfo();\n this.addContext(\n 'project',\n `Project: ${projectInfo.name}\\nPath: ${projectInfo.path}`,\n 0.9\n );\n\n // Load recent git commits\n try {\n const recentCommits = execSync('git log --oneline -10', {\n cwd: this.projectRoot,\n }).toString();\n this.addContext('git_history', `Recent commits:\\n${recentCommits}`, 0.6);\n } catch {\n // Not a git repo or git not available\n }\n\n // Load README if exists\n const readmePath = join(this.projectRoot, 'README.md');\n if (existsSync(readmePath)) {\n const readme = readFileSync(readmePath, 'utf-8');\n const summary = readme.substring(0, 500);\n this.addContext('readme', `Project README:\\n${summary}...`, 0.8);\n }\n\n // Load any existing decisions from previous sessions\n this.loadStoredContexts();\n }\n\n private getProjectId(): string {\n // Use git remote or directory path as project ID\n // Algorithm must match session-manager and project-manager\n let identifier: string;\n try {\n identifier = execSync('git config --get remote.origin.url', {\n cwd: this.projectRoot,\n stdio: 'pipe',\n timeout: 5000,\n })\n .toString()\n .trim();\n } catch {\n identifier = this.projectRoot;\n }\n\n // Normalize: remove .git suffix, replace non-alphanumeric with dashes, take last 50 chars\n const cleaned = identifier\n .replace(/\\.git$/, '')\n .replace(/[^a-zA-Z0-9-]/g, '-')\n .toLowerCase();\n\n return cleaned.substring(cleaned.length - 50) || 'unknown';\n }\n\n private getProjectInfo() {\n const packageJsonPath = join(this.projectRoot, 'package.json');\n if (existsSync(packageJsonPath)) {\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n return {\n name: pkg.name || 'unknown',\n path: this.projectRoot,\n };\n }\n return {\n name: this.projectRoot.split('/').pop() || 'unknown',\n path: this.projectRoot,\n };\n }\n\n private addContext(type: string, content: string, importance: number = 0.5) {\n const id = `${type}_${Date.now()}`;\n\n this.db\n .prepare(\n `\n INSERT OR REPLACE INTO contexts (id, type, content, importance)\n VALUES (?, ?, ?, ?)\n `\n )\n .run(id, type, content, importance);\n\n this.contexts.set(id, { type, content, importance });\n return id;\n }\n\n private loadStoredContexts() {\n const stored = this.db\n .prepare(\n `\n SELECT * FROM contexts \n ORDER BY importance DESC, last_accessed DESC\n LIMIT 50\n `\n )\n .all() as any[];\n\n stored.forEach((ctx) => {\n this.contexts.set(ctx.id, ctx);\n });\n }\n\n private setupHandlers() {\n // Tool listing\n this.server.setRequestHandler(\n z.object({\n method: z.literal('tools/list'),\n }),\n async () => {\n return {\n tools: [\n {\n name: 'get_context',\n description: 'Get current project context',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'What you want to know',\n },\n limit: {\n type: 'number',\n description: 'Max contexts to return',\n },\n },\n },\n },\n {\n name: 'add_decision',\n description: 'Record a decision or important information',\n inputSchema: {\n type: 'object',\n properties: {\n content: {\n type: 'string',\n description: 'The decision or information',\n },\n type: {\n type: 'string',\n enum: ['decision', 'constraint', 'learning'],\n },\n },\n required: ['content', 'type'],\n },\n },\n {\n name: 'start_frame',\n description: 'Start a new frame (task/subtask) on the call stack',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Frame name/goal' },\n type: {\n type: 'string',\n enum: [\n 'task',\n 'subtask',\n 'tool_scope',\n 'review',\n 'write',\n 'debug',\n ],\n description: 'Frame type',\n },\n constraints: {\n type: 'array',\n items: { type: 'string' },\n description: 'Constraints for this frame',\n },\n },\n required: ['name', 'type'],\n },\n },\n {\n name: 'close_frame',\n description: 'Close current frame and generate digest',\n inputSchema: {\n type: 'object',\n properties: {\n result: {\n type: 'string',\n description: 'Frame completion result',\n },\n outputs: {\n type: 'object',\n description: 'Final outputs from frame',\n },\n },\n },\n },\n {\n name: 'add_anchor',\n description:\n 'Add anchored fact/decision/constraint to current frame',\n inputSchema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: [\n 'FACT',\n 'DECISION',\n 'CONSTRAINT',\n 'INTERFACE_CONTRACT',\n 'TODO',\n 'RISK',\n ],\n description: 'Anchor type',\n },\n text: { type: 'string', description: 'Anchor content' },\n priority: {\n type: 'number',\n description: 'Priority (0-10)',\n minimum: 0,\n maximum: 10,\n },\n },\n required: ['type', 'text'],\n },\n },\n {\n name: 'get_hot_stack',\n description: 'Get current active frames and context',\n inputSchema: {\n type: 'object',\n properties: {\n maxEvents: {\n type: 'number',\n description: 'Max recent events per frame',\n default: 20,\n },\n },\n },\n },\n {\n name: 'create_task',\n description: 'Create a new task in git-tracked JSONL storage',\n inputSchema: {\n type: 'object',\n properties: {\n title: { type: 'string', description: 'Task title' },\n description: {\n type: 'string',\n description: 'Task description',\n },\n priority: {\n type: 'string',\n enum: ['low', 'medium', 'high', 'urgent'],\n description: 'Task priority',\n },\n estimatedEffort: {\n type: 'number',\n description: 'Estimated effort in minutes',\n },\n dependsOn: {\n type: 'array',\n items: { type: 'string' },\n description: 'Task IDs this depends on',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Tags for categorization',\n },\n },\n required: ['title'],\n },\n },\n {\n name: 'update_task_status',\n description: 'Update task status with automatic time tracking',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: 'Task ID to update' },\n status: {\n type: 'string',\n enum: [\n 'pending',\n 'in_progress',\n 'completed',\n 'blocked',\n 'cancelled',\n ],\n description: 'New status',\n },\n reason: {\n type: 'string',\n description:\n 'Reason for status change (especially for blocked)',\n },\n },\n required: ['taskId', 'status'],\n },\n },\n {\n name: 'get_active_tasks',\n description: 'Get currently active tasks synced from Linear',\n inputSchema: {\n type: 'object',\n properties: {\n frameId: {\n type: 'string',\n description: 'Filter by specific frame ID',\n },\n status: {\n type: 'string',\n enum: [\n 'pending',\n 'in_progress',\n 'completed',\n 'blocked',\n 'cancelled',\n ],\n description: 'Filter by status',\n },\n priority: {\n type: 'string',\n enum: ['low', 'medium', 'high', 'urgent'],\n description: 'Filter by priority',\n },\n search: {\n type: 'string',\n description: 'Search in task title or description',\n },\n limit: {\n type: 'number',\n description: 'Max number of tasks to return (default: 20)',\n },\n },\n },\n },\n {\n name: 'get_task_metrics',\n description: 'Get project task metrics and analytics',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'add_task_dependency',\n description: 'Add dependency relationship between tasks',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: {\n type: 'string',\n description: 'Task that depends on another',\n },\n dependsOnId: {\n type: 'string',\n description: 'Task ID that this depends on',\n },\n },\n required: ['taskId', 'dependsOnId'],\n },\n },\n {\n name: 'linear_sync',\n description: 'Sync tasks with Linear',\n inputSchema: {\n type: 'object',\n properties: {\n direction: {\n type: 'string',\n enum: ['bidirectional', 'to_linear', 'from_linear'],\n description: 'Sync direction',\n },\n },\n },\n },\n {\n name: 'linear_update_task',\n description: 'Update a Linear task status',\n inputSchema: {\n type: 'object',\n properties: {\n issueId: {\n type: 'string',\n description: 'Linear issue ID or identifier (e.g., STA-34)',\n },\n status: {\n type: 'string',\n enum: ['todo', 'in-progress', 'done', 'canceled'],\n description: 'New status for the task',\n },\n title: {\n type: 'string',\n description: 'Update task title (optional)',\n },\n description: {\n type: 'string',\n description: 'Update task description (optional)',\n },\n priority: {\n type: 'number',\n enum: [1, 2, 3, 4],\n description: 'Priority (1=urgent, 2=high, 3=medium, 4=low)',\n },\n },\n required: ['issueId'],\n },\n },\n {\n name: 'linear_get_tasks',\n description: 'Get Linear tasks',\n inputSchema: {\n type: 'object',\n properties: {\n status: {\n type: 'string',\n enum: ['todo', 'in-progress', 'done', 'all'],\n description: 'Filter by status',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of tasks to return',\n },\n },\n },\n },\n {\n name: 'linear_status',\n description: 'Get Linear integration status',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'get_traces',\n description: 'Get detected traces (bundled tool call sequences)',\n inputSchema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: [\n 'search_driven',\n 'error_recovery',\n 'feature_implementation',\n 'refactoring',\n 'testing',\n 'exploration',\n 'debugging',\n 'documentation',\n 'build_deploy',\n 'unknown',\n ],\n description: 'Filter by trace type',\n },\n minScore: {\n type: 'number',\n description: 'Minimum importance score (0-1)',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of traces to return',\n },\n },\n },\n },\n {\n name: 'get_trace_statistics',\n description: 'Get statistics about detected traces',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'flush_traces',\n description: 'Flush any pending trace and finalize detection',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'compress_old_traces',\n description: 'Compress traces older than specified hours',\n inputSchema: {\n type: 'object',\n properties: {\n ageHours: {\n type: 'number',\n description: 'Age threshold in hours (default: 24)',\n },\n },\n },\n },\n {\n name: 'smart_context',\n description:\n 'LLM-driven context retrieval - intelligently selects relevant frames based on query',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description:\n 'Natural language query describing what context you need',\n },\n tokenBudget: {\n type: 'number',\n description:\n 'Maximum tokens to use for context (default: 4000)',\n },\n forceRefresh: {\n type: 'boolean',\n description: 'Force refresh of cached summaries',\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'get_summary',\n description:\n 'Get compressed summary of project memory for analysis',\n inputSchema: {\n type: 'object',\n properties: {\n forceRefresh: {\n type: 'boolean',\n description: 'Force refresh of cached summary',\n },\n },\n },\n },\n ],\n };\n }\n );\n\n // Tool execution\n this.server.setRequestHandler(\n z.object({\n method: z.literal('tools/call'),\n params: z.object({\n name: z.string(),\n arguments: z.record(z.unknown()),\n }),\n }),\n async (request) => {\n const { name, arguments: args } = request.params;\n const callId = uuidv4();\n const startTime = Date.now();\n\n // Log tool call event before execution\n const currentFrameId = this.frameManager.getCurrentFrameId();\n if (currentFrameId) {\n this.frameManager.addEvent('tool_call', {\n tool_name: name,\n arguments: args,\n timestamp: startTime,\n });\n }\n\n // Create ToolCall for trace detection\n const toolCall: ToolCall = {\n id: callId,\n tool: name,\n arguments: args,\n timestamp: startTime,\n };\n\n let result;\n let error;\n\n try {\n switch (name) {\n case 'get_context':\n result = await this.handleGetContext(args);\n break;\n\n case 'add_decision':\n result = await this.handleAddDecision(args);\n break;\n\n case 'start_frame':\n result = await this.handleStartFrame(args);\n break;\n\n case 'close_frame':\n result = await this.handleCloseFrame(args);\n break;\n\n case 'add_anchor':\n result = await this.handleAddAnchor(args);\n break;\n\n case 'get_hot_stack':\n result = await this.handleGetHotStack(args);\n break;\n\n case 'create_task':\n result = await this.handleCreateTask(args);\n break;\n\n case 'update_task_status':\n result = await this.handleUpdateTaskStatus(args);\n break;\n\n case 'get_active_tasks':\n result = await this.handleGetActiveTasks(args);\n break;\n\n case 'get_task_metrics':\n result = await this.handleGetTaskMetrics(args);\n break;\n\n case 'add_task_dependency':\n result = await this.handleAddTaskDependency(args);\n break;\n\n case 'linear_sync':\n result = await this.handleLinearSync(args);\n break;\n\n case 'linear_update_task':\n result = await this.handleLinearUpdateTask(args);\n break;\n\n case 'linear_get_tasks':\n result = await this.handleLinearGetTasks(args);\n break;\n\n case 'linear_status':\n result = await this.handleLinearStatus(args);\n break;\n\n case 'get_traces':\n result = await this.handleGetTraces(args);\n break;\n\n case 'get_trace_statistics':\n result = await this.handleGetTraceStatistics(args);\n break;\n\n case 'flush_traces':\n result = await this.handleFlushTraces(args);\n break;\n\n case 'compress_old_traces':\n result = await this.handleCompressOldTraces(args);\n break;\n\n case 'smart_context':\n result = await this.handleSmartContext(args);\n break;\n\n case 'get_summary':\n result = await this.handleGetSummary(args);\n break;\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (err: unknown) {\n error = err instanceof Error ? err : new Error(String(err));\n toolCall.error = error.message;\n throw err;\n } finally {\n const endTime = Date.now();\n\n // Log tool result event after execution (success or failure)\n // Skip for close_frame since the frame no longer exists after closing\n if (currentFrameId && name !== 'close_frame') {\n try {\n this.frameManager.addEvent('tool_result', {\n tool_name: name,\n success: !error,\n result: error ? { error: error.message } : result,\n timestamp: endTime,\n });\n } catch {\n // Frame may have been closed, ignore logging error\n }\n }\n\n // Update tool call with results and add to trace detector\n toolCall.result = error ? undefined : result;\n toolCall.duration = endTime - startTime;\n\n // Extract files affected if available from result or args\n if (args.file_path || args.path) {\n toolCall.filesAffected = [args.file_path || args.path].filter(\n Boolean\n ) as string[];\n } else if ((result as any)?.files) {\n const files = (result as any).files;\n toolCall.filesAffected = Array.isArray(files) ? files : [files];\n }\n\n // Add to trace detector\n this.traceDetector.addToolCall(toolCall);\n }\n\n return result;\n }\n );\n }\n\n private async handleGetContext(args: any) {\n const { query = '', limit = 10 } = args;\n\n // Get relevant contexts\n const contexts = Array.from(this.contexts.values())\n .sort((a, b) => b.importance - a.importance)\n .slice(0, limit);\n\n // Update access counts\n contexts.forEach((ctx) => {\n this.db\n .prepare(\n `\n UPDATE contexts \n SET last_accessed = unixepoch(), \n access_count = access_count + 1\n WHERE id = ?\n `\n )\n .run(ctx.id);\n });\n\n // Format response\n const response = contexts\n .map(\n (ctx) =>\n `[${ctx.type.toUpperCase()}] (importance: ${ctx.importance.toFixed(2)})\\n${ctx.content}`\n )\n .join('\\n\\n---\\n\\n');\n\n // Log for attention tracking\n this.logAttention(query, response);\n\n return {\n content: [\n {\n type: 'text',\n text:\n response ||\n 'No context available yet. Start adding decisions and information!',\n },\n ],\n };\n }\n\n private async handleAddDecision(args: any) {\n const { content, type = 'decision' } = args;\n\n const id = this.addContext(type, content, 0.8);\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2713 Added ${type}: ${content}\\nID: ${id}`,\n },\n ],\n };\n }\n\n private async handleStartFrame(args: any) {\n const { name, type, constraints } = args;\n\n const inputs: Record<string, any> = {};\n if (constraints) {\n inputs.constraints = constraints;\n }\n\n const frameId = this.frameManager.createFrame({\n type: type as FrameType,\n name,\n inputs,\n });\n\n // Log event\n this.frameManager.addEvent('user_message', {\n action: 'start_frame',\n name,\n type,\n constraints,\n });\n\n // Add as context\n this.addContext('active_frame', `Active frame: ${name} (${type})`, 0.9);\n\n const stackDepth = this.frameManager.getStackDepth();\n\n return {\n content: [\n {\n type: 'text',\n text: `\uD83D\uDE80 Started ${type}: ${name}\\nFrame ID: ${frameId}\\nStack depth: ${stackDepth}`,\n },\n ],\n };\n }\n\n private async handleCloseFrame(args: any) {\n const { result, outputs } = args;\n const currentFrameId = this.frameManager.getCurrentFrameId();\n\n if (!currentFrameId) {\n return {\n content: [\n {\n type: 'text',\n text: '\u26A0\uFE0F No active frame to close',\n },\n ],\n };\n }\n\n // Log completion event\n this.frameManager.addEvent('assistant_message', {\n action: 'close_frame',\n result,\n outputs,\n });\n\n this.frameManager.closeFrame(currentFrameId, outputs);\n\n const newStackDepth = this.frameManager.getStackDepth();\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 Closed frame: ${result || 'completed'}\\nStack depth: ${newStackDepth}`,\n },\n ],\n };\n }\n\n private async handleAddAnchor(args: any) {\n const { type, text, priority = 5 } = args;\n\n const anchorId = this.frameManager.addAnchor(type, text, priority);\n\n // Log anchor creation\n this.frameManager.addEvent('decision', {\n anchor_type: type,\n text,\n priority,\n anchor_id: anchorId,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\uD83D\uDCCC Added ${type}: ${text}\\nAnchor ID: ${anchorId}`,\n },\n ],\n };\n }\n\n private async handleGetHotStack(args: any) {\n const { maxEvents = 20 } = args;\n\n const hotStack = this.frameManager.getHotStackContext(maxEvents);\n const activePath = this.frameManager.getActiveFramePath();\n\n if (hotStack.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '\uD83D\uDCDA No active frames. Start a frame with start_frame tool.',\n },\n ],\n };\n }\n\n let response = '\uD83D\uDCDA **Active Call Stack:**\\n\\n';\n\n activePath.forEach((frame, index) => {\n const indent = ' '.repeat(index);\n const context = hotStack[index];\n\n response += `${indent}${index + 1}. **${frame.name}** (${frame.type})\\n`;\n\n if (context && context.anchors && context.anchors.length > 0) {\n response += `${indent} \uD83D\uDCCC ${context.anchors.length} anchors\\n`;\n }\n\n if (context && context.recentEvents && context.recentEvents.length > 0) {\n response += `${indent} \uD83D\uDCDD ${context.recentEvents.length} recent events\\n`;\n }\n\n response += '\\n';\n });\n\n response += `**Total stack depth:** ${hotStack.length}`;\n\n // Log stack access\n this.frameManager.addEvent('observation', {\n action: 'get_hot_stack',\n stack_depth: hotStack.length,\n total_anchors: hotStack.reduce(\n (sum, frame) => sum + frame.anchors.length,\n 0\n ),\n total_events: hotStack.reduce(\n (sum, frame) => sum + frame.recentEvents.length,\n 0\n ),\n });\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n }\n\n private logAttention(query: string, response: string) {\n // Simple attention logging for analysis\n this.db\n .prepare(\n `\n INSERT INTO attention_log (query, response)\n VALUES (?, ?)\n `\n )\n .run(query, response);\n }\n\n private async handleCreateTask(args: any) {\n const { title, description, priority, estimatedEffort, dependsOn, tags } =\n args;\n const currentFrameId = this.frameManager.getCurrentFrameId();\n\n if (!currentFrameId) {\n return {\n content: [\n {\n type: 'text',\n text: '\u26A0\uFE0F No active frame. Start a frame first with start_frame tool.',\n },\n ],\n };\n }\n\n const taskId = this.taskStore.createTask({\n title,\n description,\n priority: priority as TaskPriority,\n frameId: currentFrameId,\n dependsOn,\n tags,\n estimatedEffort,\n });\n\n // Log task creation event\n this.frameManager.addEvent('decision', {\n action: 'create_task',\n task_id: taskId,\n title,\n priority: priority || 'medium',\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 Created task: ${title}\\nID: ${taskId}\\nFrame: ${currentFrameId}\\nStored in: .stackmemory/tasks.jsonl`,\n },\n ],\n };\n }\n\n private async handleUpdateTaskStatus(args: any) {\n const { taskId, status, reason } = args;\n\n try {\n this.taskStore.updateTaskStatus(taskId, status as TaskStatus, reason);\n\n // Log status change event\n this.frameManager.addEvent('observation', {\n action: 'update_task_status',\n task_id: taskId,\n new_status: status,\n reason,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 Updated task ${taskId} to ${status}${reason ? `\\nReason: ${reason}` : ''}`,\n },\n ],\n };\n } catch (error: unknown) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to update task: ${error}`,\n },\n ],\n };\n }\n }\n\n private async handleGetActiveTasks(args: any) {\n const { frameId, status, priority, search, limit = 20 } = args;\n let tasks = this.taskStore.getActiveTasks(frameId);\n\n // Apply filters\n if (status) {\n tasks = tasks.filter((t) => t.status === status);\n }\n if (priority) {\n tasks = tasks.filter((t) => t.priority === priority);\n }\n if (search) {\n const searchLower = search.toLowerCase();\n tasks = tasks.filter(\n (t) =>\n t.title.toLowerCase().includes(searchLower) ||\n (t.description && t.description.toLowerCase().includes(searchLower))\n );\n }\n\n // Sort by priority (urgent first) then by created_at\n const priorityOrder = { urgent: 0, high: 1, medium: 2, low: 3 };\n tasks.sort((a, b) => {\n const pa = priorityOrder[a.priority] ?? 2;\n const pb = priorityOrder[b.priority] ?? 2;\n if (pa !== pb) return pa - pb;\n return b.created_at - a.created_at;\n });\n\n // Limit results\n tasks = tasks.slice(0, limit);\n\n if (tasks.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: search\n ? `\uD83D\uDCDD No tasks matching \"${search}\"`\n : '\uD83D\uDCDD No active tasks found',\n },\n ],\n };\n }\n\n let response = `\uD83D\uDCDD **Tasks** (${tasks.length} found)\\n\\n`;\n tasks.forEach((task) => {\n const priorityIcon =\n { urgent: '\uD83D\uDD34', high: '\uD83D\uDFE0', medium: '\uD83D\uDFE1', low: '\uD83D\uDFE2' }[task.priority] ||\n '\u26AA';\n const statusIcon =\n {\n pending: '\u23F3',\n in_progress: '\uD83D\uDD04',\n completed: '\u2705',\n blocked: '\uD83D\uDEAB',\n cancelled: '\u274C',\n }[task.status] || '\u26AA';\n const effort = task.estimated_effort\n ? ` (~${task.estimated_effort}m)`\n : '';\n\n // Extract Linear ID from title if present\n const linearMatch = task.title.match(/\\[ENG-\\d+\\]/);\n const linearId = linearMatch ? linearMatch[0] : '';\n const title = linearId\n ? task.title.replace(linearId, '').trim()\n : task.title;\n\n response += `${statusIcon} ${priorityIcon} **${linearId || task.id}** ${title}${effort}\\n`;\n if (task.description) {\n const desc = task.description.split('\\n')[0].slice(0, 100);\n response += ` ${desc}${task.description.length > 100 ? '...' : ''}\\n`;\n }\n if (task.tags && task.tags.length > 0) {\n response += ` \uD83C\uDFF7\uFE0F ${task.tags.join(', ')}\\n`;\n }\n response += '\\n';\n });\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n }\n\n private async handleGetTaskMetrics(_args: any) {\n const metrics = this.taskStore.getMetrics();\n\n let response = '\uD83D\uDCCA **Task Metrics**\\n\\n';\n response += `**Total Tasks:** ${metrics.total_tasks}\\n`;\n response += `**Completion Rate:** ${(metrics.completion_rate * 100).toFixed(1)}%\\n\\n`;\n\n response += '**By Status:**\\n';\n Object.entries(metrics.by_status).forEach(([status, count]) => {\n response += `- ${status}: ${count}\\n`;\n });\n\n response += '\\n**By Priority:**\\n';\n Object.entries(metrics.by_priority).forEach(([priority, count]) => {\n response += `- ${priority}: ${count}\\n`;\n });\n\n if (metrics.blocked_tasks > 0) {\n response += `\\n\u26A0\uFE0F **${metrics.blocked_tasks} blocked tasks**`;\n }\n\n if (metrics.avg_effort_accuracy > 0) {\n response += `\\n\uD83C\uDFAF **Effort Accuracy:** ${(metrics.avg_effort_accuracy * 100).toFixed(1)}%`;\n }\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n }\n\n private async handleAddTaskDependency(args: any) {\n const { taskId, dependsOnId } = args;\n\n try {\n this.taskStore.addDependency(taskId, dependsOnId);\n\n // Log dependency creation\n this.frameManager.addEvent('decision', {\n action: 'add_task_dependency',\n task_id: taskId,\n depends_on_id: dependsOnId,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\uD83D\uDD17 Added dependency: ${taskId} depends on ${dependsOnId}`,\n },\n ],\n };\n } catch (error: unknown) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to add dependency: ${error}`,\n },\n ],\n };\n }\n }\n\n // Linear Integration Handlers\n private async handleLinearSync(args: any) {\n try {\n const tokens = this.linearAuthManager.loadTokens();\n\n if (!tokens) {\n return {\n content: [\n {\n type: 'text',\n text: '\u274C Linear not authenticated. Run: stackmemory linear setup',\n },\n ],\n };\n }\n\n const syncConfig = { ...DEFAULT_SYNC_CONFIG, enabled: true };\n if (args.direction) {\n syncConfig.direction = args.direction;\n }\n\n // Update sync engine configuration for this sync\n this.linearSync.updateConfig(syncConfig);\n const result = await this.linearSync.sync();\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 Linear sync completed\\n- To Linear: ${result.synced.toLinear} tasks\\n- From Linear: ${result.synced.fromLinear} tasks\\n- Updated: ${result.synced.updated} tasks`,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Linear sync failed: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleLinearUpdateTask(args: any) {\n try {\n const { LinearClient } = await import('../linear/client.js');\n\n const tokens = this.linearAuthManager.loadTokens();\n\n if (!tokens) {\n return {\n content: [\n {\n type: 'text',\n text: '\u274C Linear not authenticated. Run: stackmemory linear setup',\n },\n ],\n };\n }\n\n const client = new LinearClient({\n apiKey: tokens.accessToken,\n useBearer: true,\n onUnauthorized: async () => {\n const refreshed = await this.linearAuthManager.refreshAccessToken();\n return refreshed.accessToken;\n },\n });\n\n // Find the issue\n let issue = await client.getIssue(args.issueId);\n if (!issue) {\n issue = await client.findIssueByIdentifier(args.issueId);\n }\n\n if (!issue) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Linear issue ${args.issueId} not found`,\n },\n ],\n };\n }\n\n const updates: any = {};\n\n // Handle status update\n if (args.status) {\n const team = await client.getTeam();\n const states = await client.getWorkflowStates(team.id);\n\n const statusMap: Record<string, string> = {\n todo: 'unstarted',\n 'in-progress': 'started',\n done: 'completed',\n canceled: 'cancelled',\n };\n\n const targetType = statusMap[args.status] || args.status;\n const targetState = states.find((s: any) => s.type === targetType);\n\n if (!targetState) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Invalid status: ${args.status}`,\n },\n ],\n };\n }\n\n updates.stateId = targetState.id;\n }\n\n if (args.title) updates.title = args.title;\n if (args.description) updates.description = args.description;\n if (args.priority) updates.priority = args.priority;\n\n const updatedIssue = await client.updateIssue(issue.id, updates);\n\n // Auto-sync to local tasks after update\n this.linearSync.updateConfig({\n ...DEFAULT_SYNC_CONFIG,\n enabled: true,\n direction: 'from_linear',\n });\n const syncResult = await this.linearSync.sync();\n\n let response = `\u2705 Updated ${updatedIssue.identifier}: ${updatedIssue.title}\\n`;\n if (args.status) {\n response += `Status: ${updatedIssue.state.name}\\n`;\n }\n response += `URL: ${updatedIssue.url}\\n`;\n response += `\\n\uD83D\uDD04 Local sync: ${syncResult.synced.fromLinear} new, ${syncResult.synced.updated} updated`;\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to update Linear task: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleLinearGetTasks(args: any) {\n try {\n const { LinearClient } = await import('../linear/client.js');\n\n const tokens = this.linearAuthManager.loadTokens();\n\n if (!tokens) {\n return {\n content: [\n {\n type: 'text',\n text: '\u274C Linear not authenticated. Run: stackmemory linear setup',\n },\n ],\n };\n }\n\n const client = new LinearClient({\n apiKey: tokens.accessToken,\n useBearer: true,\n onUnauthorized: async () => {\n const refreshed = await this.linearAuthManager.refreshAccessToken();\n return refreshed.accessToken;\n },\n });\n\n let stateType: any = undefined;\n if (args.status && args.status !== 'all') {\n const statusMap: Record<string, string> = {\n todo: 'unstarted',\n 'in-progress': 'started',\n done: 'completed',\n };\n stateType = statusMap[args.status] || args.status;\n }\n\n const issues = await client.getIssues({\n stateType,\n limit: args.limit || 20,\n });\n\n if (!issues || issues.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No Linear tasks found',\n },\n ],\n };\n }\n\n let response = `\uD83D\uDCCB **Linear Tasks** (${issues.length} items)\\n\\n`;\n issues.forEach((issue: any) => {\n const priority = issue.priority ? `P${issue.priority}` : '-';\n response += `- **${issue.identifier}**: ${issue.title}\\n`;\n response += ` Status: ${issue.state.name} | Priority: ${priority}\\n`;\n if (issue.assignee) {\n response += ` Assignee: ${issue.assignee.name}\\n`;\n }\n response += ` ${issue.url}\\n\\n`;\n });\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to get Linear tasks: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleLinearStatus(_args: any) {\n try {\n const { LinearClient } = await import('../linear/client.js');\n\n const tokens = this.linearAuthManager.loadTokens();\n\n if (!tokens) {\n return {\n content: [\n {\n type: 'text',\n text: '\u274C Linear integration not configured\\nRun: stackmemory linear setup',\n },\n ],\n };\n }\n\n try {\n const client = new LinearClient({\n apiKey: tokens.accessToken,\n useBearer: true,\n onUnauthorized: async () => {\n const refreshed = await this.linearAuthManager.refreshAccessToken();\n return refreshed.accessToken;\n },\n });\n\n const viewer = await client.getViewer();\n const team = await client.getTeam();\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 **Linear Integration Status**\\n\\nConnected as: ${viewer.name} (${viewer.email})\\nTeam: ${team.name} (${team.key})\\nTokens: Valid`,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u26A0\uFE0F Linear configured but connection failed: ${error.message}`,\n },\n ],\n };\n }\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Linear status check failed: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleGetTraces(args: any) {\n const { type, minScore, limit = 20 } = args;\n\n // Flush pending traces first\n this.traceDetector.flush();\n\n let traces = this.traceDetector.getTraces();\n\n // Apply filters\n if (type) {\n traces = traces.filter((t) => t.type === type);\n }\n\n if (minScore !== undefined) {\n traces = traces.filter((t) => t.score >= minScore);\n }\n\n // Sort by score and limit\n traces = traces.sort((a, b) => b.score - a.score).slice(0, limit);\n\n // Format traces for display\n const formattedTraces = traces.map((trace) => ({\n id: trace.id,\n type: trace.type,\n score: trace.score.toFixed(2),\n summary: trace.summary,\n toolCount: trace.tools.length,\n duration: `${((trace.metadata.endTime - trace.metadata.startTime) / 1000).toFixed(1)}s`,\n filesModified: trace.metadata.filesModified.length,\n hasErrors: trace.metadata.errorsEncountered.length > 0,\n compressed: !!trace.compressed,\n }));\n\n return {\n content: [\n {\n type: 'text',\n text: `Found ${formattedTraces.length} traces:\\n\\n${formattedTraces\n .map(\n (t) =>\n `[${t.type}] Score: ${t.score} | Tools: ${t.toolCount} | Duration: ${t.duration}\\n ${t.summary}`\n )\n .join('\\n\\n')}`,\n },\n ],\n };\n }\n\n private async handleGetTraceStatistics(args: any) {\n this.traceDetector.flush();\n const stats = this.traceDetector.getStatistics();\n\n const typeBreakdown = Object.entries(stats.tracesByType)\n .map(([type, count]) => ` ${type}: ${count}`)\n .join('\\n');\n\n return {\n content: [\n {\n type: 'text',\n text: `**Trace Statistics**\\n\\nTotal Traces: ${stats.totalTraces}\nAverage Score: ${stats.averageScore.toFixed(2)}\nAverage Length: ${stats.averageLength.toFixed(1)} tools\nHigh Importance (>0.7): ${stats.highImportanceCount}\nCompressed: ${stats.compressedCount}\n\n**Trace Types:**\n${typeBreakdown}`,\n },\n ],\n };\n }\n\n private async handleFlushTraces(args: any) {\n this.traceDetector.flush();\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pending traces have been flushed and finalized.',\n },\n ],\n };\n }\n\n private async handleCompressOldTraces(args: any) {\n const { ageHours = 24 } = args;\n\n const compressedCount = this.traceDetector.compressOldTraces(ageHours);\n\n return {\n content: [\n {\n type: 'text',\n text: `Compressed ${compressedCount} traces older than ${ageHours} hours.`,\n },\n ],\n };\n }\n\n private async handleSmartContext(args: any) {\n const { query, tokenBudget = 4000, forceRefresh = false } = args;\n\n try {\n const result = await this.contextRetrieval.retrieveContext(query, {\n tokenBudget,\n forceRefresh,\n });\n\n // Log the retrieval\n const currentFrameId = this.frameManager.getCurrentFrameId();\n if (currentFrameId) {\n this.frameManager.addEvent('observation', {\n action: 'smart_context',\n query,\n framesRetrieved: result.frames.length,\n tokenUsage: result.tokenUsage,\n confidence: result.analysis.confidenceScore,\n });\n }\n\n // Build response with metadata\n let response = result.context;\n response += `\\n\\n---\\n\uD83D\uDCCA **Retrieval Stats**\\n`;\n response += `- Frames included: ${result.frames.length}\\n`;\n response += `- Tokens used: ${result.tokenUsage.used}/${result.tokenUsage.budget}\\n`;\n response += `- Confidence: ${(result.analysis.confidenceScore * 100).toFixed(0)}%\\n`;\n response += `- Time: ${result.metadata.retrievalTimeMs}ms`;\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Context retrieval failed: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleGetSummary(args: any) {\n const { forceRefresh = false } = args;\n\n try {\n const summary = this.contextRetrieval.getSummary(forceRefresh);\n\n // Format the summary for display\n let response = '\uD83D\uDCCB **Compressed Memory Summary**\\n\\n';\n\n // Recent session\n response += '## Recent Session\\n';\n response += `- Frames: ${summary.recentSession.frames.length}\\n`;\n response += `- Time range: ${new Date(summary.recentSession.timeRange.start).toLocaleString()} - ${new Date(summary.recentSession.timeRange.end).toLocaleString()}\\n`;\n\n if (summary.recentSession.dominantOperations.length > 0) {\n response += `- Dominant ops: ${summary.recentSession.dominantOperations\n .slice(0, 5)\n .map((o) => `${o.operation}(${o.count})`)\n .join(', ')}\\n`;\n }\n\n if (summary.recentSession.filesTouched.length > 0) {\n response += `- Files touched: ${summary.recentSession.filesTouched\n .slice(0, 5)\n .map((f) => f.path)\n .join(', ')}\\n`;\n }\n\n if (summary.recentSession.errorsEncountered.length > 0) {\n response += `- Errors: ${summary.recentSession.errorsEncountered.length}\\n`;\n }\n\n // Historical patterns\n response += '\\n## Historical Patterns\\n';\n response += `- Topic counts: ${Object.keys(summary.historicalPatterns.topicFrameCounts).length} topics\\n`;\n\n if (summary.historicalPatterns.keyDecisions.length > 0) {\n response += `\\n### Key Decisions (${summary.historicalPatterns.keyDecisions.length})\\n`;\n summary.historicalPatterns.keyDecisions.slice(0, 5).forEach((d) => {\n response += `- ${d.text.substring(0, 80)}${d.text.length > 80 ? '...' : ''}\\n`;\n });\n }\n\n if (summary.historicalPatterns.recurringIssues.length > 0) {\n response += `\\n### Recurring Issues (${summary.historicalPatterns.recurringIssues.length})\\n`;\n summary.historicalPatterns.recurringIssues.slice(0, 3).forEach((i) => {\n response += `- ${i.issueType} (${i.occurrenceCount} times)\\n`;\n });\n }\n\n // Queryable indices\n response += '\\n## Available Indices\\n';\n response += `- By time: ${Object.keys(summary.queryableIndices.byTimeframe).length} periods\\n`;\n response += `- By file: ${Object.keys(summary.queryableIndices.byFile).length} files\\n`;\n response += `- By topic: ${Object.keys(summary.queryableIndices.byTopic).length} topics\\n`;\n response += `- By error: ${Object.keys(summary.queryableIndices.byErrorType).length} error types\\n`;\n\n // Stats\n response += `\\n## Stats\\n`;\n response += `- Total frames: ${summary.stats.totalFrames}\\n`;\n response += `- Total anchors: ${summary.stats.totalAnchors}\\n`;\n response += `- Total events: ${summary.stats.totalEvents}\\n`;\n response += `- Generated: ${new Date(summary.generatedAt).toLocaleString()}`;\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to get summary: ${error.message}`,\n },\n ],\n };\n }\n }\n\n async start() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('StackMemory MCP Server started');\n }\n}\n\n// Export the class\nexport default LocalStackMemoryMCP;\n\n// Export function to run the server\nexport async function runMCPServer(): Promise<void> {\n const server = new LocalStackMemoryMCP();\n await server.start();\n}\n\n// Start the server\nif (import.meta.url === `file://${process.argv[1]}`) {\n const server = new LocalStackMemoryMCP();\n server.start().catch(console.error);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * StackMemory MCP Server - Local Instance\n * This runs locally and provides context to Claude Code\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport Database from 'better-sqlite3';\nimport { readFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { execSync } from 'child_process';\nimport { FrameManager, FrameType } from '../../core/context/frame-manager.js';\nimport {\n LinearTaskManager,\n TaskPriority,\n TaskStatus,\n} from '../../features/tasks/linear-task-manager.js';\nimport { LinearAuthManager, LinearOAuthSetup } from '../linear/auth.js';\nimport { LinearSyncEngine, DEFAULT_SYNC_CONFIG } from '../linear/sync.js';\nimport { logger } from '../../core/monitoring/logger.js';\nimport { BrowserMCPIntegration } from '../../features/browser/browser-mcp.js';\nimport { TraceDetector } from '../../core/trace/trace-detector.js';\nimport { ToolCall, Trace } from '../../core/trace/types.js';\nimport { LLMContextRetrieval } from '../../core/retrieval/index.js';\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\n// ============================================\n// Simple Local MCP Server\n// ============================================\n\nclass LocalStackMemoryMCP {\n private server: Server;\n private db: Database.Database;\n private projectRoot: string;\n private frameManager: FrameManager;\n private taskStore: LinearTaskManager;\n private linearAuthManager: LinearAuthManager;\n private linearSync: LinearSyncEngine;\n private projectId: string;\n private contexts: Map<string, any> = new Map();\n private browserMCP: BrowserMCPIntegration;\n private traceDetector: TraceDetector;\n private contextRetrieval: LLMContextRetrieval;\n\n constructor() {\n // Find project root (where .git is)\n this.projectRoot = this.findProjectRoot();\n this.projectId = this.getProjectId();\n\n // Ensure .stackmemory directory exists\n const dbDir = join(this.projectRoot, '.stackmemory');\n if (!existsSync(dbDir)) {\n mkdirSync(dbDir, { recursive: true });\n }\n\n // Initialize database\n const dbPath = join(dbDir, 'context.db');\n this.db = new Database(dbPath);\n this.initDB();\n\n // Initialize frame manager\n this.frameManager = new FrameManager(this.db, this.projectId);\n\n // Initialize task store\n this.taskStore = new LinearTaskManager(this.projectRoot, this.db);\n\n // Initialize Linear integration\n this.linearAuthManager = new LinearAuthManager(this.projectRoot);\n this.linearSync = new LinearSyncEngine(\n this.taskStore,\n this.linearAuthManager,\n DEFAULT_SYNC_CONFIG\n );\n\n // Initialize MCP server\n this.server = new Server(\n {\n name: 'stackmemory-local',\n version: '0.1.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Initialize Browser MCP integration\n this.browserMCP = new BrowserMCPIntegration({\n headless: process.env['BROWSER_HEADLESS'] !== 'false',\n defaultViewport: { width: 1280, height: 720 },\n });\n\n // Initialize Trace Detector with database persistence\n this.traceDetector = new TraceDetector({}, undefined, this.db);\n\n // Initialize LLM Context Retrieval\n this.contextRetrieval = new LLMContextRetrieval(\n this.db,\n this.frameManager,\n this.projectId\n );\n\n this.setupHandlers();\n this.loadInitialContext();\n\n // Initialize Browser MCP with this server\n this.browserMCP.initialize(this.server).catch((error) => {\n logger.error('Failed to initialize Browser MCP', error);\n });\n\n logger.info('StackMemory MCP Server initialized', {\n projectRoot: this.projectRoot,\n projectId: this.projectId,\n });\n }\n\n private findProjectRoot(): string {\n let dir = process.cwd();\n while (dir !== '/') {\n if (existsSync(join(dir, '.git'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return process.cwd();\n }\n\n private initDB() {\n // Note: Don't create frames table here - FrameManager handles the schema\n // with the full run_id, project_id, parent_frame_id columns\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS contexts (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n importance REAL DEFAULT 0.5,\n created_at INTEGER DEFAULT (unixepoch()),\n last_accessed INTEGER DEFAULT (unixepoch()),\n access_count INTEGER DEFAULT 1\n );\n\n CREATE TABLE IF NOT EXISTS attention_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n context_id TEXT,\n query TEXT,\n response TEXT,\n influence_score REAL,\n timestamp INTEGER DEFAULT (unixepoch())\n );\n `);\n }\n\n private loadInitialContext() {\n // Load project information\n const projectInfo = this.getProjectInfo();\n this.addContext(\n 'project',\n `Project: ${projectInfo.name}\\nPath: ${projectInfo.path}`,\n 0.9\n );\n\n // Load recent git commits\n try {\n const recentCommits = execSync('git log --oneline -10', {\n cwd: this.projectRoot,\n }).toString();\n this.addContext('git_history', `Recent commits:\\n${recentCommits}`, 0.6);\n } catch {\n // Not a git repo or git not available\n }\n\n // Load README if exists\n const readmePath = join(this.projectRoot, 'README.md');\n if (existsSync(readmePath)) {\n const readme = readFileSync(readmePath, 'utf-8');\n const summary = readme.substring(0, 500);\n this.addContext('readme', `Project README:\\n${summary}...`, 0.8);\n }\n\n // Load any existing decisions from previous sessions\n this.loadStoredContexts();\n }\n\n private getProjectId(): string {\n // Use git remote or directory path as project ID\n // Algorithm must match session-manager and project-manager\n let identifier: string;\n try {\n identifier = execSync('git config --get remote.origin.url', {\n cwd: this.projectRoot,\n stdio: 'pipe',\n timeout: 5000,\n })\n .toString()\n .trim();\n } catch {\n identifier = this.projectRoot;\n }\n\n // Normalize: remove .git suffix, replace non-alphanumeric with dashes, take last 50 chars\n const cleaned = identifier\n .replace(/\\.git$/, '')\n .replace(/[^a-zA-Z0-9-]/g, '-')\n .toLowerCase();\n\n return cleaned.substring(cleaned.length - 50) || 'unknown';\n }\n\n private getProjectInfo() {\n const packageJsonPath = join(this.projectRoot, 'package.json');\n if (existsSync(packageJsonPath)) {\n const pkg = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n return {\n name: pkg.name || 'unknown',\n path: this.projectRoot,\n };\n }\n return {\n name: this.projectRoot.split('/').pop() || 'unknown',\n path: this.projectRoot,\n };\n }\n\n private addContext(type: string, content: string, importance: number = 0.5) {\n const id = `${type}_${Date.now()}`;\n\n this.db\n .prepare(\n `\n INSERT OR REPLACE INTO contexts (id, type, content, importance)\n VALUES (?, ?, ?, ?)\n `\n )\n .run(id, type, content, importance);\n\n this.contexts.set(id, { type, content, importance });\n return id;\n }\n\n private loadStoredContexts() {\n const stored = this.db\n .prepare(\n `\n SELECT * FROM contexts \n ORDER BY importance DESC, last_accessed DESC\n LIMIT 50\n `\n )\n .all() as any[];\n\n stored.forEach((ctx) => {\n this.contexts.set(ctx.id, ctx);\n });\n }\n\n private setupHandlers() {\n // Tool listing\n this.server.setRequestHandler(\n z.object({\n method: z.literal('tools/list'),\n }),\n async () => {\n return {\n tools: [\n {\n name: 'get_context',\n description: 'Get current project context',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'What you want to know',\n },\n limit: {\n type: 'number',\n description: 'Max contexts to return',\n },\n },\n },\n },\n {\n name: 'add_decision',\n description: 'Record a decision or important information',\n inputSchema: {\n type: 'object',\n properties: {\n content: {\n type: 'string',\n description: 'The decision or information',\n },\n type: {\n type: 'string',\n enum: ['decision', 'constraint', 'learning'],\n },\n },\n required: ['content', 'type'],\n },\n },\n {\n name: 'start_frame',\n description: 'Start a new frame (task/subtask) on the call stack',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Frame name/goal' },\n type: {\n type: 'string',\n enum: [\n 'task',\n 'subtask',\n 'tool_scope',\n 'review',\n 'write',\n 'debug',\n ],\n description: 'Frame type',\n },\n constraints: {\n type: 'array',\n items: { type: 'string' },\n description: 'Constraints for this frame',\n },\n },\n required: ['name', 'type'],\n },\n },\n {\n name: 'close_frame',\n description: 'Close current frame and generate digest',\n inputSchema: {\n type: 'object',\n properties: {\n result: {\n type: 'string',\n description: 'Frame completion result',\n },\n outputs: {\n type: 'object',\n description: 'Final outputs from frame',\n },\n },\n },\n },\n {\n name: 'add_anchor',\n description:\n 'Add anchored fact/decision/constraint to current frame',\n inputSchema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: [\n 'FACT',\n 'DECISION',\n 'CONSTRAINT',\n 'INTERFACE_CONTRACT',\n 'TODO',\n 'RISK',\n ],\n description: 'Anchor type',\n },\n text: { type: 'string', description: 'Anchor content' },\n priority: {\n type: 'number',\n description: 'Priority (0-10)',\n minimum: 0,\n maximum: 10,\n },\n },\n required: ['type', 'text'],\n },\n },\n {\n name: 'get_hot_stack',\n description: 'Get current active frames and context',\n inputSchema: {\n type: 'object',\n properties: {\n maxEvents: {\n type: 'number',\n description: 'Max recent events per frame',\n default: 20,\n },\n },\n },\n },\n {\n name: 'create_task',\n description: 'Create a new task in git-tracked JSONL storage',\n inputSchema: {\n type: 'object',\n properties: {\n title: { type: 'string', description: 'Task title' },\n description: {\n type: 'string',\n description: 'Task description',\n },\n priority: {\n type: 'string',\n enum: ['low', 'medium', 'high', 'urgent'],\n description: 'Task priority',\n },\n estimatedEffort: {\n type: 'number',\n description: 'Estimated effort in minutes',\n },\n dependsOn: {\n type: 'array',\n items: { type: 'string' },\n description: 'Task IDs this depends on',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Tags for categorization',\n },\n },\n required: ['title'],\n },\n },\n {\n name: 'update_task_status',\n description: 'Update task status with automatic time tracking',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: 'Task ID to update' },\n status: {\n type: 'string',\n enum: [\n 'pending',\n 'in_progress',\n 'completed',\n 'blocked',\n 'cancelled',\n ],\n description: 'New status',\n },\n reason: {\n type: 'string',\n description:\n 'Reason for status change (especially for blocked)',\n },\n },\n required: ['taskId', 'status'],\n },\n },\n {\n name: 'get_active_tasks',\n description: 'Get currently active tasks synced from Linear',\n inputSchema: {\n type: 'object',\n properties: {\n frameId: {\n type: 'string',\n description: 'Filter by specific frame ID',\n },\n status: {\n type: 'string',\n enum: [\n 'pending',\n 'in_progress',\n 'completed',\n 'blocked',\n 'cancelled',\n ],\n description: 'Filter by status',\n },\n priority: {\n type: 'string',\n enum: ['low', 'medium', 'high', 'urgent'],\n description: 'Filter by priority',\n },\n search: {\n type: 'string',\n description: 'Search in task title or description',\n },\n limit: {\n type: 'number',\n description: 'Max number of tasks to return (default: 20)',\n },\n },\n },\n },\n {\n name: 'get_task_metrics',\n description: 'Get project task metrics and analytics',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'add_task_dependency',\n description: 'Add dependency relationship between tasks',\n inputSchema: {\n type: 'object',\n properties: {\n taskId: {\n type: 'string',\n description: 'Task that depends on another',\n },\n dependsOnId: {\n type: 'string',\n description: 'Task ID that this depends on',\n },\n },\n required: ['taskId', 'dependsOnId'],\n },\n },\n {\n name: 'linear_sync',\n description: 'Sync tasks with Linear',\n inputSchema: {\n type: 'object',\n properties: {\n direction: {\n type: 'string',\n enum: ['bidirectional', 'to_linear', 'from_linear'],\n description: 'Sync direction',\n },\n },\n },\n },\n {\n name: 'linear_update_task',\n description: 'Update a Linear task status',\n inputSchema: {\n type: 'object',\n properties: {\n issueId: {\n type: 'string',\n description: 'Linear issue ID or identifier (e.g., STA-34)',\n },\n status: {\n type: 'string',\n enum: ['todo', 'in-progress', 'done', 'canceled'],\n description: 'New status for the task',\n },\n title: {\n type: 'string',\n description: 'Update task title (optional)',\n },\n description: {\n type: 'string',\n description: 'Update task description (optional)',\n },\n priority: {\n type: 'number',\n enum: [1, 2, 3, 4],\n description: 'Priority (1=urgent, 2=high, 3=medium, 4=low)',\n },\n },\n required: ['issueId'],\n },\n },\n {\n name: 'linear_get_tasks',\n description: 'Get Linear tasks',\n inputSchema: {\n type: 'object',\n properties: {\n status: {\n type: 'string',\n enum: ['todo', 'in-progress', 'done', 'all'],\n description: 'Filter by status',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of tasks to return',\n },\n },\n },\n },\n {\n name: 'linear_status',\n description: 'Get Linear integration status',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'get_traces',\n description: 'Get detected traces (bundled tool call sequences)',\n inputSchema: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n enum: [\n 'search_driven',\n 'error_recovery',\n 'feature_implementation',\n 'refactoring',\n 'testing',\n 'exploration',\n 'debugging',\n 'documentation',\n 'build_deploy',\n 'unknown',\n ],\n description: 'Filter by trace type',\n },\n minScore: {\n type: 'number',\n description: 'Minimum importance score (0-1)',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of traces to return',\n },\n },\n },\n },\n {\n name: 'get_trace_statistics',\n description: 'Get statistics about detected traces',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'flush_traces',\n description: 'Flush any pending trace and finalize detection',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'compress_old_traces',\n description: 'Compress traces older than specified hours',\n inputSchema: {\n type: 'object',\n properties: {\n ageHours: {\n type: 'number',\n description: 'Age threshold in hours (default: 24)',\n },\n },\n },\n },\n {\n name: 'smart_context',\n description:\n 'LLM-driven context retrieval - intelligently selects relevant frames based on query',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description:\n 'Natural language query describing what context you need',\n },\n tokenBudget: {\n type: 'number',\n description:\n 'Maximum tokens to use for context (default: 4000)',\n },\n forceRefresh: {\n type: 'boolean',\n description: 'Force refresh of cached summaries',\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'get_summary',\n description:\n 'Get compressed summary of project memory for analysis',\n inputSchema: {\n type: 'object',\n properties: {\n forceRefresh: {\n type: 'boolean',\n description: 'Force refresh of cached summary',\n },\n },\n },\n },\n ],\n };\n }\n );\n\n // Tool execution\n this.server.setRequestHandler(\n z.object({\n method: z.literal('tools/call'),\n params: z.object({\n name: z.string(),\n arguments: z.record(z.unknown()),\n }),\n }),\n async (request) => {\n const { name, arguments: args } = request.params;\n const callId = uuidv4();\n const startTime = Date.now();\n\n // Log tool call event before execution\n const currentFrameId = this.frameManager.getCurrentFrameId();\n if (currentFrameId) {\n this.frameManager.addEvent('tool_call', {\n tool_name: name,\n arguments: args,\n timestamp: startTime,\n });\n }\n\n // Create ToolCall for trace detection\n const toolCall: ToolCall = {\n id: callId,\n tool: name,\n arguments: args,\n timestamp: startTime,\n };\n\n let result;\n let error;\n\n try {\n switch (name) {\n case 'get_context':\n result = await this.handleGetContext(args);\n break;\n\n case 'add_decision':\n result = await this.handleAddDecision(args);\n break;\n\n case 'start_frame':\n result = await this.handleStartFrame(args);\n break;\n\n case 'close_frame':\n result = await this.handleCloseFrame(args);\n break;\n\n case 'add_anchor':\n result = await this.handleAddAnchor(args);\n break;\n\n case 'get_hot_stack':\n result = await this.handleGetHotStack(args);\n break;\n\n case 'create_task':\n result = await this.handleCreateTask(args);\n break;\n\n case 'update_task_status':\n result = await this.handleUpdateTaskStatus(args);\n break;\n\n case 'get_active_tasks':\n result = await this.handleGetActiveTasks(args);\n break;\n\n case 'get_task_metrics':\n result = await this.handleGetTaskMetrics(args);\n break;\n\n case 'add_task_dependency':\n result = await this.handleAddTaskDependency(args);\n break;\n\n case 'linear_sync':\n result = await this.handleLinearSync(args);\n break;\n\n case 'linear_update_task':\n result = await this.handleLinearUpdateTask(args);\n break;\n\n case 'linear_get_tasks':\n result = await this.handleLinearGetTasks(args);\n break;\n\n case 'linear_status':\n result = await this.handleLinearStatus(args);\n break;\n\n case 'get_traces':\n result = await this.handleGetTraces(args);\n break;\n\n case 'get_trace_statistics':\n result = await this.handleGetTraceStatistics(args);\n break;\n\n case 'flush_traces':\n result = await this.handleFlushTraces(args);\n break;\n\n case 'compress_old_traces':\n result = await this.handleCompressOldTraces(args);\n break;\n\n case 'smart_context':\n result = await this.handleSmartContext(args);\n break;\n\n case 'get_summary':\n result = await this.handleGetSummary(args);\n break;\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (err: unknown) {\n error = err instanceof Error ? err : new Error(String(err));\n toolCall.error = error.message;\n throw err;\n } finally {\n const endTime = Date.now();\n\n // Log tool result event after execution (success or failure)\n // Skip for close_frame since the frame no longer exists after closing\n if (currentFrameId && name !== 'close_frame') {\n try {\n this.frameManager.addEvent('tool_result', {\n tool_name: name,\n success: !error,\n result: error ? { error: error.message } : result,\n timestamp: endTime,\n });\n } catch {\n // Frame may have been closed, ignore logging error\n }\n }\n\n // Update tool call with results and add to trace detector\n toolCall.result = error ? undefined : result;\n toolCall.duration = endTime - startTime;\n\n // Extract files affected if available from result or args\n if (args.file_path || args.path) {\n toolCall.filesAffected = [args.file_path || args.path].filter(\n Boolean\n ) as string[];\n } else if ((result as any)?.files) {\n const files = (result as any).files;\n toolCall.filesAffected = Array.isArray(files) ? files : [files];\n }\n\n // Add to trace detector\n this.traceDetector.addToolCall(toolCall);\n }\n\n return result;\n }\n );\n }\n\n private async handleGetContext(args: any) {\n const { query = '', limit = 10 } = args;\n\n // Get relevant contexts\n const contexts = Array.from(this.contexts.values())\n .sort((a, b) => b.importance - a.importance)\n .slice(0, limit);\n\n // Update access counts\n contexts.forEach((ctx) => {\n this.db\n .prepare(\n `\n UPDATE contexts \n SET last_accessed = unixepoch(), \n access_count = access_count + 1\n WHERE id = ?\n `\n )\n .run(ctx.id);\n });\n\n // Format response\n const response = contexts\n .map(\n (ctx) =>\n `[${ctx.type.toUpperCase()}] (importance: ${ctx.importance.toFixed(2)})\\n${ctx.content}`\n )\n .join('\\n\\n---\\n\\n');\n\n // Log for attention tracking\n this.logAttention(query, response);\n\n return {\n content: [\n {\n type: 'text',\n text:\n response ||\n 'No context available yet. Start adding decisions and information!',\n },\n ],\n };\n }\n\n private async handleAddDecision(args: any) {\n const { content, type = 'decision' } = args;\n\n const id = this.addContext(type, content, 0.8);\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2713 Added ${type}: ${content}\\nID: ${id}`,\n },\n ],\n };\n }\n\n private async handleStartFrame(args: any) {\n const { name, type, constraints } = args;\n\n const inputs: Record<string, any> = {};\n if (constraints) {\n inputs.constraints = constraints;\n }\n\n const frameId = this.frameManager.createFrame({\n type: type as FrameType,\n name,\n inputs,\n });\n\n // Log event\n this.frameManager.addEvent('user_message', {\n action: 'start_frame',\n name,\n type,\n constraints,\n });\n\n // Add as context\n this.addContext('active_frame', `Active frame: ${name} (${type})`, 0.9);\n\n const stackDepth = this.frameManager.getStackDepth();\n\n return {\n content: [\n {\n type: 'text',\n text: `\uD83D\uDE80 Started ${type}: ${name}\\nFrame ID: ${frameId}\\nStack depth: ${stackDepth}`,\n },\n ],\n };\n }\n\n private async handleCloseFrame(args: any) {\n const { result, outputs } = args;\n const currentFrameId = this.frameManager.getCurrentFrameId();\n\n if (!currentFrameId) {\n return {\n content: [\n {\n type: 'text',\n text: '\u26A0\uFE0F No active frame to close',\n },\n ],\n };\n }\n\n // Log completion event\n this.frameManager.addEvent('assistant_message', {\n action: 'close_frame',\n result,\n outputs,\n });\n\n this.frameManager.closeFrame(currentFrameId, outputs);\n\n const newStackDepth = this.frameManager.getStackDepth();\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 Closed frame: ${result || 'completed'}\\nStack depth: ${newStackDepth}`,\n },\n ],\n };\n }\n\n private async handleAddAnchor(args: any) {\n const { type, text, priority = 5 } = args;\n\n const anchorId = this.frameManager.addAnchor(type, text, priority);\n\n // Log anchor creation\n this.frameManager.addEvent('decision', {\n anchor_type: type,\n text,\n priority,\n anchor_id: anchorId,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\uD83D\uDCCC Added ${type}: ${text}\\nAnchor ID: ${anchorId}`,\n },\n ],\n };\n }\n\n private async handleGetHotStack(args: any) {\n const { maxEvents = 20 } = args;\n\n const hotStack = this.frameManager.getHotStackContext(maxEvents);\n const activePath = this.frameManager.getActiveFramePath();\n\n if (hotStack.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '\uD83D\uDCDA No active frames. Start a frame with start_frame tool.',\n },\n ],\n };\n }\n\n let response = '\uD83D\uDCDA **Active Call Stack:**\\n\\n';\n\n activePath.forEach((frame, index) => {\n const indent = ' '.repeat(index);\n const context = hotStack[index];\n\n response += `${indent}${index + 1}. **${frame.name}** (${frame.type})\\n`;\n\n if (context && context.anchors && context.anchors.length > 0) {\n response += `${indent} \uD83D\uDCCC ${context.anchors.length} anchors\\n`;\n }\n\n if (context && context.recentEvents && context.recentEvents.length > 0) {\n response += `${indent} \uD83D\uDCDD ${context.recentEvents.length} recent events\\n`;\n }\n\n response += '\\n';\n });\n\n response += `**Total stack depth:** ${hotStack.length}`;\n\n // Log stack access\n this.frameManager.addEvent('observation', {\n action: 'get_hot_stack',\n stack_depth: hotStack.length,\n total_anchors: hotStack.reduce(\n (sum, frame) => sum + frame.anchors.length,\n 0\n ),\n total_events: hotStack.reduce(\n (sum, frame) => sum + frame.recentEvents.length,\n 0\n ),\n });\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n }\n\n private logAttention(query: string, response: string) {\n // Simple attention logging for analysis\n this.db\n .prepare(\n `\n INSERT INTO attention_log (query, response)\n VALUES (?, ?)\n `\n )\n .run(query, response);\n }\n\n private async handleCreateTask(args: any) {\n const { title, description, priority, estimatedEffort, dependsOn, tags } =\n args;\n const currentFrameId = this.frameManager.getCurrentFrameId();\n\n if (!currentFrameId) {\n return {\n content: [\n {\n type: 'text',\n text: '\u26A0\uFE0F No active frame. Start a frame first with start_frame tool.',\n },\n ],\n };\n }\n\n const taskId = this.taskStore.createTask({\n title,\n description,\n priority: priority as TaskPriority,\n frameId: currentFrameId,\n dependsOn,\n tags,\n estimatedEffort,\n });\n\n // Log task creation event\n this.frameManager.addEvent('decision', {\n action: 'create_task',\n task_id: taskId,\n title,\n priority: priority || 'medium',\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 Created task: ${title}\\nID: ${taskId}\\nFrame: ${currentFrameId}\\nStored in: .stackmemory/tasks.jsonl`,\n },\n ],\n };\n }\n\n private async handleUpdateTaskStatus(args: any) {\n const { taskId, status, reason } = args;\n\n try {\n this.taskStore.updateTaskStatus(taskId, status as TaskStatus, reason);\n\n // Log status change event\n this.frameManager.addEvent('observation', {\n action: 'update_task_status',\n task_id: taskId,\n new_status: status,\n reason,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 Updated task ${taskId} to ${status}${reason ? `\\nReason: ${reason}` : ''}`,\n },\n ],\n };\n } catch (error: unknown) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to update task: ${error}`,\n },\n ],\n };\n }\n }\n\n private async handleGetActiveTasks(args: any) {\n const { frameId, status, priority, search, limit = 20 } = args;\n let tasks = this.taskStore.getActiveTasks(frameId);\n\n // Apply filters\n if (status) {\n tasks = tasks.filter((t) => t.status === status);\n }\n if (priority) {\n tasks = tasks.filter((t) => t.priority === priority);\n }\n if (search) {\n const searchLower = search.toLowerCase();\n tasks = tasks.filter(\n (t) =>\n t.title.toLowerCase().includes(searchLower) ||\n (t.description && t.description.toLowerCase().includes(searchLower))\n );\n }\n\n // Sort by priority (urgent first) then by created_at\n const priorityOrder = { urgent: 0, high: 1, medium: 2, low: 3 };\n tasks.sort((a, b) => {\n const pa = priorityOrder[a.priority] ?? 2;\n const pb = priorityOrder[b.priority] ?? 2;\n if (pa !== pb) return pa - pb;\n return b.created_at - a.created_at;\n });\n\n // Limit results\n tasks = tasks.slice(0, limit);\n\n if (tasks.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: search\n ? `\uD83D\uDCDD No tasks matching \"${search}\"`\n : '\uD83D\uDCDD No active tasks found',\n },\n ],\n };\n }\n\n let response = `\uD83D\uDCDD **Tasks** (${tasks.length} found)\\n\\n`;\n tasks.forEach((task) => {\n const priorityIcon =\n { urgent: '\uD83D\uDD34', high: '\uD83D\uDFE0', medium: '\uD83D\uDFE1', low: '\uD83D\uDFE2' }[task.priority] ||\n '\u26AA';\n const statusIcon =\n {\n pending: '\u23F3',\n in_progress: '\uD83D\uDD04',\n completed: '\u2705',\n blocked: '\uD83D\uDEAB',\n cancelled: '\u274C',\n }[task.status] || '\u26AA';\n const effort = task.estimated_effort\n ? ` (~${task.estimated_effort}m)`\n : '';\n\n // Extract Linear ID from title if present\n const linearMatch = task.title.match(/\\[ENG-\\d+\\]/);\n const linearId = linearMatch ? linearMatch[0] : '';\n const title = linearId\n ? task.title.replace(linearId, '').trim()\n : task.title;\n\n response += `${statusIcon} ${priorityIcon} **${linearId || task.id}** ${title}${effort}\\n`;\n if (task.description) {\n const desc = task.description.split('\\n')[0].slice(0, 100);\n response += ` ${desc}${task.description.length > 100 ? '...' : ''}\\n`;\n }\n if (task.tags && task.tags.length > 0) {\n response += ` \uD83C\uDFF7\uFE0F ${task.tags.join(', ')}\\n`;\n }\n response += '\\n';\n });\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n }\n\n private async handleGetTaskMetrics(_args: any) {\n const metrics = this.taskStore.getMetrics();\n\n let response = '\uD83D\uDCCA **Task Metrics**\\n\\n';\n response += `**Total Tasks:** ${metrics.total_tasks}\\n`;\n response += `**Completion Rate:** ${(metrics.completion_rate * 100).toFixed(1)}%\\n\\n`;\n\n response += '**By Status:**\\n';\n Object.entries(metrics.by_status).forEach(([status, count]) => {\n response += `- ${status}: ${count}\\n`;\n });\n\n response += '\\n**By Priority:**\\n';\n Object.entries(metrics.by_priority).forEach(([priority, count]) => {\n response += `- ${priority}: ${count}\\n`;\n });\n\n if (metrics.blocked_tasks > 0) {\n response += `\\n\u26A0\uFE0F **${metrics.blocked_tasks} blocked tasks**`;\n }\n\n if (metrics.avg_effort_accuracy > 0) {\n response += `\\n\uD83C\uDFAF **Effort Accuracy:** ${(metrics.avg_effort_accuracy * 100).toFixed(1)}%`;\n }\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n }\n\n private async handleAddTaskDependency(args: any) {\n const { taskId, dependsOnId } = args;\n\n try {\n this.taskStore.addDependency(taskId, dependsOnId);\n\n // Log dependency creation\n this.frameManager.addEvent('decision', {\n action: 'add_task_dependency',\n task_id: taskId,\n depends_on_id: dependsOnId,\n });\n\n return {\n content: [\n {\n type: 'text',\n text: `\uD83D\uDD17 Added dependency: ${taskId} depends on ${dependsOnId}`,\n },\n ],\n };\n } catch (error: unknown) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to add dependency: ${error}`,\n },\n ],\n };\n }\n }\n\n // Linear Integration Handlers\n private async handleLinearSync(args: any) {\n try {\n const tokens = this.linearAuthManager.loadTokens();\n\n if (!tokens) {\n return {\n content: [\n {\n type: 'text',\n text: '\u274C Linear not authenticated. Run: stackmemory linear setup',\n },\n ],\n };\n }\n\n const syncConfig = { ...DEFAULT_SYNC_CONFIG, enabled: true };\n if (args.direction) {\n syncConfig.direction = args.direction;\n }\n\n // Update sync engine configuration for this sync\n this.linearSync.updateConfig(syncConfig);\n const result = await this.linearSync.sync();\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 Linear sync completed\\n- To Linear: ${result.synced.toLinear} tasks\\n- From Linear: ${result.synced.fromLinear} tasks\\n- Updated: ${result.synced.updated} tasks`,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Linear sync failed: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleLinearUpdateTask(args: any) {\n try {\n const { LinearClient } = await import('../linear/client.js');\n\n const tokens = this.linearAuthManager.loadTokens();\n\n if (!tokens) {\n return {\n content: [\n {\n type: 'text',\n text: '\u274C Linear not authenticated. Run: stackmemory linear setup',\n },\n ],\n };\n }\n\n const client = new LinearClient({\n apiKey: tokens.accessToken,\n useBearer: true,\n onUnauthorized: async () => {\n const refreshed = await this.linearAuthManager.refreshAccessToken();\n return refreshed.accessToken;\n },\n });\n\n // Find the issue\n let issue = await client.getIssue(args.issueId);\n if (!issue) {\n issue = await client.findIssueByIdentifier(args.issueId);\n }\n\n if (!issue) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Linear issue ${args.issueId} not found`,\n },\n ],\n };\n }\n\n const updates: any = {};\n\n // Handle status update\n if (args.status) {\n const team = await client.getTeam();\n const states = await client.getWorkflowStates(team.id);\n\n const statusMap: Record<string, string> = {\n todo: 'unstarted',\n 'in-progress': 'started',\n done: 'completed',\n canceled: 'cancelled',\n };\n\n const targetType = statusMap[args.status] || args.status;\n const targetState = states.find((s: any) => s.type === targetType);\n\n if (!targetState) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Invalid status: ${args.status}`,\n },\n ],\n };\n }\n\n updates.stateId = targetState.id;\n }\n\n if (args.title) updates.title = args.title;\n if (args.description) updates.description = args.description;\n if (args.priority) updates.priority = args.priority;\n\n const updatedIssue = await client.updateIssue(issue.id, updates);\n\n // Auto-sync to local tasks after update\n this.linearSync.updateConfig({\n ...DEFAULT_SYNC_CONFIG,\n enabled: true,\n direction: 'from_linear',\n });\n const syncResult = await this.linearSync.sync();\n\n let response = `\u2705 Updated ${updatedIssue.identifier}: ${updatedIssue.title}\\n`;\n if (args.status) {\n response += `Status: ${updatedIssue.state.name}\\n`;\n }\n response += `URL: ${updatedIssue.url}\\n`;\n response += `\\n\uD83D\uDD04 Local sync: ${syncResult.synced.fromLinear} new, ${syncResult.synced.updated} updated`;\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to update Linear task: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleLinearGetTasks(args: any) {\n try {\n const { LinearClient } = await import('../linear/client.js');\n\n const tokens = this.linearAuthManager.loadTokens();\n\n if (!tokens) {\n return {\n content: [\n {\n type: 'text',\n text: '\u274C Linear not authenticated. Run: stackmemory linear setup',\n },\n ],\n };\n }\n\n const client = new LinearClient({\n apiKey: tokens.accessToken,\n useBearer: true,\n onUnauthorized: async () => {\n const refreshed = await this.linearAuthManager.refreshAccessToken();\n return refreshed.accessToken;\n },\n });\n\n let stateType: any = undefined;\n if (args.status && args.status !== 'all') {\n const statusMap: Record<string, string> = {\n todo: 'unstarted',\n 'in-progress': 'started',\n done: 'completed',\n };\n stateType = statusMap[args.status] || args.status;\n }\n\n const issues = await client.getIssues({\n stateType,\n limit: args.limit || 20,\n });\n\n if (!issues || issues.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No Linear tasks found',\n },\n ],\n };\n }\n\n let response = `\uD83D\uDCCB **Linear Tasks** (${issues.length} items)\\n\\n`;\n issues.forEach((issue: any) => {\n const priority = issue.priority ? `P${issue.priority}` : '-';\n response += `- **${issue.identifier}**: ${issue.title}\\n`;\n response += ` Status: ${issue.state.name} | Priority: ${priority}\\n`;\n if (issue.assignee) {\n response += ` Assignee: ${issue.assignee.name}\\n`;\n }\n response += ` ${issue.url}\\n\\n`;\n });\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to get Linear tasks: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleLinearStatus(_args: any) {\n try {\n const { LinearClient } = await import('../linear/client.js');\n\n const tokens = this.linearAuthManager.loadTokens();\n\n if (!tokens) {\n return {\n content: [\n {\n type: 'text',\n text: '\u274C Linear integration not configured\\nRun: stackmemory linear setup',\n },\n ],\n };\n }\n\n try {\n const client = new LinearClient({\n apiKey: tokens.accessToken,\n useBearer: true,\n onUnauthorized: async () => {\n const refreshed = await this.linearAuthManager.refreshAccessToken();\n return refreshed.accessToken;\n },\n });\n\n const viewer = await client.getViewer();\n const team = await client.getTeam();\n\n return {\n content: [\n {\n type: 'text',\n text: `\u2705 **Linear Integration Status**\\n\\nConnected as: ${viewer.name} (${viewer.email})\\nTeam: ${team.name} (${team.key})\\nTokens: Valid`,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u26A0\uFE0F Linear configured but connection failed: ${error.message}`,\n },\n ],\n };\n }\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Linear status check failed: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleGetTraces(args: any) {\n const { type, minScore, limit = 20 } = args;\n\n // Flush pending traces first\n this.traceDetector.flush();\n\n let traces = this.traceDetector.getTraces();\n\n // Apply filters\n if (type) {\n traces = traces.filter((t) => t.type === type);\n }\n\n if (minScore !== undefined) {\n traces = traces.filter((t) => t.score >= minScore);\n }\n\n // Sort by score and limit\n traces = traces.sort((a, b) => b.score - a.score).slice(0, limit);\n\n // Format traces for display\n const formattedTraces = traces.map((trace) => ({\n id: trace.id,\n type: trace.type,\n score: trace.score.toFixed(2),\n summary: trace.summary,\n toolCount: trace.tools.length,\n duration: `${((trace.metadata.endTime - trace.metadata.startTime) / 1000).toFixed(1)}s`,\n filesModified: trace.metadata.filesModified.length,\n hasErrors: trace.metadata.errorsEncountered.length > 0,\n compressed: !!trace.compressed,\n }));\n\n return {\n content: [\n {\n type: 'text',\n text: `Found ${formattedTraces.length} traces:\\n\\n${formattedTraces\n .map(\n (t) =>\n `[${t.type}] Score: ${t.score} | Tools: ${t.toolCount} | Duration: ${t.duration}\\n ${t.summary}`\n )\n .join('\\n\\n')}`,\n },\n ],\n };\n }\n\n private async handleGetTraceStatistics(args: any) {\n this.traceDetector.flush();\n const stats = this.traceDetector.getStatistics();\n\n const typeBreakdown = Object.entries(stats.tracesByType)\n .map(([type, count]) => ` ${type}: ${count}`)\n .join('\\n');\n\n return {\n content: [\n {\n type: 'text',\n text: `**Trace Statistics**\\n\\nTotal Traces: ${stats.totalTraces}\nAverage Score: ${stats.averageScore.toFixed(2)}\nAverage Length: ${stats.averageLength.toFixed(1)} tools\nHigh Importance (>0.7): ${stats.highImportanceCount}\nCompressed: ${stats.compressedCount}\n\n**Trace Types:**\n${typeBreakdown}`,\n },\n ],\n };\n }\n\n private async handleFlushTraces(args: any) {\n this.traceDetector.flush();\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pending traces have been flushed and finalized.',\n },\n ],\n };\n }\n\n private async handleCompressOldTraces(args: any) {\n const { ageHours = 24 } = args;\n\n const compressedCount = this.traceDetector.compressOldTraces(ageHours);\n\n return {\n content: [\n {\n type: 'text',\n text: `Compressed ${compressedCount} traces older than ${ageHours} hours.`,\n },\n ],\n };\n }\n\n private async handleSmartContext(args: any) {\n const { query, tokenBudget = 4000, forceRefresh = false } = args;\n\n try {\n const result = await this.contextRetrieval.retrieveContext(query, {\n tokenBudget,\n forceRefresh,\n });\n\n // Log the retrieval\n const currentFrameId = this.frameManager.getCurrentFrameId();\n if (currentFrameId) {\n this.frameManager.addEvent('observation', {\n action: 'smart_context',\n query,\n framesRetrieved: result.frames.length,\n tokenUsage: result.tokenUsage,\n confidence: result.analysis.confidenceScore,\n });\n }\n\n // Build response with metadata\n let response = result.context;\n response += `\\n\\n---\\n\uD83D\uDCCA **Retrieval Stats**\\n`;\n response += `- Frames included: ${result.frames.length}\\n`;\n response += `- Tokens used: ${result.tokenUsage.used}/${result.tokenUsage.budget}\\n`;\n response += `- Confidence: ${(result.analysis.confidenceScore * 100).toFixed(0)}%\\n`;\n response += `- Time: ${result.metadata.retrievalTimeMs}ms`;\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Context retrieval failed: ${error.message}`,\n },\n ],\n };\n }\n }\n\n private async handleGetSummary(args: any) {\n const { forceRefresh = false } = args;\n\n try {\n const summary = this.contextRetrieval.getSummary(forceRefresh);\n\n // Format the summary for display\n let response = '\uD83D\uDCCB **Compressed Memory Summary**\\n\\n';\n\n // Recent session\n response += '## Recent Session\\n';\n response += `- Frames: ${summary.recentSession.frames.length}\\n`;\n response += `- Time range: ${new Date(summary.recentSession.timeRange.start).toLocaleString()} - ${new Date(summary.recentSession.timeRange.end).toLocaleString()}\\n`;\n\n if (summary.recentSession.dominantOperations.length > 0) {\n response += `- Dominant ops: ${summary.recentSession.dominantOperations\n .slice(0, 5)\n .map((o) => `${o.operation}(${o.count})`)\n .join(', ')}\\n`;\n }\n\n if (summary.recentSession.filesTouched.length > 0) {\n response += `- Files touched: ${summary.recentSession.filesTouched\n .slice(0, 5)\n .map((f) => f.path)\n .join(', ')}\\n`;\n }\n\n if (summary.recentSession.errorsEncountered.length > 0) {\n response += `- Errors: ${summary.recentSession.errorsEncountered.length}\\n`;\n }\n\n // Historical patterns\n response += '\\n## Historical Patterns\\n';\n response += `- Topic counts: ${Object.keys(summary.historicalPatterns.topicFrameCounts).length} topics\\n`;\n\n if (summary.historicalPatterns.keyDecisions.length > 0) {\n response += `\\n### Key Decisions (${summary.historicalPatterns.keyDecisions.length})\\n`;\n summary.historicalPatterns.keyDecisions.slice(0, 5).forEach((d) => {\n response += `- ${d.text.substring(0, 80)}${d.text.length > 80 ? '...' : ''}\\n`;\n });\n }\n\n if (summary.historicalPatterns.recurringIssues.length > 0) {\n response += `\\n### Recurring Issues (${summary.historicalPatterns.recurringIssues.length})\\n`;\n summary.historicalPatterns.recurringIssues.slice(0, 3).forEach((i) => {\n response += `- ${i.issueType} (${i.occurrenceCount} times)\\n`;\n });\n }\n\n // Queryable indices\n response += '\\n## Available Indices\\n';\n response += `- By time: ${Object.keys(summary.queryableIndices.byTimeframe).length} periods\\n`;\n response += `- By file: ${Object.keys(summary.queryableIndices.byFile).length} files\\n`;\n response += `- By topic: ${Object.keys(summary.queryableIndices.byTopic).length} topics\\n`;\n response += `- By error: ${Object.keys(summary.queryableIndices.byErrorType).length} error types\\n`;\n\n // Stats\n response += `\\n## Stats\\n`;\n response += `- Total frames: ${summary.stats.totalFrames}\\n`;\n response += `- Total anchors: ${summary.stats.totalAnchors}\\n`;\n response += `- Total events: ${summary.stats.totalEvents}\\n`;\n response += `- Generated: ${new Date(summary.generatedAt).toLocaleString()}`;\n\n return {\n content: [\n {\n type: 'text',\n text: response,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: `\u274C Failed to get summary: ${error.message}`,\n },\n ],\n };\n }\n }\n\n async start() {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error('StackMemory MCP Server started');\n }\n}\n\n// Export the class\nexport default LocalStackMemoryMCP;\n\n// Export function to run the server\nexport async function runMCPServer(): Promise<void> {\n const server = new LocalStackMemoryMCP();\n await server.start();\n}\n\n// Start the server\nif (import.meta.url === `file://${process.argv[1]}`) {\n const server = new LocalStackMemoryMCP();\n server.start().catch(console.error);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -9,8 +9,8 @@ import Database from "better-sqlite3";
9
9
  import { join } from "path";
10
10
  import { existsSync, mkdirSync } from "fs";
11
11
  import {
12
- PebblesTaskStore
13
- } from "../features/tasks/pebbles-task-store.js";
12
+ LinearTaskManager
13
+ } from "../features/tasks/linear-task-manager.js";
14
14
  import { FrameManager } from "../core/context/frame-manager.js";
15
15
  import { AgentTaskManager } from "../agents/core/agent-task-manager.js";
16
16
  import { logger } from "../core/monitoring/logger.js";
@@ -20,7 +20,7 @@ if (!existsSync(stackmemoryDir)) {
20
20
  mkdirSync(stackmemoryDir, { recursive: true });
21
21
  }
22
22
  const db = new Database(join(stackmemoryDir, "cache.db"));
23
- const taskStore = new PebblesTaskStore(PROJECT_ROOT, db);
23
+ const taskStore = new LinearTaskManager(PROJECT_ROOT, db);
24
24
  const frameManager = new FrameManager(db, PROJECT_ROOT, void 0);
25
25
  const agentTaskManager = new AgentTaskManager(taskStore, frameManager);
26
26
  let _claudeSessionId = null;