myceliumail 1.0.1
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/.context7 +87 -0
- package/.env.example +12 -0
- package/.eslintrc.json +29 -0
- package/CLAUDE.md +35 -0
- package/COMPLETE.md +51 -0
- package/LICENSE +21 -0
- package/MYCELIUMAIL_STARTER_KIT.md +603 -0
- package/NEXT_STEPS.md +96 -0
- package/README.md +229 -0
- package/desktop/README.md +102 -0
- package/desktop/assets/icon.icns +0 -0
- package/desktop/assets/icon.iconset/icon_128x128.png +0 -0
- package/desktop/assets/icon.iconset/icon_128x128@2x.png +0 -0
- package/desktop/assets/icon.iconset/icon_16x16.png +0 -0
- package/desktop/assets/icon.iconset/icon_16x16@2x.png +0 -0
- package/desktop/assets/icon.iconset/icon_256x256.png +0 -0
- package/desktop/assets/icon.iconset/icon_256x256@2x.png +0 -0
- package/desktop/assets/icon.iconset/icon_32x32.png +0 -0
- package/desktop/assets/icon.iconset/icon_32x32@2x.png +0 -0
- package/desktop/assets/icon.iconset/icon_512x512.png +0 -0
- package/desktop/assets/icon.iconset/icon_512x512@2x.png +0 -0
- package/desktop/assets/icon.png +0 -0
- package/desktop/assets/tray-icon.png +0 -0
- package/desktop/main.js +257 -0
- package/desktop/package-lock.json +4198 -0
- package/desktop/package.json +48 -0
- package/desktop/preload.js +11 -0
- package/dist/bin/myceliumail.d.ts +8 -0
- package/dist/bin/myceliumail.d.ts.map +1 -0
- package/dist/bin/myceliumail.js +44 -0
- package/dist/bin/myceliumail.js.map +1 -0
- package/dist/commands/broadcast.d.ts +9 -0
- package/dist/commands/broadcast.d.ts.map +1 -0
- package/dist/commands/broadcast.js +59 -0
- package/dist/commands/broadcast.js.map +1 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +18 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/inbox.d.ts +6 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +65 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/key-import.d.ts +6 -0
- package/dist/commands/key-import.d.ts.map +1 -0
- package/dist/commands/key-import.js +31 -0
- package/dist/commands/key-import.js.map +1 -0
- package/dist/commands/keygen.d.ts +6 -0
- package/dist/commands/keygen.d.ts.map +1 -0
- package/dist/commands/keygen.js +33 -0
- package/dist/commands/keygen.js.map +1 -0
- package/dist/commands/keys.d.ts +6 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +47 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/read.d.ts +6 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +89 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/send.d.ts +8 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +73 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/watch.d.ts +8 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +88 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/dashboard/public/app.js +523 -0
- package/dist/dashboard/public/index.html +75 -0
- package/dist/dashboard/public/styles.css +68 -0
- package/dist/dashboard/routes.d.ts +3 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +103 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/server.d.ts +3 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +29 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/lib/config.d.ts +28 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +90 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/crypto.d.ts +72 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +169 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/realtime.d.ts +36 -0
- package/dist/lib/realtime.d.ts.map +1 -0
- package/dist/lib/realtime.js +73 -0
- package/dist/lib/realtime.js.map +1 -0
- package/dist/storage/local.d.ts +46 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +160 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/supabase.d.ts +43 -0
- package/dist/storage/supabase.d.ts.map +1 -0
- package/dist/storage/supabase.js +256 -0
- package/dist/storage/supabase.js.map +1 -0
- package/dist/types/index.d.ts +48 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/docs/20251215_Treebird-Ecosystem_Knowledge-Base_v2.md +292 -0
- package/docs/20251215_Treebird-Ecosystem_Project-Instructions_v2.md +176 -0
- package/docs/AGENT_DELEGATION_WORKFLOW.md +453 -0
- package/docs/AGENT_STARTER_KIT.md +145 -0
- package/docs/ANNOUNCEMENT_DRAFTS.md +55 -0
- package/docs/DASHBOARD_AGENT_HANDOFF.md +429 -0
- package/docs/DASHBOARD_AGENT_PROMPT.md +32 -0
- package/docs/DASHBOARD_BUILD_ROADMAP.md +61 -0
- package/docs/DEPLOYMENT.md +59 -0
- package/docs/MCP_PUBLISHING_ROADMAP.md +113 -0
- package/docs/MCP_STARTER_KIT.md +117 -0
- package/docs/SSAN_MESSAGES_SUMMARY.md +92 -0
- package/docs/STORAGE_ARCHITECTURE.md +114 -0
- package/mcp-server/README.md +143 -0
- package/mcp-server/assets/icon.png +0 -0
- package/mcp-server/myceliumail-mcp-1.0.0.tgz +0 -0
- package/mcp-server/package-lock.json +1142 -0
- package/mcp-server/package.json +49 -0
- package/mcp-server/src/lib/config.ts +21 -0
- package/mcp-server/src/lib/crypto.ts +150 -0
- package/mcp-server/src/lib/storage.ts +257 -0
- package/mcp-server/src/server.ts +387 -0
- package/mcp-server/tsconfig.json +26 -0
- package/package.json +54 -0
- package/src/bin/myceliumail.ts +52 -0
- package/src/commands/broadcast.ts +70 -0
- package/src/commands/dashboard.ts +19 -0
- package/src/commands/inbox.ts +75 -0
- package/src/commands/key-import.ts +35 -0
- package/src/commands/keygen.ts +44 -0
- package/src/commands/keys.ts +55 -0
- package/src/commands/read.ts +97 -0
- package/src/commands/send.ts +89 -0
- package/src/commands/watch.ts +101 -0
- package/src/dashboard/public/app.js +523 -0
- package/src/dashboard/public/index.html +75 -0
- package/src/dashboard/public/styles.css +68 -0
- package/src/dashboard/routes.ts +128 -0
- package/src/dashboard/server.ts +33 -0
- package/src/lib/config.ts +104 -0
- package/src/lib/crypto.ts +210 -0
- package/src/lib/realtime.ts +109 -0
- package/src/storage/local.ts +209 -0
- package/src/storage/supabase.ts +336 -0
- package/src/types/index.ts +53 -0
- package/supabase/migrations/000_myceliumail_setup.sql +93 -0
- package/supabase/migrations/001_enable_realtime.sql +10 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local JSON Storage Adapter
|
|
3
|
+
*
|
|
4
|
+
* Stores messages in a local JSON file for offline/testing use.
|
|
5
|
+
*/
|
|
6
|
+
import type { Message, InboxOptions } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Send a message (store locally)
|
|
9
|
+
*/
|
|
10
|
+
export declare function sendMessage(sender: string, recipient: string | string[], subject: string, body: string, options?: {
|
|
11
|
+
encrypted?: boolean;
|
|
12
|
+
ciphertext?: string;
|
|
13
|
+
nonce?: string;
|
|
14
|
+
senderPublicKey?: string;
|
|
15
|
+
attachments?: {
|
|
16
|
+
name: string;
|
|
17
|
+
type: string;
|
|
18
|
+
data: string;
|
|
19
|
+
size: number;
|
|
20
|
+
}[];
|
|
21
|
+
}): Promise<Message>;
|
|
22
|
+
/**
|
|
23
|
+
* Get inbox messages for an agent (use 'all' for all messages)
|
|
24
|
+
*/
|
|
25
|
+
export declare function getInbox(agentId: string, options?: InboxOptions): Promise<Message[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Get a specific message by ID
|
|
28
|
+
*/
|
|
29
|
+
export declare function getMessage(id: string): Promise<Message | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Mark message as read by an agent
|
|
32
|
+
*/
|
|
33
|
+
export declare function markAsRead(id: string, agentId?: string): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Delete a message
|
|
36
|
+
*/
|
|
37
|
+
export declare function deleteMessage(id: string): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Archive a message
|
|
40
|
+
*/
|
|
41
|
+
export declare function archiveMessage(id: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Get sent messages
|
|
44
|
+
*/
|
|
45
|
+
export declare function getSent(agentId: string, limit?: number): Promise<Message[]>;
|
|
46
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAgD/D;;GAEG;AACH,wBAAsB,WAAW,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACN,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9E,GACF,OAAO,CAAC,OAAO,CAAC,CA4BlB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAuB1F;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAIpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB/E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQjE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAcjF"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local JSON Storage Adapter
|
|
3
|
+
*
|
|
4
|
+
* Stores messages in a local JSON file for offline/testing use.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { homedir } from 'os';
|
|
9
|
+
import { randomUUID } from 'crypto';
|
|
10
|
+
const DATA_DIR = join(homedir(), '.myceliumail', 'data');
|
|
11
|
+
const MESSAGES_FILE = join(DATA_DIR, 'messages.json');
|
|
12
|
+
/**
|
|
13
|
+
* Ensure data directory exists
|
|
14
|
+
*/
|
|
15
|
+
function ensureDataDir() {
|
|
16
|
+
if (!existsSync(DATA_DIR)) {
|
|
17
|
+
mkdirSync(DATA_DIR, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Load all messages from storage
|
|
22
|
+
*/
|
|
23
|
+
function loadMessages() {
|
|
24
|
+
if (!existsSync(MESSAGES_FILE))
|
|
25
|
+
return [];
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(readFileSync(MESSAGES_FILE, 'utf-8'));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Save messages to storage
|
|
35
|
+
*/
|
|
36
|
+
function saveMessages(messages) {
|
|
37
|
+
ensureDataDir();
|
|
38
|
+
writeFileSync(MESSAGES_FILE, JSON.stringify(messages, null, 2));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Convert stored message to Message type
|
|
42
|
+
*/
|
|
43
|
+
function toMessage(stored) {
|
|
44
|
+
return {
|
|
45
|
+
...stored,
|
|
46
|
+
createdAt: new Date(stored.createdAt),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Send a message (store locally)
|
|
51
|
+
*/
|
|
52
|
+
export async function sendMessage(sender, recipient, subject, body, options) {
|
|
53
|
+
const messages = loadMessages();
|
|
54
|
+
// Handle multi-recipient
|
|
55
|
+
const recipientList = Array.isArray(recipient) ? recipient : [recipient];
|
|
56
|
+
const primaryRecipient = recipientList[0];
|
|
57
|
+
const newMessage = {
|
|
58
|
+
id: randomUUID(),
|
|
59
|
+
sender,
|
|
60
|
+
recipient: primaryRecipient,
|
|
61
|
+
recipients: recipientList.length > 1 ? recipientList : undefined,
|
|
62
|
+
subject: options?.encrypted ? '' : subject,
|
|
63
|
+
body: options?.encrypted ? '' : body,
|
|
64
|
+
encrypted: options?.encrypted || false,
|
|
65
|
+
ciphertext: options?.ciphertext,
|
|
66
|
+
nonce: options?.nonce,
|
|
67
|
+
senderPublicKey: options?.senderPublicKey,
|
|
68
|
+
attachments: options?.attachments,
|
|
69
|
+
read: false,
|
|
70
|
+
archived: false,
|
|
71
|
+
createdAt: new Date().toISOString(),
|
|
72
|
+
};
|
|
73
|
+
messages.push(newMessage);
|
|
74
|
+
saveMessages(messages);
|
|
75
|
+
return toMessage(newMessage);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get inbox messages for an agent (use 'all' for all messages)
|
|
79
|
+
*/
|
|
80
|
+
export async function getInbox(agentId, options) {
|
|
81
|
+
const messages = loadMessages();
|
|
82
|
+
let filtered = agentId === 'all'
|
|
83
|
+
? messages.filter(m => !m.archived)
|
|
84
|
+
: messages.filter(m => (m.recipient === agentId || m.recipients?.includes(agentId)) && !m.archived);
|
|
85
|
+
if (options?.unreadOnly) {
|
|
86
|
+
filtered = filtered.filter(m => !m.read);
|
|
87
|
+
}
|
|
88
|
+
// Sort by date descending (newest first)
|
|
89
|
+
filtered.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
90
|
+
if (options?.limit) {
|
|
91
|
+
filtered = filtered.slice(0, options.limit);
|
|
92
|
+
}
|
|
93
|
+
return filtered.map(toMessage);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get a specific message by ID
|
|
97
|
+
*/
|
|
98
|
+
export async function getMessage(id) {
|
|
99
|
+
const messages = loadMessages();
|
|
100
|
+
const found = messages.find(m => m.id === id);
|
|
101
|
+
return found ? toMessage(found) : null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Mark message as read by an agent
|
|
105
|
+
*/
|
|
106
|
+
export async function markAsRead(id, agentId) {
|
|
107
|
+
const messages = loadMessages();
|
|
108
|
+
const index = messages.findIndex(m => m.id === id);
|
|
109
|
+
if (index === -1)
|
|
110
|
+
return false;
|
|
111
|
+
// Initialize readBy if not present
|
|
112
|
+
if (!messages[index].readBy) {
|
|
113
|
+
messages[index].readBy = [];
|
|
114
|
+
}
|
|
115
|
+
// Add agent to readBy if provided and not already there
|
|
116
|
+
if (agentId && !messages[index].readBy.includes(agentId)) {
|
|
117
|
+
messages[index].readBy.push(agentId);
|
|
118
|
+
}
|
|
119
|
+
// Legacy compat
|
|
120
|
+
messages[index].read = true;
|
|
121
|
+
saveMessages(messages);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Delete a message
|
|
126
|
+
*/
|
|
127
|
+
export async function deleteMessage(id) {
|
|
128
|
+
const messages = loadMessages();
|
|
129
|
+
const index = messages.findIndex(m => m.id === id);
|
|
130
|
+
if (index === -1)
|
|
131
|
+
return false;
|
|
132
|
+
messages.splice(index, 1);
|
|
133
|
+
saveMessages(messages);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Archive a message
|
|
138
|
+
*/
|
|
139
|
+
export async function archiveMessage(id) {
|
|
140
|
+
const messages = loadMessages();
|
|
141
|
+
const index = messages.findIndex(m => m.id === id);
|
|
142
|
+
if (index === -1)
|
|
143
|
+
return false;
|
|
144
|
+
messages[index].archived = true;
|
|
145
|
+
saveMessages(messages);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get sent messages
|
|
150
|
+
*/
|
|
151
|
+
export async function getSent(agentId, limit) {
|
|
152
|
+
const messages = loadMessages();
|
|
153
|
+
let filtered = messages.filter(m => m.sender === agentId);
|
|
154
|
+
filtered.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
155
|
+
if (limit) {
|
|
156
|
+
filtered = filtered.slice(0, limit);
|
|
157
|
+
}
|
|
158
|
+
return filtered.map(toMessage);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AACzD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AAMtD;;GAEG;AACH,SAAS,aAAa;IAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,YAAY;IACjB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,QAAyB;IAC3C,aAAa,EAAE,CAAC;IAChB,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,MAAqB;IACpC,OAAO;QACH,GAAG,MAAM;QACT,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;KACxC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,MAAc,EACd,SAA4B,EAC5B,OAAe,EACf,IAAY,EACZ,OAMC;IAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,yBAAyB;IACzB,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,gBAAgB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAkB;QAC9B,EAAE,EAAE,UAAU,EAAE;QAChB,MAAM;QACN,SAAS,EAAE,gBAAgB;QAC3B,UAAU,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;QAChE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;QAC1C,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QACpC,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK;QACtC,UAAU,EAAE,OAAO,EAAE,UAAU;QAC/B,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,eAAe,EAAE,OAAO,EAAE,eAAe;QACzC,WAAW,EAAE,OAAO,EAAE,WAAW;QACjC,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;IAEF,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEvB,OAAO,SAAS,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe,EAAE,OAAsB;IAClE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,IAAI,QAAQ,GAAG,OAAO,KAAK,KAAK;QAC5B,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClB,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAC9E,CAAC;IAEN,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,yCAAyC;IACzC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACnB,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CACpE,CAAC;IAEF,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACjB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU;IACvC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU,EAAE,OAAgB;IACzD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/B,mCAAmC;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,wDAAwD;IACxD,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,gBAAgB;IAChB,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IAE5B,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC1C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/B,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1B,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAU;IAC3C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/B,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,KAAc;IACzD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,IAAI,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAE1D,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACnB,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CACpE,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACR,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Storage Adapter
|
|
3
|
+
*
|
|
4
|
+
* Stores messages in Supabase PostgreSQL for cloud sync.
|
|
5
|
+
* Falls back to local storage if Supabase is not configured.
|
|
6
|
+
*/
|
|
7
|
+
import type { Message, InboxOptions } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Send a message via Supabase
|
|
10
|
+
*/
|
|
11
|
+
export declare function sendMessage(sender: string, recipient: string | string[], subject: string, body: string, options?: {
|
|
12
|
+
encrypted?: boolean;
|
|
13
|
+
ciphertext?: string;
|
|
14
|
+
nonce?: string;
|
|
15
|
+
senderPublicKey?: string;
|
|
16
|
+
attachments?: {
|
|
17
|
+
name: string;
|
|
18
|
+
type: string;
|
|
19
|
+
data: string;
|
|
20
|
+
size: number;
|
|
21
|
+
}[];
|
|
22
|
+
}): Promise<Message>;
|
|
23
|
+
/**
|
|
24
|
+
* Get inbox messages from Supabase
|
|
25
|
+
*/
|
|
26
|
+
export declare function getInbox(agentId: string, options?: InboxOptions): Promise<Message[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Get a specific message
|
|
29
|
+
*/
|
|
30
|
+
export declare function getMessage(id: string): Promise<Message | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Mark message as read
|
|
33
|
+
*/
|
|
34
|
+
export declare function markAsRead(id: string, agentId?: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Archive a message
|
|
37
|
+
*/
|
|
38
|
+
export declare function archiveMessage(id: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Delete a message
|
|
41
|
+
*/
|
|
42
|
+
export declare function deleteMessage(id: string): Promise<boolean>;
|
|
43
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/storage/supabase.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA2E/D;;GAEG;AACH,wBAAsB,WAAW,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACN,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9E,GACF,OAAO,CAAC,OAAO,CAAC,CA8DlB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAuD1F;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAgDpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB/E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBjE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAehE"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Storage Adapter
|
|
3
|
+
*
|
|
4
|
+
* Stores messages in Supabase PostgreSQL for cloud sync.
|
|
5
|
+
* Falls back to local storage if Supabase is not configured.
|
|
6
|
+
*/
|
|
7
|
+
import { loadConfig, hasSupabaseConfig } from '../lib/config.js';
|
|
8
|
+
import * as local from './local.js';
|
|
9
|
+
function createClient() {
|
|
10
|
+
const config = loadConfig();
|
|
11
|
+
// Force local storage if mode is 'local'
|
|
12
|
+
if (config.storageMode === 'local') {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
// Check if Supabase is configured
|
|
16
|
+
if (!hasSupabaseConfig(config)) {
|
|
17
|
+
// Error if mode is 'supabase' but not configured
|
|
18
|
+
if (config.storageMode === 'supabase') {
|
|
19
|
+
console.error('❌ MYCELIUMAIL_STORAGE=supabase but Supabase not configured!');
|
|
20
|
+
console.error(' Set SUPABASE_URL and SUPABASE_ANON_KEY environment variables.');
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
url: config.supabaseUrl,
|
|
26
|
+
key: config.supabaseKey,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async function supabaseRequest(client, path, options = {}) {
|
|
30
|
+
const url = `${client.url}/rest/v1${path}`;
|
|
31
|
+
// Create abort controller for timeout
|
|
32
|
+
const controller = new AbortController();
|
|
33
|
+
const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout
|
|
34
|
+
try {
|
|
35
|
+
const response = await fetch(url, {
|
|
36
|
+
...options,
|
|
37
|
+
signal: controller.signal,
|
|
38
|
+
headers: {
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
'apikey': client.key,
|
|
41
|
+
'Authorization': `Bearer ${client.key}`,
|
|
42
|
+
'Prefer': options.method === 'POST' ? 'return=representation' : 'return=minimal',
|
|
43
|
+
...options.headers,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
clearTimeout(timeoutId);
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
const error = await response.text();
|
|
49
|
+
throw new Error(`Supabase error: ${error}`);
|
|
50
|
+
}
|
|
51
|
+
if (response.status === 204)
|
|
52
|
+
return {};
|
|
53
|
+
return response.json();
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
clearTimeout(timeoutId);
|
|
57
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
58
|
+
throw new Error('Supabase request timed out after 10 seconds');
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Send a message via Supabase
|
|
65
|
+
*/
|
|
66
|
+
export async function sendMessage(sender, recipient, subject, body, options) {
|
|
67
|
+
const client = createClient();
|
|
68
|
+
// Fall back to local if no Supabase
|
|
69
|
+
if (!client) {
|
|
70
|
+
return local.sendMessage(sender, recipient, subject, body, options);
|
|
71
|
+
}
|
|
72
|
+
const payload = {
|
|
73
|
+
from_agent: sender,
|
|
74
|
+
to_agent: recipient,
|
|
75
|
+
subject: options?.encrypted ? '🔒 [Encrypted Message]' : subject,
|
|
76
|
+
message: options?.encrypted ? JSON.stringify({
|
|
77
|
+
ciphertext: options?.ciphertext,
|
|
78
|
+
nonce: options?.nonce,
|
|
79
|
+
sender_public_key: options?.senderPublicKey,
|
|
80
|
+
}) : body,
|
|
81
|
+
encrypted: options?.encrypted || false,
|
|
82
|
+
};
|
|
83
|
+
const [result] = await supabaseRequest(client, '/agent_messages', {
|
|
84
|
+
method: 'POST',
|
|
85
|
+
body: JSON.stringify(payload),
|
|
86
|
+
});
|
|
87
|
+
// Parse encrypted message if needed
|
|
88
|
+
let parsedMessage = result.message;
|
|
89
|
+
let ciphertext, nonce, senderPublicKey;
|
|
90
|
+
if (result.encrypted && result.message) {
|
|
91
|
+
try {
|
|
92
|
+
const encrypted = JSON.parse(result.message);
|
|
93
|
+
ciphertext = encrypted.ciphertext;
|
|
94
|
+
nonce = encrypted.nonce;
|
|
95
|
+
senderPublicKey = encrypted.sender_public_key;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Not JSON, treat as plaintext
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
id: result.id,
|
|
103
|
+
sender: result.from_agent,
|
|
104
|
+
recipient: result.to_agent,
|
|
105
|
+
subject: result.subject || '',
|
|
106
|
+
body: result.encrypted ? '' : result.message,
|
|
107
|
+
encrypted: result.encrypted,
|
|
108
|
+
ciphertext,
|
|
109
|
+
nonce,
|
|
110
|
+
senderPublicKey,
|
|
111
|
+
read: result.read,
|
|
112
|
+
archived: false, // Not in response
|
|
113
|
+
createdAt: new Date(result.created_at),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get inbox messages from Supabase
|
|
118
|
+
*/
|
|
119
|
+
export async function getInbox(agentId, options) {
|
|
120
|
+
const client = createClient();
|
|
121
|
+
if (!client) {
|
|
122
|
+
return local.getInbox(agentId, options);
|
|
123
|
+
}
|
|
124
|
+
let query = `/agent_messages?to_agent=eq.${agentId}&order=created_at.desc`;
|
|
125
|
+
if (options?.unreadOnly) {
|
|
126
|
+
query += '&read=eq.false';
|
|
127
|
+
}
|
|
128
|
+
if (options?.limit) {
|
|
129
|
+
query += `&limit=${options.limit}`;
|
|
130
|
+
}
|
|
131
|
+
const results = await supabaseRequest(client, query);
|
|
132
|
+
return results.map(r => {
|
|
133
|
+
// Parse encrypted message
|
|
134
|
+
let ciphertext, nonce, senderPublicKey, body = r.message;
|
|
135
|
+
if (r.encrypted && r.message) {
|
|
136
|
+
try {
|
|
137
|
+
const enc = JSON.parse(r.message);
|
|
138
|
+
ciphertext = enc.ciphertext;
|
|
139
|
+
nonce = enc.nonce;
|
|
140
|
+
senderPublicKey = enc.sender_public_key;
|
|
141
|
+
body = '';
|
|
142
|
+
}
|
|
143
|
+
catch { }
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
id: r.id,
|
|
147
|
+
sender: r.from_agent,
|
|
148
|
+
recipient: r.to_agent,
|
|
149
|
+
subject: r.subject || '',
|
|
150
|
+
body,
|
|
151
|
+
encrypted: r.encrypted,
|
|
152
|
+
ciphertext,
|
|
153
|
+
nonce,
|
|
154
|
+
senderPublicKey,
|
|
155
|
+
read: r.read,
|
|
156
|
+
archived: false,
|
|
157
|
+
createdAt: new Date(r.created_at),
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get a specific message
|
|
163
|
+
*/
|
|
164
|
+
export async function getMessage(id) {
|
|
165
|
+
const client = createClient();
|
|
166
|
+
if (!client) {
|
|
167
|
+
return local.getMessage(id);
|
|
168
|
+
}
|
|
169
|
+
const results = await supabaseRequest(client, `/agent_messages?id=eq.${id}`);
|
|
170
|
+
if (results.length === 0)
|
|
171
|
+
return null;
|
|
172
|
+
const r = results[0];
|
|
173
|
+
// Parse encrypted message
|
|
174
|
+
let ciphertext, nonce, senderPublicKey, body = r.message;
|
|
175
|
+
if (r.encrypted && r.message) {
|
|
176
|
+
try {
|
|
177
|
+
const enc = JSON.parse(r.message);
|
|
178
|
+
ciphertext = enc.ciphertext;
|
|
179
|
+
nonce = enc.nonce;
|
|
180
|
+
senderPublicKey = enc.sender_public_key;
|
|
181
|
+
body = '';
|
|
182
|
+
}
|
|
183
|
+
catch { }
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
id: r.id,
|
|
187
|
+
sender: r.from_agent,
|
|
188
|
+
recipient: r.to_agent,
|
|
189
|
+
subject: r.subject || '',
|
|
190
|
+
body,
|
|
191
|
+
encrypted: r.encrypted,
|
|
192
|
+
ciphertext,
|
|
193
|
+
nonce,
|
|
194
|
+
senderPublicKey,
|
|
195
|
+
read: r.read,
|
|
196
|
+
archived: false,
|
|
197
|
+
createdAt: new Date(r.created_at),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Mark message as read
|
|
202
|
+
*/
|
|
203
|
+
export async function markAsRead(id, agentId) {
|
|
204
|
+
const client = createClient();
|
|
205
|
+
if (!client) {
|
|
206
|
+
return local.markAsRead(id, agentId);
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
await supabaseRequest(client, `/agent_messages?id=eq.${id}`, {
|
|
210
|
+
method: 'PATCH',
|
|
211
|
+
body: JSON.stringify({ read: true }),
|
|
212
|
+
});
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Archive a message
|
|
221
|
+
*/
|
|
222
|
+
export async function archiveMessage(id) {
|
|
223
|
+
const client = createClient();
|
|
224
|
+
if (!client) {
|
|
225
|
+
return local.archiveMessage(id);
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
await supabaseRequest(client, `/agent_messages?id=eq.${id}`, {
|
|
229
|
+
method: 'PATCH',
|
|
230
|
+
body: JSON.stringify({ archived: true }),
|
|
231
|
+
});
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Delete a message
|
|
240
|
+
*/
|
|
241
|
+
export async function deleteMessage(id) {
|
|
242
|
+
const client = createClient();
|
|
243
|
+
if (!client) {
|
|
244
|
+
return local.deleteMessage(id);
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
await supabaseRequest(client, `/agent_messages?id=eq.${id}`, {
|
|
248
|
+
method: 'DELETE',
|
|
249
|
+
});
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/storage/supabase.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAQpC,SAAS,YAAY;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,yCAAyC;IACzC,IAAI,MAAM,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,iDAAiD;QACjD,IAAI,MAAM,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC7E,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,GAAG,EAAE,MAAM,CAAC,WAAY;QACxB,GAAG,EAAE,MAAM,CAAC,WAAY;KAC3B,CAAC;AACN,CAAC;AAED,KAAK,UAAU,eAAe,CAC1B,MAAsB,EACtB,IAAY,EACZ,UAAuB,EAAE;IAEzB,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,WAAW,IAAI,EAAE,CAAC;IAE3C,sCAAsC;IACtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,oBAAoB;IAEnF,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,GAAG,OAAO;YACV,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,QAAQ,EAAE,MAAM,CAAC,GAAG;gBACpB,eAAe,EAAE,UAAU,MAAM,CAAC,GAAG,EAAE;gBACvC,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,gBAAgB;gBAChF,GAAG,OAAO,CAAC,OAAO;aACrB;SACJ,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAO,CAAC;QAC5C,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,MAAc,EACd,SAA4B,EAC5B,OAAe,EACf,IAAY,EACZ,OAMC;IAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,oCAAoC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG;QACZ,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO;QAChE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YACzC,UAAU,EAAE,OAAO,EAAE,UAAU;YAC/B,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,iBAAiB,EAAE,OAAO,EAAE,eAAe;SAC9C,CAAC,CAAC,CAAC,CAAC,IAAI;QACT,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK;KACzC,CAAC;IAEF,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,eAAe,CASlC,MAAM,EAAE,iBAAiB,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAChC,CAAC,CAAC;IAEH,oCAAoC;IACpC,IAAI,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;IACnC,IAAI,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC;IACvC,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7C,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;YAClC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YACxB,eAAe,GAAG,SAAS,CAAC,iBAAiB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACL,+BAA+B;QACnC,CAAC;IACL,CAAC;IAED,OAAO;QACH,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,UAAU;QACzB,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;QAC5C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU;QACV,KAAK;QACL,eAAe;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,KAAK,EAAE,kBAAkB;QACnC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;KACzC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe,EAAE,OAAsB;IAClE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,KAAK,GAAG,+BAA+B,OAAO,wBAAwB,CAAC;IAE3E,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,KAAK,IAAI,gBAAgB,CAAC;IAC9B,CAAC;IAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACjB,KAAK,IAAI,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,CASjC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEnB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACnB,0BAA0B;QAC1B,IAAI,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC;QACzD,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAClC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;gBAC5B,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;gBAClB,eAAe,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACxC,IAAI,GAAG,EAAE,CAAC;YACd,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;QACf,CAAC;QACD,OAAO;YACH,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,UAAU;YACpB,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,IAAI;YACJ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU;YACV,KAAK;YACL,eAAe;YACf,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;SACpC,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU;IACvC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,eAAe,CASjC,MAAM,EAAE,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAErB,0BAA0B;IAC1B,IAAI,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC;IACzD,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAClC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;YAC5B,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAClB,eAAe,GAAG,GAAG,CAAC,iBAAiB,CAAC;YACxC,IAAI,GAAG,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;IACf,CAAC;IAED,OAAO;QACH,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,CAAC,UAAU;QACpB,SAAS,EAAE,CAAC,CAAC,QAAQ;QACrB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;QACxB,IAAI;QACJ,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,UAAU;QACV,KAAK;QACL,eAAe;QACf,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;KACpC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU,EAAE,OAAgB;IACzD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC;QACD,MAAM,eAAe,CAAC,MAAM,EAAE,yBAAyB,EAAE,EAAE,EAAE;YACzD,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SACvC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAU;IAC3C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC;QACD,MAAM,eAAe,CAAC,MAAM,EAAE,yBAAyB,EAAE,EAAE,EAAE;YACzD,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC1C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC;QACD,MAAM,eAAe,CAAC,MAAM,EAAE,yBAAyB,EAAE,EAAE,EAAE;YACzD,MAAM,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Myceliumail Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
export interface Attachment {
|
|
5
|
+
name: string;
|
|
6
|
+
type: string;
|
|
7
|
+
data: string;
|
|
8
|
+
size: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Message {
|
|
11
|
+
id: string;
|
|
12
|
+
sender: string;
|
|
13
|
+
recipient: string;
|
|
14
|
+
recipients?: string[];
|
|
15
|
+
subject: string;
|
|
16
|
+
body: string;
|
|
17
|
+
encrypted: boolean;
|
|
18
|
+
ciphertext?: string;
|
|
19
|
+
nonce?: string;
|
|
20
|
+
senderPublicKey?: string;
|
|
21
|
+
read?: boolean;
|
|
22
|
+
readBy?: string[];
|
|
23
|
+
archived: boolean;
|
|
24
|
+
attachments?: Attachment[];
|
|
25
|
+
createdAt: Date;
|
|
26
|
+
}
|
|
27
|
+
export interface Channel {
|
|
28
|
+
name: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
isPublic: boolean;
|
|
31
|
+
createdBy: string;
|
|
32
|
+
createdAt: Date;
|
|
33
|
+
}
|
|
34
|
+
export interface Agent {
|
|
35
|
+
id: string;
|
|
36
|
+
publicKey?: string;
|
|
37
|
+
status?: string;
|
|
38
|
+
lastSeen?: Date;
|
|
39
|
+
}
|
|
40
|
+
export interface SendOptions {
|
|
41
|
+
encrypt?: boolean;
|
|
42
|
+
priority?: 'low' | 'normal' | 'high' | 'urgent';
|
|
43
|
+
}
|
|
44
|
+
export interface InboxOptions {
|
|
45
|
+
unreadOnly?: boolean;
|
|
46
|
+
limit?: number;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,KAAK;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|