@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.
- package/dist/attachments.d.ts +29 -0
- package/dist/attachments.d.ts.map +1 -0
- package/dist/attachments.js +116 -0
- package/dist/attachments.js.map +1 -0
- package/dist/channels/email.js +1 -1
- package/dist/channels/email.js.map +1 -1
- package/dist/client.d.ts +73 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +132 -10
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/tools/email-send.d.ts +2 -1
- package/dist/tools/email-send.d.ts.map +1 -1
- package/dist/tools/email-send.js +87 -11
- package/dist/tools/email-send.js.map +1 -1
- package/dist/tools/feedback.d.ts.map +1 -1
- package/dist/tools/feedback.js +11 -5
- package/dist/tools/feedback.js.map +1 -1
- package/dist/tools/identity.d.ts.map +1 -1
- package/dist/tools/identity.js +14 -4
- package/dist/tools/identity.js.map +1 -1
- package/dist/tools/inbox.d.ts +1 -1
- package/dist/tools/inbox.d.ts.map +1 -1
- package/dist/tools/inbox.js +52 -9
- package/dist/tools/inbox.js.map +1 -1
- package/dist/tools/passwords.d.ts.map +1 -1
- package/dist/tools/passwords.js +112 -10
- package/dist/tools/passwords.js.map +1 -1
- package/dist/tools/sms-send.d.ts.map +1 -1
- package/dist/tools/sms-send.js +7 -3
- package/dist/tools/sms-send.js.map +1 -1
- package/dist/tools/vault.d.ts.map +1 -1
- package/dist/tools/vault.js +43 -13
- package/dist/tools/vault.js.map +1 -1
- package/dist/types.d.ts +20 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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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"}
|
package/dist/channels/email.js
CHANGED
|
@@ -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":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmDzC,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,EAAE,EAAE,YAAqB;QAEzB,IAAI,EAAE;YACJ,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,YAAY;YACnB,cAAc,EAAE,gCAAgC;YAChD,KAAK,EACH,+FAA+F;YACjG,OAAO,EAAE,CAAC,WAAW,CAAC;SACvB;QAED,YAAY,EAAE;YACZ,SAAS,EAAE,CAAC,QAAQ,CAAU;SAC/B;QAED,MAAM,EAAE;YACN;;;;;eAKG;YACH,cAAc,EAAE,CAAC,GAA4B,EAAY,EAAE;gBACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAER,CAAC;gBACd,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED;;;;;;;;;eASG;YACH,cAAc,EAAE,CACd,GAA4B,EAC5B,SAAiB,EACG,EAAE;gBACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAER,CAAC;gBACd,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,wBAAwB,SAAS,6CAA6C,CAAC,CAAC;gBAC/F,CAAC;gBACD,OAAO,KAAK,IAAI;oBACd,YAAY,EAAE,SAAS;oBACvB,YAAY,EAAE,EAAE;oBAChB,KAAK,EAAE,EAAE;iBACV,CAAC;YACJ,CAAC;SACF;QAED;;;;;;;;;;WAUG;QACH,gBAAgB,CACd,KAAiB,EACjB,OAA2B;YAE3B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,CAAC;YAEjF,OAAO;gBACL,QAAQ,EAAE,KAAK,CAAC,UAAU;gBAC1B,IAAI,EAAE,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO;gBACzC,QAAQ,EAAE,KAAK,CAAC,SAAS;gBACzB,QAAQ,EAAE;oBACR,UAAU,EAAE,KAAK,CAAC,WAAW;oBAC7B,QAAQ,EAAE,UAAU;oBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,eAAe,EAAE,KAAK,CAAC,iBAAiB;oBACxC,WAAW,EAAE,KAAK,CAAC,YAAY;oBAC/B,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,SAAS,EAAE,KAAK,CAAC,WAAW;oBAC5B,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC;iBACrC;aACF,CAAC;QACJ,CAAC;QAED,QAAQ,EAAE;YACR,YAAY,EAAE,QAAiB;YAE/B;;;;;;;;;;eAUG;YACH,QAAQ,EAAE,KAAK,EAAE,MAIhB,EAA4C,EAAE;gBAC7C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;gBAE/C,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;oBAClC,OAAO;wBACL,EAAE,EAAE,KAAK;wBACT,KAAK,EAAE,sEAAsE;qBAC9E,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;
|
|
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
|
|
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
|
*
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,eAAe,EACf,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAc,
|
|
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
|
-
|
|
204
|
+
const payload = {
|
|
201
205
|
to_email: to,
|
|
202
206
|
subject,
|
|
203
|
-
|
|
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
|
-
|
|
216
|
-
|
|
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
|
-
|
|
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.
|
package/dist/client.js.map
CHANGED
|
@@ -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 (
|
|
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 (
|
|
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
|
|
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"}
|