agentmail-toolkit 0.2.1 → 0.2.3

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.
@@ -0,0 +1,318 @@
1
+ // src/util.ts
2
+ import { getDocumentProxy, extractText } from "unpdf";
3
+ import JSZip from "jszip";
4
+ var safeFunc = async (func, client, args) => {
5
+ try {
6
+ return { isError: false, result: await func(client, args) };
7
+ } catch (error) {
8
+ if (error instanceof Error) return { isError: true, result: error.message };
9
+ else return { isError: true, result: "Unknown error" };
10
+ }
11
+ };
12
+ function detectFileType(bytes) {
13
+ if (bytes[0] === 37 && bytes[1] === 80 && bytes[2] === 68 && bytes[3] === 70) {
14
+ return "application/pdf";
15
+ }
16
+ if (bytes[0] === 80 && bytes[1] === 75 && bytes[2] === 3 && bytes[3] === 4) {
17
+ return "application/zip";
18
+ }
19
+ return void 0;
20
+ }
21
+ async function extractPdfText(bytes) {
22
+ const pdf = await getDocumentProxy(bytes);
23
+ const { text } = await extractText(pdf);
24
+ return Array.isArray(text) ? text.join("\n") : text;
25
+ }
26
+ async function extractDocxText(bytes) {
27
+ const zip = await JSZip.loadAsync(bytes);
28
+ const documentXml = await zip.file("word/document.xml")?.async("string");
29
+ if (!documentXml) return void 0;
30
+ return documentXml.replace(/<w:p[^>]*>/g, "\n").replace(/<[^>]+>/g, "").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/\n{3,}/g, "\n\n").trim();
31
+ }
32
+
33
+ // src/toolkit.ts
34
+ import { AgentMailClient } from "agentmail";
35
+
36
+ // src/schemas.ts
37
+ import { z } from "zod";
38
+ var InboxIdSchema = z.string().describe("ID of inbox");
39
+ var ThreadIdSchema = z.string().describe("ID of thread");
40
+ var MessageIdSchema = z.string().describe("ID of message");
41
+ var AttachmentIdSchema = z.string().describe("ID of attachment");
42
+ var ListItemsParams = z.object({
43
+ limit: z.number().optional().default(10).describe("Max number of items to return"),
44
+ pageToken: z.string().optional().describe("Page token for pagination")
45
+ });
46
+ var GetInboxParams = z.object({
47
+ inboxId: InboxIdSchema
48
+ });
49
+ var CreateInboxParams = z.object({
50
+ username: z.string().optional().describe("Username"),
51
+ domain: z.string().optional().describe("Domain"),
52
+ displayName: z.string().optional().describe("Display name")
53
+ });
54
+ var ListInboxItemsParams = ListItemsParams.extend({
55
+ inboxId: InboxIdSchema,
56
+ labels: z.array(z.string()).optional().describe("Labels to filter items by"),
57
+ before: z.string().optional().describe("Filter items before datetime (ISO 8601 format)"),
58
+ after: z.string().optional().describe("Filter items after datetime (ISO 8601 format)")
59
+ });
60
+ var GetThreadParams = z.object({
61
+ inboxId: InboxIdSchema,
62
+ threadId: ThreadIdSchema
63
+ });
64
+ var GetAttachmentParams = z.object({
65
+ inboxId: InboxIdSchema,
66
+ threadId: ThreadIdSchema,
67
+ attachmentId: AttachmentIdSchema
68
+ });
69
+ var BaseMessageParams = z.object({
70
+ inboxId: InboxIdSchema,
71
+ text: z.string().optional().describe("Plain text body"),
72
+ html: z.string().optional().describe("HTML body"),
73
+ labels: z.array(z.string()).optional().describe("Labels")
74
+ });
75
+ var SendMessageParams = BaseMessageParams.extend({
76
+ to: z.array(z.string()).describe("Recipients"),
77
+ cc: z.array(z.string()).optional().describe("CC recipients"),
78
+ bcc: z.array(z.string()).optional().describe("BCC recipients"),
79
+ subject: z.string().optional().describe("Subject")
80
+ });
81
+ var ReplyToMessageParams = BaseMessageParams.extend({
82
+ messageId: MessageIdSchema,
83
+ replyAll: z.boolean().optional().describe("Reply to all recipients")
84
+ });
85
+ var ForwardMessageParams = SendMessageParams.extend({
86
+ messageId: MessageIdSchema
87
+ });
88
+ var UpdateMessageParams = z.object({
89
+ inboxId: InboxIdSchema,
90
+ messageId: MessageIdSchema,
91
+ addLabels: z.array(z.string()).optional().describe("Labels to add"),
92
+ removeLabels: z.array(z.string()).optional().describe("Labels to remove")
93
+ });
94
+
95
+ // src/functions.ts
96
+ async function listInboxes(client, args) {
97
+ return client.inboxes.list(args);
98
+ }
99
+ async function getInbox(client, args) {
100
+ const { inboxId, ...options } = args;
101
+ return client.inboxes.get(inboxId, options);
102
+ }
103
+ async function createInbox(client, args) {
104
+ return client.inboxes.create(args);
105
+ }
106
+ async function deleteInbox(client, args) {
107
+ const { inboxId } = args;
108
+ return client.inboxes.delete(inboxId);
109
+ }
110
+ async function listThreads(client, args) {
111
+ const { inboxId, ...options } = args;
112
+ return client.inboxes.threads.list(inboxId, options);
113
+ }
114
+ async function getThread(client, args) {
115
+ const { inboxId, threadId, ...options } = args;
116
+ return client.inboxes.threads.get(inboxId, threadId, options);
117
+ }
118
+ async function getAttachment(client, args) {
119
+ const { threadId, attachmentId } = args;
120
+ const { downloadUrl } = await client.threads.getAttachment(threadId, attachmentId);
121
+ const response = await fetch(downloadUrl);
122
+ const arrayBuffer = await response.arrayBuffer();
123
+ const fileBytes = new Uint8Array(arrayBuffer);
124
+ const detectedType = detectFileType(fileBytes);
125
+ if (detectedType === "application/pdf") {
126
+ return { text: await extractPdfText(fileBytes), fileType: detectedType };
127
+ } else if (detectedType === "application/zip") {
128
+ const text = await extractDocxText(fileBytes);
129
+ if (text) return { text, fileType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" };
130
+ }
131
+ return { error: "Unsupported file type", fileType: detectedType || "unknown" };
132
+ }
133
+ async function sendMessage(client, args) {
134
+ const { inboxId, ...options } = args;
135
+ return client.inboxes.messages.send(inboxId, options);
136
+ }
137
+ async function replyToMessage(client, args) {
138
+ const { inboxId, messageId, ...options } = args;
139
+ return client.inboxes.messages.reply(inboxId, messageId, options);
140
+ }
141
+ async function forwardMessage(client, args) {
142
+ const { inboxId, messageId, ...options } = args;
143
+ return client.inboxes.messages.forward(inboxId, messageId, options);
144
+ }
145
+ async function updateMessage(client, args) {
146
+ const { inboxId, messageId, ...options } = args;
147
+ return client.inboxes.messages.update(inboxId, messageId, options);
148
+ }
149
+
150
+ // src/tools.ts
151
+ var tools = [
152
+ {
153
+ name: "list_inboxes",
154
+ description: "List inboxes",
155
+ paramsSchema: ListItemsParams,
156
+ func: listInboxes,
157
+ annotations: {
158
+ readOnlyHint: true,
159
+ openWorldHint: false
160
+ }
161
+ },
162
+ {
163
+ name: "get_inbox",
164
+ description: "Get inbox",
165
+ paramsSchema: GetInboxParams,
166
+ func: getInbox,
167
+ annotations: {
168
+ readOnlyHint: true,
169
+ openWorldHint: false
170
+ }
171
+ },
172
+ {
173
+ name: "create_inbox",
174
+ description: "Create inbox",
175
+ paramsSchema: CreateInboxParams,
176
+ func: createInbox,
177
+ annotations: {
178
+ readOnlyHint: false,
179
+ destructiveHint: false,
180
+ idempotentHint: false,
181
+ openWorldHint: false
182
+ }
183
+ },
184
+ {
185
+ name: "delete_inbox",
186
+ description: "Delete inbox",
187
+ paramsSchema: GetInboxParams,
188
+ func: deleteInbox,
189
+ annotations: {
190
+ readOnlyHint: false,
191
+ destructiveHint: true,
192
+ idempotentHint: true,
193
+ openWorldHint: false
194
+ }
195
+ },
196
+ {
197
+ name: "list_threads",
198
+ description: "List threads in inbox",
199
+ paramsSchema: ListInboxItemsParams,
200
+ func: listThreads,
201
+ annotations: {
202
+ readOnlyHint: true,
203
+ openWorldHint: true
204
+ }
205
+ },
206
+ {
207
+ name: "get_thread",
208
+ description: "Get thread",
209
+ paramsSchema: GetThreadParams,
210
+ func: getThread,
211
+ annotations: {
212
+ readOnlyHint: true,
213
+ openWorldHint: true
214
+ }
215
+ },
216
+ {
217
+ name: "get_attachment",
218
+ description: "Get attachment",
219
+ paramsSchema: GetAttachmentParams,
220
+ func: getAttachment,
221
+ annotations: {
222
+ readOnlyHint: true,
223
+ openWorldHint: true
224
+ }
225
+ },
226
+ {
227
+ name: "send_message",
228
+ description: "Send message",
229
+ paramsSchema: SendMessageParams,
230
+ func: sendMessage,
231
+ annotations: {
232
+ readOnlyHint: false,
233
+ destructiveHint: false,
234
+ idempotentHint: false,
235
+ openWorldHint: true
236
+ }
237
+ },
238
+ {
239
+ name: "reply_to_message",
240
+ description: "Reply to message",
241
+ paramsSchema: ReplyToMessageParams,
242
+ func: replyToMessage,
243
+ annotations: {
244
+ readOnlyHint: false,
245
+ destructiveHint: false,
246
+ idempotentHint: false,
247
+ openWorldHint: true
248
+ }
249
+ },
250
+ {
251
+ name: "forward_message",
252
+ description: "Forward message",
253
+ paramsSchema: ForwardMessageParams,
254
+ func: forwardMessage,
255
+ annotations: {
256
+ readOnlyHint: false,
257
+ destructiveHint: false,
258
+ idempotentHint: false,
259
+ openWorldHint: true
260
+ }
261
+ },
262
+ {
263
+ name: "update_message",
264
+ description: "Update message",
265
+ paramsSchema: UpdateMessageParams,
266
+ func: updateMessage,
267
+ annotations: {
268
+ readOnlyHint: false,
269
+ destructiveHint: false,
270
+ idempotentHint: true,
271
+ openWorldHint: false
272
+ }
273
+ }
274
+ ];
275
+
276
+ // src/toolkit.ts
277
+ var BaseToolkit = class {
278
+ client;
279
+ tools = {};
280
+ constructor(client) {
281
+ this.client = client ?? new AgentMailClient();
282
+ this.tools = tools.reduce(
283
+ (acc, tool) => {
284
+ acc[tool.name] = this.buildTool(tool);
285
+ return acc;
286
+ },
287
+ {}
288
+ );
289
+ }
290
+ };
291
+ var ListToolkit = class extends BaseToolkit {
292
+ getTools(names) {
293
+ if (!names) return Object.values(this.tools);
294
+ return names.reduce((acc, name) => {
295
+ if (name in this.tools) acc.push(this.tools[name]);
296
+ return acc;
297
+ }, []);
298
+ }
299
+ };
300
+ var MapToolkit = class extends BaseToolkit {
301
+ getTools(names) {
302
+ if (!names) return this.tools;
303
+ return names.reduce(
304
+ (acc, name) => {
305
+ if (name in this.tools) acc[name] = this.tools[name];
306
+ return acc;
307
+ },
308
+ {}
309
+ );
310
+ }
311
+ };
312
+
313
+ export {
314
+ safeFunc,
315
+ ListToolkit,
316
+ MapToolkit
317
+ };
318
+ //# sourceMappingURL=chunk-YUPZCTEU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/util.ts","../src/toolkit.ts","../src/schemas.ts","../src/functions.ts","../src/tools.ts"],"sourcesContent":["import { AgentMailClient } from 'agentmail'\nimport { getDocumentProxy, extractText } from 'unpdf'\nimport JSZip from 'jszip'\n\nexport const safeFunc = async <T>(\n func: (client: AgentMailClient, args: Record<string, any>) => Promise<T>,\n client: AgentMailClient,\n args: Record<string, any>\n) => {\n try {\n return { isError: false, result: await func(client, args) }\n } catch (error) {\n if (error instanceof Error) return { isError: true, result: error.message }\n else return { isError: true, result: 'Unknown error' }\n }\n}\n\nexport function detectFileType(bytes: Uint8Array): string | undefined {\n // PDF: starts with %PDF (0x25 0x50 0x44 0x46)\n if (bytes[0] === 0x25 && bytes[1] === 0x50 && bytes[2] === 0x44 && bytes[3] === 0x46) {\n return 'application/pdf'\n }\n // ZIP (DOCX is a ZIP): starts with PK\\x03\\x04 (0x50 0x4B 0x03 0x04)\n if (bytes[0] === 0x50 && bytes[1] === 0x4b && bytes[2] === 0x03 && bytes[3] === 0x04) {\n return 'application/zip'\n }\n return undefined\n}\n\nexport async function extractPdfText(bytes: Uint8Array): Promise<string> {\n const pdf = await getDocumentProxy(bytes)\n const { text } = await extractText(pdf)\n return Array.isArray(text) ? text.join('\\n') : text\n}\n\nexport async function extractDocxText(bytes: Uint8Array): Promise<string | undefined> {\n const zip = await JSZip.loadAsync(bytes)\n const documentXml = await zip.file('word/document.xml')?.async('string')\n if (!documentXml) return undefined\n return documentXml\n .replace(/<w:p[^>]*>/g, '\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n}\n","import { AgentMailClient } from 'agentmail'\n\nimport { type Tool, tools } from './tools.js'\n\nexport abstract class BaseToolkit<T> {\n protected readonly client: AgentMailClient\n protected readonly tools: Record<string, T> = {}\n\n constructor(client?: AgentMailClient) {\n this.client = client ?? new AgentMailClient()\n\n this.tools = tools.reduce(\n (acc, tool) => {\n acc[tool.name] = this.buildTool(tool)\n return acc\n },\n {} as Record<string, T>\n )\n }\n\n protected abstract buildTool(tool: Tool): T\n}\n\nexport abstract class ListToolkit<T> extends BaseToolkit<T> {\n public getTools(names?: string[]) {\n if (!names) return Object.values(this.tools)\n\n return names.reduce((acc, name) => {\n if (name in this.tools) acc.push(this.tools[name])\n return acc\n }, [] as T[])\n }\n}\n\nexport abstract class MapToolkit<T> extends BaseToolkit<T> {\n public getTools(names?: string[]) {\n if (!names) return this.tools\n\n return names.reduce(\n (acc, name) => {\n if (name in this.tools) acc[name] = this.tools[name]\n return acc\n },\n {} as Record<string, T>\n )\n }\n}\n","import { z } from 'zod'\n\nconst InboxIdSchema = z.string().describe('ID of inbox')\nconst ThreadIdSchema = z.string().describe('ID of thread')\nconst MessageIdSchema = z.string().describe('ID of message')\nconst AttachmentIdSchema = z.string().describe('ID of attachment')\n\nexport const ListItemsParams = z.object({\n limit: z.number().optional().default(10).describe('Max number of items to return'),\n pageToken: z.string().optional().describe('Page token for pagination'),\n})\n\nexport const GetInboxParams = z.object({\n inboxId: InboxIdSchema,\n})\n\nexport const CreateInboxParams = z.object({\n username: z.string().optional().describe('Username'),\n domain: z.string().optional().describe('Domain'),\n displayName: z.string().optional().describe('Display name'),\n})\n\nexport const ListInboxItemsParams = ListItemsParams.extend({\n inboxId: InboxIdSchema,\n labels: z.array(z.string()).optional().describe('Labels to filter items by'),\n before: z.string().optional().describe('Filter items before datetime (ISO 8601 format)'),\n after: z.string().optional().describe('Filter items after datetime (ISO 8601 format)'),\n})\n\nexport const GetThreadParams = z.object({\n inboxId: InboxIdSchema,\n threadId: ThreadIdSchema,\n})\n\nexport const GetAttachmentParams = z.object({\n inboxId: InboxIdSchema,\n threadId: ThreadIdSchema,\n attachmentId: AttachmentIdSchema,\n})\n\nconst BaseMessageParams = z.object({\n inboxId: InboxIdSchema,\n text: z.string().optional().describe('Plain text body'),\n html: z.string().optional().describe('HTML body'),\n labels: z.array(z.string()).optional().describe('Labels'),\n})\n\nexport const SendMessageParams = BaseMessageParams.extend({\n to: z.array(z.string()).describe('Recipients'),\n cc: z.array(z.string()).optional().describe('CC recipients'),\n bcc: z.array(z.string()).optional().describe('BCC recipients'),\n subject: z.string().optional().describe('Subject'),\n})\n\nexport const ReplyToMessageParams = BaseMessageParams.extend({\n messageId: MessageIdSchema,\n replyAll: z.boolean().optional().describe('Reply to all recipients'),\n})\n\nexport const ForwardMessageParams = SendMessageParams.extend({\n messageId: MessageIdSchema,\n})\n\nexport const UpdateMessageParams = z.object({\n inboxId: InboxIdSchema,\n messageId: MessageIdSchema,\n addLabels: z.array(z.string()).optional().describe('Labels to add'),\n removeLabels: z.array(z.string()).optional().describe('Labels to remove'),\n})\n","import { AgentMailClient } from 'agentmail'\nimport { detectFileType, extractPdfText, extractDocxText } from './util.js'\n\nexport type Args = Record<string, any>\n\ninterface Attachment {\n text?: string\n error?: string\n fileType?: string\n}\n\nexport async function listInboxes(client: AgentMailClient, args: Args) {\n return client.inboxes.list(args)\n}\n\nexport async function getInbox(client: AgentMailClient, args: Args) {\n const { inboxId, ...options } = args\n return client.inboxes.get(inboxId, options)\n}\n\nexport async function createInbox(client: AgentMailClient, args: Args) {\n return client.inboxes.create(args)\n}\n\nexport async function deleteInbox(client: AgentMailClient, args: Args) {\n const { inboxId } = args\n return client.inboxes.delete(inboxId)\n}\n\nexport async function listThreads(client: AgentMailClient, args: Args) {\n const { inboxId, ...options } = args\n return client.inboxes.threads.list(inboxId, options)\n}\n\nexport async function getThread(client: AgentMailClient, args: Args) {\n const { inboxId, threadId, ...options } = args\n return client.inboxes.threads.get(inboxId, threadId, options)\n}\n\nexport async function getAttachment(client: AgentMailClient, args: Args): Promise<Attachment> {\n const { threadId, attachmentId } = args\n\n const { downloadUrl } = await client.threads.getAttachment(threadId, attachmentId)\n const response = await fetch(downloadUrl)\n const arrayBuffer = await response.arrayBuffer()\n const fileBytes = new Uint8Array(arrayBuffer)\n\n const detectedType = detectFileType(fileBytes)\n\n if (detectedType === 'application/pdf') {\n return { text: await extractPdfText(fileBytes), fileType: detectedType }\n } else if (detectedType === 'application/zip') {\n const text = await extractDocxText(fileBytes)\n if (text) return { text, fileType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }\n }\n\n return { error: 'Unsupported file type', fileType: detectedType || 'unknown' }\n}\n\nexport async function sendMessage(client: AgentMailClient, args: Args) {\n const { inboxId, ...options } = args\n return client.inboxes.messages.send(inboxId, options)\n}\n\nexport async function replyToMessage(client: AgentMailClient, args: Args) {\n const { inboxId, messageId, ...options } = args\n return client.inboxes.messages.reply(inboxId, messageId, options)\n}\n\nexport async function forwardMessage(client: AgentMailClient, args: Args) {\n const { inboxId, messageId, ...options } = args\n return client.inboxes.messages.forward(inboxId, messageId, options)\n}\n\nexport async function updateMessage(client: AgentMailClient, args: Args) {\n const { inboxId, messageId, ...options } = args\n return client.inboxes.messages.update(inboxId, messageId, options)\n}\n","import { z } from 'zod'\nimport { AgentMailClient } from 'agentmail'\nimport { type ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\n\nimport {\n ListItemsParams,\n ListInboxItemsParams,\n GetInboxParams,\n CreateInboxParams,\n GetThreadParams,\n GetAttachmentParams,\n SendMessageParams,\n ReplyToMessageParams,\n UpdateMessageParams,\n ForwardMessageParams,\n} from './schemas.js'\nimport {\n type Args,\n listInboxes,\n getInbox,\n createInbox,\n deleteInbox,\n listThreads,\n getThread,\n getAttachment,\n sendMessage,\n replyToMessage,\n updateMessage,\n forwardMessage,\n} from './functions.js'\nexport interface Tool {\n name: string\n description: string\n paramsSchema: z.ZodObject<any>\n func: (client: AgentMailClient, args: Args) => Promise<any>\n annotations?: ToolAnnotations\n}\n\nexport const tools: Tool[] = [\n {\n name: 'list_inboxes',\n description: 'List inboxes',\n paramsSchema: ListItemsParams,\n func: listInboxes,\n annotations: {\n readOnlyHint: true,\n openWorldHint: false,\n },\n },\n {\n name: 'get_inbox',\n description: 'Get inbox',\n paramsSchema: GetInboxParams,\n func: getInbox,\n annotations: {\n readOnlyHint: true,\n openWorldHint: false,\n },\n },\n {\n name: 'create_inbox',\n description: 'Create inbox',\n paramsSchema: CreateInboxParams,\n func: createInbox,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false,\n },\n },\n {\n name: 'delete_inbox',\n description: 'Delete inbox',\n paramsSchema: GetInboxParams,\n func: deleteInbox,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n {\n name: 'list_threads',\n description: 'List threads in inbox',\n paramsSchema: ListInboxItemsParams,\n func: listThreads,\n annotations: {\n readOnlyHint: true,\n openWorldHint: true,\n },\n },\n {\n name: 'get_thread',\n description: 'Get thread',\n paramsSchema: GetThreadParams,\n func: getThread,\n annotations: {\n readOnlyHint: true,\n openWorldHint: true,\n },\n },\n {\n name: 'get_attachment',\n description: 'Get attachment',\n paramsSchema: GetAttachmentParams,\n func: getAttachment,\n annotations: {\n readOnlyHint: true,\n openWorldHint: true,\n },\n },\n {\n name: 'send_message',\n description: 'Send message',\n paramsSchema: SendMessageParams,\n func: sendMessage,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n },\n {\n name: 'reply_to_message',\n description: 'Reply to message',\n paramsSchema: ReplyToMessageParams,\n func: replyToMessage,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n },\n {\n name: 'forward_message',\n description: 'Forward message',\n paramsSchema: ForwardMessageParams,\n func: forwardMessage,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n },\n {\n name: 'update_message',\n description: 'Update message',\n paramsSchema: UpdateMessageParams,\n func: updateMessage,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n]\n"],"mappings":"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","names":[]}
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/clawdbot.ts
31
+ var clawdbot_exports = {};
32
+ __export(clawdbot_exports, {
33
+ AgentMailToolkit: () => AgentMailToolkit
34
+ });
35
+ module.exports = __toCommonJS(clawdbot_exports);
36
+ var import_zod2 = require("zod");
37
+
38
+ // src/toolkit.ts
39
+ var import_agentmail = require("agentmail");
40
+
41
+ // src/schemas.ts
42
+ var import_zod = require("zod");
43
+ var InboxIdSchema = import_zod.z.string().describe("ID of inbox");
44
+ var ThreadIdSchema = import_zod.z.string().describe("ID of thread");
45
+ var MessageIdSchema = import_zod.z.string().describe("ID of message");
46
+ var AttachmentIdSchema = import_zod.z.string().describe("ID of attachment");
47
+ var ListItemsParams = import_zod.z.object({
48
+ limit: import_zod.z.number().optional().default(10).describe("Max number of items to return"),
49
+ pageToken: import_zod.z.string().optional().describe("Page token for pagination")
50
+ });
51
+ var GetInboxParams = import_zod.z.object({
52
+ inboxId: InboxIdSchema
53
+ });
54
+ var CreateInboxParams = import_zod.z.object({
55
+ username: import_zod.z.string().optional().describe("Username"),
56
+ domain: import_zod.z.string().optional().describe("Domain"),
57
+ displayName: import_zod.z.string().optional().describe("Display name")
58
+ });
59
+ var ListInboxItemsParams = ListItemsParams.extend({
60
+ inboxId: InboxIdSchema,
61
+ labels: import_zod.z.array(import_zod.z.string()).optional().describe("Labels to filter items by"),
62
+ before: import_zod.z.string().pipe(import_zod.z.coerce.date()).optional().describe("Filter items before datetime"),
63
+ after: import_zod.z.string().pipe(import_zod.z.coerce.date()).optional().describe("Filter items after datetime")
64
+ });
65
+ var GetThreadParams = import_zod.z.object({
66
+ inboxId: InboxIdSchema,
67
+ threadId: ThreadIdSchema
68
+ });
69
+ var GetAttachmentParams = import_zod.z.object({
70
+ inboxId: InboxIdSchema,
71
+ threadId: ThreadIdSchema,
72
+ attachmentId: AttachmentIdSchema
73
+ });
74
+ var BaseMessageParams = import_zod.z.object({
75
+ inboxId: InboxIdSchema,
76
+ text: import_zod.z.string().optional().describe("Plain text body"),
77
+ html: import_zod.z.string().optional().describe("HTML body"),
78
+ labels: import_zod.z.array(import_zod.z.string()).optional().describe("Labels")
79
+ });
80
+ var SendMessageParams = BaseMessageParams.extend({
81
+ to: import_zod.z.array(import_zod.z.string()).describe("Recipients"),
82
+ cc: import_zod.z.array(import_zod.z.string()).optional().describe("CC recipients"),
83
+ bcc: import_zod.z.array(import_zod.z.string()).optional().describe("BCC recipients"),
84
+ subject: import_zod.z.string().optional().describe("Subject")
85
+ });
86
+ var ReplyToMessageParams = BaseMessageParams.extend({
87
+ messageId: MessageIdSchema,
88
+ replyAll: import_zod.z.boolean().optional().describe("Reply to all recipients")
89
+ });
90
+ var ForwardMessageParams = SendMessageParams.extend({
91
+ messageId: MessageIdSchema
92
+ });
93
+ var UpdateMessageParams = import_zod.z.object({
94
+ inboxId: InboxIdSchema,
95
+ messageId: MessageIdSchema,
96
+ addLabels: import_zod.z.array(import_zod.z.string()).optional().describe("Labels to add"),
97
+ removeLabels: import_zod.z.array(import_zod.z.string()).optional().describe("Labels to remove")
98
+ });
99
+
100
+ // src/util.ts
101
+ var import_unpdf = require("unpdf");
102
+ var import_jszip = __toESM(require("jszip"), 1);
103
+ function detectFileType(bytes) {
104
+ if (bytes[0] === 37 && bytes[1] === 80 && bytes[2] === 68 && bytes[3] === 70) {
105
+ return "application/pdf";
106
+ }
107
+ if (bytes[0] === 80 && bytes[1] === 75 && bytes[2] === 3 && bytes[3] === 4) {
108
+ return "application/zip";
109
+ }
110
+ return void 0;
111
+ }
112
+ async function extractPdfText(bytes) {
113
+ const pdf = await (0, import_unpdf.getDocumentProxy)(bytes);
114
+ const { text } = await (0, import_unpdf.extractText)(pdf);
115
+ return Array.isArray(text) ? text.join("\n") : text;
116
+ }
117
+ async function extractDocxText(bytes) {
118
+ const zip = await import_jszip.default.loadAsync(bytes);
119
+ const documentXml = await zip.file("word/document.xml")?.async("string");
120
+ if (!documentXml) return void 0;
121
+ return documentXml.replace(/<w:p[^>]*>/g, "\n").replace(/<[^>]+>/g, "").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/\n{3,}/g, "\n\n").trim();
122
+ }
123
+
124
+ // src/functions.ts
125
+ async function listInboxes(client, args) {
126
+ return client.inboxes.list(args);
127
+ }
128
+ async function getInbox(client, args) {
129
+ const { inboxId, ...options } = args;
130
+ return client.inboxes.get(inboxId, options);
131
+ }
132
+ async function createInbox(client, args) {
133
+ return client.inboxes.create(args);
134
+ }
135
+ async function deleteInbox(client, args) {
136
+ const { inboxId } = args;
137
+ return client.inboxes.delete(inboxId);
138
+ }
139
+ async function listThreads(client, args) {
140
+ const { inboxId, ...options } = args;
141
+ return client.inboxes.threads.list(inboxId, options);
142
+ }
143
+ async function getThread(client, args) {
144
+ const { inboxId, threadId, ...options } = args;
145
+ return client.inboxes.threads.get(inboxId, threadId, options);
146
+ }
147
+ async function getAttachment(client, args) {
148
+ const { threadId, attachmentId } = args;
149
+ const { downloadUrl } = await client.threads.getAttachment(threadId, attachmentId);
150
+ const response = await fetch(downloadUrl);
151
+ const arrayBuffer = await response.arrayBuffer();
152
+ const fileBytes = new Uint8Array(arrayBuffer);
153
+ const detectedType = detectFileType(fileBytes);
154
+ if (detectedType === "application/pdf") {
155
+ return { text: await extractPdfText(fileBytes), fileType: detectedType };
156
+ } else if (detectedType === "application/zip") {
157
+ const text = await extractDocxText(fileBytes);
158
+ if (text) return { text, fileType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" };
159
+ }
160
+ return { error: "Unsupported file type", fileType: detectedType || "unknown" };
161
+ }
162
+ async function sendMessage(client, args) {
163
+ const { inboxId, ...options } = args;
164
+ return client.inboxes.messages.send(inboxId, options);
165
+ }
166
+ async function replyToMessage(client, args) {
167
+ const { inboxId, messageId, ...options } = args;
168
+ return client.inboxes.messages.reply(inboxId, messageId, options);
169
+ }
170
+ async function forwardMessage(client, args) {
171
+ const { inboxId, messageId, ...options } = args;
172
+ return client.inboxes.messages.forward(inboxId, messageId, options);
173
+ }
174
+ async function updateMessage(client, args) {
175
+ const { inboxId, messageId, ...options } = args;
176
+ return client.inboxes.messages.update(inboxId, messageId, options);
177
+ }
178
+
179
+ // src/tools.ts
180
+ var tools = [
181
+ {
182
+ name: "list_inboxes",
183
+ description: "List inboxes",
184
+ paramsSchema: ListItemsParams,
185
+ func: listInboxes,
186
+ annotations: {
187
+ readOnlyHint: true,
188
+ openWorldHint: false
189
+ }
190
+ },
191
+ {
192
+ name: "get_inbox",
193
+ description: "Get inbox",
194
+ paramsSchema: GetInboxParams,
195
+ func: getInbox,
196
+ annotations: {
197
+ readOnlyHint: true,
198
+ openWorldHint: false
199
+ }
200
+ },
201
+ {
202
+ name: "create_inbox",
203
+ description: "Create inbox",
204
+ paramsSchema: CreateInboxParams,
205
+ func: createInbox,
206
+ annotations: {
207
+ readOnlyHint: false,
208
+ destructiveHint: false,
209
+ idempotentHint: false,
210
+ openWorldHint: false
211
+ }
212
+ },
213
+ {
214
+ name: "delete_inbox",
215
+ description: "Delete inbox",
216
+ paramsSchema: GetInboxParams,
217
+ func: deleteInbox,
218
+ annotations: {
219
+ readOnlyHint: false,
220
+ destructiveHint: true,
221
+ idempotentHint: true,
222
+ openWorldHint: false
223
+ }
224
+ },
225
+ {
226
+ name: "list_threads",
227
+ description: "List threads in inbox",
228
+ paramsSchema: ListInboxItemsParams,
229
+ func: listThreads,
230
+ annotations: {
231
+ readOnlyHint: true,
232
+ openWorldHint: true
233
+ }
234
+ },
235
+ {
236
+ name: "get_thread",
237
+ description: "Get thread",
238
+ paramsSchema: GetThreadParams,
239
+ func: getThread,
240
+ annotations: {
241
+ readOnlyHint: true,
242
+ openWorldHint: true
243
+ }
244
+ },
245
+ {
246
+ name: "get_attachment",
247
+ description: "Get attachment",
248
+ paramsSchema: GetAttachmentParams,
249
+ func: getAttachment,
250
+ annotations: {
251
+ readOnlyHint: true,
252
+ openWorldHint: true
253
+ }
254
+ },
255
+ {
256
+ name: "send_message",
257
+ description: "Send message",
258
+ paramsSchema: SendMessageParams,
259
+ func: sendMessage,
260
+ annotations: {
261
+ readOnlyHint: false,
262
+ destructiveHint: false,
263
+ idempotentHint: false,
264
+ openWorldHint: true
265
+ }
266
+ },
267
+ {
268
+ name: "reply_to_message",
269
+ description: "Reply to message",
270
+ paramsSchema: ReplyToMessageParams,
271
+ func: replyToMessage,
272
+ annotations: {
273
+ readOnlyHint: false,
274
+ destructiveHint: false,
275
+ idempotentHint: false,
276
+ openWorldHint: true
277
+ }
278
+ },
279
+ {
280
+ name: "forward_message",
281
+ description: "Forward message",
282
+ paramsSchema: ForwardMessageParams,
283
+ func: forwardMessage,
284
+ annotations: {
285
+ readOnlyHint: false,
286
+ destructiveHint: false,
287
+ idempotentHint: false,
288
+ openWorldHint: true
289
+ }
290
+ },
291
+ {
292
+ name: "update_message",
293
+ description: "Update message",
294
+ paramsSchema: UpdateMessageParams,
295
+ func: updateMessage,
296
+ annotations: {
297
+ readOnlyHint: false,
298
+ destructiveHint: false,
299
+ idempotentHint: true,
300
+ openWorldHint: false
301
+ }
302
+ }
303
+ ];
304
+
305
+ // src/toolkit.ts
306
+ var BaseToolkit = class {
307
+ client;
308
+ tools = {};
309
+ constructor(client) {
310
+ this.client = client ?? new import_agentmail.AgentMailClient();
311
+ this.tools = tools.reduce(
312
+ (acc, tool) => {
313
+ acc[tool.name] = this.buildTool(tool);
314
+ return acc;
315
+ },
316
+ {}
317
+ );
318
+ }
319
+ };
320
+ var ListToolkit = class extends BaseToolkit {
321
+ getTools(names) {
322
+ if (!names) return Object.values(this.tools);
323
+ return names.reduce((acc, name) => {
324
+ if (name in this.tools) acc.push(this.tools[name]);
325
+ return acc;
326
+ }, []);
327
+ }
328
+ };
329
+
330
+ // src/clawdbot.ts
331
+ function zodToJSONSchema(tool) {
332
+ return (0, import_zod2.toJSONSchema)(tool.paramsSchema, {
333
+ unrepresentable: "any",
334
+ override: (ctx) => {
335
+ const def = ctx.zodSchema._zod.def;
336
+ if (def.type === "date") {
337
+ ctx.jsonSchema.type = "string";
338
+ ctx.jsonSchema.format = "date-time";
339
+ }
340
+ }
341
+ });
342
+ }
343
+ var AgentMailToolkit = class extends ListToolkit {
344
+ buildTool(tool) {
345
+ return {
346
+ name: tool.name,
347
+ label: tool.name,
348
+ description: tool.description,
349
+ parameters: zodToJSONSchema(tool),
350
+ execute: async (_toolCallId, args) => {
351
+ const response = await tool.func(this.client, tool.paramsSchema.parse(args));
352
+ return {
353
+ content: [{ type: "text", text: JSON.stringify(response) }],
354
+ details: response
355
+ };
356
+ }
357
+ };
358
+ }
359
+ };
360
+ // Annotate the CommonJS export names for ESM import in node:
361
+ 0 && (module.exports = {
362
+ AgentMailToolkit
363
+ });
364
+ //# sourceMappingURL=clawdbot.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/clawdbot.ts","../src/toolkit.ts","../src/schemas.ts","../src/util.ts","../src/functions.ts","../src/tools.ts"],"sourcesContent":["import type { AgentTool } from '@mariozechner/pi-agent-core'\nimport type { TSchema } from '@sinclair/typebox'\nimport { toJSONSchema } from 'zod'\n\nimport { ListToolkit } from './toolkit.js'\nimport type { Tool } from './tools.js'\n\n/** Convert Zod schema to JSON Schema, handling Date types as ISO datetime strings */\nfunction zodToJSONSchema(tool: Tool) {\n return toJSONSchema(tool.paramsSchema, {\n unrepresentable: 'any',\n override: (ctx) => {\n const def = ctx.zodSchema._zod.def\n if (def.type === 'date') {\n ctx.jsonSchema.type = 'string'\n ctx.jsonSchema.format = 'date-time'\n }\n },\n }) as unknown as TSchema\n}\n\nexport class AgentMailToolkit extends ListToolkit<AgentTool> {\n protected buildTool(tool: Tool): AgentTool {\n return {\n name: tool.name,\n label: tool.name,\n description: tool.description,\n parameters: zodToJSONSchema(tool),\n execute: async (_toolCallId, args) => {\n const response = await tool.func(this.client, tool.paramsSchema.parse(args))\n return {\n content: [{ type: 'text', text: JSON.stringify(response) }],\n details: response,\n }\n },\n }\n }\n}\n","import { AgentMailClient } from 'agentmail'\n\nimport { type Tool, tools } from './tools.js'\n\nexport abstract class BaseToolkit<T> {\n protected readonly client: AgentMailClient\n protected readonly tools: Record<string, T> = {}\n\n constructor(client?: AgentMailClient) {\n this.client = client ?? new AgentMailClient()\n\n this.tools = tools.reduce(\n (acc, tool) => {\n acc[tool.name] = this.buildTool(tool)\n return acc\n },\n {} as Record<string, T>\n )\n }\n\n protected abstract buildTool(tool: Tool): T\n}\n\nexport abstract class ListToolkit<T> extends BaseToolkit<T> {\n public getTools(names?: string[]) {\n if (!names) return Object.values(this.tools)\n\n return names.reduce((acc, name) => {\n if (name in this.tools) acc.push(this.tools[name])\n return acc\n }, [] as T[])\n }\n}\n\nexport abstract class MapToolkit<T> extends BaseToolkit<T> {\n public getTools(names?: string[]) {\n if (!names) return this.tools\n\n return names.reduce(\n (acc, name) => {\n if (name in this.tools) acc[name] = this.tools[name]\n return acc\n },\n {} as Record<string, T>\n )\n }\n}\n","import { z } from 'zod'\n\nconst InboxIdSchema = z.string().describe('ID of inbox')\nconst ThreadIdSchema = z.string().describe('ID of thread')\nconst MessageIdSchema = z.string().describe('ID of message')\nconst AttachmentIdSchema = z.string().describe('ID of attachment')\n\nexport const ListItemsParams = z.object({\n limit: z.number().optional().default(10).describe('Max number of items to return'),\n pageToken: z.string().optional().describe('Page token for pagination'),\n})\n\nexport const GetInboxParams = z.object({\n inboxId: InboxIdSchema,\n})\n\nexport const CreateInboxParams = z.object({\n username: z.string().optional().describe('Username'),\n domain: z.string().optional().describe('Domain'),\n displayName: z.string().optional().describe('Display name'),\n})\n\nexport const ListInboxItemsParams = ListItemsParams.extend({\n inboxId: InboxIdSchema,\n labels: z.array(z.string()).optional().describe('Labels to filter items by'),\n before: z.string().pipe(z.coerce.date()).optional().describe('Filter items before datetime'),\n after: z.string().pipe(z.coerce.date()).optional().describe('Filter items after datetime'),\n})\n\nexport const GetThreadParams = z.object({\n inboxId: InboxIdSchema,\n threadId: ThreadIdSchema,\n})\n\nexport const GetAttachmentParams = z.object({\n inboxId: InboxIdSchema,\n threadId: ThreadIdSchema,\n attachmentId: AttachmentIdSchema,\n})\n\nconst BaseMessageParams = z.object({\n inboxId: InboxIdSchema,\n text: z.string().optional().describe('Plain text body'),\n html: z.string().optional().describe('HTML body'),\n labels: z.array(z.string()).optional().describe('Labels'),\n})\n\nexport const SendMessageParams = BaseMessageParams.extend({\n to: z.array(z.string()).describe('Recipients'),\n cc: z.array(z.string()).optional().describe('CC recipients'),\n bcc: z.array(z.string()).optional().describe('BCC recipients'),\n subject: z.string().optional().describe('Subject'),\n})\n\nexport const ReplyToMessageParams = BaseMessageParams.extend({\n messageId: MessageIdSchema,\n replyAll: z.boolean().optional().describe('Reply to all recipients'),\n})\n\nexport const ForwardMessageParams = SendMessageParams.extend({\n messageId: MessageIdSchema,\n})\n\nexport const UpdateMessageParams = z.object({\n inboxId: InboxIdSchema,\n messageId: MessageIdSchema,\n addLabels: z.array(z.string()).optional().describe('Labels to add'),\n removeLabels: z.array(z.string()).optional().describe('Labels to remove'),\n})\n","import { AgentMailClient } from 'agentmail'\nimport { getDocumentProxy, extractText } from 'unpdf'\nimport JSZip from 'jszip'\n\nexport const safeFunc = async <T>(\n func: (client: AgentMailClient, args: Record<string, any>) => Promise<T>,\n client: AgentMailClient,\n args: Record<string, any>\n) => {\n try {\n return { isError: false, result: await func(client, args) }\n } catch (error) {\n if (error instanceof Error) return { isError: true, result: error.message }\n else return { isError: true, result: 'Unknown error' }\n }\n}\n\nexport function detectFileType(bytes: Uint8Array): string | undefined {\n // PDF: starts with %PDF (0x25 0x50 0x44 0x46)\n if (bytes[0] === 0x25 && bytes[1] === 0x50 && bytes[2] === 0x44 && bytes[3] === 0x46) {\n return 'application/pdf'\n }\n // ZIP (DOCX is a ZIP): starts with PK\\x03\\x04 (0x50 0x4B 0x03 0x04)\n if (bytes[0] === 0x50 && bytes[1] === 0x4b && bytes[2] === 0x03 && bytes[3] === 0x04) {\n return 'application/zip'\n }\n return undefined\n}\n\nexport async function extractPdfText(bytes: Uint8Array): Promise<string> {\n const pdf = await getDocumentProxy(bytes)\n const { text } = await extractText(pdf)\n return Array.isArray(text) ? text.join('\\n') : text\n}\n\nexport async function extractDocxText(bytes: Uint8Array): Promise<string | undefined> {\n const zip = await JSZip.loadAsync(bytes)\n const documentXml = await zip.file('word/document.xml')?.async('string')\n if (!documentXml) return undefined\n return documentXml\n .replace(/<w:p[^>]*>/g, '\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n}\n","import { AgentMailClient } from 'agentmail'\nimport { detectFileType, extractPdfText, extractDocxText } from './util.js'\n\nexport type Args = Record<string, any>\n\ninterface Attachment {\n text?: string\n error?: string\n fileType?: string\n}\n\nexport async function listInboxes(client: AgentMailClient, args: Args) {\n return client.inboxes.list(args)\n}\n\nexport async function getInbox(client: AgentMailClient, args: Args) {\n const { inboxId, ...options } = args\n return client.inboxes.get(inboxId, options)\n}\n\nexport async function createInbox(client: AgentMailClient, args: Args) {\n return client.inboxes.create(args)\n}\n\nexport async function deleteInbox(client: AgentMailClient, args: Args) {\n const { inboxId } = args\n return client.inboxes.delete(inboxId)\n}\n\nexport async function listThreads(client: AgentMailClient, args: Args) {\n const { inboxId, ...options } = args\n return client.inboxes.threads.list(inboxId, options)\n}\n\nexport async function getThread(client: AgentMailClient, args: Args) {\n const { inboxId, threadId, ...options } = args\n return client.inboxes.threads.get(inboxId, threadId, options)\n}\n\nexport async function getAttachment(client: AgentMailClient, args: Args): Promise<Attachment> {\n const { threadId, attachmentId } = args\n\n const { downloadUrl } = await client.threads.getAttachment(threadId, attachmentId)\n const response = await fetch(downloadUrl)\n const arrayBuffer = await response.arrayBuffer()\n const fileBytes = new Uint8Array(arrayBuffer)\n\n const detectedType = detectFileType(fileBytes)\n\n if (detectedType === 'application/pdf') {\n return { text: await extractPdfText(fileBytes), fileType: detectedType }\n } else if (detectedType === 'application/zip') {\n const text = await extractDocxText(fileBytes)\n if (text) return { text, fileType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }\n }\n\n return { error: 'Unsupported file type', fileType: detectedType || 'unknown' }\n}\n\nexport async function sendMessage(client: AgentMailClient, args: Args) {\n const { inboxId, ...options } = args\n return client.inboxes.messages.send(inboxId, options)\n}\n\nexport async function replyToMessage(client: AgentMailClient, args: Args) {\n const { inboxId, messageId, ...options } = args\n return client.inboxes.messages.reply(inboxId, messageId, options)\n}\n\nexport async function forwardMessage(client: AgentMailClient, args: Args) {\n const { inboxId, messageId, ...options } = args\n return client.inboxes.messages.forward(inboxId, messageId, options)\n}\n\nexport async function updateMessage(client: AgentMailClient, args: Args) {\n const { inboxId, messageId, ...options } = args\n return client.inboxes.messages.update(inboxId, messageId, options)\n}\n","import { z } from 'zod'\nimport { AgentMailClient } from 'agentmail'\nimport { type ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'\n\nimport {\n ListItemsParams,\n ListInboxItemsParams,\n GetInboxParams,\n CreateInboxParams,\n GetThreadParams,\n GetAttachmentParams,\n SendMessageParams,\n ReplyToMessageParams,\n UpdateMessageParams,\n ForwardMessageParams,\n} from './schemas.js'\nimport {\n type Args,\n listInboxes,\n getInbox,\n createInbox,\n deleteInbox,\n listThreads,\n getThread,\n getAttachment,\n sendMessage,\n replyToMessage,\n updateMessage,\n forwardMessage,\n} from './functions.js'\nexport interface Tool {\n name: string\n description: string\n paramsSchema: z.ZodObject<any>\n func: (client: AgentMailClient, args: Args) => Promise<any>\n annotations?: ToolAnnotations\n}\n\nexport const tools: Tool[] = [\n {\n name: 'list_inboxes',\n description: 'List inboxes',\n paramsSchema: ListItemsParams,\n func: listInboxes,\n annotations: {\n readOnlyHint: true,\n openWorldHint: false,\n },\n },\n {\n name: 'get_inbox',\n description: 'Get inbox',\n paramsSchema: GetInboxParams,\n func: getInbox,\n annotations: {\n readOnlyHint: true,\n openWorldHint: false,\n },\n },\n {\n name: 'create_inbox',\n description: 'Create inbox',\n paramsSchema: CreateInboxParams,\n func: createInbox,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false,\n },\n },\n {\n name: 'delete_inbox',\n description: 'Delete inbox',\n paramsSchema: GetInboxParams,\n func: deleteInbox,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n {\n name: 'list_threads',\n description: 'List threads in inbox',\n paramsSchema: ListInboxItemsParams,\n func: listThreads,\n annotations: {\n readOnlyHint: true,\n openWorldHint: true,\n },\n },\n {\n name: 'get_thread',\n description: 'Get thread',\n paramsSchema: GetThreadParams,\n func: getThread,\n annotations: {\n readOnlyHint: true,\n openWorldHint: true,\n },\n },\n {\n name: 'get_attachment',\n description: 'Get attachment',\n paramsSchema: GetAttachmentParams,\n func: getAttachment,\n annotations: {\n readOnlyHint: true,\n openWorldHint: true,\n },\n },\n {\n name: 'send_message',\n description: 'Send message',\n paramsSchema: SendMessageParams,\n func: sendMessage,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n },\n {\n name: 'reply_to_message',\n description: 'Reply to message',\n paramsSchema: ReplyToMessageParams,\n func: replyToMessage,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n },\n {\n name: 'forward_message',\n description: 'Forward message',\n paramsSchema: ForwardMessageParams,\n func: forwardMessage,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n },\n {\n name: 'update_message',\n description: 'Update message',\n paramsSchema: UpdateMessageParams,\n func: updateMessage,\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n]\n"],"mappings":"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","names":["import_zod","JSZip"]}
@@ -0,0 +1,11 @@
1
+ import { AgentTool } from '@mariozechner/pi-agent-core';
2
+ import { L as ListToolkit, T as Tool } from './toolkit-BBmENfEu.cjs';
3
+ import 'agentmail';
4
+ import 'zod';
5
+ import '@modelcontextprotocol/sdk/types.js';
6
+
7
+ declare class AgentMailToolkit extends ListToolkit<AgentTool> {
8
+ protected buildTool(tool: Tool): AgentTool;
9
+ }
10
+
11
+ export { AgentMailToolkit };
@@ -0,0 +1,11 @@
1
+ import { AgentTool } from '@mariozechner/pi-agent-core';
2
+ import { L as ListToolkit, T as Tool } from './toolkit-BBmENfEu.js';
3
+ import 'agentmail';
4
+ import 'zod';
5
+ import '@modelcontextprotocol/sdk/types.js';
6
+
7
+ declare class AgentMailToolkit extends ListToolkit<AgentTool> {
8
+ protected buildTool(tool: Tool): AgentTool;
9
+ }
10
+
11
+ export { AgentMailToolkit };
@@ -0,0 +1,39 @@
1
+ import {
2
+ ListToolkit
3
+ } from "./chunk-KMHACGIU.js";
4
+
5
+ // src/clawdbot.ts
6
+ import { toJSONSchema } from "zod";
7
+ function zodToJSONSchema(tool) {
8
+ return toJSONSchema(tool.paramsSchema, {
9
+ unrepresentable: "any",
10
+ override: (ctx) => {
11
+ const def = ctx.zodSchema._zod.def;
12
+ if (def.type === "date") {
13
+ ctx.jsonSchema.type = "string";
14
+ ctx.jsonSchema.format = "date-time";
15
+ }
16
+ }
17
+ });
18
+ }
19
+ var AgentMailToolkit = class extends ListToolkit {
20
+ buildTool(tool) {
21
+ return {
22
+ name: tool.name,
23
+ label: tool.name,
24
+ description: tool.description,
25
+ parameters: zodToJSONSchema(tool),
26
+ execute: async (_toolCallId, args) => {
27
+ const response = await tool.func(this.client, tool.paramsSchema.parse(args));
28
+ return {
29
+ content: [{ type: "text", text: JSON.stringify(response) }],
30
+ details: response
31
+ };
32
+ }
33
+ };
34
+ }
35
+ };
36
+ export {
37
+ AgentMailToolkit
38
+ };
39
+ //# sourceMappingURL=clawdbot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/clawdbot.ts"],"sourcesContent":["import type { AgentTool } from '@mariozechner/pi-agent-core'\nimport type { TSchema } from '@sinclair/typebox'\nimport { toJSONSchema } from 'zod'\n\nimport { ListToolkit } from './toolkit.js'\nimport type { Tool } from './tools.js'\n\n/** Convert Zod schema to JSON Schema, handling Date types as ISO datetime strings */\nfunction zodToJSONSchema(tool: Tool) {\n return toJSONSchema(tool.paramsSchema, {\n unrepresentable: 'any',\n override: (ctx) => {\n const def = ctx.zodSchema._zod.def\n if (def.type === 'date') {\n ctx.jsonSchema.type = 'string'\n ctx.jsonSchema.format = 'date-time'\n }\n },\n }) as unknown as TSchema\n}\n\nexport class AgentMailToolkit extends ListToolkit<AgentTool> {\n protected buildTool(tool: Tool): AgentTool {\n return {\n name: tool.name,\n label: tool.name,\n description: tool.description,\n parameters: zodToJSONSchema(tool),\n execute: async (_toolCallId, args) => {\n const response = await tool.func(this.client, tool.paramsSchema.parse(args))\n return {\n content: [{ type: 'text', text: JSON.stringify(response) }],\n details: response,\n }\n },\n }\n }\n}\n"],"mappings":";;;;;AAEA,SAAS,oBAAoB;AAM7B,SAAS,gBAAgB,MAAY;AACjC,SAAO,aAAa,KAAK,cAAc;AAAA,IACnC,iBAAiB;AAAA,IACjB,UAAU,CAAC,QAAQ;AACf,YAAM,MAAM,IAAI,UAAU,KAAK;AAC/B,UAAI,IAAI,SAAS,QAAQ;AACrB,YAAI,WAAW,OAAO;AACtB,YAAI,WAAW,SAAS;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;AAEO,IAAM,mBAAN,cAA+B,YAAuB;AAAA,EAC/C,UAAU,MAAuB;AACvC,WAAO;AAAA,MACH,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,YAAY,gBAAgB,IAAI;AAAA,MAChC,SAAS,OAAO,aAAa,SAAS;AAClC,cAAM,WAAW,MAAM,KAAK,KAAK,KAAK,QAAQ,KAAK,aAAa,MAAM,IAAI,CAAC;AAC3E,eAAO;AAAA,UACH,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,EAAE,CAAC;AAAA,UAC1D,SAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentmail-toolkit",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "AgentMail Toolkit",
5
5
  "scripts": {
6
6
  "build": "tsup",
@@ -47,6 +47,11 @@
47
47
  "types": "./dist/mcp.d.ts",
48
48
  "import": "./dist/mcp.js",
49
49
  "require": "./dist/mcp.cjs"
50
+ },
51
+ "./clawdbot": {
52
+ "types": "./dist/clawdbot.d.ts",
53
+ "import": "./dist/clawdbot.js",
54
+ "require": "./dist/clawdbot.cjs"
50
55
  }
51
56
  },
52
57
  "dependencies": {
@@ -58,6 +63,7 @@
58
63
  "peerDependencies": {
59
64
  "@modelcontextprotocol/sdk": "^1.24.1",
60
65
  "ai": "^6.0.0-beta.150",
66
+ "clawdbot": "*",
61
67
  "langchain": "^1.2.0"
62
68
  },
63
69
  "peerDependenciesMeta": {
@@ -67,13 +73,19 @@
67
73
  "ai": {
68
74
  "optional": true
69
75
  },
76
+ "clawdbot": {
77
+ "optional": true
78
+ },
70
79
  "langchain": {
71
80
  "optional": true
72
81
  }
73
82
  },
74
83
  "devDependencies": {
75
84
  "@eslint/js": "^9.39.1",
85
+ "@mariozechner/pi-agent-core": "^0.50.1",
86
+ "@sinclair/typebox": "^0.34.47",
76
87
  "@types/node": "^24.10.1",
88
+ "clawdbot": "2026.1.24-3",
77
89
  "eslint": "^9.39.1",
78
90
  "eslint-config-prettier": "^10.1.8",
79
91
  "globals": "^16.5.0",