@ravi-hq/ravi 0.3.2 → 0.3.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,29 @@
1
+ /**
2
+ * Attachment validation for the Ravi OpenClaw plugin.
3
+ *
4
+ * Mirrors the backend BLOCKED_EXTENSIONS list (constants.py) and the Go CLI
5
+ * validation.go — ensures dangerous file types and oversized files are
6
+ * rejected client-side before hitting the presign endpoint.
7
+ *
8
+ * @module attachments
9
+ */
10
+ /** Maximum attachment size: 10 MB (matches backend MAX_ATTACHMENT_SIZE_BYTES). */
11
+ export declare const MAX_ATTACHMENT_SIZE_BYTES: number;
12
+ /**
13
+ * Blocked file extensions — mirrors backend constants.py.
14
+ * These are dangerous executables, installers, and disk images that should
15
+ * never be attached to emails.
16
+ */
17
+ export declare const BLOCKED_EXTENSIONS: Set<string>;
18
+ /**
19
+ * Validate an attachment file before upload.
20
+ *
21
+ * @throws {Error} If the extension is blocked or the file exceeds the size limit.
22
+ */
23
+ export declare function validateAttachment(filename: string, size: number): void;
24
+ /**
25
+ * Get MIME type for a filename based on its extension.
26
+ * Returns `application/octet-stream` for unknown extensions.
27
+ */
28
+ export declare function getMimeType(filename: string): string;
29
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,aAkB7B,CAAC;AA4DH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAUvE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpD"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Attachment validation for the Ravi OpenClaw plugin.
3
+ *
4
+ * Mirrors the backend BLOCKED_EXTENSIONS list (constants.py) and the Go CLI
5
+ * validation.go — ensures dangerous file types and oversized files are
6
+ * rejected client-side before hitting the presign endpoint.
7
+ *
8
+ * @module attachments
9
+ */
10
+ import { extname } from "node:path";
11
+ /** Maximum attachment size: 10 MB (matches backend MAX_ATTACHMENT_SIZE_BYTES). */
12
+ export const MAX_ATTACHMENT_SIZE_BYTES = 10 * 1024 * 1024;
13
+ /**
14
+ * Blocked file extensions — mirrors backend constants.py.
15
+ * These are dangerous executables, installers, and disk images that should
16
+ * never be attached to emails.
17
+ */
18
+ export const BLOCKED_EXTENSIONS = new Set([
19
+ // Windows executables and libraries
20
+ ".exe", ".dll", ".scr", ".com", ".pif", ".cpl", ".sys",
21
+ // Windows scripts
22
+ ".bat", ".cmd", ".ps1", ".vbs", ".vbe",
23
+ ".wsf", ".wsh", ".wsc", ".sct", ".shb",
24
+ // Windows installers and packages
25
+ ".msi", ".msp", ".mst", ".cab",
26
+ // Windows management and help
27
+ ".msc", ".inf", ".reg", ".rgs", ".ins", ".isp", ".chm", ".hta",
28
+ // Shortcuts and links
29
+ ".lnk", ".url", ".scf",
30
+ // Disk images and containers
31
+ ".iso", ".img", ".vhd", ".vhdx", ".dmg",
32
+ // Mobile and cross-platform executables
33
+ ".apk", ".app", ".action", ".jar",
34
+ // Access database extensions
35
+ ".ade", ".adp", ".mde",
36
+ ]);
37
+ /** Common extension-to-MIME-type mappings. Falls back to application/octet-stream. */
38
+ const MIME_TYPES = {
39
+ // Documents
40
+ ".pdf": "application/pdf",
41
+ ".doc": "application/msword",
42
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
43
+ ".xls": "application/vnd.ms-excel",
44
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
45
+ ".ppt": "application/vnd.ms-powerpoint",
46
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
47
+ ".odt": "application/vnd.oasis.opendocument.text",
48
+ ".ods": "application/vnd.oasis.opendocument.spreadsheet",
49
+ ".csv": "text/csv",
50
+ ".txt": "text/plain",
51
+ ".rtf": "application/rtf",
52
+ ".md": "text/markdown",
53
+ // Images
54
+ ".png": "image/png",
55
+ ".jpg": "image/jpeg",
56
+ ".jpeg": "image/jpeg",
57
+ ".gif": "image/gif",
58
+ ".webp": "image/webp",
59
+ ".svg": "image/svg+xml",
60
+ ".ico": "image/x-icon",
61
+ ".bmp": "image/bmp",
62
+ ".tiff": "image/tiff",
63
+ ".tif": "image/tiff",
64
+ // Audio
65
+ ".mp3": "audio/mpeg",
66
+ ".wav": "audio/wav",
67
+ ".ogg": "audio/ogg",
68
+ // Video
69
+ ".mp4": "video/mp4",
70
+ ".webm": "video/webm",
71
+ ".avi": "video/x-msvideo",
72
+ ".mov": "video/quicktime",
73
+ // Archives
74
+ ".zip": "application/zip",
75
+ ".gz": "application/gzip",
76
+ ".tar": "application/x-tar",
77
+ ".7z": "application/x-7z-compressed",
78
+ ".rar": "application/vnd.rar",
79
+ // Code
80
+ ".json": "application/json",
81
+ ".xml": "application/xml",
82
+ ".html": "text/html",
83
+ ".css": "text/css",
84
+ ".js": "text/javascript",
85
+ ".ts": "text/typescript",
86
+ ".py": "text/x-python",
87
+ ".yaml": "text/yaml",
88
+ ".yml": "text/yaml",
89
+ // Misc
90
+ ".eml": "message/rfc822",
91
+ ".ics": "text/calendar",
92
+ ".vcf": "text/vcard",
93
+ };
94
+ /**
95
+ * Validate an attachment file before upload.
96
+ *
97
+ * @throws {Error} If the extension is blocked or the file exceeds the size limit.
98
+ */
99
+ export function validateAttachment(filename, size) {
100
+ const ext = extname(filename).toLowerCase();
101
+ if (ext && BLOCKED_EXTENSIONS.has(ext)) {
102
+ throw new Error(`File extension "${ext}" is not allowed`);
103
+ }
104
+ if (size > MAX_ATTACHMENT_SIZE_BYTES) {
105
+ throw new Error(`File size ${size} bytes exceeds maximum of ${MAX_ATTACHMENT_SIZE_BYTES} bytes (10 MB)`);
106
+ }
107
+ }
108
+ /**
109
+ * Get MIME type for a filename based on its extension.
110
+ * Returns `application/octet-stream` for unknown extensions.
111
+ */
112
+ export function getMimeType(filename) {
113
+ const ext = extname(filename).toLowerCase();
114
+ return MIME_TYPES[ext] ?? "application/octet-stream";
115
+ }
116
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
@@ -110,7 +110,7 @@ export function createEmailChannel() {
110
110
  };
111
111
  }
112
112
  try {
113
- await client.replyToEmail(threadContext.lastMessageId, wrapInHtml(text));
113
+ await client.replyToEmail(threadContext.lastMessageId, wrapInHtml(text), threadContext.subject);
114
114
  return { ok: true };
115
115
  }
116
116
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/channels/email.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/channels/email.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Identity, EmailThread, EmailMessage, SmsConversation, SmsMessage, PasswordEntry, SecretEntry, EncryptionMeta } from "./types.js";
1
+ import type { Identity, EmailThread, EmailMessage, SmsConversation, SmsMessage, PasswordEntry, SecretEntry, EncryptionMeta, PresignResponse } from "./types.js";
2
2
  /** Options for constructing a {@link RaviClient}. */
3
3
  export interface RaviClientConfig {
4
4
  /** Base URL of the Ravi API (e.g. "https://api.ravi.dev"). */
@@ -105,17 +105,24 @@ export declare class RaviClient {
105
105
  * @param to - Recipient email address.
106
106
  * @param subject - Email subject line.
107
107
  * @param body - HTML body content.
108
+ * @param opts - Optional compose options (cc, bcc, attachment UUIDs).
108
109
  * @throws {Error} When the identity has no email inbox provisioned.
109
110
  */
110
- composeEmail(to: string, subject: string, body: string): Promise<EmailMessage>;
111
+ composeEmail(to: string, subject: string, body: string, opts?: {
112
+ cc?: string[];
113
+ bcc?: string[];
114
+ attachmentUuids?: string[];
115
+ }): Promise<EmailMessage>;
111
116
  /**
112
117
  * Reply to an existing email message.
113
118
  *
114
119
  * @param messageId - The numeric ID of the message to reply to.
115
120
  * @param body - HTML body content for the reply.
121
+ * @param subject - Subject line (required because the original is E2E encrypted server-side).
116
122
  * @param replyAll - When `true`, reply to all recipients (default: `false`).
123
+ * @param attachmentUuids - Optional array of attachment UUIDs from {@link uploadAttachment}.
117
124
  */
118
- replyToEmail(messageId: number, body: string, replyAll?: boolean): Promise<EmailMessage>;
125
+ replyToEmail(messageId: number, body: string, subject: string, replyAll?: boolean, attachmentUuids?: string[]): Promise<EmailMessage>;
119
126
  /**
120
127
  * Send an SMS message from the current identity's phone number.
121
128
  *
@@ -138,8 +145,33 @@ export declare class RaviClient {
138
145
  password?: string;
139
146
  notes?: string;
140
147
  }): Promise<PasswordEntry>;
148
+ /**
149
+ * Update an existing password entry.
150
+ *
151
+ * @param uuid - The UUID of the password entry to update.
152
+ * @param data - Fields to update. All are optional; only provided fields are changed.
153
+ */
154
+ updatePassword(uuid: string, data: {
155
+ domain?: string;
156
+ username?: string;
157
+ password?: string;
158
+ notes?: string;
159
+ }): Promise<PasswordEntry>;
141
160
  /** Delete a password entry by UUID. */
142
161
  deletePassword(uuid: string): Promise<void>;
162
+ /**
163
+ * Generate a random password using the backend's password generator.
164
+ *
165
+ * @param opts - Optional generation options.
166
+ */
167
+ generatePassword(opts?: {
168
+ length?: number;
169
+ uppercase?: boolean;
170
+ lowercase?: boolean;
171
+ digits?: boolean;
172
+ special?: boolean;
173
+ excludeChars?: string;
174
+ }): Promise<string>;
143
175
  /** List all vault secrets for the current identity. */
144
176
  listSecrets(): Promise<SecretEntry[]>;
145
177
  /**
@@ -156,10 +188,47 @@ export declare class RaviClient {
156
188
  *
157
189
  * @param key - The secret's key name.
158
190
  * @param value - The secret value (will be E2E encrypted by the crypto layer).
191
+ * @param notes - Optional notes (will be E2E encrypted by the crypto layer).
159
192
  */
160
- setSecret(key: string, value: string): Promise<SecretEntry>;
193
+ setSecret(key: string, value: string, notes?: string): Promise<SecretEntry>;
161
194
  /** Delete a vault secret by UUID. */
162
195
  deleteSecret(uuid: string): Promise<void>;
196
+ /**
197
+ * Request a presigned upload URL for an email attachment.
198
+ *
199
+ * Creates a pending attachment record on the server and returns a presigned
200
+ * PUT URL for direct upload to R2 storage.
201
+ *
202
+ * @param filename - Original filename (e.g. "report.pdf").
203
+ * @param contentType - MIME type (e.g. "application/pdf").
204
+ * @param size - File size in bytes.
205
+ */
206
+ presignAttachment(filename: string, contentType: string, size: number): Promise<PresignResponse>;
207
+ /**
208
+ * Upload raw file data to a presigned R2 URL.
209
+ *
210
+ * The presigned URL has auth baked in, so no Authorization header is needed.
211
+ * Uses a plain PUT with the raw binary body.
212
+ */
213
+ uploadToPresignedUrl(uploadUrl: string, data: Buffer, contentType: string): Promise<void>;
214
+ /**
215
+ * High-level attachment upload: validate, presign, read file, upload.
216
+ *
217
+ * @param filePath - Absolute path to the file on disk.
218
+ * @returns The attachment UUID to include in compose/reply requests.
219
+ */
220
+ uploadAttachment(filePath: string): Promise<string>;
221
+ /**
222
+ * Download an email attachment from its presigned download URL.
223
+ *
224
+ * The download URL is a time-limited presigned GET URL from R2 storage,
225
+ * returned in the `download_url` field of each attachment on an EmailMessage.
226
+ * No Authorization header is needed — the URL has auth baked in.
227
+ *
228
+ * @param downloadUrl - The presigned download URL from the attachment object.
229
+ * @returns The raw file content as a Buffer.
230
+ */
231
+ downloadAttachment(downloadUrl: string): Promise<Buffer>;
163
232
  /**
164
233
  * Get the encryption metadata for the current identity.
165
234
  *
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -1,3 +1,6 @@
1
+ import { validateAttachment, getMimeType } from "./attachments.js";
2
+ import { readFile, stat } from "node:fs/promises";
3
+ import { basename } from "node:path";
1
4
  // ─── Error Type ──────────────────────────────────────────────────────────────
2
5
  /**
3
6
  * Error thrown when the Ravi API returns a non-OK response.
@@ -190,31 +193,42 @@ export class RaviClient {
190
193
  * @param to - Recipient email address.
191
194
  * @param subject - Email subject line.
192
195
  * @param body - HTML body content.
196
+ * @param opts - Optional compose options (cc, bcc, attachment UUIDs).
193
197
  * @throws {Error} When the identity has no email inbox provisioned.
194
198
  */
195
- async composeEmail(to, subject, body) {
199
+ async composeEmail(to, subject, body, opts) {
196
200
  const inboxes = await this.request("GET", "/api/email/");
197
201
  const inboxId = inboxes[0]?.id;
198
202
  if (!inboxId)
199
203
  throw new Error("No email inbox found for this identity");
200
- return this.request("POST", `/api/email-messages/compose/?inbox=${inboxId}`, {
204
+ const payload = {
201
205
  to_email: to,
202
206
  subject,
203
- html_content: body,
204
- });
207
+ content: body,
208
+ };
209
+ if (opts?.cc)
210
+ payload.cc = opts.cc;
211
+ if (opts?.bcc)
212
+ payload.bcc = opts.bcc;
213
+ if (opts?.attachmentUuids?.length)
214
+ payload.attachment_uuids = opts.attachmentUuids;
215
+ return this.request("POST", `/api/email-messages/compose/?inbox=${inboxId}`, payload);
205
216
  }
206
217
  /**
207
218
  * Reply to an existing email message.
208
219
  *
209
220
  * @param messageId - The numeric ID of the message to reply to.
210
221
  * @param body - HTML body content for the reply.
222
+ * @param subject - Subject line (required because the original is E2E encrypted server-side).
211
223
  * @param replyAll - When `true`, reply to all recipients (default: `false`).
224
+ * @param attachmentUuids - Optional array of attachment UUIDs from {@link uploadAttachment}.
212
225
  */
213
- async replyToEmail(messageId, body, replyAll = false) {
226
+ async replyToEmail(messageId, body, subject, replyAll = false, attachmentUuids) {
214
227
  const action = replyAll ? "reply-all" : "reply";
215
- return this.request("POST", `/api/email-messages/${messageId}/${action}/`, {
216
- html_content: body,
217
- });
228
+ const payload = { content: body, subject };
229
+ if (attachmentUuids?.length)
230
+ payload.attachment_uuids = attachmentUuids;
231
+ return this.request("POST", `/api/email-messages/${messageId}/${action}/`, payload);
218
232
  }
219
233
  // ── SMS Send ─────────────────────────────────────────────────────────────
220
234
  /**
@@ -243,10 +257,43 @@ export class RaviClient {
243
257
  async createPassword(data) {
244
258
  return this.request("POST", "/api/passwords/", data);
245
259
  }
260
+ /**
261
+ * Update an existing password entry.
262
+ *
263
+ * @param uuid - The UUID of the password entry to update.
264
+ * @param data - Fields to update. All are optional; only provided fields are changed.
265
+ */
266
+ async updatePassword(uuid, data) {
267
+ return this.request("PATCH", `/api/passwords/${uuid}/`, data);
268
+ }
246
269
  /** Delete a password entry by UUID. */
247
270
  async deletePassword(uuid) {
248
271
  return this.request("DELETE", `/api/passwords/${uuid}/`);
249
272
  }
273
+ /**
274
+ * Generate a random password using the backend's password generator.
275
+ *
276
+ * @param opts - Optional generation options.
277
+ */
278
+ async generatePassword(opts) {
279
+ const params = new URLSearchParams();
280
+ if (opts?.length !== undefined)
281
+ params.set("length", String(opts.length));
282
+ if (opts?.uppercase !== undefined)
283
+ params.set("uppercase", String(opts.uppercase));
284
+ if (opts?.lowercase !== undefined)
285
+ params.set("lowercase", String(opts.lowercase));
286
+ if (opts?.digits !== undefined)
287
+ params.set("digits", String(opts.digits));
288
+ if (opts?.special !== undefined)
289
+ params.set("special", String(opts.special));
290
+ if (opts?.excludeChars)
291
+ params.set("exclude_chars", opts.excludeChars);
292
+ const query = params.toString();
293
+ const path = `/api/passwords/generate-password/${query ? `?${query}` : ""}`;
294
+ const result = await this.request("GET", path);
295
+ return result.password;
296
+ }
250
297
  // ── Vault Secrets ────────────────────────────────────────────────────────
251
298
  /** List all vault secrets for the current identity. */
252
299
  async listSecrets() {
@@ -272,14 +319,89 @@ export class RaviClient {
272
319
  *
273
320
  * @param key - The secret's key name.
274
321
  * @param value - The secret value (will be E2E encrypted by the crypto layer).
322
+ * @param notes - Optional notes (will be E2E encrypted by the crypto layer).
275
323
  */
276
- async setSecret(key, value) {
277
- return this.request("POST", "/api/vault/", { key, value });
324
+ async setSecret(key, value, notes) {
325
+ const payload = { key, value };
326
+ if (notes !== undefined)
327
+ payload.notes = notes;
328
+ return this.request("POST", "/api/vault/", payload);
278
329
  }
279
330
  /** Delete a vault secret by UUID. */
280
331
  async deleteSecret(uuid) {
281
332
  return this.request("DELETE", `/api/vault/${uuid}/`);
282
333
  }
334
+ // ── Attachments ─────────────────────────────────────────────────────────
335
+ /**
336
+ * Request a presigned upload URL for an email attachment.
337
+ *
338
+ * Creates a pending attachment record on the server and returns a presigned
339
+ * PUT URL for direct upload to R2 storage.
340
+ *
341
+ * @param filename - Original filename (e.g. "report.pdf").
342
+ * @param contentType - MIME type (e.g. "application/pdf").
343
+ * @param size - File size in bytes.
344
+ */
345
+ async presignAttachment(filename, contentType, size) {
346
+ return this.request("POST", "/api/email-attachments/presign/", {
347
+ filename,
348
+ content_type: contentType,
349
+ size,
350
+ });
351
+ }
352
+ /**
353
+ * Upload raw file data to a presigned R2 URL.
354
+ *
355
+ * The presigned URL has auth baked in, so no Authorization header is needed.
356
+ * Uses a plain PUT with the raw binary body.
357
+ */
358
+ async uploadToPresignedUrl(uploadUrl, data, contentType) {
359
+ const response = await fetch(uploadUrl, {
360
+ method: "PUT",
361
+ headers: { "Content-Type": contentType },
362
+ body: data,
363
+ });
364
+ if (!response.ok) {
365
+ const detail = await response.text().catch(() => "(unable to read response body)");
366
+ throw new Error(`Upload to presigned URL failed (${response.status}): ${detail.slice(0, 200)}`);
367
+ }
368
+ }
369
+ /**
370
+ * High-level attachment upload: validate, presign, read file, upload.
371
+ *
372
+ * @param filePath - Absolute path to the file on disk.
373
+ * @returns The attachment UUID to include in compose/reply requests.
374
+ */
375
+ async uploadAttachment(filePath) {
376
+ const fileInfo = await stat(filePath);
377
+ const filename = basename(filePath);
378
+ validateAttachment(filename, fileInfo.size);
379
+ const contentType = getMimeType(filename);
380
+ const presign = await this.presignAttachment(filename, contentType, fileInfo.size);
381
+ const data = await readFile(filePath);
382
+ await this.uploadToPresignedUrl(presign.upload_url, data, contentType);
383
+ return presign.uuid;
384
+ }
385
+ // ── Attachment Download ─────────────────────────────────────────────
386
+ /**
387
+ * Download an email attachment from its presigned download URL.
388
+ *
389
+ * The download URL is a time-limited presigned GET URL from R2 storage,
390
+ * returned in the `download_url` field of each attachment on an EmailMessage.
391
+ * No Authorization header is needed — the URL has auth baked in.
392
+ *
393
+ * @param downloadUrl - The presigned download URL from the attachment object.
394
+ * @returns The raw file content as a Buffer.
395
+ */
396
+ async downloadAttachment(downloadUrl) {
397
+ const response = await fetch(downloadUrl);
398
+ if (!response.ok) {
399
+ const detail = await response.text().catch(() => "(unable to read response body)");
400
+ throw new Error(`Attachment download failed (${response.status}): ${detail.slice(0, 200)}`);
401
+ }
402
+ const arrayBuffer = await response.arrayBuffer();
403
+ return Buffer.from(arrayBuffer);
404
+ }
283
405
  // ── Encryption ───────────────────────────────────────────────────────────
284
406
  /**
285
407
  * Get the encryption metadata for the current identity.
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -21,7 +21,7 @@ export type { CliCommand } from "./cli.js";
21
21
  * All agent tools combined into a single flat array.
22
22
  *
23
23
  * Contains identity, inbox, email-send, sms-send, password, vault, and
24
- * feedback tools (19 total). Exported for programmatic access by consumers
24
+ * feedback tools (21 total). Exported for programmatic access by consumers
25
25
  * who need the tool definitions without going through the plugin registration API.
26
26
  */
27
27
  export declare const allTools: import("./index.js").ToolDefinition[];
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ import { cliCommands } from "./cli.js";
29
29
  * All agent tools combined into a single flat array.
30
30
  *
31
31
  * Contains identity, inbox, email-send, sms-send, password, vault, and
32
- * feedback tools (19 total). Exported for programmatic access by consumers
32
+ * feedback tools (21 total). Exported for programmatic access by consumers
33
33
  * who need the tool definitions without going through the plugin registration API.
34
34
  */
35
35
  export const allTools = [
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Provides tools to compose new emails and reply to existing messages from
5
5
  * the identity's Ravi email address. Plain text bodies are automatically
6
- * wrapped in HTML before sending.
6
+ * wrapped in HTML before sending. File attachments are uploaded via
7
+ * presigned URLs before being linked to the outgoing email.
7
8
  *
8
9
  * @module tools/email-send
9
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"email-send.d.ts","sourceRoot":"","sources":["../../src/tools/email-send.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,eAAe,CAAC;AAGjE,oDAAoD;AACpD,eAAO,MAAM,cAAc,EAAE,cAAc,EA0D1C,CAAC"}
1
+ {"version":3,"file":"email-send.d.ts","sourceRoot":"","sources":["../../src/tools/email-send.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,eAAe,CAAC;AAgBjE,oDAAoD;AACpD,eAAO,MAAM,cAAc,EAAE,cAAc,EAgI1C,CAAC"}