@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,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contact management tools implementation.
|
|
3
|
+
* Provides contact_search, contact_get, and contact_create tools.
|
|
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 contact_search tool */
|
|
10
|
+
export declare const ContactSearchParamsSchema: z.ZodObject<{
|
|
11
|
+
query: z.ZodString;
|
|
12
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
query: string;
|
|
15
|
+
limit?: number | undefined;
|
|
16
|
+
}, {
|
|
17
|
+
query: string;
|
|
18
|
+
limit?: number | undefined;
|
|
19
|
+
}>;
|
|
20
|
+
export type ContactSearchParams = z.infer<typeof ContactSearchParamsSchema>;
|
|
21
|
+
/** Contact item from API */
|
|
22
|
+
export interface Contact {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
email?: string;
|
|
26
|
+
phone?: string;
|
|
27
|
+
notes?: string;
|
|
28
|
+
createdAt?: string;
|
|
29
|
+
updatedAt?: string;
|
|
30
|
+
}
|
|
31
|
+
/** Successful search result */
|
|
32
|
+
export interface ContactSearchSuccess {
|
|
33
|
+
success: true;
|
|
34
|
+
data: {
|
|
35
|
+
content: string;
|
|
36
|
+
details: {
|
|
37
|
+
contacts: Contact[];
|
|
38
|
+
total: number;
|
|
39
|
+
userId: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Failed result */
|
|
44
|
+
export interface ContactFailure {
|
|
45
|
+
success: false;
|
|
46
|
+
error: string;
|
|
47
|
+
}
|
|
48
|
+
export type ContactSearchResult = ContactSearchSuccess | ContactFailure;
|
|
49
|
+
/** Tool configuration */
|
|
50
|
+
export interface ContactToolOptions {
|
|
51
|
+
client: ApiClient;
|
|
52
|
+
logger: Logger;
|
|
53
|
+
config: PluginConfig;
|
|
54
|
+
userId: string;
|
|
55
|
+
}
|
|
56
|
+
/** Tool definition */
|
|
57
|
+
export interface ContactSearchTool {
|
|
58
|
+
name: string;
|
|
59
|
+
description: string;
|
|
60
|
+
parameters: typeof ContactSearchParamsSchema;
|
|
61
|
+
execute: (params: ContactSearchParams) => Promise<ContactSearchResult>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Creates the contact_search tool.
|
|
65
|
+
*/
|
|
66
|
+
export declare function createContactSearchTool(options: ContactToolOptions): ContactSearchTool;
|
|
67
|
+
/** Parameters for contact_get tool */
|
|
68
|
+
export declare const ContactGetParamsSchema: z.ZodObject<{
|
|
69
|
+
id: z.ZodString;
|
|
70
|
+
}, "strip", z.ZodTypeAny, {
|
|
71
|
+
id: string;
|
|
72
|
+
}, {
|
|
73
|
+
id: string;
|
|
74
|
+
}>;
|
|
75
|
+
export type ContactGetParams = z.infer<typeof ContactGetParamsSchema>;
|
|
76
|
+
/** Successful get result */
|
|
77
|
+
export interface ContactGetSuccess {
|
|
78
|
+
success: true;
|
|
79
|
+
data: {
|
|
80
|
+
content: string;
|
|
81
|
+
details: {
|
|
82
|
+
contact: Contact;
|
|
83
|
+
userId: string;
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export type ContactGetResult = ContactGetSuccess | ContactFailure;
|
|
88
|
+
export interface ContactGetTool {
|
|
89
|
+
name: string;
|
|
90
|
+
description: string;
|
|
91
|
+
parameters: typeof ContactGetParamsSchema;
|
|
92
|
+
execute: (params: ContactGetParams) => Promise<ContactGetResult>;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Creates the contact_get tool.
|
|
96
|
+
*/
|
|
97
|
+
export declare function createContactGetTool(options: ContactToolOptions): ContactGetTool;
|
|
98
|
+
/** Parameters for contact_create tool */
|
|
99
|
+
export declare const ContactCreateParamsSchema: z.ZodObject<{
|
|
100
|
+
name: z.ZodString;
|
|
101
|
+
email: z.ZodOptional<z.ZodString>;
|
|
102
|
+
phone: z.ZodOptional<z.ZodString>;
|
|
103
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
104
|
+
}, "strip", z.ZodTypeAny, {
|
|
105
|
+
name: string;
|
|
106
|
+
email?: string | undefined;
|
|
107
|
+
phone?: string | undefined;
|
|
108
|
+
notes?: string | undefined;
|
|
109
|
+
}, {
|
|
110
|
+
name: string;
|
|
111
|
+
email?: string | undefined;
|
|
112
|
+
phone?: string | undefined;
|
|
113
|
+
notes?: string | undefined;
|
|
114
|
+
}>;
|
|
115
|
+
export type ContactCreateParams = z.infer<typeof ContactCreateParamsSchema>;
|
|
116
|
+
/** Successful create result */
|
|
117
|
+
export interface ContactCreateSuccess {
|
|
118
|
+
success: true;
|
|
119
|
+
data: {
|
|
120
|
+
content: string;
|
|
121
|
+
details: {
|
|
122
|
+
id: string;
|
|
123
|
+
name: string;
|
|
124
|
+
userId: string;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export type ContactCreateResult = ContactCreateSuccess | ContactFailure;
|
|
129
|
+
export interface ContactCreateTool {
|
|
130
|
+
name: string;
|
|
131
|
+
description: string;
|
|
132
|
+
parameters: typeof ContactCreateParamsSchema;
|
|
133
|
+
execute: (params: ContactCreateParams) => Promise<ContactCreateResult>;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Creates the contact_create tool.
|
|
137
|
+
*/
|
|
138
|
+
export declare function createContactCreateTool(options: ContactToolOptions): ContactCreateTool;
|
|
139
|
+
//# sourceMappingURL=contacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contact management tools implementation.
|
|
3
|
+
* Provides contact_search, contact_get, and contact_create tools.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/** UUID validation regex */
|
|
7
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
8
|
+
/** Email validation regex (simplified RFC 5322) */
|
|
9
|
+
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
10
|
+
/** Phone validation regex (E.164 or common formats with digits) */
|
|
11
|
+
const PHONE_REGEX = /^\+?[0-9\s()-]{7,20}$/;
|
|
12
|
+
// ==================== contact_search ====================
|
|
13
|
+
/** Parameters for contact_search tool */
|
|
14
|
+
export const ContactSearchParamsSchema = z.object({
|
|
15
|
+
query: z
|
|
16
|
+
.string()
|
|
17
|
+
.min(1, 'Search query is required')
|
|
18
|
+
.max(200, 'Search query must be 200 characters or less'),
|
|
19
|
+
limit: z.number().int().min(1).max(50).optional(),
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Create a sanitized error message.
|
|
23
|
+
*/
|
|
24
|
+
function sanitizeErrorMessage(error) {
|
|
25
|
+
if (error instanceof Error) {
|
|
26
|
+
const message = error.message
|
|
27
|
+
.replace(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g, '[host]')
|
|
28
|
+
.replace(/:\d{2,5}\b/g, '')
|
|
29
|
+
.replace(/\b(?:localhost|internal[-\w]*)\b/gi, '[internal]');
|
|
30
|
+
if (message.includes('[internal]') || message.includes('[host]')) {
|
|
31
|
+
return 'Operation failed. Please try again.';
|
|
32
|
+
}
|
|
33
|
+
return message;
|
|
34
|
+
}
|
|
35
|
+
return 'An unexpected error occurred.';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Strip HTML tags from a string.
|
|
39
|
+
* Also removes content inside script and style tags for security.
|
|
40
|
+
*/
|
|
41
|
+
function stripHtml(text) {
|
|
42
|
+
return text
|
|
43
|
+
.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
|
|
44
|
+
.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, '')
|
|
45
|
+
.replace(/<[^>]*>/g, '')
|
|
46
|
+
.trim();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sanitize query input to remove control characters.
|
|
50
|
+
*/
|
|
51
|
+
function sanitizeQuery(query) {
|
|
52
|
+
const sanitized = query.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
|
|
53
|
+
return sanitized.trim();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validate UUID format.
|
|
57
|
+
*/
|
|
58
|
+
function isValidUuid(id) {
|
|
59
|
+
return UUID_REGEX.test(id);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate email format.
|
|
63
|
+
*/
|
|
64
|
+
function isValidEmail(email) {
|
|
65
|
+
return EMAIL_REGEX.test(email);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Validate phone format.
|
|
69
|
+
*/
|
|
70
|
+
function isValidPhone(phone) {
|
|
71
|
+
// Must have at least some digits
|
|
72
|
+
const digitCount = (phone.match(/\d/g) || []).length;
|
|
73
|
+
return PHONE_REGEX.test(phone) && digitCount >= 7;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Creates the contact_search tool.
|
|
77
|
+
*/
|
|
78
|
+
export function createContactSearchTool(options) {
|
|
79
|
+
const { client, logger, userId } = options;
|
|
80
|
+
return {
|
|
81
|
+
name: 'contact_search',
|
|
82
|
+
description: 'Search for contacts by name, email, or phone number.',
|
|
83
|
+
parameters: ContactSearchParamsSchema,
|
|
84
|
+
async execute(params) {
|
|
85
|
+
const parseResult = ContactSearchParamsSchema.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 { query, limit = 20 } = parseResult.data;
|
|
93
|
+
const sanitizedQuery = sanitizeQuery(query);
|
|
94
|
+
if (sanitizedQuery.length === 0) {
|
|
95
|
+
return { success: false, error: 'Search query cannot be empty' };
|
|
96
|
+
}
|
|
97
|
+
// Log without PII
|
|
98
|
+
logger.info('contact_search invoked', { userId, queryLength: sanitizedQuery.length, limit });
|
|
99
|
+
try {
|
|
100
|
+
const queryParams = new URLSearchParams({
|
|
101
|
+
q: sanitizedQuery,
|
|
102
|
+
limit: String(limit),
|
|
103
|
+
});
|
|
104
|
+
const response = await client.get(`/api/contacts/search?${queryParams.toString()}`, { userId });
|
|
105
|
+
if (!response.success) {
|
|
106
|
+
logger.error('contact_search API error', {
|
|
107
|
+
userId,
|
|
108
|
+
status: response.error.status,
|
|
109
|
+
code: response.error.code,
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
success: false,
|
|
113
|
+
error: response.error.message || 'Failed to search contacts',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const contacts = response.data.contacts ?? response.data.items ?? [];
|
|
117
|
+
const total = response.data.total ?? contacts.length;
|
|
118
|
+
if (contacts.length === 0) {
|
|
119
|
+
return {
|
|
120
|
+
success: true,
|
|
121
|
+
data: {
|
|
122
|
+
content: 'No contacts found matching your search.',
|
|
123
|
+
details: { contacts: [], total: 0, userId },
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const content = contacts
|
|
128
|
+
.map((c) => {
|
|
129
|
+
const parts = [c.name];
|
|
130
|
+
if (c.email)
|
|
131
|
+
parts.push(`<${c.email}>`);
|
|
132
|
+
if (c.phone)
|
|
133
|
+
parts.push(c.phone);
|
|
134
|
+
return `- ${parts.join(' ')}`;
|
|
135
|
+
})
|
|
136
|
+
.join('\n');
|
|
137
|
+
// Don't log contact details
|
|
138
|
+
logger.debug('contact_search completed', { userId, count: contacts.length });
|
|
139
|
+
return {
|
|
140
|
+
success: true,
|
|
141
|
+
data: {
|
|
142
|
+
content,
|
|
143
|
+
details: { contacts, total, userId },
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
logger.error('contact_search failed', {
|
|
149
|
+
userId,
|
|
150
|
+
error: error instanceof Error ? error.message : String(error),
|
|
151
|
+
});
|
|
152
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// ==================== contact_get ====================
|
|
158
|
+
/** Parameters for contact_get tool */
|
|
159
|
+
export const ContactGetParamsSchema = z.object({
|
|
160
|
+
id: z.string().min(1, 'Contact ID is required'),
|
|
161
|
+
});
|
|
162
|
+
/**
|
|
163
|
+
* Creates the contact_get tool.
|
|
164
|
+
*/
|
|
165
|
+
export function createContactGetTool(options) {
|
|
166
|
+
const { client, logger, userId } = options;
|
|
167
|
+
return {
|
|
168
|
+
name: 'contact_get',
|
|
169
|
+
description: 'Get full details of a specific contact by ID.',
|
|
170
|
+
parameters: ContactGetParamsSchema,
|
|
171
|
+
async execute(params) {
|
|
172
|
+
const parseResult = ContactGetParamsSchema.safeParse(params);
|
|
173
|
+
if (!parseResult.success) {
|
|
174
|
+
const errorMessage = parseResult.error.errors
|
|
175
|
+
.map((e) => `${e.path.join('.')}: ${e.message}`)
|
|
176
|
+
.join(', ');
|
|
177
|
+
return { success: false, error: errorMessage };
|
|
178
|
+
}
|
|
179
|
+
const { id } = parseResult.data;
|
|
180
|
+
// Validate UUID format
|
|
181
|
+
if (!isValidUuid(id)) {
|
|
182
|
+
return { success: false, error: 'Invalid contact ID format. Expected UUID.' };
|
|
183
|
+
}
|
|
184
|
+
logger.info('contact_get invoked', { userId, contactId: id });
|
|
185
|
+
try {
|
|
186
|
+
const response = await client.get(`/api/contacts/${id}`, { userId });
|
|
187
|
+
if (!response.success) {
|
|
188
|
+
if (response.error.code === 'NOT_FOUND') {
|
|
189
|
+
return { success: false, error: 'Contact not found.' };
|
|
190
|
+
}
|
|
191
|
+
logger.error('contact_get API error', {
|
|
192
|
+
userId,
|
|
193
|
+
contactId: id,
|
|
194
|
+
status: response.error.status,
|
|
195
|
+
});
|
|
196
|
+
return {
|
|
197
|
+
success: false,
|
|
198
|
+
error: response.error.message || 'Failed to get contact',
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const contact = response.data;
|
|
202
|
+
const lines = [`**${contact.name}**`];
|
|
203
|
+
if (contact.email)
|
|
204
|
+
lines.push(`Email: ${contact.email}`);
|
|
205
|
+
if (contact.phone)
|
|
206
|
+
lines.push(`Phone: ${contact.phone}`);
|
|
207
|
+
if (contact.notes)
|
|
208
|
+
lines.push(`\nNotes: ${contact.notes}`);
|
|
209
|
+
const content = lines.join('\n');
|
|
210
|
+
logger.debug('contact_get completed', { userId, contactId: id });
|
|
211
|
+
return {
|
|
212
|
+
success: true,
|
|
213
|
+
data: {
|
|
214
|
+
content,
|
|
215
|
+
details: { contact, userId },
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
logger.error('contact_get failed', {
|
|
221
|
+
userId,
|
|
222
|
+
contactId: id,
|
|
223
|
+
error: error instanceof Error ? error.message : String(error),
|
|
224
|
+
});
|
|
225
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// ==================== contact_create ====================
|
|
231
|
+
/** Parameters for contact_create tool */
|
|
232
|
+
export const ContactCreateParamsSchema = z.object({
|
|
233
|
+
name: z
|
|
234
|
+
.string()
|
|
235
|
+
.min(1, 'Contact name is required')
|
|
236
|
+
.max(200, 'Contact name must be 200 characters or less'),
|
|
237
|
+
email: z.string().optional(),
|
|
238
|
+
phone: z.string().optional(),
|
|
239
|
+
notes: z.string().max(2000, 'Notes must be 2000 characters or less').optional(),
|
|
240
|
+
});
|
|
241
|
+
/**
|
|
242
|
+
* Creates the contact_create tool.
|
|
243
|
+
*/
|
|
244
|
+
export function createContactCreateTool(options) {
|
|
245
|
+
const { client, logger, userId } = options;
|
|
246
|
+
return {
|
|
247
|
+
name: 'contact_create',
|
|
248
|
+
description: 'Create a new contact with name and optional email, phone, and notes.',
|
|
249
|
+
parameters: ContactCreateParamsSchema,
|
|
250
|
+
async execute(params) {
|
|
251
|
+
const parseResult = ContactCreateParamsSchema.safeParse(params);
|
|
252
|
+
if (!parseResult.success) {
|
|
253
|
+
const errorMessage = parseResult.error.errors
|
|
254
|
+
.map((e) => `${e.path.join('.')}: ${e.message}`)
|
|
255
|
+
.join(', ');
|
|
256
|
+
return { success: false, error: errorMessage };
|
|
257
|
+
}
|
|
258
|
+
const { name, email, phone, notes } = parseResult.data;
|
|
259
|
+
// Sanitize input
|
|
260
|
+
const sanitizedName = stripHtml(name);
|
|
261
|
+
const sanitizedNotes = notes ? stripHtml(notes) : undefined;
|
|
262
|
+
if (sanitizedName.length === 0) {
|
|
263
|
+
return { success: false, error: 'Contact name cannot be empty after sanitization' };
|
|
264
|
+
}
|
|
265
|
+
// Validate email if provided
|
|
266
|
+
if (email && !isValidEmail(email)) {
|
|
267
|
+
return { success: false, error: 'Invalid email format.' };
|
|
268
|
+
}
|
|
269
|
+
// Validate phone if provided
|
|
270
|
+
if (phone && !isValidPhone(phone)) {
|
|
271
|
+
return { success: false, error: 'Invalid phone format. Expected a valid phone number.' };
|
|
272
|
+
}
|
|
273
|
+
// Log without PII
|
|
274
|
+
logger.info('contact_create invoked', {
|
|
275
|
+
userId,
|
|
276
|
+
nameLength: sanitizedName.length,
|
|
277
|
+
hasEmail: !!email,
|
|
278
|
+
hasPhone: !!phone,
|
|
279
|
+
hasNotes: !!notes,
|
|
280
|
+
});
|
|
281
|
+
try {
|
|
282
|
+
const body = {
|
|
283
|
+
name: sanitizedName,
|
|
284
|
+
};
|
|
285
|
+
if (email) {
|
|
286
|
+
body.email = email;
|
|
287
|
+
}
|
|
288
|
+
if (phone) {
|
|
289
|
+
body.phone = phone;
|
|
290
|
+
}
|
|
291
|
+
if (sanitizedNotes) {
|
|
292
|
+
body.notes = sanitizedNotes;
|
|
293
|
+
}
|
|
294
|
+
const response = await client.post('/api/contacts', body, { userId });
|
|
295
|
+
if (!response.success) {
|
|
296
|
+
logger.error('contact_create API error', {
|
|
297
|
+
userId,
|
|
298
|
+
status: response.error.status,
|
|
299
|
+
code: response.error.code,
|
|
300
|
+
});
|
|
301
|
+
return {
|
|
302
|
+
success: false,
|
|
303
|
+
error: response.error.message || 'Failed to create contact',
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
const newContact = response.data;
|
|
307
|
+
logger.debug('contact_create completed', {
|
|
308
|
+
userId,
|
|
309
|
+
contactId: newContact.id,
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
success: true,
|
|
313
|
+
data: {
|
|
314
|
+
content: `Created contact "${sanitizedName}" (ID: ${newContact.id})`,
|
|
315
|
+
details: {
|
|
316
|
+
id: newContact.id,
|
|
317
|
+
name: sanitizedName,
|
|
318
|
+
userId,
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
logger.error('contact_create failed', {
|
|
325
|
+
userId,
|
|
326
|
+
error: error instanceof Error ? error.message : String(error),
|
|
327
|
+
});
|
|
328
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=contacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* email_send tool implementation.
|
|
3
|
+
* Sends email messages via Postmark.
|
|
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 email_send tool */
|
|
10
|
+
export declare const EmailSendParamsSchema: z.ZodObject<{
|
|
11
|
+
to: z.ZodString;
|
|
12
|
+
subject: z.ZodString;
|
|
13
|
+
body: z.ZodString;
|
|
14
|
+
htmlBody: z.ZodOptional<z.ZodString>;
|
|
15
|
+
threadId: z.ZodOptional<z.ZodString>;
|
|
16
|
+
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
to: string;
|
|
19
|
+
body: string;
|
|
20
|
+
subject: string;
|
|
21
|
+
threadId?: string | undefined;
|
|
22
|
+
idempotencyKey?: string | undefined;
|
|
23
|
+
htmlBody?: string | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
to: string;
|
|
26
|
+
body: string;
|
|
27
|
+
subject: string;
|
|
28
|
+
threadId?: string | undefined;
|
|
29
|
+
idempotencyKey?: string | undefined;
|
|
30
|
+
htmlBody?: string | undefined;
|
|
31
|
+
}>;
|
|
32
|
+
export type EmailSendParams = z.infer<typeof EmailSendParamsSchema>;
|
|
33
|
+
/** Successful tool result */
|
|
34
|
+
export interface EmailSendSuccess {
|
|
35
|
+
success: true;
|
|
36
|
+
data: {
|
|
37
|
+
content: string;
|
|
38
|
+
details: {
|
|
39
|
+
messageId: string;
|
|
40
|
+
threadId?: string;
|
|
41
|
+
status: string;
|
|
42
|
+
userId: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Failed tool result */
|
|
47
|
+
export interface EmailSendFailure {
|
|
48
|
+
success: false;
|
|
49
|
+
error: string;
|
|
50
|
+
}
|
|
51
|
+
/** Tool result type */
|
|
52
|
+
export type EmailSendResult = EmailSendSuccess | EmailSendFailure;
|
|
53
|
+
/** Tool configuration */
|
|
54
|
+
export interface EmailSendToolOptions {
|
|
55
|
+
client: ApiClient;
|
|
56
|
+
logger: Logger;
|
|
57
|
+
config: PluginConfig;
|
|
58
|
+
userId: string;
|
|
59
|
+
}
|
|
60
|
+
/** Tool definition */
|
|
61
|
+
export interface EmailSendTool {
|
|
62
|
+
name: string;
|
|
63
|
+
description: string;
|
|
64
|
+
parameters: typeof EmailSendParamsSchema;
|
|
65
|
+
execute: (params: EmailSendParams) => Promise<EmailSendResult>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates the email_send tool.
|
|
69
|
+
*/
|
|
70
|
+
export declare function createEmailSendTool(options: EmailSendToolOptions): EmailSendTool;
|
|
71
|
+
//# sourceMappingURL=email-send.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-send.d.ts","sourceRoot":"","sources":["../../src/tools/email-send.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;AAQhD,qCAAqC;AACrC,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;EAchC,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AASnE,6BAA6B;AAC7B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,IAAI,CAAA;IACb,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE;YACP,SAAS,EAAE,MAAM,CAAA;YACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;YACjB,MAAM,EAAE,MAAM,CAAA;YACd,MAAM,EAAE,MAAM,CAAA;SACf,CAAA;KACF,CAAA;CACF;AAED,yBAAyB;AACzB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,uBAAuB;AACvB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAEjE,yBAAyB;AACzB,MAAM,WAAW,oBAAoB;IACnC,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,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,qBAAqB,CAAA;IACxC,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;CAC/D;AAqBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAoGhF"}
|