replylayer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/api-client.d.ts +54 -0
  2. package/dist/api-client.d.ts.map +1 -0
  3. package/dist/api-client.js +185 -0
  4. package/dist/api-client.js.map +1 -0
  5. package/dist/auth.d.ts +33 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +85 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/bin/replylayer.d.ts +3 -0
  10. package/dist/bin/replylayer.d.ts.map +1 -0
  11. package/dist/bin/replylayer.js +4 -0
  12. package/dist/bin/replylayer.js.map +1 -0
  13. package/dist/commands/account.d.ts +3 -0
  14. package/dist/commands/account.d.ts.map +1 -0
  15. package/dist/commands/account.js +47 -0
  16. package/dist/commands/account.js.map +1 -0
  17. package/dist/commands/api-key.d.ts +3 -0
  18. package/dist/commands/api-key.d.ts.map +1 -0
  19. package/dist/commands/api-key.js +75 -0
  20. package/dist/commands/api-key.js.map +1 -0
  21. package/dist/commands/auth.d.ts +3 -0
  22. package/dist/commands/auth.d.ts.map +1 -0
  23. package/dist/commands/auth.js +115 -0
  24. package/dist/commands/auth.js.map +1 -0
  25. package/dist/commands/inbox.d.ts +3 -0
  26. package/dist/commands/inbox.d.ts.map +1 -0
  27. package/dist/commands/inbox.js +95 -0
  28. package/dist/commands/inbox.js.map +1 -0
  29. package/dist/commands/mailbox.d.ts +3 -0
  30. package/dist/commands/mailbox.d.ts.map +1 -0
  31. package/dist/commands/mailbox.js +113 -0
  32. package/dist/commands/mailbox.js.map +1 -0
  33. package/dist/commands/recipients.d.ts +3 -0
  34. package/dist/commands/recipients.d.ts.map +1 -0
  35. package/dist/commands/recipients.js +50 -0
  36. package/dist/commands/recipients.js.map +1 -0
  37. package/dist/commands/reply.d.ts +3 -0
  38. package/dist/commands/reply.d.ts.map +1 -0
  39. package/dist/commands/reply.js +23 -0
  40. package/dist/commands/reply.js.map +1 -0
  41. package/dist/commands/send.d.ts +3 -0
  42. package/dist/commands/send.d.ts.map +1 -0
  43. package/dist/commands/send.js +28 -0
  44. package/dist/commands/send.js.map +1 -0
  45. package/dist/commands/signup.d.ts +3 -0
  46. package/dist/commands/signup.d.ts.map +1 -0
  47. package/dist/commands/signup.js +50 -0
  48. package/dist/commands/signup.js.map +1 -0
  49. package/dist/format.d.ts +26 -0
  50. package/dist/format.d.ts.map +1 -0
  51. package/dist/format.js +153 -0
  52. package/dist/format.js.map +1 -0
  53. package/dist/index.d.ts +7 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +77 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/resolve.d.ts +14 -0
  58. package/dist/resolve.d.ts.map +1 -0
  59. package/dist/resolve.js +36 -0
  60. package/dist/resolve.js.map +1 -0
  61. package/dist/types.d.ts +48 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +15 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +41 -0
package/dist/format.js ADDED
@@ -0,0 +1,153 @@
1
+ const isTTY = process.stdout.isTTY;
2
+ // ANSI color helpers — only emit codes when stdout is a TTY
3
+ const color = {
4
+ bold: (s) => (isTTY ? `\x1b[1m${s}\x1b[0m` : s),
5
+ dim: (s) => (isTTY ? `\x1b[2m${s}\x1b[0m` : s),
6
+ green: (s) => (isTTY ? `\x1b[32m${s}\x1b[0m` : s),
7
+ yellow: (s) => (isTTY ? `\x1b[33m${s}\x1b[0m` : s),
8
+ red: (s) => (isTTY ? `\x1b[31m${s}\x1b[0m` : s),
9
+ cyan: (s) => (isTTY ? `\x1b[36m${s}\x1b[0m` : s),
10
+ };
11
+ /**
12
+ * Format a table with aligned columns.
13
+ */
14
+ export function formatTable(headers, rows) {
15
+ if (rows.length === 0) {
16
+ return '(no results)';
17
+ }
18
+ // Calculate column widths
19
+ const widths = headers.map((h, i) => {
20
+ const maxRow = rows.reduce((max, row) => Math.max(max, (row[i] || '').length), 0);
21
+ return Math.max(h.length, maxRow);
22
+ });
23
+ // Build header line
24
+ const headerLine = headers
25
+ .map((h, i) => h.padEnd(widths[i]))
26
+ .join(' ');
27
+ // Build separator
28
+ const separator = widths.map((w) => '-'.repeat(w)).join(' ');
29
+ // Build rows
30
+ const dataLines = rows.map((row) => row.map((cell, i) => (cell || '').padEnd(widths[i])).join(' '));
31
+ return [color.bold(headerLine), separator, ...dataLines].join('\n');
32
+ }
33
+ /**
34
+ * Format a message for `inbox read` display.
35
+ */
36
+ export function formatMessage(msg) {
37
+ const lines = [];
38
+ lines.push(`${color.bold('From:')} ${msg.sender}`);
39
+ lines.push(`${color.bold('To:')} ${msg.recipient}`);
40
+ lines.push(`${color.bold('Subject:')} ${msg.subject}`);
41
+ lines.push(`${color.bold('Date:')} ${formatDate(msg.created_at)}`);
42
+ lines.push(`${color.bold('State:')} ${formatState(msg.state)}`);
43
+ if (msg.thread_id) {
44
+ lines.push(`${color.bold('Thread:')} ${msg.thread_id}`);
45
+ }
46
+ if (msg.in_reply_to) {
47
+ lines.push(`${color.bold('Reply to:')} ${msg.in_reply_to}`);
48
+ }
49
+ lines.push('');
50
+ lines.push(msg.body_sanitized || color.dim('(no body)'));
51
+ // Attachments
52
+ if (msg.attachments && msg.attachments.length > 0) {
53
+ lines.push('');
54
+ lines.push(color.bold('Attachments:'));
55
+ for (const att of msg.attachments) {
56
+ const sizeStr = formatSize(att.size);
57
+ const action = att.policy_action === 'deliver'
58
+ ? color.green(att.policy_action)
59
+ : att.policy_action === 'quarantine'
60
+ ? color.yellow(att.policy_action)
61
+ : att.policy_action === 'block'
62
+ ? color.red(att.policy_action)
63
+ : att.policy_action;
64
+ lines.push(` ${att.filename} (${att.content_type}, ${sizeStr}) [${action}]`);
65
+ }
66
+ }
67
+ // Scan results
68
+ if (msg.scan_results && msg.scan_results.length > 0) {
69
+ lines.push('');
70
+ lines.push(color.bold('Scan Results:'));
71
+ for (const scan of msg.scan_results) {
72
+ const decision = scan.decision === 'allow'
73
+ ? color.green(scan.decision)
74
+ : scan.decision === 'block'
75
+ ? color.red(scan.decision)
76
+ : color.yellow(scan.decision);
77
+ lines.push(` ${scan.scanner}: ${decision} (${Math.round(scan.confidence * 100)}%) - ${scan.reason}`);
78
+ }
79
+ }
80
+ return lines.join('\n');
81
+ }
82
+ /**
83
+ * Format a message summary for inbox list rows.
84
+ */
85
+ export function formatMessageRow(msg) {
86
+ const unreadMarker = msg.read_at ? ' ' : '*';
87
+ return [
88
+ unreadMarker + msg.id.substring(0, 8),
89
+ msg.sender,
90
+ msg.subject.substring(0, 50),
91
+ formatDate(msg.created_at),
92
+ formatState(msg.state),
93
+ ];
94
+ }
95
+ function formatState(state) {
96
+ switch (state) {
97
+ case 'available':
98
+ return color.green(state);
99
+ case 'quarantined':
100
+ return color.yellow(state);
101
+ case 'blocked':
102
+ return color.red(state);
103
+ case 'delivered':
104
+ return color.green(state);
105
+ case 'bounced':
106
+ return color.red(state);
107
+ default:
108
+ return state;
109
+ }
110
+ }
111
+ function formatDate(iso) {
112
+ try {
113
+ const d = new Date(iso);
114
+ return d.toISOString().replace('T', ' ').replace(/\.\d+Z$/, 'Z');
115
+ }
116
+ catch {
117
+ return iso;
118
+ }
119
+ }
120
+ function formatSize(bytes) {
121
+ if (bytes < 1024)
122
+ return `${bytes}B`;
123
+ if (bytes < 1024 * 1024)
124
+ return `${(bytes / 1024).toFixed(1)}KB`;
125
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
126
+ }
127
+ /**
128
+ * Output helper: prints JSON if --json flag is set, otherwise the formatted string.
129
+ */
130
+ export function output(data, formatted, json) {
131
+ if (json) {
132
+ console.log(JSON.stringify(data, null, 2));
133
+ }
134
+ else {
135
+ console.log(formatted);
136
+ }
137
+ }
138
+ /**
139
+ * Print a status message about a send/reply result.
140
+ */
141
+ export function formatSendResult(result) {
142
+ switch (result.status) {
143
+ case 'sent':
144
+ return color.green(`Sent: ${result.message_id}`);
145
+ case 'quarantined':
146
+ return color.yellow(`Quarantined: ${result.message_id}${result.warning ? ` — ${result.warning}` : ''}`);
147
+ case 'blocked':
148
+ return color.red(`Blocked: ${result.message_id}${result.warning ? ` — ${result.warning}` : ''}`);
149
+ default:
150
+ return `${result.status}: ${result.message_id}`;
151
+ }
152
+ }
153
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProgram(): Command;
3
+ export declare function run(argv?: string[]): Promise<void>;
4
+ export { ApiClient } from './api-client.js';
5
+ export { ApiError } from './types.js';
6
+ export type { ApiClientOptions } from './api-client.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,aAAa,IAAI,OAAO,CA8BvC;AAED,wBAAsB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDxD;AAGD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,77 @@
1
+ import { Command } from 'commander';
2
+ import { signupCommand } from './commands/signup.js';
3
+ import { authCommand } from './commands/auth.js';
4
+ import { mailboxCommand } from './commands/mailbox.js';
5
+ import { sendCommand } from './commands/send.js';
6
+ import { inboxCommand } from './commands/inbox.js';
7
+ import { replyCommand } from './commands/reply.js';
8
+ import { recipientsCommand } from './commands/recipients.js';
9
+ import { accountCommand } from './commands/account.js';
10
+ import { apiKeyCommand } from './commands/api-key.js';
11
+ import { ApiError } from './types.js';
12
+ export function createProgram() {
13
+ const program = new Command();
14
+ program
15
+ .name('replylayer')
16
+ .description('ReplyLayer CLI — email for AI agents')
17
+ .version('0.0.1')
18
+ .option('--api-url <url>', 'API base URL (env: REPLYLAYER_API_URL)', process.env.REPLYLAYER_API_URL || 'https://api.replylayer.ai')
19
+ .option('--api-key <key>', 'API key (overrides stored credential)')
20
+ .option('--json', 'Output JSON instead of formatted text', false);
21
+ // Register commands
22
+ program.addCommand(signupCommand());
23
+ program.addCommand(authCommand());
24
+ program.addCommand(mailboxCommand());
25
+ program.addCommand(sendCommand());
26
+ program.addCommand(inboxCommand());
27
+ program.addCommand(replyCommand());
28
+ program.addCommand(recipientsCommand());
29
+ program.addCommand(accountCommand());
30
+ program.addCommand(apiKeyCommand());
31
+ // Global error handler
32
+ program.exitOverride();
33
+ return program;
34
+ }
35
+ export async function run(argv) {
36
+ const program = createProgram();
37
+ try {
38
+ await program.parseAsync(argv || process.argv);
39
+ }
40
+ catch (err) {
41
+ if (err instanceof ApiError) {
42
+ const isJson = process.argv.includes('--json') ||
43
+ (argv && argv.includes('--json'));
44
+ if (isJson) {
45
+ console.error(JSON.stringify({
46
+ error: err.message,
47
+ code: err.code,
48
+ details: err.details,
49
+ }, null, 2));
50
+ }
51
+ else {
52
+ console.error(`Error: ${err.message}`);
53
+ if (err.code) {
54
+ console.error(`Code: ${err.code}`);
55
+ }
56
+ if (err.details && Object.keys(err.details).length > 0) {
57
+ console.error(`Details: ${JSON.stringify(err.details)}`);
58
+ }
59
+ }
60
+ process.exit(1);
61
+ }
62
+ // Commander errors (help, version, missing required option, etc.)
63
+ if (err &&
64
+ typeof err === 'object' &&
65
+ 'exitCode' in err) {
66
+ const exitCode = err.exitCode;
67
+ process.exit(exitCode);
68
+ }
69
+ // Unknown errors
70
+ console.error(`Unexpected error: ${err instanceof Error ? err.message : String(err)}`);
71
+ process.exit(1);
72
+ }
73
+ }
74
+ // Re-exports for programmatic use
75
+ export { ApiClient } from './api-client.js';
76
+ export { ApiError } from './types.js';
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ApiClient } from './api-client.js';
2
+ /**
3
+ * Resolve a mailbox name or ID to a UUID.
4
+ * If the input looks like a UUID, return it directly.
5
+ * Otherwise, list mailboxes and find by name.
6
+ */
7
+ export declare function resolveMailboxId(client: ApiClient, nameOrId: string): Promise<string>;
8
+ /**
9
+ * Resolve a recipient email or ID to a UUID.
10
+ * If the input looks like a UUID, return it directly.
11
+ * Otherwise, list recipients and find by email.
12
+ */
13
+ export declare function resolveRecipientId(client: ApiClient, emailOrId: string): Promise<string>;
14
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAKjD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
@@ -0,0 +1,36 @@
1
+ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
2
+ /**
3
+ * Resolve a mailbox name or ID to a UUID.
4
+ * If the input looks like a UUID, return it directly.
5
+ * Otherwise, list mailboxes and find by name.
6
+ */
7
+ export async function resolveMailboxId(client, nameOrId) {
8
+ if (UUID_REGEX.test(nameOrId)) {
9
+ return nameOrId;
10
+ }
11
+ const { mailboxes } = await client.listMailboxes();
12
+ const match = mailboxes.find((m) => m.name.toLowerCase() === nameOrId.toLowerCase());
13
+ if (!match) {
14
+ console.error(`Mailbox '${nameOrId}' not found. Run \`replylayer mailbox list\` to see available mailboxes.`);
15
+ process.exit(1);
16
+ }
17
+ return match.id;
18
+ }
19
+ /**
20
+ * Resolve a recipient email or ID to a UUID.
21
+ * If the input looks like a UUID, return it directly.
22
+ * Otherwise, list recipients and find by email.
23
+ */
24
+ export async function resolveRecipientId(client, emailOrId) {
25
+ if (UUID_REGEX.test(emailOrId)) {
26
+ return emailOrId;
27
+ }
28
+ const { recipients } = await client.listRecipients();
29
+ const match = recipients.find((r) => r.email.toLowerCase() === emailOrId.toLowerCase());
30
+ if (!match) {
31
+ console.error(`Recipient '${emailOrId}' not found. Run \`replylayer recipients list\` to see verified recipients.`);
32
+ process.exit(1);
33
+ }
34
+ return match.id;
35
+ }
36
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GACd,iEAAiE,CAAC;AAEpE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAiB,EACjB,QAAgB;IAEhB,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CACvD,CAAC;IAEF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,YAAY,QAAQ,0EAA0E,CAC/F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAiB,EACjB,SAAiB;IAEjB,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CACzD,CAAC;IAEF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,cAAc,SAAS,6EAA6E,CACrG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,48 @@
1
+ export interface AddRecipientResponse {
2
+ id: string;
3
+ email: string;
4
+ created_at: string;
5
+ }
6
+ export interface DeleteMailboxResponse {
7
+ status: string;
8
+ }
9
+ export interface ScannerPolicy {
10
+ language_mode?: 'english_only' | 'allow_all_languages' | 'disabled';
11
+ disabled_scanners?: string[];
12
+ disabled_proxy_criteria?: string[];
13
+ }
14
+ export interface UpdateMailboxResponse {
15
+ id: string;
16
+ name: string;
17
+ address: string;
18
+ scanner_policy: ScannerPolicy | null;
19
+ }
20
+ export interface CreateApiKeyResponse {
21
+ id: string;
22
+ api_key: string;
23
+ role: 'admin' | 'agent';
24
+ label: string | null;
25
+ mailbox_ids: string[];
26
+ }
27
+ export interface ListApiKeysResponse {
28
+ keys: Array<{
29
+ id: string;
30
+ prefix: string;
31
+ status: string;
32
+ role: string | null;
33
+ label: string | null;
34
+ mailbox_ids: string[];
35
+ created_at: string;
36
+ last_used_at: string | null;
37
+ }>;
38
+ }
39
+ export interface RevokeApiKeyResponse {
40
+ status: string;
41
+ }
42
+ export declare class ApiError extends Error {
43
+ readonly statusCode: number;
44
+ readonly code: string;
45
+ readonly details?: Record<string, unknown>;
46
+ constructor(statusCode: number, code: string, message: string, details?: Record<string, unknown>);
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,cAAc,GAAG,qBAAqB,GAAG,UAAU,CAAC;IACpE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,aAAa,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,KAAK,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGhD,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQpC"}
package/dist/types.js ADDED
@@ -0,0 +1,15 @@
1
+ // Local types for CLI that aren't in @replylayer/shared
2
+ // TODO: upstream to @replylayer/shared
3
+ export class ApiError extends Error {
4
+ statusCode;
5
+ code;
6
+ details;
7
+ constructor(statusCode, code, message, details) {
8
+ super(message);
9
+ this.name = 'ApiError';
10
+ this.statusCode = statusCode;
11
+ this.code = code;
12
+ this.details = details;
13
+ }
14
+ }
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,uCAAuC;AAkDvC,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,UAAU,CAAS;IACnB,IAAI,CAAS;IACb,OAAO,CAA2B;IAElD,YACE,UAAkB,EAClB,IAAY,EACZ,OAAe,EACf,OAAiC;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "replylayer",
3
+ "version": "0.1.0",
4
+ "description": "CLI for ReplyLayer — safe email for AI agents",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/mcintoshjames-sketch/ReplyLayer.git",
10
+ "directory": "packages/cli"
11
+ },
12
+ "keywords": ["email", "ai", "agent", "cli", "replylayer", "mailbox"],
13
+ "bin": {
14
+ "replylayer": "dist/bin/replylayer.js"
15
+ },
16
+ "files": ["dist", "!dist/__tests__"],
17
+ "engines": {
18
+ "node": ">=22"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "dev": "tsx src/bin/replylayer.ts",
23
+ "prepublishOnly": "pnpm run build",
24
+ "test": "vitest run --passWithNoTests",
25
+ "test:watch": "vitest",
26
+ "lint": "eslint src/",
27
+ "typecheck": "tsc --noEmit",
28
+ "clean": "rm -rf dist"
29
+ },
30
+ "dependencies": {
31
+ "commander": "^14.0.3"
32
+ },
33
+ "devDependencies": {
34
+ "@replylayer/shared": "workspace:*",
35
+ "@types/node": "^25.5.0",
36
+ "nock": "^14.0.11",
37
+ "tsx": "^4.0.0",
38
+ "typescript": "^5.8.0",
39
+ "vitest": "^3.2.0"
40
+ }
41
+ }