jazz-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +182 -0
  3. package/dist/cli/commands/auth.d.ts +18 -0
  4. package/dist/cli/commands/auth.d.ts.map +1 -0
  5. package/dist/cli/commands/auth.js +128 -0
  6. package/dist/cli/commands/auth.js.map +1 -0
  7. package/dist/cli/commands/chat-agent.d.ts +18 -0
  8. package/dist/cli/commands/chat-agent.d.ts.map +1 -0
  9. package/dist/cli/commands/chat-agent.js +421 -0
  10. package/dist/cli/commands/chat-agent.js.map +1 -0
  11. package/dist/cli/commands/edit-agent.d.ts +10 -0
  12. package/dist/cli/commands/edit-agent.d.ts.map +1 -0
  13. package/dist/cli/commands/edit-agent.js +310 -0
  14. package/dist/cli/commands/edit-agent.js.map +1 -0
  15. package/dist/cli/commands/task-agent.d.ts +126 -0
  16. package/dist/cli/commands/task-agent.d.ts.map +1 -0
  17. package/dist/cli/commands/task-agent.js +345 -0
  18. package/dist/cli/commands/task-agent.js.map +1 -0
  19. package/dist/core/agent/agent-prompt.d.ts +47 -0
  20. package/dist/core/agent/agent-prompt.d.ts.map +1 -0
  21. package/dist/core/agent/agent-prompt.js +146 -0
  22. package/dist/core/agent/agent-prompt.js.map +1 -0
  23. package/dist/core/agent/agent-runner.d.ts +63 -0
  24. package/dist/core/agent/agent-runner.d.ts.map +1 -0
  25. package/dist/core/agent/agent-runner.js +346 -0
  26. package/dist/core/agent/agent-runner.js.map +1 -0
  27. package/dist/core/agent/agent-service.d.ts +164 -0
  28. package/dist/core/agent/agent-service.d.ts.map +1 -0
  29. package/dist/core/agent/agent-service.js +463 -0
  30. package/dist/core/agent/agent-service.js.map +1 -0
  31. package/dist/core/agent/gmail-agent.d.ts +17 -0
  32. package/dist/core/agent/gmail-agent.d.ts.map +1 -0
  33. package/dist/core/agent/gmail-agent.js +191 -0
  34. package/dist/core/agent/gmail-agent.js.map +1 -0
  35. package/dist/core/agent/prompts/default/v1.d.ts +2 -0
  36. package/dist/core/agent/prompts/default/v1.d.ts.map +1 -0
  37. package/dist/core/agent/prompts/default/v1.js +202 -0
  38. package/dist/core/agent/prompts/default/v1.js.map +1 -0
  39. package/dist/core/agent/prompts/default/v2.d.ts +2 -0
  40. package/dist/core/agent/prompts/default/v2.d.ts.map +1 -0
  41. package/dist/core/agent/prompts/default/v2.js +72 -0
  42. package/dist/core/agent/prompts/default/v2.js.map +1 -0
  43. package/dist/core/agent/prompts/gmail/v1.d.ts +2 -0
  44. package/dist/core/agent/prompts/gmail/v1.d.ts.map +1 -0
  45. package/dist/core/agent/prompts/gmail/v1.js +206 -0
  46. package/dist/core/agent/prompts/gmail/v1.js.map +1 -0
  47. package/dist/core/agent/prompts/gmail/v2.d.ts +2 -0
  48. package/dist/core/agent/prompts/gmail/v2.d.ts.map +1 -0
  49. package/dist/core/agent/prompts/gmail/v2.js +59 -0
  50. package/dist/core/agent/prompts/gmail/v2.js.map +1 -0
  51. package/dist/core/agent/tools/base-tool.d.ts +161 -0
  52. package/dist/core/agent/tools/base-tool.d.ts.map +1 -0
  53. package/dist/core/agent/tools/base-tool.js +153 -0
  54. package/dist/core/agent/tools/base-tool.js.map +1 -0
  55. package/dist/core/agent/tools/fs-tools.d.ts +21 -0
  56. package/dist/core/agent/tools/fs-tools.d.ts.map +1 -0
  57. package/dist/core/agent/tools/fs-tools.js +1210 -0
  58. package/dist/core/agent/tools/fs-tools.js.map +1 -0
  59. package/dist/core/agent/tools/git-tools.d.ts +63 -0
  60. package/dist/core/agent/tools/git-tools.d.ts.map +1 -0
  61. package/dist/core/agent/tools/git-tools.js +600 -0
  62. package/dist/core/agent/tools/git-tools.js.map +1 -0
  63. package/dist/core/agent/tools/gmail-tools.d.ts +22 -0
  64. package/dist/core/agent/tools/gmail-tools.d.ts.map +1 -0
  65. package/dist/core/agent/tools/gmail-tools.js +779 -0
  66. package/dist/core/agent/tools/gmail-tools.js.map +1 -0
  67. package/dist/core/agent/tools/register-tools.d.ts +13 -0
  68. package/dist/core/agent/tools/register-tools.d.ts.map +1 -0
  69. package/dist/core/agent/tools/register-tools.js +169 -0
  70. package/dist/core/agent/tools/register-tools.js.map +1 -0
  71. package/dist/core/agent/tools/shell-tools.d.ts +19 -0
  72. package/dist/core/agent/tools/shell-tools.d.ts.map +1 -0
  73. package/dist/core/agent/tools/shell-tools.js +367 -0
  74. package/dist/core/agent/tools/shell-tools.js.map +1 -0
  75. package/dist/core/agent/tools/tool-registry.d.ts +62 -0
  76. package/dist/core/agent/tools/tool-registry.d.ts.map +1 -0
  77. package/dist/core/agent/tools/tool-registry.js +187 -0
  78. package/dist/core/agent/tools/tool-registry.js.map +1 -0
  79. package/dist/core/agent/tools/web-search-tools.d.ts +39 -0
  80. package/dist/core/agent/tools/web-search-tools.d.ts.map +1 -0
  81. package/dist/core/agent/tools/web-search-tools.js +220 -0
  82. package/dist/core/agent/tools/web-search-tools.js.map +1 -0
  83. package/dist/core/types/errors.d.ts +300 -0
  84. package/dist/core/types/errors.d.ts.map +1 -0
  85. package/dist/core/types/errors.js +115 -0
  86. package/dist/core/types/errors.js.map +1 -0
  87. package/dist/core/types/index.d.ts +208 -0
  88. package/dist/core/types/index.d.ts.map +1 -0
  89. package/dist/core/types/index.js +30 -0
  90. package/dist/core/types/index.js.map +1 -0
  91. package/dist/core/utils/error-handler.d.ts +114 -0
  92. package/dist/core/utils/error-handler.d.ts.map +1 -0
  93. package/dist/core/utils/error-handler.js +551 -0
  94. package/dist/core/utils/error-handler.js.map +1 -0
  95. package/dist/core/utils/markdown-renderer.d.ts +52 -0
  96. package/dist/core/utils/markdown-renderer.d.ts.map +1 -0
  97. package/dist/core/utils/markdown-renderer.js +134 -0
  98. package/dist/core/utils/markdown-renderer.js.map +1 -0
  99. package/dist/main.d.ts +3 -0
  100. package/dist/main.d.ts.map +1 -0
  101. package/dist/main.js +255 -0
  102. package/dist/main.js.map +1 -0
  103. package/dist/services/config.d.ts +29 -0
  104. package/dist/services/config.d.ts.map +1 -0
  105. package/dist/services/config.js +204 -0
  106. package/dist/services/config.js.map +1 -0
  107. package/dist/services/gmail.d.ts +197 -0
  108. package/dist/services/gmail.d.ts.map +1 -0
  109. package/dist/services/gmail.js +592 -0
  110. package/dist/services/gmail.js.map +1 -0
  111. package/dist/services/llm/ai-sdk-service.d.ts +5 -0
  112. package/dist/services/llm/ai-sdk-service.d.ts.map +1 -0
  113. package/dist/services/llm/ai-sdk-service.js +326 -0
  114. package/dist/services/llm/ai-sdk-service.js.map +1 -0
  115. package/dist/services/llm/context-manager.d.ts +51 -0
  116. package/dist/services/llm/context-manager.d.ts.map +1 -0
  117. package/dist/services/llm/context-manager.js +269 -0
  118. package/dist/services/llm/context-manager.js.map +1 -0
  119. package/dist/services/llm/types.d.ts +114 -0
  120. package/dist/services/llm/types.d.ts.map +1 -0
  121. package/dist/services/llm/types.js +51 -0
  122. package/dist/services/llm/types.js.map +1 -0
  123. package/dist/services/logger.d.ts +28 -0
  124. package/dist/services/logger.d.ts.map +1 -0
  125. package/dist/services/logger.js +267 -0
  126. package/dist/services/logger.js.map +1 -0
  127. package/dist/services/shell.d.ts +37 -0
  128. package/dist/services/shell.d.ts.map +1 -0
  129. package/dist/services/shell.js +197 -0
  130. package/dist/services/shell.js.map +1 -0
  131. package/dist/services/storage/file.d.ts +37 -0
  132. package/dist/services/storage/file.d.ts.map +1 -0
  133. package/dist/services/storage/file.js +221 -0
  134. package/dist/services/storage/file.js.map +1 -0
  135. package/dist/services/storage/inMemory.d.ts +25 -0
  136. package/dist/services/storage/inMemory.d.ts.map +1 -0
  137. package/dist/services/storage/inMemory.js +106 -0
  138. package/dist/services/storage/inMemory.js.map +1 -0
  139. package/dist/services/storage/service.d.ts +26 -0
  140. package/dist/services/storage/service.d.ts.map +1 -0
  141. package/dist/services/storage/service.js +48 -0
  142. package/dist/services/storage/service.js.map +1 -0
  143. package/package.json +92 -0
@@ -0,0 +1,779 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createListEmailsTool = createListEmailsTool;
4
+ exports.createGetEmailTool = createGetEmailTool;
5
+ exports.createSearchEmailsTool = createSearchEmailsTool;
6
+ exports.createSendEmailTool = createSendEmailTool;
7
+ exports.createListLabelsTool = createListLabelsTool;
8
+ exports.createCreateLabelTool = createCreateLabelTool;
9
+ exports.createUpdateLabelTool = createUpdateLabelTool;
10
+ exports.createDeleteLabelTool = createDeleteLabelTool;
11
+ exports.createTrashEmailTool = createTrashEmailTool;
12
+ exports.createDeleteEmailTool = createDeleteEmailTool;
13
+ exports.createExecuteTrashEmailTool = createExecuteTrashEmailTool;
14
+ exports.createExecuteDeleteEmailTool = createExecuteDeleteEmailTool;
15
+ exports.createExecuteDeleteLabelTool = createExecuteDeleteLabelTool;
16
+ exports.createAddLabelsToEmailTool = createAddLabelsToEmailTool;
17
+ exports.createRemoveLabelsFromEmailTool = createRemoveLabelsFromEmailTool;
18
+ exports.createBatchModifyEmailsTool = createBatchModifyEmailsTool;
19
+ const effect_1 = require("effect");
20
+ const zod_1 = require("zod");
21
+ const gmail_1 = require("../../../services/gmail");
22
+ const base_tool_1 = require("./base-tool");
23
+ // Gmail allowed label colors
24
+ const ALLOWED_LABEL_COLORS = [
25
+ "#000000",
26
+ "#434343",
27
+ "#666666",
28
+ "#999999",
29
+ "#cccccc",
30
+ "#efefef",
31
+ "#f3f3f3",
32
+ "#ffffff",
33
+ "#fb4c2f",
34
+ "#ffad47",
35
+ "#fad165",
36
+ "#16a766",
37
+ "#43d692",
38
+ "#4a86e8",
39
+ "#a479e2",
40
+ "#f691b3",
41
+ "#f6c5be",
42
+ "#ffe6c7",
43
+ "#fef1d1",
44
+ "#b9e4d0",
45
+ "#c6f3de",
46
+ "#c9daf8",
47
+ "#e4d7f5",
48
+ "#fcdee8",
49
+ "#efa093",
50
+ "#ffd6a2",
51
+ "#fce8b3",
52
+ "#89d3b2",
53
+ "#a0eac9",
54
+ "#a4c2f4",
55
+ "#d0bcf1",
56
+ "#fbc8d9",
57
+ "#e66550",
58
+ "#ffbc6b",
59
+ "#fcda83",
60
+ "#44b984",
61
+ "#68dfa9",
62
+ "#6d9eeb",
63
+ "#b694e8",
64
+ "#f7a7c0",
65
+ "#cc3a21",
66
+ "#eaa041",
67
+ "#f2c960",
68
+ "#149e60",
69
+ "#3dc789",
70
+ "#3c78d8",
71
+ "#8e63ce",
72
+ "#e07798",
73
+ "#ac2b16",
74
+ "#cf8933",
75
+ "#d5ae49",
76
+ "#0b804b",
77
+ "#2a9c68",
78
+ "#285bac",
79
+ "#653e9b",
80
+ "#b65775",
81
+ "#822111",
82
+ "#a46a21",
83
+ "#aa8831",
84
+ "#076239",
85
+ "#1a764d",
86
+ "#1c4587",
87
+ "#41236d",
88
+ "#83334c",
89
+ "#464646",
90
+ "#e7e7e7",
91
+ "#0d3472",
92
+ "#b6cff5",
93
+ "#0d3b44",
94
+ "#98d7e4",
95
+ "#3d188e",
96
+ "#e3d7ff",
97
+ "#711a36",
98
+ "#fbd3e0",
99
+ "#8a1c0a",
100
+ "#f2b2a8",
101
+ "#7a2e0b",
102
+ "#ffc8af",
103
+ "#7a4706",
104
+ "#ffdeb5",
105
+ "#594c05",
106
+ "#fbe983",
107
+ "#684e07",
108
+ "#fdedc1",
109
+ "#0b4f30",
110
+ "#b3efd3",
111
+ "#04502e",
112
+ "#a2dcc1",
113
+ "#c2c2c2",
114
+ "#4986e7",
115
+ "#2da2bb",
116
+ "#b99aff",
117
+ "#994a64",
118
+ "#f691b2",
119
+ "#ff7537",
120
+ "#ffad46",
121
+ "#662e37",
122
+ "#ebdbde",
123
+ "#cca6ac",
124
+ "#094228",
125
+ "#42d692",
126
+ "#16a765",
127
+ ];
128
+ /**
129
+ * Gmail tools for agent
130
+ */
131
+ // List emails tool
132
+ function createListEmailsTool() {
133
+ const parameters = zod_1.z
134
+ .object({
135
+ maxResults: zod_1.z.number().int().min(1).max(100).optional().describe("Maximum emails to return"),
136
+ query: zod_1.z.string().optional().describe("Gmail search query, e.g. 'in:inbox newer_than:7d'"),
137
+ })
138
+ .strict();
139
+ return (0, base_tool_1.defineTool)({
140
+ name: "listEmails",
141
+ description: "List the user's emails with optional filtering",
142
+ parameters,
143
+ validate: (args) => {
144
+ const result = parameters.safeParse(args);
145
+ return result.success
146
+ ? {
147
+ valid: true,
148
+ value: result.data,
149
+ }
150
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
151
+ },
152
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
153
+ const gmailService = yield* gmail_1.GmailServiceTag;
154
+ const maxResults = typeof validatedArgs.maxResults === "number" ? validatedArgs.maxResults : 10;
155
+ const query = typeof validatedArgs.query === "string" ? validatedArgs.query : "";
156
+ try {
157
+ const emails = yield* gmailService.listEmails(maxResults, query);
158
+ return { success: true, result: formatEmailsForDisplay(emails) };
159
+ }
160
+ catch (error) {
161
+ return {
162
+ success: false,
163
+ result: null,
164
+ error: `Failed to list emails: ${error instanceof Error ? error.message : String(error)}`,
165
+ };
166
+ }
167
+ }),
168
+ });
169
+ }
170
+ // Get email tool
171
+ function createGetEmailTool() {
172
+ const parameters = zod_1.z
173
+ .object({
174
+ emailId: zod_1.z.string().min(1).describe("ID of the email to retrieve"),
175
+ })
176
+ .strict();
177
+ return (0, base_tool_1.defineTool)({
178
+ name: "getEmail",
179
+ description: "Get the full content of a specific email by ID",
180
+ parameters,
181
+ validate: (args) => {
182
+ const result = parameters.safeParse(args);
183
+ return result.success
184
+ ? { valid: true, value: result.data }
185
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
186
+ },
187
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
188
+ const gmailService = yield* gmail_1.GmailServiceTag;
189
+ const email = yield* gmailService.getEmail(validatedArgs.emailId);
190
+ return { success: true, result: formatEmailDetail(email) };
191
+ }),
192
+ });
193
+ }
194
+ // Search emails tool
195
+ function createSearchEmailsTool() {
196
+ const parameters = zod_1.z
197
+ .object({
198
+ query: zod_1.z.string().min(1).describe("Gmail search query to filter emails"),
199
+ maxResults: zod_1.z.number().int().min(1).max(100).optional().describe("Maximum emails to return"),
200
+ })
201
+ .strict();
202
+ return (0, base_tool_1.defineTool)({
203
+ name: "searchEmails",
204
+ description: "Search for emails matching specific criteria",
205
+ parameters,
206
+ validate: (args) => {
207
+ const result = parameters.safeParse(args);
208
+ return result.success
209
+ ? {
210
+ valid: true,
211
+ value: result.data,
212
+ }
213
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
214
+ },
215
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
216
+ const gmailService = yield* gmail_1.GmailServiceTag;
217
+ const maxResults = typeof validatedArgs.maxResults === "number" ? validatedArgs.maxResults : 10;
218
+ const emails = yield* gmailService.searchEmails(validatedArgs.query, maxResults);
219
+ return { success: true, result: formatEmailsForDisplay(emails) };
220
+ }),
221
+ });
222
+ }
223
+ // Send email tool
224
+ function createSendEmailTool() {
225
+ const parameters = zod_1.z
226
+ .object({
227
+ to: zod_1.z.array(zod_1.z.string()).min(1).describe("Primary recipients (email addresses)"),
228
+ subject: zod_1.z.string().min(1).describe("Email subject"),
229
+ body: zod_1.z.string().min(1).describe("Email body (plain text)"),
230
+ cc: zod_1.z.array(zod_1.z.string()).optional().describe("CC recipients"),
231
+ bcc: zod_1.z.array(zod_1.z.string()).optional().describe("BCC recipients"),
232
+ })
233
+ .strict();
234
+ return (0, base_tool_1.defineTool)({
235
+ name: "sendEmail",
236
+ description: "Draft an email on behalf of the user (does not send)",
237
+ parameters,
238
+ validate: (args) => {
239
+ const result = parameters.safeParse(args);
240
+ return result.success
241
+ ? {
242
+ valid: true,
243
+ value: result.data,
244
+ }
245
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
246
+ },
247
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
248
+ const gmailService = yield* gmail_1.GmailServiceTag;
249
+ const { to, subject, body, cc, bcc } = validatedArgs;
250
+ const options = {};
251
+ if (cc)
252
+ options.cc = cc;
253
+ if (bcc)
254
+ options.bcc = bcc;
255
+ yield* gmailService.sendEmail(to, subject, body, options);
256
+ return { success: true, result: `Draft created for ${to.join(", ")}` };
257
+ }),
258
+ });
259
+ }
260
+ // List labels tool
261
+ function createListLabelsTool() {
262
+ const parameters = zod_1.z.object({}).strict();
263
+ return (0, base_tool_1.defineTool)({
264
+ name: "listLabels",
265
+ description: "List all Gmail labels (both system and user-created)",
266
+ parameters,
267
+ validate: (args) => {
268
+ const result = parameters.safeParse(args);
269
+ return result.success
270
+ ? { valid: true, value: result.data }
271
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
272
+ },
273
+ handler: () => effect_1.Effect.gen(function* () {
274
+ const gmailService = yield* gmail_1.GmailServiceTag;
275
+ const labels = yield* gmailService.listLabels();
276
+ return { success: true, result: formatLabelsForDisplay(labels) };
277
+ }),
278
+ });
279
+ }
280
+ // Create label tool
281
+ function createCreateLabelTool() {
282
+ const parameters = zod_1.z
283
+ .object({
284
+ name: zod_1.z.string().min(1).describe("Name of the label to create"),
285
+ labelListVisibility: zod_1.z
286
+ .enum(["labelShow", "labelHide"])
287
+ .optional()
288
+ .describe("Whether to show the label in the label list"),
289
+ messageListVisibility: zod_1.z
290
+ .enum(["show", "hide"])
291
+ .optional()
292
+ .describe("Whether to show the label in the message list"),
293
+ color: zod_1.z
294
+ .object({
295
+ textColor: zod_1.z
296
+ .enum(ALLOWED_LABEL_COLORS)
297
+ .describe("Text color (must be one of the allowed Gmail label colors)"),
298
+ backgroundColor: zod_1.z
299
+ .enum(ALLOWED_LABEL_COLORS)
300
+ .describe("Background color (must be one of the allowed Gmail label colors)"),
301
+ })
302
+ .partial()
303
+ .optional()
304
+ .refine((val) => !val || (typeof val.textColor === "string" && typeof val.backgroundColor === "string"), { message: "Both textColor and backgroundColor must be provided when color is set" })
305
+ .describe("Color settings for the label"),
306
+ })
307
+ .strict();
308
+ return (0, base_tool_1.defineTool)({
309
+ name: "createLabel",
310
+ description: "Create a new Gmail label with optional visibility and color settings",
311
+ parameters,
312
+ validate: (args) => {
313
+ const result = parameters.safeParse(args);
314
+ return result.success
315
+ ? {
316
+ valid: true,
317
+ value: result.data,
318
+ }
319
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
320
+ },
321
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
322
+ const gmailService = yield* gmail_1.GmailServiceTag;
323
+ const { name, labelListVisibility, messageListVisibility, color } = validatedArgs;
324
+ const options = {};
325
+ if (labelListVisibility)
326
+ options.labelListVisibility = labelListVisibility;
327
+ if (messageListVisibility)
328
+ options.messageListVisibility = messageListVisibility;
329
+ if (color)
330
+ options.color = color;
331
+ const createResult = yield* gmailService.createLabel(name, options).pipe(effect_1.Effect.catchAll((error) => {
332
+ // Check if it's a 409 conflict error (label already exists)
333
+ if (error instanceof Error && "status" in error && error.status === 409) {
334
+ // Return a special marker to indicate the label already exists
335
+ return effect_1.Effect.succeed("LABEL_EXISTS");
336
+ }
337
+ return effect_1.Effect.fail(error);
338
+ }));
339
+ // Handle the case where label already exists
340
+ if (createResult === "LABEL_EXISTS") {
341
+ return { success: true, result: `Label "${name}" already exists` };
342
+ }
343
+ // If we get here, the label was created successfully
344
+ return { success: true, result: formatLabelForDisplay(createResult) };
345
+ }),
346
+ });
347
+ }
348
+ // Update label tool
349
+ function createUpdateLabelTool() {
350
+ const parameters = zod_1.z
351
+ .object({
352
+ labelId: zod_1.z.string().min(1).describe("ID of the label to update"),
353
+ name: zod_1.z.string().min(1).optional().describe("New name for the label"),
354
+ labelListVisibility: zod_1.z
355
+ .enum(["labelShow", "labelHide"])
356
+ .optional()
357
+ .describe("Whether to show the label in the label list"),
358
+ messageListVisibility: zod_1.z
359
+ .enum(["show", "hide"])
360
+ .optional()
361
+ .describe("Whether to show the label in the message list"),
362
+ color: zod_1.z
363
+ .object({
364
+ textColor: zod_1.z.enum(ALLOWED_LABEL_COLORS),
365
+ backgroundColor: zod_1.z.enum(ALLOWED_LABEL_COLORS),
366
+ })
367
+ .partial()
368
+ .optional()
369
+ .refine((val) => !val || (typeof val.textColor === "string" && typeof val.backgroundColor === "string"), { message: "Both textColor and backgroundColor must be provided when color is set" })
370
+ .describe("Color settings for the label"),
371
+ })
372
+ .strict();
373
+ return (0, base_tool_1.defineTool)({
374
+ name: "updateLabel",
375
+ description: "Update an existing Gmail label's properties",
376
+ parameters,
377
+ validate: (args) => {
378
+ const result = parameters.safeParse(args);
379
+ return result.success
380
+ ? {
381
+ valid: true,
382
+ value: result.data,
383
+ }
384
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
385
+ },
386
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
387
+ const gmailService = yield* gmail_1.GmailServiceTag;
388
+ const { labelId, name, labelListVisibility, messageListVisibility, color } = validatedArgs;
389
+ const updates = {};
390
+ if (name !== undefined)
391
+ updates.name = name;
392
+ if (labelListVisibility !== undefined)
393
+ updates.labelListVisibility = labelListVisibility;
394
+ if (messageListVisibility !== undefined)
395
+ updates.messageListVisibility = messageListVisibility;
396
+ if (color !== undefined)
397
+ updates.color = color;
398
+ const label = yield* gmailService.updateLabel(labelId, updates);
399
+ return { success: true, result: formatLabelForDisplay(label) };
400
+ }),
401
+ });
402
+ }
403
+ // Delete label tool
404
+ function createDeleteLabelTool() {
405
+ const parameters = zod_1.z
406
+ .object({
407
+ labelId: zod_1.z.string().min(1).describe("ID of the label to delete"),
408
+ })
409
+ .strict();
410
+ return (0, base_tool_1.defineTool)({
411
+ name: "deleteLabel",
412
+ description: "Delete a Gmail label (only user-created labels can be deleted)",
413
+ parameters,
414
+ validate: (args) => {
415
+ const result = parameters.safeParse(args);
416
+ return result.success
417
+ ? { valid: true, value: result.data }
418
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
419
+ },
420
+ approval: {
421
+ message: (args, _context) => {
422
+ const a = args;
423
+ return effect_1.Effect.succeed(`About to permanently delete label '${a.labelId}'. This action cannot be undone.\n\nIf the user confirms, call executeDeleteLabel with the same labelId.`);
424
+ },
425
+ execute: {
426
+ toolName: "executeDeleteLabel",
427
+ buildArgs: (args) => ({ labelId: args.labelId }),
428
+ },
429
+ },
430
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
431
+ const gmailService = yield* gmail_1.GmailServiceTag;
432
+ yield* gmailService.deleteLabel(validatedArgs.labelId);
433
+ return { success: true, result: `Label ${validatedArgs.labelId} deleted successfully` };
434
+ }),
435
+ });
436
+ }
437
+ // Trash email tool (requires approval)
438
+ function createTrashEmailTool() {
439
+ const parameters = zod_1.z
440
+ .object({
441
+ emailId: zod_1.z.string().min(1).describe("ID of the email to move to trash"),
442
+ })
443
+ .strict();
444
+ return (0, base_tool_1.defineTool)({
445
+ name: "trashEmail",
446
+ description: "Move an email to trash (recoverable). Use this for safer email removal.",
447
+ parameters,
448
+ validate: (args) => {
449
+ const result = parameters.safeParse(args);
450
+ return result.success
451
+ ? { valid: true, value: result.data }
452
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
453
+ },
454
+ approval: {
455
+ message: (args, _context) => effect_1.Effect.gen(function* () {
456
+ const a = args;
457
+ const gmailService = yield* gmail_1.GmailServiceTag;
458
+ try {
459
+ const email = yield* gmailService.getEmail(a.emailId);
460
+ const preview = createEmailPreviewMessage(email);
461
+ return `${preview}\n\n🗑️ About to move this email to trash. It can be recovered later.\n\nIf the user confirms, call executeTrashEmail with the same emailId.`;
462
+ }
463
+ catch (error) {
464
+ // If we can't fetch email details, fall back to basic message
465
+ return `About to move email '${a.emailId}' to trash. It can be recovered later.\n(Note: Could not fetch email details: ${error instanceof Error ? error.message : String(error)})`;
466
+ }
467
+ }),
468
+ execute: {
469
+ toolName: "executeTrashEmail",
470
+ buildArgs: (args) => ({ emailId: args.emailId }),
471
+ },
472
+ },
473
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
474
+ const gmailService = yield* gmail_1.GmailServiceTag;
475
+ yield* gmailService.trashEmail(validatedArgs.emailId);
476
+ return { success: true, result: `Email ${validatedArgs.emailId} moved to trash` };
477
+ }),
478
+ });
479
+ }
480
+ // Delete email tool (requires approval)
481
+ function createDeleteEmailTool() {
482
+ const parameters = zod_1.z
483
+ .object({
484
+ emailId: zod_1.z.string().min(1).describe("ID of the email to delete permanently"),
485
+ })
486
+ .strict();
487
+ return (0, base_tool_1.defineTool)({
488
+ name: "deleteEmail",
489
+ description: "Permanently delete an email. This action cannot be undone. Consider using trashEmail for safer removal.",
490
+ parameters,
491
+ validate: (args) => {
492
+ const result = parameters.safeParse(args);
493
+ return result.success
494
+ ? { valid: true, value: result.data }
495
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
496
+ },
497
+ approval: {
498
+ message: (args, _context) => effect_1.Effect.gen(function* () {
499
+ const a = args;
500
+ const gmailService = yield* gmail_1.GmailServiceTag;
501
+ try {
502
+ const email = yield* gmailService.getEmail(a.emailId);
503
+ const preview = createEmailPreviewMessage(email);
504
+ return `${preview}\n\n⚠️ About to PERMANENTLY DELETE this email. This cannot be undone!\n\nIf the user confirms, call executeDeleteEmail with the same emailId.`;
505
+ }
506
+ catch (error) {
507
+ // If we can't fetch email details, fall back to basic message
508
+ return `About to permanently delete email '${a.emailId}'. This cannot be undone!\n(Note: Could not fetch email details: ${error instanceof Error ? error.message : String(error)})`;
509
+ }
510
+ }),
511
+ execute: {
512
+ toolName: "executeDeleteEmail",
513
+ buildArgs: (args) => ({ emailId: args.emailId }),
514
+ },
515
+ },
516
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
517
+ const gmailService = yield* gmail_1.GmailServiceTag;
518
+ yield* gmailService.deleteEmail(validatedArgs.emailId);
519
+ return { success: true, result: `Email ${validatedArgs.emailId} deleted permanently` };
520
+ }),
521
+ });
522
+ }
523
+ // Execute trash email tool (internal - called after approval)
524
+ function createExecuteTrashEmailTool() {
525
+ const parameters = zod_1.z
526
+ .object({
527
+ emailId: zod_1.z.string().min(1).describe("ID of the email to move to trash"),
528
+ })
529
+ .strict();
530
+ return (0, base_tool_1.defineTool)({
531
+ name: "executeTrashEmail",
532
+ description: "Execute the trash email action after user approval",
533
+ hidden: true,
534
+ parameters,
535
+ validate: (args) => {
536
+ const result = parameters.safeParse(args);
537
+ return result.success
538
+ ? { valid: true, value: result.data }
539
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
540
+ },
541
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
542
+ const gmailService = yield* gmail_1.GmailServiceTag;
543
+ yield* gmailService.trashEmail(validatedArgs.emailId);
544
+ return { success: true, result: `Email ${validatedArgs.emailId} moved to trash` };
545
+ }),
546
+ });
547
+ }
548
+ // Execute delete email tool (internal - called after approval)
549
+ function createExecuteDeleteEmailTool() {
550
+ const parameters = zod_1.z
551
+ .object({
552
+ emailId: zod_1.z.string().min(1).describe("ID of the email to delete permanently"),
553
+ })
554
+ .strict();
555
+ return (0, base_tool_1.defineTool)({
556
+ name: "executeDeleteEmail",
557
+ description: "Execute the delete email action after user approval",
558
+ hidden: true,
559
+ parameters,
560
+ validate: (args) => {
561
+ const result = parameters.safeParse(args);
562
+ return result.success
563
+ ? {
564
+ valid: true,
565
+ value: result.data,
566
+ }
567
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
568
+ },
569
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
570
+ const gmailService = yield* gmail_1.GmailServiceTag;
571
+ yield* gmailService.deleteEmail(validatedArgs.emailId);
572
+ return { success: true, result: `Email ${validatedArgs.emailId} deleted permanently` };
573
+ }),
574
+ });
575
+ }
576
+ // Execute delete label tool (internal - called after approval)
577
+ function createExecuteDeleteLabelTool() {
578
+ const parameters = zod_1.z
579
+ .object({
580
+ labelId: zod_1.z.string().min(1).describe("ID of the label to delete"),
581
+ })
582
+ .strict();
583
+ return (0, base_tool_1.defineTool)({
584
+ name: "executeDeleteLabel",
585
+ description: "Execute the delete label action after user approval",
586
+ hidden: true,
587
+ parameters,
588
+ validate: (args) => {
589
+ const result = parameters.safeParse(args);
590
+ return result.success
591
+ ? {
592
+ valid: true,
593
+ value: result.data,
594
+ }
595
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
596
+ },
597
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
598
+ const gmailService = yield* gmail_1.GmailServiceTag;
599
+ yield* gmailService.deleteLabel(validatedArgs.labelId);
600
+ return { success: true, result: `Label ${validatedArgs.labelId} deleted successfully` };
601
+ }),
602
+ });
603
+ }
604
+ // Add labels to email tool
605
+ function createAddLabelsToEmailTool() {
606
+ const parameters = zod_1.z
607
+ .object({
608
+ emailId: zod_1.z.string().min(1).describe("ID of the email to add labels to"),
609
+ labelIds: zod_1.z.array(zod_1.z.string()).min(1).describe("Array of label IDs to add to the email"),
610
+ })
611
+ .strict();
612
+ return (0, base_tool_1.defineTool)({
613
+ name: "addLabelsToEmail",
614
+ description: "Add one or more labels to a specific email",
615
+ parameters,
616
+ validate: (args) => {
617
+ const result = parameters.safeParse(args);
618
+ return result.success
619
+ ? {
620
+ valid: true,
621
+ value: result.data,
622
+ }
623
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
624
+ },
625
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
626
+ const gmailService = yield* gmail_1.GmailServiceTag;
627
+ const email = yield* gmailService.modifyEmail(validatedArgs.emailId, {
628
+ addLabelIds: validatedArgs.labelIds,
629
+ });
630
+ return { success: true, result: formatEmailDetail(email) };
631
+ }),
632
+ });
633
+ }
634
+ // Remove labels from email tool
635
+ function createRemoveLabelsFromEmailTool() {
636
+ const parameters = zod_1.z
637
+ .object({
638
+ emailId: zod_1.z.string().min(1).describe("ID of the email to remove labels from"),
639
+ labelIds: zod_1.z.array(zod_1.z.string()).min(1).describe("Array of label IDs to remove from the email"),
640
+ })
641
+ .strict();
642
+ return (0, base_tool_1.defineTool)({
643
+ name: "removeLabelsFromEmail",
644
+ description: "Remove one or more labels from a specific email",
645
+ parameters,
646
+ validate: (args) => {
647
+ const result = parameters.safeParse(args);
648
+ return result.success
649
+ ? { valid: true, value: result.data }
650
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
651
+ },
652
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
653
+ const gmailService = yield* gmail_1.GmailServiceTag;
654
+ const email = yield* gmailService.modifyEmail(validatedArgs.emailId, {
655
+ removeLabelIds: validatedArgs.labelIds,
656
+ });
657
+ return { success: true, result: formatEmailDetail(email) };
658
+ }),
659
+ });
660
+ }
661
+ // Batch modify emails tool
662
+ function createBatchModifyEmailsTool() {
663
+ const parameters = zod_1.z
664
+ .object({
665
+ emailIds: zod_1.z.array(zod_1.z.string()).min(1).max(1000).describe("Array of email IDs to modify"),
666
+ addLabelIds: zod_1.z
667
+ .array(zod_1.z.string())
668
+ .optional()
669
+ .describe("Array of label IDs to add to all emails"),
670
+ removeLabelIds: zod_1.z
671
+ .array(zod_1.z.string())
672
+ .optional()
673
+ .describe("Array of label IDs to remove from all emails"),
674
+ })
675
+ .strict();
676
+ return (0, base_tool_1.defineTool)({
677
+ name: "batchModifyEmails",
678
+ description: "Modify multiple emails at once by adding or removing labels",
679
+ parameters,
680
+ validate: (args) => {
681
+ const result = parameters.safeParse(args);
682
+ return result.success
683
+ ? {
684
+ valid: true,
685
+ value: result.data,
686
+ }
687
+ : { valid: false, errors: result.error.issues.map((i) => i.message) };
688
+ },
689
+ handler: (validatedArgs) => effect_1.Effect.gen(function* () {
690
+ const gmailService = yield* gmail_1.GmailServiceTag;
691
+ const { emailIds, addLabelIds, removeLabelIds } = validatedArgs;
692
+ const options = {};
693
+ if (addLabelIds)
694
+ options.addLabelIds = addLabelIds;
695
+ if (removeLabelIds)
696
+ options.removeLabelIds = removeLabelIds;
697
+ yield* gmailService.batchModifyEmails(emailIds, options);
698
+ return {
699
+ success: true,
700
+ result: `Successfully modified ${emailIds.length} emails`,
701
+ };
702
+ }),
703
+ });
704
+ }
705
+ // Helper function to create email preview for approval messages
706
+ function createEmailPreviewMessage(email) {
707
+ const now = new Date();
708
+ const emailDate = new Date(email.date);
709
+ const daysInInbox = Math.floor((now.getTime() - emailDate.getTime()) / (1000 * 60 * 60 * 24));
710
+ const isImportant = email.labels?.includes("IMPORTANT") || false;
711
+ const labels = email.labels?.filter((label) => !["INBOX", "UNREAD", "STARRED", "SENT", "DRAFT", "SPAM", "TRASH"].includes(label)) || [];
712
+ const labelsText = labels.length > 0 ? `\nLabels: ${labels.join(", ")}` : "";
713
+ const importantText = isImportant ? "\n⚠️ IMPORTANT" : "";
714
+ const daysText = daysInInbox === 0 ? "Today" : daysInInbox === 1 ? "1 day ago" : `${daysInInbox} days ago`;
715
+ return `📧 Email Preview:
716
+ Subject: ${email.subject}
717
+ From: ${email.from}
718
+ Date: ${daysText} (${emailDate.toLocaleDateString()})${importantText}${labelsText}
719
+ Snippet: ${email.snippet.substring(0, 100)}${email.snippet.length > 100 ? "..." : ""}`;
720
+ }
721
+ // Helper functions for formatting email data
722
+ function formatEmailsForDisplay(emails) {
723
+ return emails.map((email) => ({
724
+ id: email.id,
725
+ subject: email.subject,
726
+ from: email.from,
727
+ date: email.date,
728
+ snippet: email.snippet,
729
+ labels: email.labels,
730
+ }));
731
+ }
732
+ function formatEmailDetail(email) {
733
+ return {
734
+ id: email.id,
735
+ threadId: email.threadId,
736
+ subject: email.subject,
737
+ from: email.from,
738
+ to: email.to,
739
+ cc: email.cc,
740
+ bcc: email.bcc,
741
+ date: email.date,
742
+ body: email.body || email.snippet,
743
+ labels: email.labels,
744
+ attachments: email.attachments?.map((attachment) => ({
745
+ filename: attachment.filename,
746
+ mimeType: attachment.mimeType,
747
+ size: attachment.size,
748
+ })),
749
+ };
750
+ }
751
+ function formatLabelsForDisplay(labels) {
752
+ return labels.map((label) => ({
753
+ id: label.id,
754
+ name: label.name,
755
+ type: label.type,
756
+ messagesTotal: label.messagesTotal,
757
+ messagesUnread: label.messagesUnread,
758
+ threadsTotal: label.threadsTotal,
759
+ threadsUnread: label.threadsUnread,
760
+ color: label.color,
761
+ labelListVisibility: label.labelListVisibility,
762
+ messageListVisibility: label.messageListVisibility,
763
+ }));
764
+ }
765
+ function formatLabelForDisplay(label) {
766
+ return {
767
+ id: label.id,
768
+ name: label.name,
769
+ type: label.type,
770
+ messagesTotal: label.messagesTotal,
771
+ messagesUnread: label.messagesUnread,
772
+ threadsTotal: label.threadsTotal,
773
+ threadsUnread: label.threadsUnread,
774
+ color: label.color,
775
+ labelListVisibility: label.labelListVisibility,
776
+ messageListVisibility: label.messageListVisibility,
777
+ };
778
+ }
779
+ //# sourceMappingURL=gmail-tools.js.map