@stackmemoryai/stackmemory 0.5.23 → 0.5.24

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 (69) hide show
  1. package/dist/cli/claude-sm.js +2 -0
  2. package/dist/cli/claude-sm.js.map +2 -2
  3. package/dist/cli/commands/discovery.js +279 -0
  4. package/dist/cli/commands/discovery.js.map +7 -0
  5. package/dist/cli/index.js +2 -0
  6. package/dist/cli/index.js.map +2 -2
  7. package/dist/core/retrieval/llm-context-retrieval.js +1 -3
  8. package/dist/core/retrieval/llm-context-retrieval.js.map +3 -3
  9. package/dist/integrations/mcp/handlers/discovery-handlers.js +497 -0
  10. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  11. package/dist/integrations/mcp/handlers/index.js +40 -12
  12. package/dist/integrations/mcp/handlers/index.js.map +2 -2
  13. package/dist/integrations/mcp/server.js +270 -0
  14. package/dist/integrations/mcp/server.js.map +2 -2
  15. package/dist/integrations/mcp/tool-definitions.js +141 -5
  16. package/dist/integrations/mcp/tool-definitions.js.map +2 -2
  17. package/package.json +1 -1
  18. package/dist/cli/commands/agent.js +0 -286
  19. package/dist/cli/commands/agent.js.map +0 -7
  20. package/dist/cli/commands/chromadb.js +0 -482
  21. package/dist/cli/commands/chromadb.js.map +0 -7
  22. package/dist/cli/commands/gc.js +0 -251
  23. package/dist/cli/commands/gc.js.map +0 -7
  24. package/dist/cli/commands/infinite-storage.js +0 -292
  25. package/dist/cli/commands/infinite-storage.js.map +0 -7
  26. package/dist/cli/commands/linear-create.js +0 -171
  27. package/dist/cli/commands/linear-create.js.map +0 -7
  28. package/dist/cli/commands/linear-list.js +0 -103
  29. package/dist/cli/commands/linear-list.js.map +0 -7
  30. package/dist/cli/commands/linear-migrate.js +0 -64
  31. package/dist/cli/commands/linear-migrate.js.map +0 -7
  32. package/dist/cli/commands/linear-test.js +0 -134
  33. package/dist/cli/commands/linear-test.js.map +0 -7
  34. package/dist/cli/commands/tui.js +0 -77
  35. package/dist/cli/commands/tui.js.map +0 -7
  36. package/dist/cli/commands/webhook.js +0 -181
  37. package/dist/cli/commands/webhook.js.map +0 -7
  38. package/dist/cli/streamlined-cli.js +0 -144
  39. package/dist/cli/streamlined-cli.js.map +0 -7
  40. package/dist/core/events/event-bus.js +0 -110
  41. package/dist/core/events/event-bus.js.map +0 -7
  42. package/dist/core/frame/workflow-templates-stub.js +0 -42
  43. package/dist/core/frame/workflow-templates-stub.js.map +0 -7
  44. package/dist/core/plugins/plugin-interface.js +0 -87
  45. package/dist/core/plugins/plugin-interface.js.map +0 -7
  46. package/dist/core/session/clear-survival-stub.js +0 -53
  47. package/dist/core/session/clear-survival-stub.js.map +0 -7
  48. package/dist/core/storage/chromadb-simple.js +0 -172
  49. package/dist/core/storage/chromadb-simple.js.map +0 -7
  50. package/dist/core/storage/simplified-storage.js +0 -328
  51. package/dist/core/storage/simplified-storage.js.map +0 -7
  52. package/dist/features/tasks/pebbles-task-store.js +0 -647
  53. package/dist/features/tasks/pebbles-task-store.js.map +0 -7
  54. package/dist/integrations/linear/sync-enhanced.js +0 -202
  55. package/dist/integrations/linear/sync-enhanced.js.map +0 -7
  56. package/dist/plugins/linear/index.js +0 -166
  57. package/dist/plugins/linear/index.js.map +0 -7
  58. package/dist/plugins/loader.js +0 -57
  59. package/dist/plugins/loader.js.map +0 -7
  60. package/dist/plugins/plugin-interface.js +0 -67
  61. package/dist/plugins/plugin-interface.js.map +0 -7
  62. package/dist/plugins/ralph/simple-ralph-plugin.js +0 -305
  63. package/dist/plugins/ralph/simple-ralph-plugin.js.map +0 -7
  64. package/dist/plugins/ralph/use-cases/code-generator.js +0 -151
  65. package/dist/plugins/ralph/use-cases/code-generator.js.map +0 -7
  66. package/dist/plugins/ralph/use-cases/test-generator.js +0 -201
  67. package/dist/plugins/ralph/use-cases/test-generator.js.map +0 -7
  68. package/dist/utils/logger.js +0 -52
  69. package/dist/utils/logger.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/integrations/mcp/handlers/index.ts"],
4
- "sourcesContent": ["/**\n * MCP Handler Modules\n * Centralized exports for all MCP tool handlers\n */\n\nexport { ContextHandlers, type ContextHandlerDependencies } from './context-handlers.js';\nexport { TaskHandlers, type TaskHandlerDependencies } from './task-handlers.js';\nexport { LinearHandlers, type LinearHandlerDependencies } from './linear-handlers.js';\nexport { TraceHandlers, type TraceHandlerDependencies } from './trace-handlers.js';\n\nimport { ContextHandlers, ContextHandlerDependencies } from './context-handlers.js';\nimport { TaskHandlers, TaskHandlerDependencies } from './task-handlers.js';\nimport { LinearHandlers, LinearHandlerDependencies } from './linear-handlers.js';\nimport { TraceHandlers, TraceHandlerDependencies } from './trace-handlers.js';\n\n// Combined dependencies interface\nexport interface MCPHandlerDependencies extends \n ContextHandlerDependencies,\n TaskHandlerDependencies,\n LinearHandlerDependencies,\n TraceHandlerDependencies {\n}\n\n/**\n * Handler factory that creates all MCP tool handlers\n */\nexport class MCPHandlerFactory {\n private contextHandlers: ContextHandlers;\n private taskHandlers: TaskHandlers;\n private linearHandlers: LinearHandlers;\n private traceHandlers: TraceHandlers;\n\n constructor(deps: MCPHandlerDependencies) {\n this.contextHandlers = new ContextHandlers({\n frameManager: deps.frameManager,\n contextRetrieval: deps.contextRetrieval,\n });\n\n this.taskHandlers = new TaskHandlers({\n taskStore: deps.taskStore,\n projectId: deps.projectId,\n });\n\n this.linearHandlers = new LinearHandlers({\n linearAuthManager: deps.linearAuthManager,\n linearSync: deps.linearSync,\n taskStore: deps.taskStore,\n });\n\n this.traceHandlers = new TraceHandlers({\n traceDetector: deps.traceDetector,\n browserMCP: deps.browserMCP,\n });\n }\n\n /**\n * Get handler for a specific tool\n */\n getHandler(toolName: string): (args: any) => Promise<any> {\n switch (toolName) {\n // Context handlers\n case 'get_context':\n return this.contextHandlers.handleGetContext.bind(this.contextHandlers);\n case 'add_decision':\n return this.contextHandlers.handleAddDecision.bind(this.contextHandlers);\n case 'start_frame':\n return this.contextHandlers.handleStartFrame.bind(this.contextHandlers);\n case 'close_frame':\n return this.contextHandlers.handleCloseFrame.bind(this.contextHandlers);\n case 'add_anchor':\n return this.contextHandlers.handleAddAnchor.bind(this.contextHandlers);\n case 'get_hot_stack':\n return this.contextHandlers.handleGetHotStack.bind(this.contextHandlers);\n\n // Task handlers\n case 'create_task':\n return this.taskHandlers.handleCreateTask.bind(this.taskHandlers);\n case 'update_task_status':\n return this.taskHandlers.handleUpdateTaskStatus.bind(this.taskHandlers);\n case 'get_active_tasks':\n return this.taskHandlers.handleGetActiveTasks.bind(this.taskHandlers);\n case 'get_task_metrics':\n return this.taskHandlers.handleGetTaskMetrics.bind(this.taskHandlers);\n case 'add_task_dependency':\n return this.taskHandlers.handleAddTaskDependency.bind(this.taskHandlers);\n\n // Linear handlers\n case 'linear_sync':\n return this.linearHandlers.handleLinearSync.bind(this.linearHandlers);\n case 'linear_update_task':\n return this.linearHandlers.handleLinearUpdateTask.bind(this.linearHandlers);\n case 'linear_get_tasks':\n return this.linearHandlers.handleLinearGetTasks.bind(this.linearHandlers);\n case 'linear_status':\n return this.linearHandlers.handleLinearStatus.bind(this.linearHandlers);\n\n // Trace handlers\n case 'get_traces':\n return this.traceHandlers.handleGetTraces.bind(this.traceHandlers);\n case 'analyze_traces':\n return this.traceHandlers.handleAnalyzeTraces.bind(this.traceHandlers);\n case 'start_browser_debug':\n return this.traceHandlers.handleStartBrowserDebug.bind(this.traceHandlers);\n case 'take_screenshot':\n return this.traceHandlers.handleTakeScreenshot.bind(this.traceHandlers);\n case 'execute_script':\n return this.traceHandlers.handleExecuteScript.bind(this.traceHandlers);\n case 'stop_browser_debug':\n return this.traceHandlers.handleStopBrowserDebug.bind(this.traceHandlers);\n\n default:\n throw new Error(`Unknown tool: ${toolName}`);\n }\n }\n\n /**\n * Get all available tool names\n */\n getAvailableTools(): string[] {\n return [\n // Context tools\n 'get_context',\n 'add_decision', \n 'start_frame',\n 'close_frame',\n 'add_anchor',\n 'get_hot_stack',\n \n // Task tools\n 'create_task',\n 'update_task_status',\n 'get_active_tasks',\n 'get_task_metrics',\n 'add_task_dependency',\n \n // Linear tools\n 'linear_sync',\n 'linear_update_task',\n 'linear_get_tasks',\n 'linear_status',\n \n // Trace tools\n 'get_traces',\n 'analyze_traces',\n 'start_browser_debug',\n 'take_screenshot',\n 'execute_script',\n 'stop_browser_debug',\n ];\n }\n\n /**\n * Check if a tool exists\n */\n hasHandler(toolName: string): boolean {\n return this.getAvailableTools().includes(toolName);\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * MCP Handler Modules\n * Centralized exports for all MCP tool handlers\n */\n\nexport {\n ContextHandlers,\n type ContextHandlerDependencies,\n} from './context-handlers.js';\nexport { TaskHandlers, type TaskHandlerDependencies } from './task-handlers.js';\nexport {\n LinearHandlers,\n type LinearHandlerDependencies,\n} from './linear-handlers.js';\nexport {\n TraceHandlers,\n type TraceHandlerDependencies,\n} from './trace-handlers.js';\nexport {\n DiscoveryHandlers,\n type DiscoveryDependencies,\n} from './discovery-handlers.js';\n\nimport {\n ContextHandlers,\n ContextHandlerDependencies,\n} from './context-handlers.js';\nimport { TaskHandlers, TaskHandlerDependencies } from './task-handlers.js';\nimport {\n LinearHandlers,\n LinearHandlerDependencies,\n} from './linear-handlers.js';\nimport { TraceHandlers, TraceHandlerDependencies } from './trace-handlers.js';\n\n// Combined dependencies interface\nexport interface MCPHandlerDependencies\n extends\n ContextHandlerDependencies,\n TaskHandlerDependencies,\n LinearHandlerDependencies,\n TraceHandlerDependencies {}\n\n/**\n * Handler factory that creates all MCP tool handlers\n */\nexport class MCPHandlerFactory {\n private contextHandlers: ContextHandlers;\n private taskHandlers: TaskHandlers;\n private linearHandlers: LinearHandlers;\n private traceHandlers: TraceHandlers;\n\n constructor(deps: MCPHandlerDependencies) {\n this.contextHandlers = new ContextHandlers({\n frameManager: deps.frameManager,\n contextRetrieval: deps.contextRetrieval,\n });\n\n this.taskHandlers = new TaskHandlers({\n taskStore: deps.taskStore,\n projectId: deps.projectId,\n });\n\n this.linearHandlers = new LinearHandlers({\n linearAuthManager: deps.linearAuthManager,\n linearSync: deps.linearSync,\n taskStore: deps.taskStore,\n });\n\n this.traceHandlers = new TraceHandlers({\n traceDetector: deps.traceDetector,\n browserMCP: deps.browserMCP,\n });\n }\n\n /**\n * Get handler for a specific tool\n */\n getHandler(toolName: string): (args: any) => Promise<any> {\n switch (toolName) {\n // Context handlers\n case 'get_context':\n return this.contextHandlers.handleGetContext.bind(this.contextHandlers);\n case 'add_decision':\n return this.contextHandlers.handleAddDecision.bind(\n this.contextHandlers\n );\n case 'start_frame':\n return this.contextHandlers.handleStartFrame.bind(this.contextHandlers);\n case 'close_frame':\n return this.contextHandlers.handleCloseFrame.bind(this.contextHandlers);\n case 'add_anchor':\n return this.contextHandlers.handleAddAnchor.bind(this.contextHandlers);\n case 'get_hot_stack':\n return this.contextHandlers.handleGetHotStack.bind(\n this.contextHandlers\n );\n\n // Task handlers\n case 'create_task':\n return this.taskHandlers.handleCreateTask.bind(this.taskHandlers);\n case 'update_task_status':\n return this.taskHandlers.handleUpdateTaskStatus.bind(this.taskHandlers);\n case 'get_active_tasks':\n return this.taskHandlers.handleGetActiveTasks.bind(this.taskHandlers);\n case 'get_task_metrics':\n return this.taskHandlers.handleGetTaskMetrics.bind(this.taskHandlers);\n case 'add_task_dependency':\n return this.taskHandlers.handleAddTaskDependency.bind(\n this.taskHandlers\n );\n\n // Linear handlers\n case 'linear_sync':\n return this.linearHandlers.handleLinearSync.bind(this.linearHandlers);\n case 'linear_update_task':\n return this.linearHandlers.handleLinearUpdateTask.bind(\n this.linearHandlers\n );\n case 'linear_get_tasks':\n return this.linearHandlers.handleLinearGetTasks.bind(\n this.linearHandlers\n );\n case 'linear_status':\n return this.linearHandlers.handleLinearStatus.bind(this.linearHandlers);\n\n // Trace handlers\n case 'get_traces':\n return this.traceHandlers.handleGetTraces.bind(this.traceHandlers);\n case 'analyze_traces':\n return this.traceHandlers.handleAnalyzeTraces.bind(this.traceHandlers);\n case 'start_browser_debug':\n return this.traceHandlers.handleStartBrowserDebug.bind(\n this.traceHandlers\n );\n case 'take_screenshot':\n return this.traceHandlers.handleTakeScreenshot.bind(this.traceHandlers);\n case 'execute_script':\n return this.traceHandlers.handleExecuteScript.bind(this.traceHandlers);\n case 'stop_browser_debug':\n return this.traceHandlers.handleStopBrowserDebug.bind(\n this.traceHandlers\n );\n\n default:\n throw new Error(`Unknown tool: ${toolName}`);\n }\n }\n\n /**\n * Get all available tool names\n */\n getAvailableTools(): string[] {\n return [\n // Context tools\n 'get_context',\n 'add_decision',\n 'start_frame',\n 'close_frame',\n 'add_anchor',\n 'get_hot_stack',\n\n // Task tools\n 'create_task',\n 'update_task_status',\n 'get_active_tasks',\n 'get_task_metrics',\n 'add_task_dependency',\n\n // Linear tools\n 'linear_sync',\n 'linear_update_task',\n 'linear_get_tasks',\n 'linear_status',\n\n // Trace tools\n 'get_traces',\n 'analyze_traces',\n 'start_browser_debug',\n 'take_screenshot',\n 'execute_script',\n 'stop_browser_debug',\n ];\n }\n\n /**\n * Check if a tool exists\n */\n hasHandler(toolName: string): boolean {\n return this.getAvailableTools().includes(toolName);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ContextHandlers", "TaskHandlers", "LinearHandlers", "TraceHandlers"]
7
7
  }
@@ -20,6 +20,7 @@ import { logger } from "../../core/monitoring/logger.js";
20
20
  import { BrowserMCPIntegration } from "../../features/browser/browser-mcp.js";
21
21
  import { TraceDetector } from "../../core/trace/trace-detector.js";
22
22
  import { LLMContextRetrieval } from "../../core/retrieval/index.js";
23
+ import { DiscoveryHandlers } from "./handlers/discovery-handlers.js";
23
24
  import { v4 as uuidv4 } from "uuid";
24
25
  function getEnv(key, defaultValue) {
25
26
  const value = process.env[key];
@@ -45,6 +46,7 @@ class LocalStackMemoryMCP {
45
46
  browserMCP;
46
47
  traceDetector;
47
48
  contextRetrieval;
49
+ discoveryHandlers;
48
50
  constructor() {
49
51
  this.projectRoot = this.findProjectRoot();
50
52
  this.projectId = this.getProjectId();
@@ -84,6 +86,12 @@ class LocalStackMemoryMCP {
84
86
  this.frameManager,
85
87
  this.projectId
86
88
  );
89
+ this.discoveryHandlers = new DiscoveryHandlers({
90
+ frameManager: this.frameManager,
91
+ contextRetrieval: this.contextRetrieval,
92
+ db: this.db,
93
+ projectRoot: this.projectRoot
94
+ });
87
95
  this.setupHandlers();
88
96
  this.loadInitialContext();
89
97
  this.browserMCP.initialize(this.server).catch((error) => {
@@ -624,6 +632,90 @@ ${summary}...`, 0.8);
624
632
  }
625
633
  }
626
634
  }
635
+ },
636
+ // Discovery tools
637
+ {
638
+ name: "sm_discover",
639
+ description: "Discover relevant files based on current context. Extracts keywords from active frames and searches codebase.",
640
+ inputSchema: {
641
+ type: "object",
642
+ properties: {
643
+ query: {
644
+ type: "string",
645
+ description: "Optional query to focus the discovery"
646
+ },
647
+ depth: {
648
+ type: "string",
649
+ enum: ["shallow", "medium", "deep"],
650
+ description: "Search depth"
651
+ },
652
+ maxFiles: {
653
+ type: "number",
654
+ description: "Maximum files to return"
655
+ }
656
+ }
657
+ }
658
+ },
659
+ {
660
+ name: "sm_related_files",
661
+ description: "Find files related to a specific file or concept",
662
+ inputSchema: {
663
+ type: "object",
664
+ properties: {
665
+ file: {
666
+ type: "string",
667
+ description: "File path to find related files for"
668
+ },
669
+ concept: {
670
+ type: "string",
671
+ description: "Concept to search for"
672
+ },
673
+ maxFiles: {
674
+ type: "number",
675
+ description: "Maximum files to return"
676
+ }
677
+ }
678
+ }
679
+ },
680
+ {
681
+ name: "sm_session_summary",
682
+ description: "Get summary of current session with active tasks, files, and decisions",
683
+ inputSchema: {
684
+ type: "object",
685
+ properties: {
686
+ includeFiles: {
687
+ type: "boolean",
688
+ description: "Include recently accessed files"
689
+ },
690
+ includeDecisions: {
691
+ type: "boolean",
692
+ description: "Include recent decisions"
693
+ }
694
+ }
695
+ }
696
+ },
697
+ {
698
+ name: "sm_search",
699
+ description: "Search across StackMemory - frames, events, decisions, tasks",
700
+ inputSchema: {
701
+ type: "object",
702
+ properties: {
703
+ query: {
704
+ type: "string",
705
+ description: "Search query"
706
+ },
707
+ scope: {
708
+ type: "string",
709
+ enum: ["all", "frames", "events", "decisions", "tasks"],
710
+ description: "Scope of search"
711
+ },
712
+ limit: {
713
+ type: "number",
714
+ description: "Maximum results"
715
+ }
716
+ },
717
+ required: ["query"]
718
+ }
627
719
  }
628
720
  ]
629
721
  };
@@ -722,6 +814,19 @@ ${summary}...`, 0.8);
722
814
  case "get_summary":
723
815
  result = await this.handleGetSummary(args);
724
816
  break;
817
+ // Discovery tools
818
+ case "sm_discover":
819
+ result = await this.handleSmDiscover(args);
820
+ break;
821
+ case "sm_related_files":
822
+ result = await this.handleSmRelatedFiles(args);
823
+ break;
824
+ case "sm_session_summary":
825
+ result = await this.handleSmSessionSummary(args);
826
+ break;
827
+ case "sm_search":
828
+ result = await this.handleSmSearch(args);
829
+ break;
725
830
  default:
726
831
  throw new Error(`Unknown tool: ${name}`);
727
832
  }
@@ -1632,6 +1737,171 @@ ${typeBreakdown}`
1632
1737
  };
1633
1738
  }
1634
1739
  }
1740
+ // ============================================
1741
+ // Discovery Tools Handlers
1742
+ // ============================================
1743
+ async handleSmDiscover(args) {
1744
+ return this.discoveryHandlers.handleDiscover(args);
1745
+ }
1746
+ async handleSmRelatedFiles(args) {
1747
+ return this.discoveryHandlers.handleRelatedFiles(args);
1748
+ }
1749
+ async handleSmSessionSummary(args) {
1750
+ return this.discoveryHandlers.handleSessionSummary(args);
1751
+ }
1752
+ async handleSmSearch(args) {
1753
+ try {
1754
+ const { query, scope = "all", limit = 20 } = args;
1755
+ if (!query) {
1756
+ throw new Error("Query is required");
1757
+ }
1758
+ const results = [];
1759
+ if (scope === "all" || scope === "frames") {
1760
+ const frames = this.db.prepare(
1761
+ `
1762
+ SELECT frame_id, name, type, created_at, inputs, outputs
1763
+ FROM frames
1764
+ WHERE project_id = ? AND (name LIKE ? OR inputs LIKE ? OR outputs LIKE ?)
1765
+ ORDER BY created_at DESC
1766
+ LIMIT ?
1767
+ `
1768
+ ).all(
1769
+ this.projectId,
1770
+ `%${query}%`,
1771
+ `%${query}%`,
1772
+ `%${query}%`,
1773
+ limit
1774
+ );
1775
+ frames.forEach((f) => {
1776
+ results.push({
1777
+ type: "frame",
1778
+ id: f.frame_id,
1779
+ name: f.name,
1780
+ frameType: f.type,
1781
+ created: new Date(f.created_at * 1e3).toISOString()
1782
+ });
1783
+ });
1784
+ }
1785
+ if (scope === "all" || scope === "events") {
1786
+ const events = this.db.prepare(
1787
+ `
1788
+ SELECT e.event_id, e.type, e.data, e.timestamp, f.name as frame_name
1789
+ FROM events e
1790
+ JOIN frames f ON e.frame_id = f.frame_id
1791
+ WHERE f.project_id = ? AND e.data LIKE ?
1792
+ ORDER BY e.timestamp DESC
1793
+ LIMIT ?
1794
+ `
1795
+ ).all(this.projectId, `%${query}%`, limit);
1796
+ events.forEach((e) => {
1797
+ results.push({
1798
+ type: "event",
1799
+ id: e.event_id,
1800
+ eventType: e.type,
1801
+ frame: e.frame_name,
1802
+ timestamp: new Date(e.timestamp * 1e3).toISOString()
1803
+ });
1804
+ });
1805
+ }
1806
+ if (scope === "all" || scope === "decisions") {
1807
+ const anchors = this.db.prepare(
1808
+ `
1809
+ SELECT a.anchor_id, a.type, a.text, a.priority, a.created_at, f.name as frame_name
1810
+ FROM anchors a
1811
+ JOIN frames f ON a.frame_id = f.frame_id
1812
+ WHERE f.project_id = ? AND a.text LIKE ?
1813
+ ORDER BY a.created_at DESC
1814
+ LIMIT ?
1815
+ `
1816
+ ).all(this.projectId, `%${query}%`, limit);
1817
+ anchors.forEach((a) => {
1818
+ results.push({
1819
+ type: "decision",
1820
+ id: a.anchor_id,
1821
+ decisionType: a.type,
1822
+ text: a.text,
1823
+ priority: a.priority,
1824
+ frame: a.frame_name
1825
+ });
1826
+ });
1827
+ }
1828
+ if (scope === "all" || scope === "tasks") {
1829
+ try {
1830
+ const tasks = this.db.prepare(
1831
+ `
1832
+ SELECT id, title, description, status, priority
1833
+ FROM task_cache
1834
+ WHERE title LIKE ? OR description LIKE ?
1835
+ ORDER BY created_at DESC
1836
+ LIMIT ?
1837
+ `
1838
+ ).all(`%${query}%`, `%${query}%`, limit);
1839
+ tasks.forEach((t) => {
1840
+ results.push({
1841
+ type: "task",
1842
+ id: t.id,
1843
+ title: t.title,
1844
+ status: t.status,
1845
+ priority: t.priority
1846
+ });
1847
+ });
1848
+ } catch {
1849
+ }
1850
+ }
1851
+ let response = `# Search Results for "${query}"
1852
+
1853
+ `;
1854
+ response += `Found ${results.length} results
1855
+
1856
+ `;
1857
+ const grouped = results.reduce(
1858
+ (acc, r) => {
1859
+ if (!acc[r.type]) acc[r.type] = [];
1860
+ acc[r.type].push(r);
1861
+ return acc;
1862
+ },
1863
+ {}
1864
+ );
1865
+ for (const [type, items] of Object.entries(grouped)) {
1866
+ response += `## ${type.charAt(0).toUpperCase() + type.slice(1)}s (${items.length})
1867
+ `;
1868
+ for (const item of items.slice(0, 10)) {
1869
+ if (type === "frame") {
1870
+ response += `- [${item.frameType}] ${item.name}
1871
+ `;
1872
+ } else if (type === "decision") {
1873
+ response += `- [${item.decisionType}] ${item.text.slice(0, 60)}...
1874
+ `;
1875
+ } else if (type === "task") {
1876
+ response += `- [${item.status}] ${item.title}
1877
+ `;
1878
+ } else {
1879
+ response += `- ${JSON.stringify(item).slice(0, 80)}...
1880
+ `;
1881
+ }
1882
+ }
1883
+ response += "\n";
1884
+ }
1885
+ return {
1886
+ content: [
1887
+ {
1888
+ type: "text",
1889
+ text: response
1890
+ }
1891
+ ],
1892
+ metadata: { results, query, scope }
1893
+ };
1894
+ } catch (error) {
1895
+ return {
1896
+ content: [
1897
+ {
1898
+ type: "text",
1899
+ text: `\u274C Search failed: ${error.message}`
1900
+ }
1901
+ ]
1902
+ };
1903
+ }
1904
+ }
1635
1905
  async start() {
1636
1906
  const transport = new StdioServerTransport();
1637
1907
  await this.server.connect(transport);