@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.
- package/dist/cli/claude-sm.js +2 -0
- package/dist/cli/claude-sm.js.map +2 -2
- package/dist/cli/commands/discovery.js +279 -0
- package/dist/cli/commands/discovery.js.map +7 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +2 -2
- package/dist/core/retrieval/llm-context-retrieval.js +1 -3
- package/dist/core/retrieval/llm-context-retrieval.js.map +3 -3
- package/dist/integrations/mcp/handlers/discovery-handlers.js +497 -0
- package/dist/integrations/mcp/handlers/discovery-handlers.js.map +7 -0
- package/dist/integrations/mcp/handlers/index.js +40 -12
- package/dist/integrations/mcp/handlers/index.js.map +2 -2
- package/dist/integrations/mcp/server.js +270 -0
- package/dist/integrations/mcp/server.js.map +2 -2
- package/dist/integrations/mcp/tool-definitions.js +141 -5
- package/dist/integrations/mcp/tool-definitions.js.map +2 -2
- package/package.json +1 -1
- package/dist/cli/commands/agent.js +0 -286
- package/dist/cli/commands/agent.js.map +0 -7
- package/dist/cli/commands/chromadb.js +0 -482
- package/dist/cli/commands/chromadb.js.map +0 -7
- package/dist/cli/commands/gc.js +0 -251
- package/dist/cli/commands/gc.js.map +0 -7
- package/dist/cli/commands/infinite-storage.js +0 -292
- package/dist/cli/commands/infinite-storage.js.map +0 -7
- package/dist/cli/commands/linear-create.js +0 -171
- package/dist/cli/commands/linear-create.js.map +0 -7
- package/dist/cli/commands/linear-list.js +0 -103
- package/dist/cli/commands/linear-list.js.map +0 -7
- package/dist/cli/commands/linear-migrate.js +0 -64
- package/dist/cli/commands/linear-migrate.js.map +0 -7
- package/dist/cli/commands/linear-test.js +0 -134
- package/dist/cli/commands/linear-test.js.map +0 -7
- package/dist/cli/commands/tui.js +0 -77
- package/dist/cli/commands/tui.js.map +0 -7
- package/dist/cli/commands/webhook.js +0 -181
- package/dist/cli/commands/webhook.js.map +0 -7
- package/dist/cli/streamlined-cli.js +0 -144
- package/dist/cli/streamlined-cli.js.map +0 -7
- package/dist/core/events/event-bus.js +0 -110
- package/dist/core/events/event-bus.js.map +0 -7
- package/dist/core/frame/workflow-templates-stub.js +0 -42
- package/dist/core/frame/workflow-templates-stub.js.map +0 -7
- package/dist/core/plugins/plugin-interface.js +0 -87
- package/dist/core/plugins/plugin-interface.js.map +0 -7
- package/dist/core/session/clear-survival-stub.js +0 -53
- package/dist/core/session/clear-survival-stub.js.map +0 -7
- package/dist/core/storage/chromadb-simple.js +0 -172
- package/dist/core/storage/chromadb-simple.js.map +0 -7
- package/dist/core/storage/simplified-storage.js +0 -328
- package/dist/core/storage/simplified-storage.js.map +0 -7
- package/dist/features/tasks/pebbles-task-store.js +0 -647
- package/dist/features/tasks/pebbles-task-store.js.map +0 -7
- package/dist/integrations/linear/sync-enhanced.js +0 -202
- package/dist/integrations/linear/sync-enhanced.js.map +0 -7
- package/dist/plugins/linear/index.js +0 -166
- package/dist/plugins/linear/index.js.map +0 -7
- package/dist/plugins/loader.js +0 -57
- package/dist/plugins/loader.js.map +0 -7
- package/dist/plugins/plugin-interface.js +0 -67
- package/dist/plugins/plugin-interface.js.map +0 -7
- package/dist/plugins/ralph/simple-ralph-plugin.js +0 -305
- package/dist/plugins/ralph/simple-ralph-plugin.js.map +0 -7
- package/dist/plugins/ralph/use-cases/code-generator.js +0 -151
- package/dist/plugins/ralph/use-cases/code-generator.js.map +0 -7
- package/dist/plugins/ralph/use-cases/test-generator.js +0 -201
- package/dist/plugins/ralph/use-cases/test-generator.js.map +0 -7
- package/dist/utils/logger.js +0 -52
- 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 {
|
|
5
|
-
"mappings": ";;;;AAKA,
|
|
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);
|