@troykelly/openclaw-projects 0.0.1
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/LICENSE +21 -0
- package/README.md +389 -0
- package/dist/api-client.d.ts +81 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +216 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli.d.ts +112 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +233 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +324 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +287 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +87 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +144 -0
- package/dist/context.js.map +1 -0
- package/dist/gateway/rpc-methods.d.ts +93 -0
- package/dist/gateway/rpc-methods.d.ts.map +1 -0
- package/dist/gateway/rpc-methods.js +145 -0
- package/dist/gateway/rpc-methods.js.map +1 -0
- package/dist/hooks.d.ts +86 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +314 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +106 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +221 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +78 -0
- package/dist/logger.js.map +1 -0
- package/dist/register-openclaw.d.ts +43 -0
- package/dist/register-openclaw.d.ts.map +1 -0
- package/dist/register-openclaw.js +1838 -0
- package/dist/register-openclaw.js.map +1 -0
- package/dist/secrets.d.ts +56 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +161 -0
- package/dist/secrets.js.map +1 -0
- package/dist/services/notification-service.d.ts +60 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +145 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/tools/contacts.d.ts +139 -0
- package/dist/tools/contacts.d.ts.map +1 -0
- package/dist/tools/contacts.js +333 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/email-send.d.ts +71 -0
- package/dist/tools/email-send.d.ts.map +1 -0
- package/dist/tools/email-send.js +132 -0
- package/dist/tools/email-send.js.map +1 -0
- package/dist/tools/file-share.d.ts +64 -0
- package/dist/tools/file-share.d.ts.map +1 -0
- package/dist/tools/file-share.js +133 -0
- package/dist/tools/file-share.js.map +1 -0
- package/dist/tools/index.d.ts +22 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory-forget.d.ts +69 -0
- package/dist/tools/memory-forget.d.ts.map +1 -0
- package/dist/tools/memory-forget.js +224 -0
- package/dist/tools/memory-forget.js.map +1 -0
- package/dist/tools/memory-recall.d.ts +82 -0
- package/dist/tools/memory-recall.d.ts.map +1 -0
- package/dist/tools/memory-recall.js +161 -0
- package/dist/tools/memory-recall.js.map +1 -0
- package/dist/tools/memory-store.d.ts +80 -0
- package/dist/tools/memory-store.d.ts.map +1 -0
- package/dist/tools/memory-store.js +172 -0
- package/dist/tools/memory-store.js.map +1 -0
- package/dist/tools/message-search.d.ts +85 -0
- package/dist/tools/message-search.d.ts.map +1 -0
- package/dist/tools/message-search.js +137 -0
- package/dist/tools/message-search.js.map +1 -0
- package/dist/tools/notebooks.d.ts +155 -0
- package/dist/tools/notebooks.d.ts.map +1 -0
- package/dist/tools/notebooks.js +287 -0
- package/dist/tools/notebooks.js.map +1 -0
- package/dist/tools/notes.d.ts +272 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +530 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/projects.d.ts +139 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +280 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/relationships.d.ts +133 -0
- package/dist/tools/relationships.d.ts.map +1 -0
- package/dist/tools/relationships.js +281 -0
- package/dist/tools/relationships.js.map +1 -0
- package/dist/tools/sms-send.d.ts +62 -0
- package/dist/tools/sms-send.d.ts.map +1 -0
- package/dist/tools/sms-send.js +121 -0
- package/dist/tools/sms-send.js.map +1 -0
- package/dist/tools/threads.d.ts +127 -0
- package/dist/tools/threads.d.ts.map +1 -0
- package/dist/tools/threads.js +202 -0
- package/dist/tools/threads.js.map +1 -0
- package/dist/tools/todos.d.ts +142 -0
- package/dist/tools/todos.d.ts.map +1 -0
- package/dist/tools/todos.js +308 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/types/openclaw-api.d.ts +215 -0
- package/dist/types/openclaw-api.d.ts.map +1 -0
- package/dist/types/openclaw-api.js +10 -0
- package/dist/types/openclaw-api.js.map +1 -0
- package/dist/utils/zod-to-json-schema.d.ts +19 -0
- package/dist/utils/zod-to-json-schema.d.ts.map +1 -0
- package/dist/utils/zod-to-json-schema.js +132 -0
- package/dist/utils/zod-to-json-schema.js.map +1 -0
- package/openclaw.plugin.json +229 -0
- package/package.json +69 -0
- package/skills/contact-lookup/SKILL.md +30 -0
- package/skills/daily-summary/SKILL.md +23 -0
- package/skills/project-status/SKILL.md +33 -0
- package/skills/send-reminder/SKILL.md +42 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* memory_store tool implementation.
|
|
3
|
+
* Persists important information to long-term memory.
|
|
4
|
+
* Tags support added in Issue #492.
|
|
5
|
+
* Relationship scope added in Issue #493.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { MemoryCategory } from './memory-recall.js';
|
|
9
|
+
/** Parameters for memory_store tool */
|
|
10
|
+
export const MemoryStoreParamsSchema = z.object({
|
|
11
|
+
text: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1, 'Text cannot be empty')
|
|
14
|
+
.max(5000, 'Text must be 5000 characters or less'),
|
|
15
|
+
category: MemoryCategory.optional(),
|
|
16
|
+
importance: z.number().min(0).max(1).optional(),
|
|
17
|
+
tags: z
|
|
18
|
+
.array(z.string().min(1).max(100))
|
|
19
|
+
.max(20, 'Maximum 20 tags per memory')
|
|
20
|
+
.optional(),
|
|
21
|
+
relationship_id: z
|
|
22
|
+
.string()
|
|
23
|
+
.uuid('relationship_id must be a valid UUID')
|
|
24
|
+
.optional(),
|
|
25
|
+
});
|
|
26
|
+
/** Patterns that may indicate credentials */
|
|
27
|
+
const CREDENTIAL_PATTERNS = [
|
|
28
|
+
/sk-[a-zA-Z0-9]{20,}/i, // OpenAI-style API keys
|
|
29
|
+
/api[_-]?key[:\s]*[a-zA-Z0-9]{16,}/i, // Generic API keys
|
|
30
|
+
/password[:\s]*\S{8,}/i, // Passwords
|
|
31
|
+
/secret[_-]?key[:\s]*[a-zA-Z0-9]{16,}/i, // Secret keys
|
|
32
|
+
/bearer\s+[a-zA-Z0-9._-]{20,}/i, // Bearer tokens
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Sanitize text input to remove control characters.
|
|
36
|
+
*/
|
|
37
|
+
function sanitizeText(text) {
|
|
38
|
+
// Remove control characters (ASCII 0-31 except tab, newline, carriage return)
|
|
39
|
+
const sanitized = text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
|
|
40
|
+
// Trim whitespace
|
|
41
|
+
return sanitized.trim();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if text may contain credentials.
|
|
45
|
+
*/
|
|
46
|
+
function mayContainCredentials(text) {
|
|
47
|
+
return CREDENTIAL_PATTERNS.some((pattern) => pattern.test(text));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Truncate text for display preview.
|
|
51
|
+
*/
|
|
52
|
+
function truncateForPreview(text, maxLength = 100) {
|
|
53
|
+
if (text.length <= maxLength) {
|
|
54
|
+
return text;
|
|
55
|
+
}
|
|
56
|
+
return text.substring(0, maxLength) + '...';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a sanitized error message that doesn't expose internal details.
|
|
60
|
+
*/
|
|
61
|
+
function sanitizeErrorMessage(error) {
|
|
62
|
+
if (error instanceof Error) {
|
|
63
|
+
const message = error.message
|
|
64
|
+
.replace(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g, '[host]')
|
|
65
|
+
.replace(/:\d{2,5}\b/g, '')
|
|
66
|
+
.replace(/\b(?:localhost|internal[-\w]*)\b/gi, '[internal]');
|
|
67
|
+
if (message.includes('[internal]') || message.includes('[host]')) {
|
|
68
|
+
return 'Failed to store memory. Please try again.';
|
|
69
|
+
}
|
|
70
|
+
return message;
|
|
71
|
+
}
|
|
72
|
+
return 'An unexpected error occurred while storing memory.';
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates the memory_store tool.
|
|
76
|
+
*/
|
|
77
|
+
export function createMemoryStoreTool(options) {
|
|
78
|
+
const { client, logger, config, userId } = options;
|
|
79
|
+
return {
|
|
80
|
+
name: 'memory_store',
|
|
81
|
+
description: 'Save important information to long-term memory. Use for preferences, facts, decisions, or any information worth remembering. Optionally tag memories for structured retrieval (e.g., ["music", "work", "food"]). Use relationship_id to scope memories to a specific relationship between contacts (e.g., anniversaries, shared preferences).',
|
|
82
|
+
parameters: MemoryStoreParamsSchema,
|
|
83
|
+
async execute(params) {
|
|
84
|
+
// Validate parameters
|
|
85
|
+
const parseResult = MemoryStoreParamsSchema.safeParse(params);
|
|
86
|
+
if (!parseResult.success) {
|
|
87
|
+
const errorMessage = parseResult.error.errors
|
|
88
|
+
.map((e) => `${e.path.join('.')}: ${e.message}`)
|
|
89
|
+
.join(', ');
|
|
90
|
+
return { success: false, error: errorMessage };
|
|
91
|
+
}
|
|
92
|
+
const { text, category = 'other', importance = 0.7, tags = [], relationship_id, } = parseResult.data;
|
|
93
|
+
// Sanitize text
|
|
94
|
+
const sanitizedText = sanitizeText(text);
|
|
95
|
+
if (sanitizedText.length === 0) {
|
|
96
|
+
return { success: false, error: 'Text cannot be empty after sanitization' };
|
|
97
|
+
}
|
|
98
|
+
// Check for potential credentials (warn but don't block)
|
|
99
|
+
if (mayContainCredentials(sanitizedText)) {
|
|
100
|
+
logger.warn('Potential credential detected in memory_store', {
|
|
101
|
+
userId,
|
|
102
|
+
textLength: sanitizedText.length,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Log invocation (without content for privacy)
|
|
106
|
+
logger.info('memory_store invoked', {
|
|
107
|
+
userId,
|
|
108
|
+
category,
|
|
109
|
+
importance,
|
|
110
|
+
tags,
|
|
111
|
+
textLength: sanitizedText.length,
|
|
112
|
+
});
|
|
113
|
+
try {
|
|
114
|
+
// Store memory via API
|
|
115
|
+
const payload = {
|
|
116
|
+
content: sanitizedText,
|
|
117
|
+
category,
|
|
118
|
+
importance,
|
|
119
|
+
tags,
|
|
120
|
+
};
|
|
121
|
+
if (relationship_id) {
|
|
122
|
+
payload.relationship_id = relationship_id;
|
|
123
|
+
}
|
|
124
|
+
const response = await client.post('/api/memories', payload, { userId });
|
|
125
|
+
if (!response.success) {
|
|
126
|
+
logger.error('memory_store API error', {
|
|
127
|
+
userId,
|
|
128
|
+
status: response.error.status,
|
|
129
|
+
code: response.error.code,
|
|
130
|
+
});
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
error: response.error.message || 'Failed to store memory',
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const stored = response.data;
|
|
137
|
+
// Format response
|
|
138
|
+
const preview = truncateForPreview(sanitizedText);
|
|
139
|
+
const tagSuffix = tags.length > 0 ? ` (tags: ${tags.join(', ')})` : '';
|
|
140
|
+
const content = `Stored memory [${category}]: "${preview}"${tagSuffix}`;
|
|
141
|
+
logger.debug('memory_store completed', {
|
|
142
|
+
userId,
|
|
143
|
+
memoryId: stored.id,
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
success: true,
|
|
147
|
+
data: {
|
|
148
|
+
content,
|
|
149
|
+
details: {
|
|
150
|
+
id: stored.id,
|
|
151
|
+
category,
|
|
152
|
+
importance,
|
|
153
|
+
tags,
|
|
154
|
+
userId,
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
logger.error('memory_store failed', {
|
|
161
|
+
userId,
|
|
162
|
+
error: error instanceof Error ? error.message : String(error),
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
error: sanitizeErrorMessage(error),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/tools/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* message_search tool implementation.
|
|
3
|
+
* Searches message history semantically using pgvector embeddings.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import type { ApiClient } from '../api-client.js';
|
|
7
|
+
import type { Logger } from '../logger.js';
|
|
8
|
+
import type { PluginConfig } from '../config.js';
|
|
9
|
+
/** Parameters for message_search tool */
|
|
10
|
+
export declare const MessageSearchParamsSchema: z.ZodObject<{
|
|
11
|
+
query: z.ZodString;
|
|
12
|
+
channel: z.ZodDefault<z.ZodEnum<["sms", "email", "all"]>>;
|
|
13
|
+
contactId: z.ZodOptional<z.ZodString>;
|
|
14
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
15
|
+
includeThread: z.ZodDefault<z.ZodBoolean>;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
query: string;
|
|
18
|
+
limit: number;
|
|
19
|
+
channel: "email" | "all" | "sms";
|
|
20
|
+
includeThread: boolean;
|
|
21
|
+
contactId?: string | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
query: string;
|
|
24
|
+
limit?: number | undefined;
|
|
25
|
+
contactId?: string | undefined;
|
|
26
|
+
channel?: "email" | "all" | "sms" | undefined;
|
|
27
|
+
includeThread?: boolean | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
export type MessageSearchParams = z.infer<typeof MessageSearchParamsSchema>;
|
|
30
|
+
/** Message result for tool output */
|
|
31
|
+
interface MessageResult {
|
|
32
|
+
id: string;
|
|
33
|
+
body: string;
|
|
34
|
+
direction: 'inbound' | 'outbound';
|
|
35
|
+
channel: string;
|
|
36
|
+
contactName?: string;
|
|
37
|
+
timestamp: string;
|
|
38
|
+
similarity: number;
|
|
39
|
+
threadId?: string;
|
|
40
|
+
threadContext?: Array<{
|
|
41
|
+
id: string;
|
|
42
|
+
body: string;
|
|
43
|
+
direction: string;
|
|
44
|
+
timestamp: string;
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
47
|
+
/** Successful tool result */
|
|
48
|
+
export interface MessageSearchSuccess {
|
|
49
|
+
success: true;
|
|
50
|
+
data: {
|
|
51
|
+
content: string;
|
|
52
|
+
details: {
|
|
53
|
+
messages: MessageResult[];
|
|
54
|
+
total: number;
|
|
55
|
+
userId: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Failed tool result */
|
|
60
|
+
export interface MessageSearchFailure {
|
|
61
|
+
success: false;
|
|
62
|
+
error: string;
|
|
63
|
+
}
|
|
64
|
+
/** Tool result type */
|
|
65
|
+
export type MessageSearchResult = MessageSearchSuccess | MessageSearchFailure;
|
|
66
|
+
/** Tool configuration */
|
|
67
|
+
export interface MessageSearchToolOptions {
|
|
68
|
+
client: ApiClient;
|
|
69
|
+
logger: Logger;
|
|
70
|
+
config: PluginConfig;
|
|
71
|
+
userId: string;
|
|
72
|
+
}
|
|
73
|
+
/** Tool definition */
|
|
74
|
+
export interface MessageSearchTool {
|
|
75
|
+
name: string;
|
|
76
|
+
description: string;
|
|
77
|
+
parameters: typeof MessageSearchParamsSchema;
|
|
78
|
+
execute: (params: MessageSearchParams) => Promise<MessageSearchResult>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Creates the message_search tool.
|
|
82
|
+
*/
|
|
83
|
+
export declare function createMessageSearchTool(options: MessageSearchToolOptions): MessageSearchTool;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=message-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-search.d.ts","sourceRoot":"","sources":["../../src/tools/message-search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAYhD,yCAAyC;AACzC,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;EAapC,CAAA;AACF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AA0B3E,qCAAqC;AACrC,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,SAAS,GAAG,UAAU,CAAA;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAC,CAAA;CACH;AAED,6BAA6B;AAC7B,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,IAAI,CAAA;IACb,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE;YACP,QAAQ,EAAE,aAAa,EAAE,CAAA;YACzB,KAAK,EAAE,MAAM,CAAA;YACb,MAAM,EAAE,MAAM,CAAA;SACf,CAAA;KACF,CAAA;CACF;AAED,yBAAyB;AACzB,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,uBAAuB;AACvB,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,CAAA;AAE7E,yBAAyB;AACzB,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,sBAAsB;AACtB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,yBAAyB,CAAA;IAC5C,OAAO,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACvE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CA2H5F"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* message_search tool implementation.
|
|
3
|
+
* Searches message history semantically using pgvector embeddings.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/** Channel type enum */
|
|
7
|
+
const ChannelType = z.enum(['sms', 'email', 'all']);
|
|
8
|
+
/** Maximum results limit */
|
|
9
|
+
const MAX_LIMIT = 100;
|
|
10
|
+
/** Default results limit */
|
|
11
|
+
const DEFAULT_LIMIT = 10;
|
|
12
|
+
/** Parameters for message_search tool */
|
|
13
|
+
export const MessageSearchParamsSchema = z.object({
|
|
14
|
+
query: z
|
|
15
|
+
.string()
|
|
16
|
+
.min(1, 'Search query cannot be empty'),
|
|
17
|
+
channel: ChannelType.default('all'),
|
|
18
|
+
contactId: z.string().uuid().optional(),
|
|
19
|
+
limit: z
|
|
20
|
+
.number()
|
|
21
|
+
.int()
|
|
22
|
+
.min(1, 'Limit must be at least 1')
|
|
23
|
+
.max(MAX_LIMIT, `Limit must be ${MAX_LIMIT} or less`)
|
|
24
|
+
.default(DEFAULT_LIMIT),
|
|
25
|
+
includeThread: z.boolean().default(false),
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* Creates the message_search tool.
|
|
29
|
+
*/
|
|
30
|
+
export function createMessageSearchTool(options) {
|
|
31
|
+
const { client, logger, userId } = options;
|
|
32
|
+
return {
|
|
33
|
+
name: 'message_search',
|
|
34
|
+
description: 'Search message history semantically. Use when you need to find past conversations, ' +
|
|
35
|
+
'messages about specific topics, or communications with contacts. ' +
|
|
36
|
+
'Supports filtering by channel (SMS/email) and contact.',
|
|
37
|
+
parameters: MessageSearchParamsSchema,
|
|
38
|
+
async execute(params) {
|
|
39
|
+
// Validate parameters
|
|
40
|
+
const parseResult = MessageSearchParamsSchema.safeParse(params);
|
|
41
|
+
if (!parseResult.success) {
|
|
42
|
+
const errorMessage = parseResult.error.errors
|
|
43
|
+
.map((e) => `${e.path.join('.')}: ${e.message}`)
|
|
44
|
+
.join(', ');
|
|
45
|
+
return { success: false, error: errorMessage };
|
|
46
|
+
}
|
|
47
|
+
const { query, channel, contactId, limit, includeThread } = parseResult.data;
|
|
48
|
+
// Log invocation
|
|
49
|
+
logger.info('message_search invoked', {
|
|
50
|
+
userId,
|
|
51
|
+
queryLength: query.length,
|
|
52
|
+
channel,
|
|
53
|
+
hasContactId: !!contactId,
|
|
54
|
+
limit,
|
|
55
|
+
includeThread,
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
// Build query parameters
|
|
59
|
+
const queryParams = new URLSearchParams();
|
|
60
|
+
queryParams.set('q', query);
|
|
61
|
+
queryParams.set('types', 'message');
|
|
62
|
+
queryParams.set('limit', String(limit));
|
|
63
|
+
if (channel !== 'all') {
|
|
64
|
+
queryParams.set('channel', channel);
|
|
65
|
+
}
|
|
66
|
+
if (contactId) {
|
|
67
|
+
queryParams.set('contactId', contactId);
|
|
68
|
+
}
|
|
69
|
+
if (includeThread) {
|
|
70
|
+
queryParams.set('includeThread', 'true');
|
|
71
|
+
}
|
|
72
|
+
// Call API
|
|
73
|
+
const response = await client.get(`/api/search?${queryParams}`, { userId });
|
|
74
|
+
if (!response.success) {
|
|
75
|
+
logger.error('message_search API error', {
|
|
76
|
+
userId,
|
|
77
|
+
status: response.error.status,
|
|
78
|
+
code: response.error.code,
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
error: response.error.message || 'Failed to search messages',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const { results, total } = response.data;
|
|
86
|
+
// Transform results
|
|
87
|
+
const messages = results.map((r) => ({
|
|
88
|
+
id: r.id,
|
|
89
|
+
body: r.body,
|
|
90
|
+
direction: r.direction,
|
|
91
|
+
channel: r.channel,
|
|
92
|
+
contactName: r.contactName,
|
|
93
|
+
timestamp: r.timestamp,
|
|
94
|
+
similarity: r.score,
|
|
95
|
+
threadId: r.threadId,
|
|
96
|
+
threadContext: r.threadMessages,
|
|
97
|
+
}));
|
|
98
|
+
logger.debug('message_search completed', {
|
|
99
|
+
userId,
|
|
100
|
+
resultCount: messages.length,
|
|
101
|
+
total,
|
|
102
|
+
});
|
|
103
|
+
// Format content for display
|
|
104
|
+
const content = messages.length > 0
|
|
105
|
+
? messages.map((m) => {
|
|
106
|
+
const prefix = m.direction === 'inbound' ? '←' : '→';
|
|
107
|
+
const contact = m.contactName || 'Unknown';
|
|
108
|
+
const similarity = `(${Math.round(m.similarity * 100)}%)`;
|
|
109
|
+
return `${prefix} [${m.channel}] ${contact} ${similarity}: ${m.body.substring(0, 100)}${m.body.length > 100 ? '...' : ''}`;
|
|
110
|
+
}).join('\n')
|
|
111
|
+
: 'No messages found matching your query.';
|
|
112
|
+
return {
|
|
113
|
+
success: true,
|
|
114
|
+
data: {
|
|
115
|
+
content,
|
|
116
|
+
details: {
|
|
117
|
+
messages,
|
|
118
|
+
total,
|
|
119
|
+
userId,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
logger.error('message_search failed', {
|
|
126
|
+
userId,
|
|
127
|
+
error: error instanceof Error ? error.message : String(error),
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: error instanceof Error ? error.message : 'An unexpected error occurred while searching messages.',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=message-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-search.js","sourceRoot":"","sources":["../../src/tools/message-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notebook tools for OpenClaw agents.
|
|
3
|
+
* Part of Epic #339, Issue #363
|
|
4
|
+
*
|
|
5
|
+
* Provides tools for:
|
|
6
|
+
* - notebook_list: List user's notebooks
|
|
7
|
+
* - notebook_create: Create a new notebook
|
|
8
|
+
* - notebook_get: Get a notebook by ID
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import type { ApiClient } from '../api-client.js';
|
|
12
|
+
import type { Logger } from '../logger.js';
|
|
13
|
+
import type { PluginConfig } from '../config.js';
|
|
14
|
+
/** Notebook from API */
|
|
15
|
+
export interface Notebook {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description: string | null;
|
|
19
|
+
userEmail: string;
|
|
20
|
+
isArchived: boolean;
|
|
21
|
+
noteCount?: number;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
/** Tool options shared by all notebook tools */
|
|
26
|
+
export interface NotebookToolOptions {
|
|
27
|
+
client: ApiClient;
|
|
28
|
+
logger: Logger;
|
|
29
|
+
config: PluginConfig;
|
|
30
|
+
userId: string;
|
|
31
|
+
}
|
|
32
|
+
export declare const NotebookListParamsSchema: z.ZodObject<{
|
|
33
|
+
includeArchived: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
34
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
35
|
+
offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
limit: number;
|
|
38
|
+
offset: number;
|
|
39
|
+
includeArchived: boolean;
|
|
40
|
+
}, {
|
|
41
|
+
limit?: number | undefined;
|
|
42
|
+
offset?: number | undefined;
|
|
43
|
+
includeArchived?: boolean | undefined;
|
|
44
|
+
}>;
|
|
45
|
+
export type NotebookListParams = z.infer<typeof NotebookListParamsSchema>;
|
|
46
|
+
export interface NotebookListSuccess {
|
|
47
|
+
success: true;
|
|
48
|
+
data: {
|
|
49
|
+
notebooks: Array<{
|
|
50
|
+
id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
description: string | null;
|
|
53
|
+
isArchived: boolean;
|
|
54
|
+
noteCount: number;
|
|
55
|
+
url: string;
|
|
56
|
+
}>;
|
|
57
|
+
total: number;
|
|
58
|
+
limit: number;
|
|
59
|
+
offset: number;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export interface NotebookListFailure {
|
|
63
|
+
success: false;
|
|
64
|
+
error: string;
|
|
65
|
+
}
|
|
66
|
+
export type NotebookListResult = NotebookListSuccess | NotebookListFailure;
|
|
67
|
+
export interface NotebookListTool {
|
|
68
|
+
name: string;
|
|
69
|
+
description: string;
|
|
70
|
+
parameters: typeof NotebookListParamsSchema;
|
|
71
|
+
execute: (params: NotebookListParams) => Promise<NotebookListResult>;
|
|
72
|
+
}
|
|
73
|
+
export declare function createNotebookListTool(options: NotebookToolOptions): NotebookListTool;
|
|
74
|
+
export declare const NotebookCreateParamsSchema: z.ZodObject<{
|
|
75
|
+
name: z.ZodString;
|
|
76
|
+
description: z.ZodOptional<z.ZodString>;
|
|
77
|
+
}, "strip", z.ZodTypeAny, {
|
|
78
|
+
name: string;
|
|
79
|
+
description?: string | undefined;
|
|
80
|
+
}, {
|
|
81
|
+
name: string;
|
|
82
|
+
description?: string | undefined;
|
|
83
|
+
}>;
|
|
84
|
+
export type NotebookCreateParams = z.infer<typeof NotebookCreateParamsSchema>;
|
|
85
|
+
export interface NotebookCreateSuccess {
|
|
86
|
+
success: true;
|
|
87
|
+
data: {
|
|
88
|
+
id: string;
|
|
89
|
+
name: string;
|
|
90
|
+
description: string | null;
|
|
91
|
+
createdAt: string;
|
|
92
|
+
url: string;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export interface NotebookCreateFailure {
|
|
96
|
+
success: false;
|
|
97
|
+
error: string;
|
|
98
|
+
}
|
|
99
|
+
export type NotebookCreateResult = NotebookCreateSuccess | NotebookCreateFailure;
|
|
100
|
+
export interface NotebookCreateTool {
|
|
101
|
+
name: string;
|
|
102
|
+
description: string;
|
|
103
|
+
parameters: typeof NotebookCreateParamsSchema;
|
|
104
|
+
execute: (params: NotebookCreateParams) => Promise<NotebookCreateResult>;
|
|
105
|
+
}
|
|
106
|
+
export declare function createNotebookCreateTool(options: NotebookToolOptions): NotebookCreateTool;
|
|
107
|
+
export declare const NotebookGetParamsSchema: z.ZodObject<{
|
|
108
|
+
notebookId: z.ZodString;
|
|
109
|
+
includeNotes: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
110
|
+
}, "strip", z.ZodTypeAny, {
|
|
111
|
+
notebookId: string;
|
|
112
|
+
includeNotes: boolean;
|
|
113
|
+
}, {
|
|
114
|
+
notebookId: string;
|
|
115
|
+
includeNotes?: boolean | undefined;
|
|
116
|
+
}>;
|
|
117
|
+
export type NotebookGetParams = z.infer<typeof NotebookGetParamsSchema>;
|
|
118
|
+
export interface NotebookNote {
|
|
119
|
+
id: string;
|
|
120
|
+
title: string;
|
|
121
|
+
visibility: string;
|
|
122
|
+
updatedAt: string;
|
|
123
|
+
}
|
|
124
|
+
export interface NotebookGetSuccess {
|
|
125
|
+
success: true;
|
|
126
|
+
data: {
|
|
127
|
+
id: string;
|
|
128
|
+
name: string;
|
|
129
|
+
description: string | null;
|
|
130
|
+
isArchived: boolean;
|
|
131
|
+
noteCount: number;
|
|
132
|
+
createdAt: string;
|
|
133
|
+
updatedAt: string;
|
|
134
|
+
url: string;
|
|
135
|
+
notes?: Array<{
|
|
136
|
+
id: string;
|
|
137
|
+
title: string;
|
|
138
|
+
visibility: string;
|
|
139
|
+
url: string;
|
|
140
|
+
}>;
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
export interface NotebookGetFailure {
|
|
144
|
+
success: false;
|
|
145
|
+
error: string;
|
|
146
|
+
}
|
|
147
|
+
export type NotebookGetResult = NotebookGetSuccess | NotebookGetFailure;
|
|
148
|
+
export interface NotebookGetTool {
|
|
149
|
+
name: string;
|
|
150
|
+
description: string;
|
|
151
|
+
parameters: typeof NotebookGetParamsSchema;
|
|
152
|
+
execute: (params: NotebookGetParams) => Promise<NotebookGetResult>;
|
|
153
|
+
}
|
|
154
|
+
export declare function createNotebookGetTool(options: NotebookToolOptions): NotebookGetTool;
|
|
155
|
+
//# sourceMappingURL=notebooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebooks.d.ts","sourceRoot":"","sources":["../../src/tools/notebooks.ts"],"names":[],"mappings":"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"}
|