@hasna/emails 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 (44) hide show
  1. package/dashboard/index.html +479 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +55403 -0
  5. package/dist/db/addresses.d.ts +10 -0
  6. package/dist/db/addresses.d.ts.map +1 -0
  7. package/dist/db/database.d.ts +8 -0
  8. package/dist/db/database.d.ts.map +1 -0
  9. package/dist/db/domains.d.ts +10 -0
  10. package/dist/db/domains.d.ts.map +1 -0
  11. package/dist/db/emails.d.ts +8 -0
  12. package/dist/db/emails.d.ts.map +1 -0
  13. package/dist/db/events.d.ts +16 -0
  14. package/dist/db/events.d.ts.map +1 -0
  15. package/dist/db/providers.d.ts +11 -0
  16. package/dist/db/providers.d.ts.map +1 -0
  17. package/dist/index.d.ts +14 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +54149 -0
  20. package/dist/lib/dns.d.ts +5 -0
  21. package/dist/lib/dns.d.ts.map +1 -0
  22. package/dist/lib/stats.d.ts +5 -0
  23. package/dist/lib/stats.d.ts.map +1 -0
  24. package/dist/lib/sync.d.ts +4 -0
  25. package/dist/lib/sync.d.ts.map +1 -0
  26. package/dist/mcp/index.d.ts +3 -0
  27. package/dist/mcp/index.d.ts.map +1 -0
  28. package/dist/mcp/index.js +58282 -0
  29. package/dist/providers/index.d.ts +7 -0
  30. package/dist/providers/index.d.ts.map +1 -0
  31. package/dist/providers/interface.d.ts +37 -0
  32. package/dist/providers/interface.d.ts.map +1 -0
  33. package/dist/providers/resend.d.ts +24 -0
  34. package/dist/providers/resend.d.ts.map +1 -0
  35. package/dist/providers/ses.d.ts +23 -0
  36. package/dist/providers/ses.d.ts.map +1 -0
  37. package/dist/server/index.d.ts +3 -0
  38. package/dist/server/index.d.ts.map +1 -0
  39. package/dist/server/index.js +54208 -0
  40. package/dist/server/serve.d.ts +6 -0
  41. package/dist/server/serve.d.ts.map +1 -0
  42. package/dist/types/index.d.ts +202 -0
  43. package/dist/types/index.d.ts.map +1 -0
  44. package/package.json +48 -0
@@ -0,0 +1,6 @@
1
+ /**
2
+ * HTTP server for the emails dashboard.
3
+ * Provides REST API and serves the static dashboard from dashboard/index.html.
4
+ */
5
+ export declare function startServer(port?: number): Promise<void>;
6
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/server/serve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyFH,wBAAsB,WAAW,CAAC,IAAI,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2R5D"}
@@ -0,0 +1,202 @@
1
+ export type ProviderType = "resend" | "ses";
2
+ export interface Provider {
3
+ id: string;
4
+ name: string;
5
+ type: ProviderType;
6
+ api_key: string | null;
7
+ region: string | null;
8
+ access_key: string | null;
9
+ secret_key: string | null;
10
+ active: boolean;
11
+ created_at: string;
12
+ updated_at: string;
13
+ }
14
+ export interface CreateProviderInput {
15
+ name: string;
16
+ type: ProviderType;
17
+ api_key?: string;
18
+ region?: string;
19
+ access_key?: string;
20
+ secret_key?: string;
21
+ }
22
+ export interface ProviderRow {
23
+ id: string;
24
+ name: string;
25
+ type: string;
26
+ api_key: string | null;
27
+ region: string | null;
28
+ access_key: string | null;
29
+ secret_key: string | null;
30
+ active: number;
31
+ created_at: string;
32
+ updated_at: string;
33
+ }
34
+ export type DnsStatus = "pending" | "verified" | "failed";
35
+ export interface Domain {
36
+ id: string;
37
+ provider_id: string;
38
+ domain: string;
39
+ dkim_status: DnsStatus;
40
+ spf_status: DnsStatus;
41
+ dmarc_status: DnsStatus;
42
+ verified_at: string | null;
43
+ created_at: string;
44
+ updated_at: string;
45
+ }
46
+ export interface DnsRecord {
47
+ type: "TXT" | "CNAME" | "MX";
48
+ name: string;
49
+ value: string;
50
+ purpose: "DKIM" | "SPF" | "DMARC" | "MX";
51
+ }
52
+ export interface EmailAddress {
53
+ id: string;
54
+ provider_id: string;
55
+ email: string;
56
+ display_name: string | null;
57
+ verified: boolean;
58
+ created_at: string;
59
+ updated_at: string;
60
+ }
61
+ export interface AddressRow {
62
+ id: string;
63
+ provider_id: string;
64
+ email: string;
65
+ display_name: string | null;
66
+ verified: number;
67
+ created_at: string;
68
+ updated_at: string;
69
+ }
70
+ export interface CreateAddressInput {
71
+ provider_id: string;
72
+ email: string;
73
+ display_name?: string;
74
+ }
75
+ export interface Attachment {
76
+ filename: string;
77
+ content: string;
78
+ content_type: string;
79
+ }
80
+ export interface SendEmailOptions {
81
+ provider_id?: string;
82
+ from: string;
83
+ to: string | string[];
84
+ cc?: string | string[];
85
+ bcc?: string | string[];
86
+ reply_to?: string;
87
+ subject: string;
88
+ html?: string;
89
+ text?: string;
90
+ attachments?: Attachment[];
91
+ tags?: Record<string, string>;
92
+ }
93
+ export type EmailStatus = "sent" | "delivered" | "bounced" | "complained" | "failed";
94
+ export interface Email {
95
+ id: string;
96
+ provider_id: string;
97
+ provider_message_id: string | null;
98
+ from_address: string;
99
+ to_addresses: string[];
100
+ cc_addresses: string[];
101
+ bcc_addresses: string[];
102
+ reply_to: string | null;
103
+ subject: string;
104
+ status: EmailStatus;
105
+ has_attachments: boolean;
106
+ attachment_count: number;
107
+ tags: Record<string, string>;
108
+ sent_at: string;
109
+ created_at: string;
110
+ updated_at: string;
111
+ }
112
+ export interface EmailRow {
113
+ id: string;
114
+ provider_id: string;
115
+ provider_message_id: string | null;
116
+ from_address: string;
117
+ to_addresses: string;
118
+ cc_addresses: string;
119
+ bcc_addresses: string;
120
+ reply_to: string | null;
121
+ subject: string;
122
+ status: string;
123
+ has_attachments: number;
124
+ attachment_count: number;
125
+ tags: string;
126
+ sent_at: string;
127
+ created_at: string;
128
+ updated_at: string;
129
+ }
130
+ export type EventType = "delivered" | "bounced" | "complained" | "opened" | "clicked" | "unsubscribed";
131
+ export interface EmailEvent {
132
+ id: string;
133
+ email_id: string | null;
134
+ provider_id: string;
135
+ provider_event_id: string | null;
136
+ type: EventType;
137
+ recipient: string | null;
138
+ metadata: Record<string, unknown>;
139
+ occurred_at: string;
140
+ created_at: string;
141
+ }
142
+ export interface EventRow {
143
+ id: string;
144
+ email_id: string | null;
145
+ provider_id: string;
146
+ provider_event_id: string | null;
147
+ type: string;
148
+ recipient: string | null;
149
+ metadata: string;
150
+ occurred_at: string;
151
+ created_at: string;
152
+ }
153
+ export interface Stats {
154
+ provider_id: string;
155
+ period: string;
156
+ sent: number;
157
+ delivered: number;
158
+ bounced: number;
159
+ complained: number;
160
+ opened: number;
161
+ clicked: number;
162
+ delivery_rate: number;
163
+ bounce_rate: number;
164
+ open_rate: number;
165
+ }
166
+ export interface EmailFilter {
167
+ provider_id?: string;
168
+ status?: EmailStatus | EmailStatus[];
169
+ from_address?: string;
170
+ since?: string;
171
+ until?: string;
172
+ limit?: number;
173
+ offset?: number;
174
+ }
175
+ export interface EventFilter {
176
+ email_id?: string;
177
+ provider_id?: string;
178
+ type?: EventType | EventType[];
179
+ since?: string;
180
+ limit?: number;
181
+ offset?: number;
182
+ }
183
+ export declare class ProviderNotFoundError extends Error {
184
+ providerId: string;
185
+ constructor(providerId: string);
186
+ }
187
+ export declare class DomainNotFoundError extends Error {
188
+ domainId: string;
189
+ constructor(domainId: string);
190
+ }
191
+ export declare class AddressNotFoundError extends Error {
192
+ addressId: string;
193
+ constructor(addressId: string);
194
+ }
195
+ export declare class EmailNotFoundError extends Error {
196
+ emailId: string;
197
+ constructor(emailId: string);
198
+ }
199
+ export declare class ProviderConfigError extends Error {
200
+ constructor(message: string);
201
+ }
202
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@hasna/emails",
3
+ "version": "0.1.0",
4
+ "description": "Email management CLI + MCP server + dashboard for Resend and AWS SES",
5
+ "type": "module",
6
+ "bin": {
7
+ "emails": "dist/cli/index.js",
8
+ "emails-mcp": "dist/mcp/index.js",
9
+ "emails-serve": "dist/server/index.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": ["dist", "dashboard/dist", "dashboard/index.html", "LICENSE", "README.md"],
18
+ "scripts": {
19
+ "build": "bun build src/cli/index.tsx --outdir dist/cli --target bun --external ink --external react --external chalk --external @modelcontextprotocol/sdk && bun build src/mcp/index.ts --outdir dist/mcp --target bun --external @modelcontextprotocol/sdk && bun build src/server/index.ts --outdir dist/server --target bun && bun build src/index.ts --outdir dist --target bun && tsc --emitDeclarationOnly --outDir dist",
20
+ "test": "bun test",
21
+ "dev:cli": "bun run src/cli/index.tsx",
22
+ "dev:mcp": "bun run src/mcp/index.ts",
23
+ "dev:serve": "bun run src/server/index.ts"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "engines": {
29
+ "bun": ">=1.0.0"
30
+ },
31
+ "author": "Andrei Hasna <andrei@hasna.com>",
32
+ "license": "Apache-2.0",
33
+ "dependencies": {
34
+ "@aws-sdk/client-sesv2": "^3.0.0",
35
+ "@modelcontextprotocol/sdk": "^1.12.1",
36
+ "chalk": "^5.4.1",
37
+ "commander": "^13.1.0",
38
+ "ink": "^5.2.0",
39
+ "react": "^18.3.1",
40
+ "resend": "^4.0.0",
41
+ "zod": "^3.24.2"
42
+ },
43
+ "devDependencies": {
44
+ "@types/bun": "^1.2.4",
45
+ "@types/react": "^18.3.18",
46
+ "typescript": "^5.7.3"
47
+ }
48
+ }