@troykelly/openclaw-projects 0.0.11 → 0.0.13
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/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +22 -3
- package/dist/hooks.js.map +1 -1
- package/dist/register-openclaw.d.ts +3 -1
- package/dist/register-openclaw.d.ts.map +1 -1
- package/dist/register-openclaw.js +640 -55
- package/dist/register-openclaw.js.map +1 -1
- package/dist/tools/context-search.d.ts +79 -0
- package/dist/tools/context-search.d.ts.map +1 -0
- package/dist/tools/context-search.js +267 -0
- package/dist/tools/context-search.js.map +1 -0
- package/dist/tools/email-send.d.ts.map +1 -1
- package/dist/tools/email-send.js +1 -14
- package/dist/tools/email-send.js.map +1 -1
- package/dist/tools/entity-links.d.ts +117 -0
- package/dist/tools/entity-links.d.ts.map +1 -0
- package/dist/tools/entity-links.js +446 -0
- package/dist/tools/entity-links.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-recall.d.ts +28 -0
- package/dist/tools/memory-recall.d.ts.map +1 -1
- package/dist/tools/memory-recall.js +42 -3
- package/dist/tools/memory-recall.js.map +1 -1
- package/dist/tools/memory-store.d.ts +57 -0
- package/dist/tools/memory-store.d.ts.map +1 -1
- package/dist/tools/memory-store.js +29 -2
- package/dist/tools/memory-store.js.map +1 -1
- package/dist/tools/message-search.d.ts +2 -2
- package/dist/tools/message-search.d.ts.map +1 -1
- package/dist/tools/message-search.js +36 -3
- package/dist/tools/message-search.js.map +1 -1
- package/dist/tools/notes.d.ts +2 -2
- package/dist/tools/project-search.d.ts +92 -0
- package/dist/tools/project-search.d.ts.map +1 -0
- package/dist/tools/project-search.js +160 -0
- package/dist/tools/project-search.js.map +1 -0
- package/dist/tools/skill-store.d.ts +6 -6
- package/dist/tools/threads.d.ts +3 -3
- package/dist/tools/threads.d.ts.map +1 -1
- package/dist/tools/threads.js +45 -7
- package/dist/tools/threads.js.map +1 -1
- package/dist/tools/todo-search.d.ts +95 -0
- package/dist/tools/todo-search.d.ts.map +1 -0
- package/dist/tools/todo-search.js +164 -0
- package/dist/tools/todo-search.js.map +1 -0
- package/dist/types/openclaw-api.d.ts +15 -0
- package/dist/types/openclaw-api.d.ts.map +1 -1
- package/dist/utils/auto-linker.d.ts +66 -0
- package/dist/utils/auto-linker.d.ts.map +1 -0
- package/dist/utils/auto-linker.js +354 -0
- package/dist/utils/auto-linker.js.map +1 -0
- package/dist/utils/geo.d.ts +24 -0
- package/dist/utils/geo.d.ts.map +1 -0
- package/dist/utils/geo.js +38 -0
- package/dist/utils/geo.js.map +1 -0
- package/dist/utils/inbound-gate.d.ts +85 -0
- package/dist/utils/inbound-gate.d.ts.map +1 -0
- package/dist/utils/inbound-gate.js +133 -0
- package/dist/utils/inbound-gate.js.map +1 -0
- package/dist/utils/injection-log-rate-limiter.d.ts +62 -0
- package/dist/utils/injection-log-rate-limiter.d.ts.map +1 -0
- package/dist/utils/injection-log-rate-limiter.js +106 -0
- package/dist/utils/injection-log-rate-limiter.js.map +1 -0
- package/dist/utils/injection-protection.d.ts +133 -0
- package/dist/utils/injection-protection.d.ts.map +1 -0
- package/dist/utils/injection-protection.js +252 -0
- package/dist/utils/injection-protection.js.map +1 -0
- package/dist/utils/nominatim.d.ts +18 -0
- package/dist/utils/nominatim.d.ts.map +1 -0
- package/dist/utils/nominatim.js +56 -0
- package/dist/utils/nominatim.js.map +1 -0
- package/dist/utils/prompt-guard-client.d.ts +59 -0
- package/dist/utils/prompt-guard-client.d.ts.map +1 -0
- package/dist/utils/prompt-guard-client.js +99 -0
- package/dist/utils/prompt-guard-client.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +81 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +188 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/spam-filter.d.ts +79 -0
- package/dist/utils/spam-filter.d.ts.map +1 -0
- package/dist/utils/spam-filter.js +237 -0
- package/dist/utils/spam-filter.js.map +1 -0
- package/dist/utils/token-budget.d.ts +68 -0
- package/dist/utils/token-budget.d.ts.map +1 -0
- package/dist/utils/token-budget.js +142 -0
- package/dist/utils/token-budget.js.map +1 -0
- package/openclaw.plugin.json +25 -3
- package/package.json +12 -11
- package/LICENSE +0 -21
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* project_search tool implementation.
|
|
3
|
+
* Provides semantic search specifically for projects (kind=project work items).
|
|
4
|
+
* Uses the unified search API with work_item type filter and client-side kind filtering.
|
|
5
|
+
* Geo-contextual ranking added in Issue #1218.
|
|
6
|
+
*
|
|
7
|
+
* Part of Issue #1217.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { sanitizeErrorMessage } from '../utils/sanitize.js';
|
|
11
|
+
import { reverseGeocode } from '../utils/nominatim.js';
|
|
12
|
+
/** Parameters for project_search tool */
|
|
13
|
+
export const ProjectSearchParamsSchema = z.object({
|
|
14
|
+
query: z.string().min(1, 'Query cannot be empty').max(1000, 'Query must be 1000 characters or less'),
|
|
15
|
+
limit: z.number().int().min(1).max(50).optional(),
|
|
16
|
+
status: z.enum(['active', 'completed', 'archived']).optional(),
|
|
17
|
+
location: z.object({
|
|
18
|
+
lat: z.number().min(-90).max(90),
|
|
19
|
+
lng: z.number().min(-180).max(180),
|
|
20
|
+
}).optional(),
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Sanitize query input to prevent injection and remove control characters.
|
|
24
|
+
*/
|
|
25
|
+
function sanitizeQuery(query) {
|
|
26
|
+
return query.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '').trim();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates the project_search tool.
|
|
30
|
+
*/
|
|
31
|
+
export function createProjectSearchTool(options) {
|
|
32
|
+
const { client, logger, config, userId } = options;
|
|
33
|
+
return {
|
|
34
|
+
name: 'project_search',
|
|
35
|
+
description: 'Search projects by natural language query. Uses semantic and text search to find relevant projects. ' +
|
|
36
|
+
'Optionally filter by status (active, completed, archived). ' +
|
|
37
|
+
'Provide location (lat/lng) to boost results relevant to the current location.',
|
|
38
|
+
parameters: ProjectSearchParamsSchema,
|
|
39
|
+
async execute(params) {
|
|
40
|
+
const parseResult = ProjectSearchParamsSchema.safeParse(params);
|
|
41
|
+
if (!parseResult.success) {
|
|
42
|
+
const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
|
|
43
|
+
return { success: false, error: errorMessage };
|
|
44
|
+
}
|
|
45
|
+
const { query, limit = 10, status, location } = parseResult.data;
|
|
46
|
+
const sanitizedQuery = sanitizeQuery(query);
|
|
47
|
+
if (sanitizedQuery.length === 0) {
|
|
48
|
+
return { success: false, error: 'Query cannot be empty after sanitization' };
|
|
49
|
+
}
|
|
50
|
+
logger.info('project_search invoked', {
|
|
51
|
+
userId,
|
|
52
|
+
queryLength: sanitizedQuery.length,
|
|
53
|
+
limit,
|
|
54
|
+
status: status ?? 'all',
|
|
55
|
+
hasLocation: !!location,
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
// Augment query with location context for geo-contextual ranking (Issue #1218)
|
|
59
|
+
let searchQuery = sanitizedQuery;
|
|
60
|
+
if (location && config.nominatimUrl) {
|
|
61
|
+
try {
|
|
62
|
+
const geo = await reverseGeocode(location.lat, location.lng, config.nominatimUrl);
|
|
63
|
+
if (geo?.placeLabel) {
|
|
64
|
+
const augmented = `${sanitizedQuery} near ${geo.placeLabel}`;
|
|
65
|
+
if (augmented.length <= 1000) {
|
|
66
|
+
searchQuery = augmented;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
logger.warn('Reverse geocode failed, proceeding without location augmentation', { userId });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Always over-fetch by 3x since we always filter to kind=project client-side
|
|
75
|
+
const fetchLimit = Math.min(limit * 3, 50);
|
|
76
|
+
const queryParams = new URLSearchParams({
|
|
77
|
+
q: searchQuery,
|
|
78
|
+
types: 'work_item',
|
|
79
|
+
limit: String(fetchLimit),
|
|
80
|
+
semantic: 'true',
|
|
81
|
+
user_email: userId,
|
|
82
|
+
});
|
|
83
|
+
const response = await client.get(`/api/search?${queryParams.toString()}`, { userId });
|
|
84
|
+
if (!response.success) {
|
|
85
|
+
logger.error('project_search API error', {
|
|
86
|
+
userId,
|
|
87
|
+
status: response.error.status,
|
|
88
|
+
code: response.error.code,
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
success: false,
|
|
92
|
+
error: response.error.message || 'Failed to search projects',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
let results = response.data.results ?? [];
|
|
96
|
+
// Always filter to kind=project since this is a project-specific search tool
|
|
97
|
+
results = results.filter((r) => r.metadata?.kind === 'project');
|
|
98
|
+
// Additional client-side filtering by status if specified
|
|
99
|
+
if (status) {
|
|
100
|
+
results = results.filter((r) => r.metadata?.status === status);
|
|
101
|
+
}
|
|
102
|
+
results = results.slice(0, limit);
|
|
103
|
+
const items = results.map((r) => ({
|
|
104
|
+
id: r.id,
|
|
105
|
+
title: r.title,
|
|
106
|
+
snippet: r.snippet,
|
|
107
|
+
score: r.score,
|
|
108
|
+
kind: r.metadata?.kind,
|
|
109
|
+
status: r.metadata?.status,
|
|
110
|
+
}));
|
|
111
|
+
if (items.length === 0) {
|
|
112
|
+
return {
|
|
113
|
+
success: true,
|
|
114
|
+
data: {
|
|
115
|
+
content: 'No matching projects found.',
|
|
116
|
+
details: {
|
|
117
|
+
count: 0,
|
|
118
|
+
results: [],
|
|
119
|
+
searchType: response.data.search_type,
|
|
120
|
+
userId,
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const content = items
|
|
126
|
+
.map((item) => {
|
|
127
|
+
const statusStr = item.status ? ` (${item.status})` : '';
|
|
128
|
+
const snippetStr = item.snippet ? ` - ${item.snippet}` : '';
|
|
129
|
+
return `- **${item.title}**${statusStr}${snippetStr}`;
|
|
130
|
+
})
|
|
131
|
+
.join('\n');
|
|
132
|
+
logger.debug('project_search completed', {
|
|
133
|
+
userId,
|
|
134
|
+
resultCount: items.length,
|
|
135
|
+
searchType: response.data.search_type,
|
|
136
|
+
});
|
|
137
|
+
return {
|
|
138
|
+
success: true,
|
|
139
|
+
data: {
|
|
140
|
+
content,
|
|
141
|
+
details: {
|
|
142
|
+
count: items.length,
|
|
143
|
+
results: items,
|
|
144
|
+
searchType: response.data.search_type,
|
|
145
|
+
userId,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
logger.error('project_search failed', {
|
|
152
|
+
userId,
|
|
153
|
+
error: error instanceof Error ? error.message : String(error),
|
|
154
|
+
});
|
|
155
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=project-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-search.js","sourceRoot":"","sources":["../../src/tools/project-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,8 +35,8 @@ export declare const SkillStorePutParamsSchema: z.ZodObject<{
|
|
|
35
35
|
tags?: string[] | undefined;
|
|
36
36
|
content?: string | undefined;
|
|
37
37
|
title?: string | undefined;
|
|
38
|
-
summary?: string | undefined;
|
|
39
38
|
user_email?: string | undefined;
|
|
39
|
+
summary?: string | undefined;
|
|
40
40
|
collection?: string | undefined;
|
|
41
41
|
media_url?: string | undefined;
|
|
42
42
|
media_type?: string | undefined;
|
|
@@ -51,8 +51,8 @@ export declare const SkillStorePutParamsSchema: z.ZodObject<{
|
|
|
51
51
|
tags?: string[] | undefined;
|
|
52
52
|
content?: string | undefined;
|
|
53
53
|
title?: string | undefined;
|
|
54
|
-
summary?: string | undefined;
|
|
55
54
|
user_email?: string | undefined;
|
|
55
|
+
summary?: string | undefined;
|
|
56
56
|
collection?: string | undefined;
|
|
57
57
|
media_url?: string | undefined;
|
|
58
58
|
media_type?: string | undefined;
|
|
@@ -95,21 +95,21 @@ export declare const SkillStoreListParamsSchema: z.ZodObject<{
|
|
|
95
95
|
skill_id: string;
|
|
96
96
|
status?: "active" | "archived" | "processing" | undefined;
|
|
97
97
|
limit?: number | undefined;
|
|
98
|
+
since?: string | undefined;
|
|
98
99
|
tags?: string[] | undefined;
|
|
99
100
|
offset?: number | undefined;
|
|
100
101
|
user_email?: string | undefined;
|
|
101
102
|
collection?: string | undefined;
|
|
102
|
-
since?: string | undefined;
|
|
103
103
|
order_by?: "title" | "priority" | "created_at" | "updated_at" | undefined;
|
|
104
104
|
}, {
|
|
105
105
|
skill_id: string;
|
|
106
106
|
status?: "active" | "archived" | "processing" | undefined;
|
|
107
107
|
limit?: number | undefined;
|
|
108
|
+
since?: string | undefined;
|
|
108
109
|
tags?: string[] | undefined;
|
|
109
110
|
offset?: number | undefined;
|
|
110
111
|
user_email?: string | undefined;
|
|
111
112
|
collection?: string | undefined;
|
|
112
|
-
since?: string | undefined;
|
|
113
113
|
order_by?: "title" | "priority" | "created_at" | "updated_at" | undefined;
|
|
114
114
|
}>;
|
|
115
115
|
export type SkillStoreListParams = z.infer<typeof SkillStoreListParamsSchema>;
|
|
@@ -249,16 +249,16 @@ export declare const SkillStoreAggregateParamsSchema: z.ZodObject<{
|
|
|
249
249
|
}, "strip", z.ZodTypeAny, {
|
|
250
250
|
skill_id: string;
|
|
251
251
|
operation: "count" | "count_by_tag" | "count_by_status" | "latest" | "oldest";
|
|
252
|
+
since?: string | undefined;
|
|
252
253
|
user_email?: string | undefined;
|
|
253
254
|
collection?: string | undefined;
|
|
254
|
-
since?: string | undefined;
|
|
255
255
|
until?: string | undefined;
|
|
256
256
|
}, {
|
|
257
257
|
skill_id: string;
|
|
258
258
|
operation: "count" | "count_by_tag" | "count_by_status" | "latest" | "oldest";
|
|
259
|
+
since?: string | undefined;
|
|
259
260
|
user_email?: string | undefined;
|
|
260
261
|
collection?: string | undefined;
|
|
261
|
-
since?: string | undefined;
|
|
262
262
|
until?: string | undefined;
|
|
263
263
|
}>;
|
|
264
264
|
export type SkillStoreAggregateParams = z.infer<typeof SkillStoreAggregateParamsSchema>;
|
package/dist/tools/threads.d.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import type { ApiClient } from '../api-client.js';
|
|
7
|
-
import type { Logger } from '../logger.js';
|
|
8
7
|
import type { PluginConfig } from '../config.js';
|
|
8
|
+
import type { Logger } from '../logger.js';
|
|
9
9
|
/** Parameters for thread_list tool */
|
|
10
10
|
export declare const ThreadListParamsSchema: z.ZodObject<{
|
|
11
11
|
channel: z.ZodOptional<z.ZodEnum<["sms", "email"]>>;
|
|
@@ -13,12 +13,12 @@ export declare const ThreadListParamsSchema: z.ZodObject<{
|
|
|
13
13
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
14
14
|
}, "strip", z.ZodTypeAny, {
|
|
15
15
|
limit: number;
|
|
16
|
-
contactId?: string | undefined;
|
|
17
16
|
channel?: "email" | "sms" | undefined;
|
|
17
|
+
contactId?: string | undefined;
|
|
18
18
|
}, {
|
|
19
19
|
limit?: number | undefined;
|
|
20
|
-
contactId?: string | undefined;
|
|
21
20
|
channel?: "email" | "sms" | undefined;
|
|
21
|
+
contactId?: string | undefined;
|
|
22
22
|
}>;
|
|
23
23
|
export type ThreadListParams = z.infer<typeof ThreadListParamsSchema>;
|
|
24
24
|
/** Thread in list response (mapped from search results) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../src/tools/threads.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../src/tools/threads.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/threads.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
* Provides thread_list and thread_get tools for viewing message threads.
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
|
+
import { injectionLogLimiter } from '../utils/injection-log-rate-limiter.js';
|
|
7
|
+
import { createBoundaryMarkers, detectInjectionPatternsAsync, sanitizeMessageForContext, sanitizeMetadataField, wrapExternalMessage, } from '../utils/injection-protection.js';
|
|
6
8
|
/** Channel type enum */
|
|
7
9
|
const ChannelType = z.enum(['sms', 'email']);
|
|
8
10
|
/** Default and max limits */
|
|
@@ -82,11 +84,16 @@ export function createThreadListTool(options) {
|
|
|
82
84
|
resultCount: threadItems.length,
|
|
83
85
|
total,
|
|
84
86
|
});
|
|
85
|
-
// Format content for display
|
|
87
|
+
// Format content for display with injection protection.
|
|
88
|
+
// Sanitize snippet/title since they may contain external message content.
|
|
89
|
+
// Generate a per-invocation nonce for boundary markers (#1255)
|
|
90
|
+
const { nonce } = createBoundaryMarkers();
|
|
86
91
|
const content = threadItems.length > 0
|
|
87
92
|
? threadItems
|
|
88
93
|
.map((t) => {
|
|
89
|
-
|
|
94
|
+
const safeTitle = sanitizeMetadataField(t.title, nonce);
|
|
95
|
+
const wrappedSnippet = wrapExternalMessage(t.snippet, { nonce });
|
|
96
|
+
return `${safeTitle}: ${wrappedSnippet}`;
|
|
90
97
|
})
|
|
91
98
|
.join('\n')
|
|
92
99
|
: 'No threads found.';
|
|
@@ -128,7 +135,7 @@ export const ThreadGetParamsSchema = z.object({
|
|
|
128
135
|
* Creates the thread_get tool.
|
|
129
136
|
*/
|
|
130
137
|
export function createThreadGetTool(options) {
|
|
131
|
-
const { client, logger, userId } = options;
|
|
138
|
+
const { client, logger, config, userId } = options;
|
|
132
139
|
return {
|
|
133
140
|
name: 'thread_get',
|
|
134
141
|
description: 'Get a thread with its message history. Use to view the full conversation in a thread.',
|
|
@@ -168,15 +175,46 @@ export function createThreadGetTool(options) {
|
|
|
168
175
|
threadId,
|
|
169
176
|
messageCount: messages.length,
|
|
170
177
|
});
|
|
171
|
-
// Format content for display
|
|
172
|
-
|
|
173
|
-
const
|
|
178
|
+
// Format content for display — sanitize metadata fields interpolated outside boundary wrappers
|
|
179
|
+
// Generate a per-invocation nonce for boundary markers (#1255)
|
|
180
|
+
const { nonce: threadGetNonce } = createBoundaryMarkers();
|
|
181
|
+
const contact = sanitizeMetadataField(thread.contact?.displayName || 'Unknown', threadGetNonce);
|
|
182
|
+
const safeChannel = sanitizeMetadataField(thread.channel, threadGetNonce);
|
|
183
|
+
const header = `Thread with ${contact} [${safeChannel}]`;
|
|
184
|
+
// Detect and log potential injection patterns in inbound messages
|
|
185
|
+
// Rate-limited to prevent log flooding from volume attacks. (#1257)
|
|
186
|
+
for (const m of messages) {
|
|
187
|
+
if (m.direction === 'inbound' && m.body) {
|
|
188
|
+
const detection = await detectInjectionPatternsAsync(m.body, {
|
|
189
|
+
promptGuardUrl: config.promptGuardUrl,
|
|
190
|
+
});
|
|
191
|
+
if (detection.detected) {
|
|
192
|
+
const logDecision = injectionLogLimiter.shouldLog(userId);
|
|
193
|
+
if (logDecision.log) {
|
|
194
|
+
logger.warn(logDecision.summary ? 'injection detection log summary for previous window' : 'potential prompt injection detected in thread_get result', {
|
|
195
|
+
userId,
|
|
196
|
+
threadId,
|
|
197
|
+
messageId: m.id,
|
|
198
|
+
patterns: detection.patterns,
|
|
199
|
+
source: detection.source,
|
|
200
|
+
...(logDecision.suppressed > 0 && { suppressedCount: logDecision.suppressed }),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
174
206
|
const messageContent = messages.length > 0
|
|
175
207
|
? messages
|
|
176
208
|
.map((m) => {
|
|
177
209
|
const prefix = m.direction === 'inbound' ? '←' : '→';
|
|
178
210
|
const timestamp = new Date(m.createdAt).toLocaleString();
|
|
179
|
-
|
|
211
|
+
const body = sanitizeMessageForContext(m.body || '', {
|
|
212
|
+
direction: m.direction,
|
|
213
|
+
channel: thread.channel,
|
|
214
|
+
sender: contact,
|
|
215
|
+
nonce: threadGetNonce,
|
|
216
|
+
});
|
|
217
|
+
return `${prefix} [${timestamp}] ${body}`;
|
|
180
218
|
})
|
|
181
219
|
.join('\n')
|
|
182
220
|
: 'No messages in this thread.';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/tools/threads.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/tools/threads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* todo_search tool implementation.
|
|
3
|
+
* Provides semantic search through work items (todos and projects).
|
|
4
|
+
* Uses the unified search API with work_item type filter.
|
|
5
|
+
* Geo-contextual ranking added in Issue #1218.
|
|
6
|
+
*
|
|
7
|
+
* Part of Issue #1216.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import type { ApiClient } from '../api-client.js';
|
|
11
|
+
import type { Logger } from '../logger.js';
|
|
12
|
+
import type { PluginConfig } from '../config.js';
|
|
13
|
+
/** Parameters for todo_search tool */
|
|
14
|
+
export declare const TodoSearchParamsSchema: z.ZodObject<{
|
|
15
|
+
query: z.ZodString;
|
|
16
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
kind: z.ZodOptional<z.ZodEnum<["task", "project", "initiative", "epic", "issue"]>>;
|
|
18
|
+
status: z.ZodOptional<z.ZodString>;
|
|
19
|
+
location: z.ZodOptional<z.ZodObject<{
|
|
20
|
+
lat: z.ZodNumber;
|
|
21
|
+
lng: z.ZodNumber;
|
|
22
|
+
}, "strip", z.ZodTypeAny, {
|
|
23
|
+
lat: number;
|
|
24
|
+
lng: number;
|
|
25
|
+
}, {
|
|
26
|
+
lat: number;
|
|
27
|
+
lng: number;
|
|
28
|
+
}>>;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
query: string;
|
|
31
|
+
status?: string | undefined;
|
|
32
|
+
limit?: number | undefined;
|
|
33
|
+
location?: {
|
|
34
|
+
lat: number;
|
|
35
|
+
lng: number;
|
|
36
|
+
} | undefined;
|
|
37
|
+
kind?: "project" | "task" | "initiative" | "epic" | "issue" | undefined;
|
|
38
|
+
}, {
|
|
39
|
+
query: string;
|
|
40
|
+
status?: string | undefined;
|
|
41
|
+
limit?: number | undefined;
|
|
42
|
+
location?: {
|
|
43
|
+
lat: number;
|
|
44
|
+
lng: number;
|
|
45
|
+
} | undefined;
|
|
46
|
+
kind?: "project" | "task" | "initiative" | "epic" | "issue" | undefined;
|
|
47
|
+
}>;
|
|
48
|
+
export type TodoSearchParams = z.infer<typeof TodoSearchParamsSchema>;
|
|
49
|
+
/** Search result item */
|
|
50
|
+
export interface TodoSearchItem {
|
|
51
|
+
id: string;
|
|
52
|
+
title: string;
|
|
53
|
+
snippet: string;
|
|
54
|
+
score: number;
|
|
55
|
+
kind?: string;
|
|
56
|
+
status?: string;
|
|
57
|
+
}
|
|
58
|
+
/** Successful search result */
|
|
59
|
+
export interface TodoSearchSuccess {
|
|
60
|
+
success: true;
|
|
61
|
+
data: {
|
|
62
|
+
content: string;
|
|
63
|
+
details: {
|
|
64
|
+
count: number;
|
|
65
|
+
results: TodoSearchItem[];
|
|
66
|
+
searchType: string;
|
|
67
|
+
userId: string;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Failed result */
|
|
72
|
+
export interface TodoSearchFailure {
|
|
73
|
+
success: false;
|
|
74
|
+
error: string;
|
|
75
|
+
}
|
|
76
|
+
export type TodoSearchResult = TodoSearchSuccess | TodoSearchFailure;
|
|
77
|
+
/** Tool configuration */
|
|
78
|
+
export interface TodoSearchToolOptions {
|
|
79
|
+
client: ApiClient;
|
|
80
|
+
logger: Logger;
|
|
81
|
+
config: PluginConfig;
|
|
82
|
+
userId: string;
|
|
83
|
+
}
|
|
84
|
+
/** Tool definition */
|
|
85
|
+
export interface TodoSearchTool {
|
|
86
|
+
name: string;
|
|
87
|
+
description: string;
|
|
88
|
+
parameters: typeof TodoSearchParamsSchema;
|
|
89
|
+
execute: (params: TodoSearchParams) => Promise<TodoSearchResult>;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Creates the todo_search tool.
|
|
93
|
+
*/
|
|
94
|
+
export declare function createTodoSearchTool(options: TodoSearchToolOptions): TodoSearchTool;
|
|
95
|
+
//# sourceMappingURL=todo-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo-search.d.ts","sourceRoot":"","sources":["../../src/tools/todo-search.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,sCAAsC;AACtC,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,yBAAyB;AACzB,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+BAA+B;AAC/B,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE;YACP,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,cAAc,EAAE,CAAC;YAC1B,UAAU,EAAE,MAAM,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;CACH;AAED,oBAAoB;AACpB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAErE,yBAAyB;AACzB,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sBAAsB;AACtB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,sBAAsB,CAAC;IAC1C,OAAO,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAClE;AASD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CA8JnF"}
|