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.
- package/LICENSE +21 -0
- package/README.md +182 -0
- package/dist/cli/commands/auth.d.ts +18 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +128 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/chat-agent.d.ts +18 -0
- package/dist/cli/commands/chat-agent.d.ts.map +1 -0
- package/dist/cli/commands/chat-agent.js +421 -0
- package/dist/cli/commands/chat-agent.js.map +1 -0
- package/dist/cli/commands/edit-agent.d.ts +10 -0
- package/dist/cli/commands/edit-agent.d.ts.map +1 -0
- package/dist/cli/commands/edit-agent.js +310 -0
- package/dist/cli/commands/edit-agent.js.map +1 -0
- package/dist/cli/commands/task-agent.d.ts +126 -0
- package/dist/cli/commands/task-agent.d.ts.map +1 -0
- package/dist/cli/commands/task-agent.js +345 -0
- package/dist/cli/commands/task-agent.js.map +1 -0
- package/dist/core/agent/agent-prompt.d.ts +47 -0
- package/dist/core/agent/agent-prompt.d.ts.map +1 -0
- package/dist/core/agent/agent-prompt.js +146 -0
- package/dist/core/agent/agent-prompt.js.map +1 -0
- package/dist/core/agent/agent-runner.d.ts +63 -0
- package/dist/core/agent/agent-runner.d.ts.map +1 -0
- package/dist/core/agent/agent-runner.js +346 -0
- package/dist/core/agent/agent-runner.js.map +1 -0
- package/dist/core/agent/agent-service.d.ts +164 -0
- package/dist/core/agent/agent-service.d.ts.map +1 -0
- package/dist/core/agent/agent-service.js +463 -0
- package/dist/core/agent/agent-service.js.map +1 -0
- package/dist/core/agent/gmail-agent.d.ts +17 -0
- package/dist/core/agent/gmail-agent.d.ts.map +1 -0
- package/dist/core/agent/gmail-agent.js +191 -0
- package/dist/core/agent/gmail-agent.js.map +1 -0
- package/dist/core/agent/prompts/default/v1.d.ts +2 -0
- package/dist/core/agent/prompts/default/v1.d.ts.map +1 -0
- package/dist/core/agent/prompts/default/v1.js +202 -0
- package/dist/core/agent/prompts/default/v1.js.map +1 -0
- package/dist/core/agent/prompts/default/v2.d.ts +2 -0
- package/dist/core/agent/prompts/default/v2.d.ts.map +1 -0
- package/dist/core/agent/prompts/default/v2.js +72 -0
- package/dist/core/agent/prompts/default/v2.js.map +1 -0
- package/dist/core/agent/prompts/gmail/v1.d.ts +2 -0
- package/dist/core/agent/prompts/gmail/v1.d.ts.map +1 -0
- package/dist/core/agent/prompts/gmail/v1.js +206 -0
- package/dist/core/agent/prompts/gmail/v1.js.map +1 -0
- package/dist/core/agent/prompts/gmail/v2.d.ts +2 -0
- package/dist/core/agent/prompts/gmail/v2.d.ts.map +1 -0
- package/dist/core/agent/prompts/gmail/v2.js +59 -0
- package/dist/core/agent/prompts/gmail/v2.js.map +1 -0
- package/dist/core/agent/tools/base-tool.d.ts +161 -0
- package/dist/core/agent/tools/base-tool.d.ts.map +1 -0
- package/dist/core/agent/tools/base-tool.js +153 -0
- package/dist/core/agent/tools/base-tool.js.map +1 -0
- package/dist/core/agent/tools/fs-tools.d.ts +21 -0
- package/dist/core/agent/tools/fs-tools.d.ts.map +1 -0
- package/dist/core/agent/tools/fs-tools.js +1210 -0
- package/dist/core/agent/tools/fs-tools.js.map +1 -0
- package/dist/core/agent/tools/git-tools.d.ts +63 -0
- package/dist/core/agent/tools/git-tools.d.ts.map +1 -0
- package/dist/core/agent/tools/git-tools.js +600 -0
- package/dist/core/agent/tools/git-tools.js.map +1 -0
- package/dist/core/agent/tools/gmail-tools.d.ts +22 -0
- package/dist/core/agent/tools/gmail-tools.d.ts.map +1 -0
- package/dist/core/agent/tools/gmail-tools.js +779 -0
- package/dist/core/agent/tools/gmail-tools.js.map +1 -0
- package/dist/core/agent/tools/register-tools.d.ts +13 -0
- package/dist/core/agent/tools/register-tools.d.ts.map +1 -0
- package/dist/core/agent/tools/register-tools.js +169 -0
- package/dist/core/agent/tools/register-tools.js.map +1 -0
- package/dist/core/agent/tools/shell-tools.d.ts +19 -0
- package/dist/core/agent/tools/shell-tools.d.ts.map +1 -0
- package/dist/core/agent/tools/shell-tools.js +367 -0
- package/dist/core/agent/tools/shell-tools.js.map +1 -0
- package/dist/core/agent/tools/tool-registry.d.ts +62 -0
- package/dist/core/agent/tools/tool-registry.d.ts.map +1 -0
- package/dist/core/agent/tools/tool-registry.js +187 -0
- package/dist/core/agent/tools/tool-registry.js.map +1 -0
- package/dist/core/agent/tools/web-search-tools.d.ts +39 -0
- package/dist/core/agent/tools/web-search-tools.d.ts.map +1 -0
- package/dist/core/agent/tools/web-search-tools.js +220 -0
- package/dist/core/agent/tools/web-search-tools.js.map +1 -0
- package/dist/core/types/errors.d.ts +300 -0
- package/dist/core/types/errors.d.ts.map +1 -0
- package/dist/core/types/errors.js +115 -0
- package/dist/core/types/errors.js.map +1 -0
- package/dist/core/types/index.d.ts +208 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +30 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/utils/error-handler.d.ts +114 -0
- package/dist/core/utils/error-handler.d.ts.map +1 -0
- package/dist/core/utils/error-handler.js +551 -0
- package/dist/core/utils/error-handler.js.map +1 -0
- package/dist/core/utils/markdown-renderer.d.ts +52 -0
- package/dist/core/utils/markdown-renderer.d.ts.map +1 -0
- package/dist/core/utils/markdown-renderer.js +134 -0
- package/dist/core/utils/markdown-renderer.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +255 -0
- package/dist/main.js.map +1 -0
- package/dist/services/config.d.ts +29 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +204 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/gmail.d.ts +197 -0
- package/dist/services/gmail.d.ts.map +1 -0
- package/dist/services/gmail.js +592 -0
- package/dist/services/gmail.js.map +1 -0
- package/dist/services/llm/ai-sdk-service.d.ts +5 -0
- package/dist/services/llm/ai-sdk-service.d.ts.map +1 -0
- package/dist/services/llm/ai-sdk-service.js +326 -0
- package/dist/services/llm/ai-sdk-service.js.map +1 -0
- package/dist/services/llm/context-manager.d.ts +51 -0
- package/dist/services/llm/context-manager.d.ts.map +1 -0
- package/dist/services/llm/context-manager.js +269 -0
- package/dist/services/llm/context-manager.js.map +1 -0
- package/dist/services/llm/types.d.ts +114 -0
- package/dist/services/llm/types.d.ts.map +1 -0
- package/dist/services/llm/types.js +51 -0
- package/dist/services/llm/types.js.map +1 -0
- package/dist/services/logger.d.ts +28 -0
- package/dist/services/logger.d.ts.map +1 -0
- package/dist/services/logger.js +267 -0
- package/dist/services/logger.js.map +1 -0
- package/dist/services/shell.d.ts +37 -0
- package/dist/services/shell.d.ts.map +1 -0
- package/dist/services/shell.js +197 -0
- package/dist/services/shell.js.map +1 -0
- package/dist/services/storage/file.d.ts +37 -0
- package/dist/services/storage/file.d.ts.map +1 -0
- package/dist/services/storage/file.js +221 -0
- package/dist/services/storage/file.js.map +1 -0
- package/dist/services/storage/inMemory.d.ts +25 -0
- package/dist/services/storage/inMemory.d.ts.map +1 -0
- package/dist/services/storage/inMemory.js +106 -0
- package/dist/services/storage/inMemory.js.map +1 -0
- package/dist/services/storage/service.d.ts +26 -0
- package/dist/services/storage/service.d.ts.map +1 -0
- package/dist/services/storage/service.js +48 -0
- package/dist/services/storage/service.js.map +1 -0
- 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
|