thread-mcp 1.0.0

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 (63) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +497 -0
  3. package/dist/formatters/index.d.ts +5 -0
  4. package/dist/formatters/index.d.ts.map +1 -0
  5. package/dist/formatters/index.js +12 -0
  6. package/dist/formatters/index.js.map +1 -0
  7. package/dist/formatters/json.d.ts +3 -0
  8. package/dist/formatters/json.d.ts.map +1 -0
  9. package/dist/formatters/json.js +25 -0
  10. package/dist/formatters/json.js.map +1 -0
  11. package/dist/formatters/markdown.d.ts +3 -0
  12. package/dist/formatters/markdown.d.ts.map +1 -0
  13. package/dist/formatters/markdown.js +134 -0
  14. package/dist/formatters/markdown.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +7 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/server.d.ts +4 -0
  20. package/dist/server.d.ts.map +1 -0
  21. package/dist/server.js +175 -0
  22. package/dist/server.js.map +1 -0
  23. package/dist/storage/index.d.ts +3 -0
  24. package/dist/storage/index.d.ts.map +1 -0
  25. package/dist/storage/index.js +3 -0
  26. package/dist/storage/index.js.map +1 -0
  27. package/dist/storage/local.d.ts +23 -0
  28. package/dist/storage/local.d.ts.map +1 -0
  29. package/dist/storage/local.js +126 -0
  30. package/dist/storage/local.js.map +1 -0
  31. package/dist/storage/remote.d.ts +15 -0
  32. package/dist/storage/remote.d.ts.map +1 -0
  33. package/dist/storage/remote.js +91 -0
  34. package/dist/storage/remote.js.map +1 -0
  35. package/dist/tools/delete-thread.d.ts +71 -0
  36. package/dist/tools/delete-thread.d.ts.map +1 -0
  37. package/dist/tools/delete-thread.js +74 -0
  38. package/dist/tools/delete-thread.js.map +1 -0
  39. package/dist/tools/find-threads.d.ts +175 -0
  40. package/dist/tools/find-threads.d.ts.map +1 -0
  41. package/dist/tools/find-threads.js +265 -0
  42. package/dist/tools/find-threads.js.map +1 -0
  43. package/dist/tools/index.d.ts +270 -0
  44. package/dist/tools/index.d.ts.map +1 -0
  45. package/dist/tools/index.js +18 -0
  46. package/dist/tools/index.js.map +1 -0
  47. package/dist/tools/resume-thread.d.ts +138 -0
  48. package/dist/tools/resume-thread.d.ts.map +1 -0
  49. package/dist/tools/resume-thread.js +191 -0
  50. package/dist/tools/resume-thread.js.map +1 -0
  51. package/dist/tools/save-thread.d.ts +155 -0
  52. package/dist/tools/save-thread.d.ts.map +1 -0
  53. package/dist/tools/save-thread.js +116 -0
  54. package/dist/tools/save-thread.js.map +1 -0
  55. package/dist/tools/update-thread.d.ts +180 -0
  56. package/dist/tools/update-thread.d.ts.map +1 -0
  57. package/dist/tools/update-thread.js +159 -0
  58. package/dist/tools/update-thread.js.map +1 -0
  59. package/dist/types.d.ts +177 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +41 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +67 -0
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ import { getDefaultLocalStorage, createLocalStorage } from "../storage/local.js";
3
+ import { createRemoteStorage } from "../storage/remote.js";
4
+ export const DeleteThreadInputSchema = z.object({
5
+ // Lookup (use one)
6
+ id: z.string().optional().describe("ID of the thread to delete"),
7
+ title: z.string().optional().describe("Find and delete thread by exact title match"),
8
+ // Source
9
+ source: z
10
+ .enum(["local", "remote"])
11
+ .default("local")
12
+ .describe("Source where thread is stored"),
13
+ outputDir: z.string().optional().describe("Custom directory for local storage"),
14
+ remoteUrl: z.string().url().optional().describe("Remote server URL"),
15
+ apiKey: z.string().optional().describe("API key for remote"),
16
+ headers: z.record(z.string()).optional().describe("Additional headers for remote"),
17
+ });
18
+ export async function deleteThread(input) {
19
+ if (!input.id && !input.title) {
20
+ throw new Error("Either 'id' or 'title' must be provided to identify the thread");
21
+ }
22
+ if (input.source === "remote" && !input.remoteUrl) {
23
+ throw new Error("remoteUrl is required when source is 'remote'");
24
+ }
25
+ const storage = input.source === "remote"
26
+ ? createRemoteStorage({
27
+ url: input.remoteUrl,
28
+ apiKey: input.apiKey,
29
+ headers: input.headers,
30
+ })
31
+ : input.outputDir
32
+ ? createLocalStorage(input.outputDir)
33
+ : getDefaultLocalStorage();
34
+ // Find thread by title if needed
35
+ let threadId = input.id;
36
+ let threadTitle = input.title;
37
+ if (!threadId && input.title) {
38
+ const allInfos = await storage.list();
39
+ for (const info of allInfos) {
40
+ const conv = await storage.get(info.id);
41
+ if (conv && conv.metadata.title === input.title) {
42
+ threadId = info.id;
43
+ threadTitle = conv.metadata.title;
44
+ break;
45
+ }
46
+ }
47
+ if (!threadId) {
48
+ return {
49
+ deleted: false,
50
+ error: `Thread with title '${input.title}' not found`,
51
+ source: input.source,
52
+ };
53
+ }
54
+ }
55
+ // Get title for response if we only have ID
56
+ if (threadId && !threadTitle) {
57
+ const conv = await storage.get(threadId);
58
+ threadTitle = conv?.metadata.title;
59
+ }
60
+ const deleted = await storage.delete(threadId);
61
+ return {
62
+ deleted,
63
+ id: threadId,
64
+ title: threadTitle,
65
+ source: input.source,
66
+ };
67
+ }
68
+ export const deleteThreadTool = {
69
+ name: "delete_thread",
70
+ description: "Delete a saved conversation thread. Can find by ID or exact title match.",
71
+ inputSchema: DeleteThreadInputSchema,
72
+ handler: deleteThread,
73
+ };
74
+ //# sourceMappingURL=delete-thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-thread.js","sourceRoot":"","sources":["../../src/tools/delete-thread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ import { z } from "zod";
2
+ export declare const FindThreadsInputSchema: z.ZodObject<{
3
+ id: z.ZodOptional<z.ZodString>;
4
+ title: z.ZodOptional<z.ZodString>;
5
+ titleContains: z.ZodOptional<z.ZodString>;
6
+ query: z.ZodOptional<z.ZodString>;
7
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
8
+ sourceApp: z.ZodOptional<z.ZodString>;
9
+ dateFrom: z.ZodOptional<z.ZodString>;
10
+ dateTo: z.ZodOptional<z.ZodString>;
11
+ includeContent: z.ZodDefault<z.ZodBoolean>;
12
+ includeRelevanceInfo: z.ZodDefault<z.ZodBoolean>;
13
+ limit: z.ZodDefault<z.ZodNumber>;
14
+ source: z.ZodDefault<z.ZodEnum<["local", "remote"]>>;
15
+ outputDir: z.ZodOptional<z.ZodString>;
16
+ remoteUrl: z.ZodOptional<z.ZodString>;
17
+ apiKey: z.ZodOptional<z.ZodString>;
18
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ includeContent: boolean;
21
+ includeRelevanceInfo: boolean;
22
+ limit: number;
23
+ source: "local" | "remote";
24
+ title?: string | undefined;
25
+ sourceApp?: string | undefined;
26
+ tags?: string[] | undefined;
27
+ id?: string | undefined;
28
+ apiKey?: string | undefined;
29
+ headers?: Record<string, string> | undefined;
30
+ remoteUrl?: string | undefined;
31
+ outputDir?: string | undefined;
32
+ titleContains?: string | undefined;
33
+ query?: string | undefined;
34
+ dateFrom?: string | undefined;
35
+ dateTo?: string | undefined;
36
+ }, {
37
+ title?: string | undefined;
38
+ sourceApp?: string | undefined;
39
+ tags?: string[] | undefined;
40
+ id?: string | undefined;
41
+ apiKey?: string | undefined;
42
+ headers?: Record<string, string> | undefined;
43
+ remoteUrl?: string | undefined;
44
+ outputDir?: string | undefined;
45
+ titleContains?: string | undefined;
46
+ query?: string | undefined;
47
+ dateFrom?: string | undefined;
48
+ dateTo?: string | undefined;
49
+ includeContent?: boolean | undefined;
50
+ includeRelevanceInfo?: boolean | undefined;
51
+ limit?: number | undefined;
52
+ source?: "local" | "remote" | undefined;
53
+ }>;
54
+ export type FindThreadsInput = z.infer<typeof FindThreadsInputSchema>;
55
+ interface ThreadResult {
56
+ id: string;
57
+ title: string;
58
+ sourceApp?: string;
59
+ createdAt: string;
60
+ updatedAt?: string;
61
+ tags?: string[];
62
+ summary?: string;
63
+ filePath?: string;
64
+ remoteUrl?: string;
65
+ format: "markdown" | "json";
66
+ relevance?: {
67
+ score: number;
68
+ matchedFields: string[];
69
+ messageCount: number;
70
+ wordCount: number;
71
+ topicHints: string[];
72
+ ageInDays: number;
73
+ };
74
+ content?: {
75
+ messages: Array<{
76
+ role: "user" | "assistant" | "system";
77
+ content: string;
78
+ timestamp?: string;
79
+ }>;
80
+ };
81
+ }
82
+ export declare function findThreads(input: FindThreadsInput): Promise<{
83
+ found: boolean;
84
+ id: string;
85
+ source: "local" | "remote";
86
+ thread?: undefined;
87
+ totalResults?: undefined;
88
+ filters?: undefined;
89
+ threads?: undefined;
90
+ } | {
91
+ found: boolean;
92
+ source: "local" | "remote";
93
+ thread: ThreadResult;
94
+ id?: undefined;
95
+ totalResults?: undefined;
96
+ filters?: undefined;
97
+ threads?: undefined;
98
+ } | {
99
+ source: "local" | "remote";
100
+ totalResults: number;
101
+ filters: {
102
+ query: string | undefined;
103
+ title: string | undefined;
104
+ titleContains: string | undefined;
105
+ tags: string[] | undefined;
106
+ sourceApp: string | undefined;
107
+ dateRange: {
108
+ from: string | undefined;
109
+ to: string | undefined;
110
+ } | undefined;
111
+ };
112
+ threads: ThreadResult[];
113
+ found?: undefined;
114
+ id?: undefined;
115
+ thread?: undefined;
116
+ }>;
117
+ export declare const findThreadsTool: {
118
+ name: string;
119
+ description: string;
120
+ inputSchema: z.ZodObject<{
121
+ id: z.ZodOptional<z.ZodString>;
122
+ title: z.ZodOptional<z.ZodString>;
123
+ titleContains: z.ZodOptional<z.ZodString>;
124
+ query: z.ZodOptional<z.ZodString>;
125
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
126
+ sourceApp: z.ZodOptional<z.ZodString>;
127
+ dateFrom: z.ZodOptional<z.ZodString>;
128
+ dateTo: z.ZodOptional<z.ZodString>;
129
+ includeContent: z.ZodDefault<z.ZodBoolean>;
130
+ includeRelevanceInfo: z.ZodDefault<z.ZodBoolean>;
131
+ limit: z.ZodDefault<z.ZodNumber>;
132
+ source: z.ZodDefault<z.ZodEnum<["local", "remote"]>>;
133
+ outputDir: z.ZodOptional<z.ZodString>;
134
+ remoteUrl: z.ZodOptional<z.ZodString>;
135
+ apiKey: z.ZodOptional<z.ZodString>;
136
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
137
+ }, "strip", z.ZodTypeAny, {
138
+ includeContent: boolean;
139
+ includeRelevanceInfo: boolean;
140
+ limit: number;
141
+ source: "local" | "remote";
142
+ title?: string | undefined;
143
+ sourceApp?: string | undefined;
144
+ tags?: string[] | undefined;
145
+ id?: string | undefined;
146
+ apiKey?: string | undefined;
147
+ headers?: Record<string, string> | undefined;
148
+ remoteUrl?: string | undefined;
149
+ outputDir?: string | undefined;
150
+ titleContains?: string | undefined;
151
+ query?: string | undefined;
152
+ dateFrom?: string | undefined;
153
+ dateTo?: string | undefined;
154
+ }, {
155
+ title?: string | undefined;
156
+ sourceApp?: string | undefined;
157
+ tags?: string[] | undefined;
158
+ id?: string | undefined;
159
+ apiKey?: string | undefined;
160
+ headers?: Record<string, string> | undefined;
161
+ remoteUrl?: string | undefined;
162
+ outputDir?: string | undefined;
163
+ titleContains?: string | undefined;
164
+ query?: string | undefined;
165
+ dateFrom?: string | undefined;
166
+ dateTo?: string | undefined;
167
+ includeContent?: boolean | undefined;
168
+ includeRelevanceInfo?: boolean | undefined;
169
+ limit?: number | undefined;
170
+ source?: "local" | "remote" | undefined;
171
+ }>;
172
+ handler: typeof findThreads;
173
+ };
174
+ export {};
175
+ //# sourceMappingURL=find-threads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-threads.d.ts","sourceRoot":"","sources":["../../src/tools/find-threads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,QAAQ,EAAE,KAAK,CAAC;YACd,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;YACtC,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC,CAAC;KACJ,CAAC;CACH;AA6ID,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2IxD;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQ3B,CAAC"}
@@ -0,0 +1,265 @@
1
+ import { z } from "zod";
2
+ import { getDefaultLocalStorage, createLocalStorage } from "../storage/local.js";
3
+ import { createRemoteStorage } from "../storage/remote.js";
4
+ export const FindThreadsInputSchema = z.object({
5
+ // Lookup methods (use one)
6
+ id: z.string().optional().describe("Get a specific thread by ID"),
7
+ title: z.string().optional().describe("Find thread by exact title match"),
8
+ titleContains: z.string().optional().describe("Find threads with title containing this text"),
9
+ query: z.string().optional().describe("Search query (matches title, summary, and content)"),
10
+ // Filters
11
+ tags: z.array(z.string()).optional().describe("Filter by tags (must have ALL specified tags)"),
12
+ sourceApp: z.string().optional().describe("Filter by source application"),
13
+ dateFrom: z.string().optional().describe("Filter threads created after this date (ISO format)"),
14
+ dateTo: z.string().optional().describe("Filter threads created before this date (ISO format)"),
15
+ // Output options
16
+ includeContent: z
17
+ .boolean()
18
+ .default(false)
19
+ .describe("Include full message content in results"),
20
+ includeRelevanceInfo: z
21
+ .boolean()
22
+ .default(true)
23
+ .describe("Include relevance scores and metadata"),
24
+ limit: z.number().positive().default(10).describe("Maximum results to return"),
25
+ // Source
26
+ source: z
27
+ .enum(["local", "remote"])
28
+ .default("local")
29
+ .describe("Source to search"),
30
+ outputDir: z.string().optional().describe("Custom directory for local storage"),
31
+ remoteUrl: z.string().url().optional().describe("Remote server URL (required if source is 'remote')"),
32
+ apiKey: z.string().optional().describe("API key for remote"),
33
+ headers: z.record(z.string()).optional().describe("Additional headers for remote"),
34
+ });
35
+ function extractTopicHints(conversation) {
36
+ const hints = [];
37
+ if (conversation.metadata.tags) {
38
+ hints.push(...conversation.metadata.tags);
39
+ }
40
+ const titleWords = conversation.metadata.title
41
+ .toLowerCase()
42
+ .split(/\s+/)
43
+ .filter((w) => w.length > 3);
44
+ hints.push(...titleWords.slice(0, 5));
45
+ const allContent = conversation.messages.map((m) => m.content).join(" ");
46
+ if (allContent.includes("```") ||
47
+ allContent.includes("function ") ||
48
+ allContent.includes("class ")) {
49
+ hints.push("code");
50
+ }
51
+ if (allContent.includes("error") ||
52
+ allContent.includes("bug") ||
53
+ allContent.includes("fix")) {
54
+ hints.push("debugging");
55
+ }
56
+ return [...new Set(hints)].slice(0, 10);
57
+ }
58
+ function calculateWordCount(conversation) {
59
+ return conversation.messages.reduce((count, msg) => {
60
+ return count + msg.content.split(/\s+/).length;
61
+ }, 0);
62
+ }
63
+ function calculateRelevance(conversation, info, query, titleContains) {
64
+ let score = 50; // Base score
65
+ const matchedFields = [];
66
+ const searchTerm = query || titleContains;
67
+ if (searchTerm) {
68
+ const termLower = searchTerm.toLowerCase();
69
+ const titleLower = conversation.metadata.title.toLowerCase();
70
+ if (titleLower.includes(termLower)) {
71
+ score += 30;
72
+ matchedFields.push("title");
73
+ }
74
+ if (conversation.metadata.summary?.toLowerCase().includes(termLower)) {
75
+ score += 20;
76
+ matchedFields.push("summary");
77
+ }
78
+ if (query) {
79
+ for (const msg of conversation.messages) {
80
+ if (msg.content.toLowerCase().includes(termLower)) {
81
+ score += 10;
82
+ matchedFields.push("content");
83
+ break;
84
+ }
85
+ }
86
+ }
87
+ if (conversation.metadata.tags?.some((t) => t.toLowerCase().includes(termLower))) {
88
+ score += 15;
89
+ matchedFields.push("tags");
90
+ }
91
+ }
92
+ // Recency bonus
93
+ const ageInDays = (Date.now() - new Date(info.savedAt).getTime()) / (1000 * 60 * 60 * 24);
94
+ if (ageInDays < 7)
95
+ score += 10;
96
+ else if (ageInDays < 30)
97
+ score += 5;
98
+ return { score, matchedFields: [...new Set(matchedFields)] };
99
+ }
100
+ function matchesFilters(conversation, input) {
101
+ // Title exact match
102
+ if (input.title && conversation.metadata.title !== input.title) {
103
+ return false;
104
+ }
105
+ // Title contains
106
+ if (input.titleContains &&
107
+ !conversation.metadata.title.toLowerCase().includes(input.titleContains.toLowerCase())) {
108
+ return false;
109
+ }
110
+ // Date filters
111
+ if (input.dateFrom && new Date(conversation.metadata.createdAt) < new Date(input.dateFrom)) {
112
+ return false;
113
+ }
114
+ if (input.dateTo && new Date(conversation.metadata.createdAt) > new Date(input.dateTo)) {
115
+ return false;
116
+ }
117
+ // Source app
118
+ if (input.sourceApp && conversation.metadata.sourceApp !== input.sourceApp) {
119
+ return false;
120
+ }
121
+ // Tags (must have ALL)
122
+ if (input.tags && input.tags.length > 0) {
123
+ if (!conversation.metadata.tags)
124
+ return false;
125
+ const hasAllTags = input.tags.every((t) => conversation.metadata.tags.some((ct) => ct.toLowerCase() === t.toLowerCase()));
126
+ if (!hasAllTags)
127
+ return false;
128
+ }
129
+ // Query search (in title, summary, content)
130
+ if (input.query) {
131
+ const queryLower = input.query.toLowerCase();
132
+ const inTitle = conversation.metadata.title.toLowerCase().includes(queryLower);
133
+ const inSummary = conversation.metadata.summary?.toLowerCase().includes(queryLower);
134
+ const inContent = conversation.messages.some((m) => m.content.toLowerCase().includes(queryLower));
135
+ if (!inTitle && !inSummary && !inContent)
136
+ return false;
137
+ }
138
+ return true;
139
+ }
140
+ export async function findThreads(input) {
141
+ if (input.source === "remote" && !input.remoteUrl) {
142
+ throw new Error("remoteUrl is required when source is 'remote'");
143
+ }
144
+ const storage = input.source === "remote"
145
+ ? createRemoteStorage({
146
+ url: input.remoteUrl,
147
+ apiKey: input.apiKey,
148
+ headers: input.headers,
149
+ })
150
+ : input.outputDir
151
+ ? createLocalStorage(input.outputDir)
152
+ : getDefaultLocalStorage();
153
+ // If looking up by ID, return single result
154
+ if (input.id) {
155
+ const conversation = await storage.get(input.id);
156
+ if (!conversation) {
157
+ return {
158
+ found: false,
159
+ id: input.id,
160
+ source: input.source,
161
+ };
162
+ }
163
+ const list = await storage.list();
164
+ const info = list.find((i) => i.id === input.id);
165
+ const result = {
166
+ id: conversation.id,
167
+ title: conversation.metadata.title,
168
+ sourceApp: conversation.metadata.sourceApp,
169
+ createdAt: conversation.metadata.createdAt,
170
+ updatedAt: conversation.metadata.updatedAt,
171
+ tags: conversation.metadata.tags,
172
+ summary: conversation.metadata.summary,
173
+ filePath: info?.filePath,
174
+ remoteUrl: info?.remoteUrl,
175
+ format: info?.format || "markdown",
176
+ };
177
+ if (input.includeContent) {
178
+ result.content = { messages: conversation.messages };
179
+ }
180
+ if (input.includeRelevanceInfo && info) {
181
+ const ageInDays = (Date.now() - new Date(info.savedAt).getTime()) / (1000 * 60 * 60 * 24);
182
+ result.relevance = {
183
+ score: 100,
184
+ matchedFields: ["id"],
185
+ messageCount: conversation.messages.length,
186
+ wordCount: calculateWordCount(conversation),
187
+ topicHints: extractTopicHints(conversation),
188
+ ageInDays: Math.round(ageInDays),
189
+ };
190
+ }
191
+ return {
192
+ found: true,
193
+ source: input.source,
194
+ thread: result,
195
+ };
196
+ }
197
+ // Search/list mode
198
+ const allInfos = await storage.list();
199
+ const results = [];
200
+ for (const info of allInfos) {
201
+ if (results.length >= input.limit)
202
+ break;
203
+ const conversation = await storage.get(info.id);
204
+ if (!conversation)
205
+ continue;
206
+ if (!matchesFilters(conversation, input))
207
+ continue;
208
+ const { score, matchedFields } = calculateRelevance(conversation, info, input.query, input.titleContains);
209
+ const ageInDays = (Date.now() - new Date(info.savedAt).getTime()) / (1000 * 60 * 60 * 24);
210
+ const result = {
211
+ id: info.id,
212
+ title: conversation.metadata.title,
213
+ sourceApp: conversation.metadata.sourceApp,
214
+ createdAt: conversation.metadata.createdAt,
215
+ updatedAt: conversation.metadata.updatedAt,
216
+ tags: conversation.metadata.tags,
217
+ summary: conversation.metadata.summary,
218
+ filePath: info.filePath,
219
+ remoteUrl: info.remoteUrl,
220
+ format: info.format,
221
+ };
222
+ if (input.includeRelevanceInfo) {
223
+ result.relevance = {
224
+ score,
225
+ matchedFields,
226
+ messageCount: conversation.messages.length,
227
+ wordCount: calculateWordCount(conversation),
228
+ topicHints: extractTopicHints(conversation),
229
+ ageInDays: Math.round(ageInDays),
230
+ };
231
+ }
232
+ if (input.includeContent) {
233
+ result.content = { messages: conversation.messages };
234
+ }
235
+ results.push(result);
236
+ }
237
+ // Sort by relevance
238
+ if (input.includeRelevanceInfo) {
239
+ results.sort((a, b) => (b.relevance?.score || 0) - (a.relevance?.score || 0));
240
+ }
241
+ return {
242
+ source: input.source,
243
+ totalResults: results.length,
244
+ filters: {
245
+ query: input.query,
246
+ title: input.title,
247
+ titleContains: input.titleContains,
248
+ tags: input.tags,
249
+ sourceApp: input.sourceApp,
250
+ dateRange: input.dateFrom || input.dateTo
251
+ ? { from: input.dateFrom, to: input.dateTo }
252
+ : undefined,
253
+ },
254
+ threads: results,
255
+ };
256
+ }
257
+ export const findThreadsTool = {
258
+ name: "find_threads",
259
+ description: "Find saved conversation threads. Can get by ID, search by title, or query content. " +
260
+ "Supports filtering by tags, source app, and date range. " +
261
+ "Use includeContent=true to load full conversations.",
262
+ inputSchema: FindThreadsInputSchema,
263
+ handler: findThreads,
264
+ };
265
+ //# sourceMappingURL=find-threads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-threads.js","sourceRoot":"","sources":["../../src/tools/find-threads.ts"],"names":[],"mappings":"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"}