@stackmemoryai/stackmemory 0.5.23 → 0.5.25

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 (72) hide show
  1. package/bin/opencode-sm +6 -0
  2. package/dist/cli/claude-sm.js +2 -0
  3. package/dist/cli/claude-sm.js.map +2 -2
  4. package/dist/cli/commands/discovery.js +279 -0
  5. package/dist/cli/commands/discovery.js.map +7 -0
  6. package/dist/cli/index.js +2 -0
  7. package/dist/cli/index.js.map +2 -2
  8. package/dist/cli/opencode-sm.js +448 -0
  9. package/dist/cli/opencode-sm.js.map +7 -0
  10. package/dist/core/retrieval/llm-context-retrieval.js +1 -3
  11. package/dist/core/retrieval/llm-context-retrieval.js.map +3 -3
  12. package/dist/integrations/mcp/handlers/discovery-handlers.js +497 -0
  13. package/dist/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
  14. package/dist/integrations/mcp/handlers/index.js +40 -12
  15. package/dist/integrations/mcp/handlers/index.js.map +2 -2
  16. package/dist/integrations/mcp/server.js +270 -0
  17. package/dist/integrations/mcp/server.js.map +2 -2
  18. package/dist/integrations/mcp/tool-definitions.js +141 -5
  19. package/dist/integrations/mcp/tool-definitions.js.map +2 -2
  20. package/package.json +3 -2
  21. package/dist/cli/commands/agent.js +0 -286
  22. package/dist/cli/commands/agent.js.map +0 -7
  23. package/dist/cli/commands/chromadb.js +0 -482
  24. package/dist/cli/commands/chromadb.js.map +0 -7
  25. package/dist/cli/commands/gc.js +0 -251
  26. package/dist/cli/commands/gc.js.map +0 -7
  27. package/dist/cli/commands/infinite-storage.js +0 -292
  28. package/dist/cli/commands/infinite-storage.js.map +0 -7
  29. package/dist/cli/commands/linear-create.js +0 -171
  30. package/dist/cli/commands/linear-create.js.map +0 -7
  31. package/dist/cli/commands/linear-list.js +0 -103
  32. package/dist/cli/commands/linear-list.js.map +0 -7
  33. package/dist/cli/commands/linear-migrate.js +0 -64
  34. package/dist/cli/commands/linear-migrate.js.map +0 -7
  35. package/dist/cli/commands/linear-test.js +0 -134
  36. package/dist/cli/commands/linear-test.js.map +0 -7
  37. package/dist/cli/commands/tui.js +0 -77
  38. package/dist/cli/commands/tui.js.map +0 -7
  39. package/dist/cli/commands/webhook.js +0 -181
  40. package/dist/cli/commands/webhook.js.map +0 -7
  41. package/dist/cli/streamlined-cli.js +0 -144
  42. package/dist/cli/streamlined-cli.js.map +0 -7
  43. package/dist/core/events/event-bus.js +0 -110
  44. package/dist/core/events/event-bus.js.map +0 -7
  45. package/dist/core/frame/workflow-templates-stub.js +0 -42
  46. package/dist/core/frame/workflow-templates-stub.js.map +0 -7
  47. package/dist/core/plugins/plugin-interface.js +0 -87
  48. package/dist/core/plugins/plugin-interface.js.map +0 -7
  49. package/dist/core/session/clear-survival-stub.js +0 -53
  50. package/dist/core/session/clear-survival-stub.js.map +0 -7
  51. package/dist/core/storage/chromadb-simple.js +0 -172
  52. package/dist/core/storage/chromadb-simple.js.map +0 -7
  53. package/dist/core/storage/simplified-storage.js +0 -328
  54. package/dist/core/storage/simplified-storage.js.map +0 -7
  55. package/dist/features/tasks/pebbles-task-store.js +0 -647
  56. package/dist/features/tasks/pebbles-task-store.js.map +0 -7
  57. package/dist/integrations/linear/sync-enhanced.js +0 -202
  58. package/dist/integrations/linear/sync-enhanced.js.map +0 -7
  59. package/dist/plugins/linear/index.js +0 -166
  60. package/dist/plugins/linear/index.js.map +0 -7
  61. package/dist/plugins/loader.js +0 -57
  62. package/dist/plugins/loader.js.map +0 -7
  63. package/dist/plugins/plugin-interface.js +0 -67
  64. package/dist/plugins/plugin-interface.js.map +0 -7
  65. package/dist/plugins/ralph/simple-ralph-plugin.js +0 -305
  66. package/dist/plugins/ralph/simple-ralph-plugin.js.map +0 -7
  67. package/dist/plugins/ralph/use-cases/code-generator.js +0 -151
  68. package/dist/plugins/ralph/use-cases/code-generator.js.map +0 -7
  69. package/dist/plugins/ralph/use-cases/test-generator.js +0 -201
  70. package/dist/plugins/ralph/use-cases/test-generator.js.map +0 -7
  71. package/dist/utils/logger.js +0 -52
  72. 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);