spidersan 0.3.0 → 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/README.md +7 -43
- package/dist/bin/spidersan.d.ts.map +1 -1
- package/dist/bin/spidersan.js +2 -1
- package/dist/bin/spidersan.js.map +1 -1
- package/dist/commands/demo.d.ts.map +1 -1
- package/dist/commands/demo.js +24 -19
- package/dist/commands/demo.js.map +1 -1
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +81 -27
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/msg-read.d.ts.map +1 -1
- package/dist/commands/msg-read.js +59 -34
- package/dist/commands/msg-read.js.map +1 -1
- package/dist/commands/semantic.d.ts.map +1 -1
- package/dist/commands/semantic.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +53 -66
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/welcome.d.ts +3 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +92 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/storage/git-messages.d.ts +53 -0
- package/dist/storage/git-messages.d.ts.map +1 -0
- package/dist/storage/git-messages.js +372 -0
- package/dist/storage/git-messages.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +7 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/local-messages.d.ts +37 -0
- package/dist/storage/local-messages.d.ts.map +1 -0
- package/dist/storage/local-messages.js +151 -0
- package/dist/storage/local-messages.js.map +1 -0
- package/dist/storage/message-adapter.d.ts +86 -0
- package/dist/storage/message-adapter.d.ts.map +1 -0
- package/dist/storage/message-adapter.js +28 -0
- package/dist/storage/message-adapter.js.map +1 -0
- package/dist/storage/message-factory.d.ts +36 -0
- package/dist/storage/message-factory.d.ts.map +1 -0
- package/dist/storage/message-factory.js +99 -0
- package/dist/storage/message-factory.js.map +1 -0
- package/dist/storage/mycmail-adapter.d.ts +38 -0
- package/dist/storage/mycmail-adapter.d.ts.map +1 -0
- package/dist/storage/mycmail-adapter.js +297 -0
- package/dist/storage/mycmail-adapter.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Storage Adapter Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstract interface for tiered message storage.
|
|
5
|
+
* Implementations:
|
|
6
|
+
* Tier 1: MycmailAdapter (real-time, full features via Supabase)
|
|
7
|
+
* Tier 2: GitMessagesAdapter (git orphan branch coordination)
|
|
8
|
+
* Tier 3: LocalMessagesAdapter (single-machine fallback)
|
|
9
|
+
*/
|
|
10
|
+
export type MessageType = 'info' | 'question' | 'alert' | 'handoff' | 'file_share';
|
|
11
|
+
export interface Message {
|
|
12
|
+
id: string;
|
|
13
|
+
from: string;
|
|
14
|
+
to: string;
|
|
15
|
+
subject: string;
|
|
16
|
+
body: string;
|
|
17
|
+
timestamp: Date;
|
|
18
|
+
type: MessageType;
|
|
19
|
+
encrypted: boolean;
|
|
20
|
+
read: boolean;
|
|
21
|
+
branch?: string;
|
|
22
|
+
files?: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface SendMessageInput {
|
|
25
|
+
from: string;
|
|
26
|
+
to: string;
|
|
27
|
+
subject: string;
|
|
28
|
+
body: string;
|
|
29
|
+
type?: MessageType;
|
|
30
|
+
encrypted?: boolean;
|
|
31
|
+
branch?: string;
|
|
32
|
+
files?: string[];
|
|
33
|
+
}
|
|
34
|
+
export interface InboxOptions {
|
|
35
|
+
unread?: boolean;
|
|
36
|
+
limit?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface TierStatus {
|
|
39
|
+
tier: number;
|
|
40
|
+
name: string;
|
|
41
|
+
available: boolean;
|
|
42
|
+
reason?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface MessageStorageAdapter {
|
|
45
|
+
/**
|
|
46
|
+
* Get the tier number (1 = highest priority, 3 = lowest)
|
|
47
|
+
*/
|
|
48
|
+
getTier(): number;
|
|
49
|
+
/**
|
|
50
|
+
* Get the human-readable tier name
|
|
51
|
+
*/
|
|
52
|
+
getTierName(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Check if this storage backend is available
|
|
55
|
+
*/
|
|
56
|
+
isAvailable(): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Get detailed availability status
|
|
59
|
+
*/
|
|
60
|
+
getStatus(): Promise<TierStatus>;
|
|
61
|
+
/**
|
|
62
|
+
* Send a message
|
|
63
|
+
*/
|
|
64
|
+
send(message: SendMessageInput): Promise<Message>;
|
|
65
|
+
/**
|
|
66
|
+
* Get inbox messages for an agent
|
|
67
|
+
*/
|
|
68
|
+
inbox(agentId: string, options?: InboxOptions): Promise<Message[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Read a specific message by ID
|
|
71
|
+
*/
|
|
72
|
+
read(messageId: string): Promise<Message | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Mark a message as read
|
|
75
|
+
*/
|
|
76
|
+
markRead(messageId: string): Promise<boolean>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Generate a unique message ID
|
|
80
|
+
*/
|
|
81
|
+
export declare function generateMessageId(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Create a slug from subject for file naming
|
|
84
|
+
*/
|
|
85
|
+
export declare function subjectToSlug(subject: string): string;
|
|
86
|
+
//# sourceMappingURL=message-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/message-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;AAEnF,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,OAAO,IAAI,MAAM,CAAC;IAElB;;OAEG;IACH,WAAW,IAAI,MAAM,CAAC;IAEtB;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnE;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAEjD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Storage Adapter Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstract interface for tiered message storage.
|
|
5
|
+
* Implementations:
|
|
6
|
+
* Tier 1: MycmailAdapter (real-time, full features via Supabase)
|
|
7
|
+
* Tier 2: GitMessagesAdapter (git orphan branch coordination)
|
|
8
|
+
* Tier 3: LocalMessagesAdapter (single-machine fallback)
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Generate a unique message ID
|
|
12
|
+
*/
|
|
13
|
+
export function generateMessageId() {
|
|
14
|
+
const timestamp = Date.now().toString(36);
|
|
15
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
16
|
+
return `msg_${timestamp}_${random}`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a slug from subject for file naming
|
|
20
|
+
*/
|
|
21
|
+
export function subjectToSlug(subject) {
|
|
22
|
+
return subject
|
|
23
|
+
.toLowerCase()
|
|
24
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
25
|
+
.replace(/^-|-$/g, '')
|
|
26
|
+
.substring(0, 30);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=message-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-adapter.js","sourceRoot":"","sources":["../../src/storage/message-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmFH;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,SAAS,IAAI,MAAM,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IACzC,OAAO,OAAO;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Storage Factory - Tiered Selection Logic
|
|
3
|
+
*
|
|
4
|
+
* Selects the best available message storage backend:
|
|
5
|
+
* Tier 1: Mycmail/Supabase (real-time, full features)
|
|
6
|
+
* Tier 2: Git coordination branch (near-real-time on pull)
|
|
7
|
+
* Tier 3: Local JSON (single-machine only)
|
|
8
|
+
*/
|
|
9
|
+
import type { MessageStorageAdapter, TierStatus } from './message-adapter.js';
|
|
10
|
+
export interface MessageStorageOptions {
|
|
11
|
+
/** Force a specific tier (1, 2, or 3) */
|
|
12
|
+
forceTier?: number;
|
|
13
|
+
/** Agent ID for mycmail */
|
|
14
|
+
agentId?: string;
|
|
15
|
+
/** Base path for git/local storage */
|
|
16
|
+
basePath?: string;
|
|
17
|
+
/** Enable verbose logging */
|
|
18
|
+
verbose?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get the best available message storage adapter
|
|
22
|
+
*/
|
|
23
|
+
export declare function getMessageStorage(options?: MessageStorageOptions): Promise<MessageStorageAdapter>;
|
|
24
|
+
/**
|
|
25
|
+
* Get status of all message storage tiers
|
|
26
|
+
*/
|
|
27
|
+
export declare function getAllTierStatus(options?: MessageStorageOptions): Promise<TierStatus[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Print tier status to console
|
|
30
|
+
*/
|
|
31
|
+
export declare function printTierStatus(options?: MessageStorageOptions): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Parse tier option from command line
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseTierOption(tierArg: string | undefined): number | undefined;
|
|
36
|
+
//# sourceMappingURL=message-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-factory.d.ts","sourceRoot":"","sources":["../../src/storage/message-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IAClC,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACnC,OAAO,GAAE,qBAA0B,GACpC,OAAO,CAAC,qBAAqB,CAAC,CAmChC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAClC,OAAO,GAAE,qBAA0B,GACpC,OAAO,CAAC,UAAU,EAAE,CAAC,CAcvB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,OAAO,GAAE,qBAA0B,GACpC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAU/E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message Storage Factory - Tiered Selection Logic
|
|
3
|
+
*
|
|
4
|
+
* Selects the best available message storage backend:
|
|
5
|
+
* Tier 1: Mycmail/Supabase (real-time, full features)
|
|
6
|
+
* Tier 2: Git coordination branch (near-real-time on pull)
|
|
7
|
+
* Tier 3: Local JSON (single-machine only)
|
|
8
|
+
*/
|
|
9
|
+
import { MycmailAdapter } from './mycmail-adapter.js';
|
|
10
|
+
import { GitMessagesAdapter } from './git-messages.js';
|
|
11
|
+
import { LocalMessagesAdapter } from './local-messages.js';
|
|
12
|
+
/**
|
|
13
|
+
* Get the best available message storage adapter
|
|
14
|
+
*/
|
|
15
|
+
export async function getMessageStorage(options = {}) {
|
|
16
|
+
const { forceTier, agentId, basePath, verbose } = options;
|
|
17
|
+
// Create all adapters
|
|
18
|
+
const tier1 = new MycmailAdapter(agentId);
|
|
19
|
+
const tier2 = new GitMessagesAdapter(basePath);
|
|
20
|
+
const tier3 = new LocalMessagesAdapter(basePath);
|
|
21
|
+
// If tier is forced, return that adapter (even if unavailable)
|
|
22
|
+
if (forceTier === 1) {
|
|
23
|
+
if (verbose)
|
|
24
|
+
console.error('🔗 Forced Tier 1: mycmail-supabase');
|
|
25
|
+
return tier1;
|
|
26
|
+
}
|
|
27
|
+
if (forceTier === 2) {
|
|
28
|
+
if (verbose)
|
|
29
|
+
console.error('🔗 Forced Tier 2: git-coordination-branch');
|
|
30
|
+
return tier2;
|
|
31
|
+
}
|
|
32
|
+
if (forceTier === 3) {
|
|
33
|
+
if (verbose)
|
|
34
|
+
console.error('🔗 Forced Tier 3: local-json');
|
|
35
|
+
return tier3;
|
|
36
|
+
}
|
|
37
|
+
// Auto-detect best available tier
|
|
38
|
+
if (await tier1.isAvailable()) {
|
|
39
|
+
if (verbose)
|
|
40
|
+
console.error('🔗 Using Tier 1: mycmail-supabase');
|
|
41
|
+
return tier1;
|
|
42
|
+
}
|
|
43
|
+
if (await tier2.isAvailable()) {
|
|
44
|
+
if (verbose)
|
|
45
|
+
console.error('🔗 Using Tier 2: git-coordination-branch');
|
|
46
|
+
return tier2;
|
|
47
|
+
}
|
|
48
|
+
if (verbose)
|
|
49
|
+
console.error('🔗 Using Tier 3: local-json');
|
|
50
|
+
return tier3;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get status of all message storage tiers
|
|
54
|
+
*/
|
|
55
|
+
export async function getAllTierStatus(options = {}) {
|
|
56
|
+
const { agentId, basePath } = options;
|
|
57
|
+
const tier1 = new MycmailAdapter(agentId);
|
|
58
|
+
const tier2 = new GitMessagesAdapter(basePath);
|
|
59
|
+
const tier3 = new LocalMessagesAdapter(basePath);
|
|
60
|
+
const [status1, status2, status3] = await Promise.all([
|
|
61
|
+
tier1.getStatus(),
|
|
62
|
+
tier2.getStatus(),
|
|
63
|
+
tier3.getStatus(),
|
|
64
|
+
]);
|
|
65
|
+
return [status1, status2, status3];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Print tier status to console
|
|
69
|
+
*/
|
|
70
|
+
export async function printTierStatus(options = {}) {
|
|
71
|
+
const statuses = await getAllTierStatus(options);
|
|
72
|
+
console.log('\n📡 Message Tier Status\n');
|
|
73
|
+
console.log('┌─────────────────────────────────────────────────────────────┐');
|
|
74
|
+
for (const status of statuses) {
|
|
75
|
+
const icon = status.available ? '✅' : '❌';
|
|
76
|
+
const tierLabel = `Tier ${status.tier}`;
|
|
77
|
+
const nameLabel = status.name.padEnd(25);
|
|
78
|
+
console.log(`│ ${icon} ${tierLabel}: ${nameLabel} │`);
|
|
79
|
+
console.log(`│ ${(status.reason || '').padEnd(53)} │`);
|
|
80
|
+
}
|
|
81
|
+
console.log('└─────────────────────────────────────────────────────────────┘');
|
|
82
|
+
// Show which tier would be selected
|
|
83
|
+
const adapter = await getMessageStorage(options);
|
|
84
|
+
console.log(`\n🎯 Active: Tier ${adapter.getTier()} (${adapter.getTierName()})\n`);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parse tier option from command line
|
|
88
|
+
*/
|
|
89
|
+
export function parseTierOption(tierArg) {
|
|
90
|
+
if (!tierArg)
|
|
91
|
+
return undefined;
|
|
92
|
+
const tier = parseInt(tierArg, 10);
|
|
93
|
+
if (isNaN(tier) || tier < 1 || tier > 3) {
|
|
94
|
+
console.error(`❌ Invalid tier: ${tierArg}. Must be 1, 2, or 3.`);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
return tier;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=message-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-factory.js","sourceRoot":"","sources":["../../src/storage/message-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mycmail Message Storage Adapter (Tier 1)
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing mycmail CLI for Supabase-backed messaging.
|
|
5
|
+
* This is the highest tier with real-time, full features.
|
|
6
|
+
*/
|
|
7
|
+
import type { MessageStorageAdapter, Message, SendMessageInput, InboxOptions, TierStatus } from './message-adapter.js';
|
|
8
|
+
export declare class MycmailAdapter implements MessageStorageAdapter {
|
|
9
|
+
private agentId;
|
|
10
|
+
private mycmailAvailable;
|
|
11
|
+
private supabaseAvailable;
|
|
12
|
+
constructor(agentId?: string);
|
|
13
|
+
getTier(): number;
|
|
14
|
+
getTierName(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Check if mycmail CLI is installed
|
|
17
|
+
*/
|
|
18
|
+
private isMycmailInstalled;
|
|
19
|
+
/**
|
|
20
|
+
* Check if Supabase is configured and responding
|
|
21
|
+
*/
|
|
22
|
+
private isSupabaseAvailable;
|
|
23
|
+
isAvailable(): Promise<boolean>;
|
|
24
|
+
getStatus(): Promise<TierStatus>;
|
|
25
|
+
/**
|
|
26
|
+
* Format message body with Spidersan context
|
|
27
|
+
*/
|
|
28
|
+
private formatMessageBody;
|
|
29
|
+
/**
|
|
30
|
+
* Parse message body to extract Spidersan context
|
|
31
|
+
*/
|
|
32
|
+
private parseMessageBody;
|
|
33
|
+
send(input: SendMessageInput): Promise<Message>;
|
|
34
|
+
inbox(agentId: string, options?: InboxOptions): Promise<Message[]>;
|
|
35
|
+
read(messageId: string): Promise<Message | null>;
|
|
36
|
+
markRead(messageId: string): Promise<boolean>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=mycmail-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mycmail-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/mycmail-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACR,qBAAqB,EACrB,OAAO,EACP,gBAAgB,EAChB,YAAY,EACZ,UAAU,EAEb,MAAM,sBAAsB,CAAC;AAkB9B,qBAAa,cAAe,YAAW,qBAAqB;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,iBAAiB,CAAwB;gBAErC,OAAO,CAAC,EAAE,MAAM;IAI5B,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;YACW,mBAAmB;IA4B3B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAO/B,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAqCtC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0ClB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0C/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAqDtE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA0ChD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAKtD"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mycmail Message Storage Adapter (Tier 1)
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing mycmail CLI for Supabase-backed messaging.
|
|
5
|
+
* This is the highest tier with real-time, full features.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync, spawnSync } from 'child_process';
|
|
8
|
+
import { generateMessageId } from './message-adapter.js';
|
|
9
|
+
// Security: Input validation
|
|
10
|
+
const VALID_AGENT_ID = /^[a-z0-9][a-z0-9_-]{0,30}$/i;
|
|
11
|
+
function validateAgentId(agentId) {
|
|
12
|
+
if (!VALID_AGENT_ID.test(agentId)) {
|
|
13
|
+
throw new Error(`Invalid agent ID: "${agentId.slice(0, 20)}..." (must be alphanumeric with - or _)`);
|
|
14
|
+
}
|
|
15
|
+
return agentId;
|
|
16
|
+
}
|
|
17
|
+
function sanitizeText(text) {
|
|
18
|
+
// Remove shell metacharacters but allow normal text
|
|
19
|
+
return text.replace(/[`$(){}[\]|;&<>]/g, '');
|
|
20
|
+
}
|
|
21
|
+
export class MycmailAdapter {
|
|
22
|
+
agentId;
|
|
23
|
+
mycmailAvailable = null;
|
|
24
|
+
supabaseAvailable = null;
|
|
25
|
+
constructor(agentId) {
|
|
26
|
+
this.agentId = agentId || process.env.SPIDERSAN_AGENT || 'cli-agent';
|
|
27
|
+
}
|
|
28
|
+
getTier() {
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
getTierName() {
|
|
32
|
+
return 'mycmail-supabase';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if mycmail CLI is installed
|
|
36
|
+
*/
|
|
37
|
+
isMycmailInstalled() {
|
|
38
|
+
if (this.mycmailAvailable !== null) {
|
|
39
|
+
return this.mycmailAvailable;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
execSync('which mycmail', { stdio: 'ignore' });
|
|
43
|
+
this.mycmailAvailable = true;
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
this.mycmailAvailable = false;
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if Supabase is configured and responding
|
|
53
|
+
*/
|
|
54
|
+
async isSupabaseAvailable() {
|
|
55
|
+
if (this.supabaseAvailable !== null) {
|
|
56
|
+
return this.supabaseAvailable;
|
|
57
|
+
}
|
|
58
|
+
// Check for Supabase environment variables
|
|
59
|
+
if (!process.env.SUPABASE_URL || !process.env.SUPABASE_KEY) {
|
|
60
|
+
this.supabaseAvailable = false;
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Try a simple mycmail command to verify connectivity
|
|
64
|
+
try {
|
|
65
|
+
const result = spawnSync('mycmail', ['inbox'], {
|
|
66
|
+
encoding: 'utf-8',
|
|
67
|
+
env: { ...process.env, MYCELIUMAIL_AGENT_ID: this.agentId },
|
|
68
|
+
timeout: 5000, // 5 second timeout
|
|
69
|
+
});
|
|
70
|
+
// If mycmail works without error, Supabase is available
|
|
71
|
+
this.supabaseAvailable = result.status === 0;
|
|
72
|
+
return this.supabaseAvailable;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
this.supabaseAvailable = false;
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async isAvailable() {
|
|
80
|
+
if (!this.isMycmailInstalled()) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return this.isSupabaseAvailable();
|
|
84
|
+
}
|
|
85
|
+
async getStatus() {
|
|
86
|
+
if (!this.isMycmailInstalled()) {
|
|
87
|
+
return {
|
|
88
|
+
tier: 1,
|
|
89
|
+
name: this.getTierName(),
|
|
90
|
+
available: false,
|
|
91
|
+
reason: 'mycmail CLI not installed (npm install -g myceliumail)',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (!process.env.SUPABASE_URL || !process.env.SUPABASE_KEY) {
|
|
95
|
+
return {
|
|
96
|
+
tier: 1,
|
|
97
|
+
name: this.getTierName(),
|
|
98
|
+
available: false,
|
|
99
|
+
reason: 'SUPABASE_URL and SUPABASE_KEY not configured',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const supabaseUp = await this.isSupabaseAvailable();
|
|
103
|
+
if (!supabaseUp) {
|
|
104
|
+
return {
|
|
105
|
+
tier: 1,
|
|
106
|
+
name: this.getTierName(),
|
|
107
|
+
available: false,
|
|
108
|
+
reason: 'Supabase not responding',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
tier: 1,
|
|
113
|
+
name: this.getTierName(),
|
|
114
|
+
available: true,
|
|
115
|
+
reason: 'Mycmail + Supabase available',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Format message body with Spidersan context
|
|
120
|
+
*/
|
|
121
|
+
formatMessageBody(input) {
|
|
122
|
+
let contextHeader = '';
|
|
123
|
+
if (input.type && input.type !== 'info') {
|
|
124
|
+
contextHeader += `Type: ${input.type}\n`;
|
|
125
|
+
}
|
|
126
|
+
if (input.branch) {
|
|
127
|
+
contextHeader += `Branch: ${input.branch}\n`;
|
|
128
|
+
}
|
|
129
|
+
if (input.files && input.files.length > 0) {
|
|
130
|
+
contextHeader += `Files: ${input.files.join(', ')}\n`;
|
|
131
|
+
}
|
|
132
|
+
return contextHeader ? `${contextHeader}\n${input.body}` : input.body;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Parse message body to extract Spidersan context
|
|
136
|
+
*/
|
|
137
|
+
parseMessageBody(rawBody) {
|
|
138
|
+
const lines = rawBody.split('\n');
|
|
139
|
+
let body = rawBody;
|
|
140
|
+
let type = 'info';
|
|
141
|
+
let branch;
|
|
142
|
+
let files;
|
|
143
|
+
// Look for context header
|
|
144
|
+
let headerEnd = 0;
|
|
145
|
+
for (let i = 0; i < lines.length; i++) {
|
|
146
|
+
const line = lines[i];
|
|
147
|
+
if (line.startsWith('Type: ')) {
|
|
148
|
+
type = line.substring(6);
|
|
149
|
+
headerEnd = i + 1;
|
|
150
|
+
}
|
|
151
|
+
else if (line.startsWith('Branch: ')) {
|
|
152
|
+
branch = line.substring(8);
|
|
153
|
+
headerEnd = i + 1;
|
|
154
|
+
}
|
|
155
|
+
else if (line.startsWith('Files: ')) {
|
|
156
|
+
files = line.substring(7).split(', ');
|
|
157
|
+
headerEnd = i + 1;
|
|
158
|
+
}
|
|
159
|
+
else if (line === '' && headerEnd > 0) {
|
|
160
|
+
// Empty line after headers - skip it
|
|
161
|
+
headerEnd = i + 1;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
else if (headerEnd === 0) {
|
|
165
|
+
// No header found
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (headerEnd > 0) {
|
|
170
|
+
body = lines.slice(headerEnd).join('\n');
|
|
171
|
+
}
|
|
172
|
+
return { body, type, branch, files };
|
|
173
|
+
}
|
|
174
|
+
async send(input) {
|
|
175
|
+
const safeTo = validateAgentId(input.to);
|
|
176
|
+
const safeSubject = sanitizeText(input.subject);
|
|
177
|
+
const fullMessage = this.formatMessageBody(input);
|
|
178
|
+
const safeMessage = sanitizeText(fullMessage);
|
|
179
|
+
const args = ['send', safeTo, safeSubject, '--message', safeMessage];
|
|
180
|
+
if (input.encrypted) {
|
|
181
|
+
args.push('--encrypt');
|
|
182
|
+
}
|
|
183
|
+
const result = spawnSync('mycmail', args, {
|
|
184
|
+
encoding: 'utf-8',
|
|
185
|
+
env: { ...process.env, MYCELIUMAIL_AGENT_ID: input.from },
|
|
186
|
+
});
|
|
187
|
+
if (result.error) {
|
|
188
|
+
throw result.error;
|
|
189
|
+
}
|
|
190
|
+
if (result.status !== 0) {
|
|
191
|
+
throw new Error(`mycmail send failed: ${result.stderr || result.stdout}`);
|
|
192
|
+
}
|
|
193
|
+
// Create synthetic message object since mycmail doesn't return structured data
|
|
194
|
+
const message = {
|
|
195
|
+
id: generateMessageId(),
|
|
196
|
+
from: input.from,
|
|
197
|
+
to: input.to,
|
|
198
|
+
subject: input.subject,
|
|
199
|
+
body: input.body,
|
|
200
|
+
timestamp: new Date(),
|
|
201
|
+
type: input.type || 'info',
|
|
202
|
+
encrypted: input.encrypted || false,
|
|
203
|
+
read: false,
|
|
204
|
+
branch: input.branch,
|
|
205
|
+
files: input.files,
|
|
206
|
+
};
|
|
207
|
+
return message;
|
|
208
|
+
}
|
|
209
|
+
async inbox(agentId, options = {}) {
|
|
210
|
+
const safeAgentId = validateAgentId(agentId);
|
|
211
|
+
const result = spawnSync('mycmail', ['inbox', '--json'], {
|
|
212
|
+
encoding: 'utf-8',
|
|
213
|
+
env: { ...process.env, MYCELIUMAIL_AGENT_ID: safeAgentId },
|
|
214
|
+
});
|
|
215
|
+
if (result.error) {
|
|
216
|
+
throw result.error;
|
|
217
|
+
}
|
|
218
|
+
// Try to parse JSON output
|
|
219
|
+
try {
|
|
220
|
+
const data = JSON.parse(result.stdout);
|
|
221
|
+
// Map mycmail format to our Message format
|
|
222
|
+
let messages = (data.messages || data || []).map((msg) => {
|
|
223
|
+
const parsed = this.parseMessageBody(msg.body || msg.content || '');
|
|
224
|
+
return {
|
|
225
|
+
id: msg.id || generateMessageId(),
|
|
226
|
+
from: msg.from || msg.sender || 'unknown',
|
|
227
|
+
to: msg.to || msg.recipient || agentId,
|
|
228
|
+
subject: msg.subject || '(no subject)',
|
|
229
|
+
body: parsed.body,
|
|
230
|
+
timestamp: new Date(msg.timestamp || msg.created_at || Date.now()),
|
|
231
|
+
type: parsed.type,
|
|
232
|
+
encrypted: msg.encrypted || false,
|
|
233
|
+
read: msg.read || false,
|
|
234
|
+
branch: parsed.branch,
|
|
235
|
+
files: parsed.files,
|
|
236
|
+
};
|
|
237
|
+
});
|
|
238
|
+
// Sort by timestamp descending
|
|
239
|
+
messages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
|
|
240
|
+
if (options.unread) {
|
|
241
|
+
messages = messages.filter(msg => !msg.read);
|
|
242
|
+
}
|
|
243
|
+
if (options.limit && options.limit > 0) {
|
|
244
|
+
messages = messages.slice(0, options.limit);
|
|
245
|
+
}
|
|
246
|
+
return messages;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// If JSON parsing fails, return empty array
|
|
250
|
+
// (mycmail might not support --json yet)
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async read(messageId) {
|
|
255
|
+
// Validate message ID format
|
|
256
|
+
const VALID_MESSAGE_ID = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,64}$/;
|
|
257
|
+
if (!VALID_MESSAGE_ID.test(messageId)) {
|
|
258
|
+
throw new Error(`Invalid message ID: "${messageId.slice(0, 20)}..."`);
|
|
259
|
+
}
|
|
260
|
+
const result = spawnSync('mycmail', ['read', messageId, '--json'], {
|
|
261
|
+
encoding: 'utf-8',
|
|
262
|
+
env: { ...process.env, MYCELIUMAIL_AGENT_ID: this.agentId },
|
|
263
|
+
});
|
|
264
|
+
if (result.error) {
|
|
265
|
+
throw result.error;
|
|
266
|
+
}
|
|
267
|
+
if (result.status !== 0) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
const msg = JSON.parse(result.stdout);
|
|
272
|
+
const parsed = this.parseMessageBody(msg.body || msg.content || '');
|
|
273
|
+
return {
|
|
274
|
+
id: msg.id || messageId,
|
|
275
|
+
from: msg.from || msg.sender || 'unknown',
|
|
276
|
+
to: msg.to || msg.recipient || this.agentId,
|
|
277
|
+
subject: msg.subject || '(no subject)',
|
|
278
|
+
body: parsed.body,
|
|
279
|
+
timestamp: new Date(msg.timestamp || msg.created_at || Date.now()),
|
|
280
|
+
type: parsed.type,
|
|
281
|
+
encrypted: msg.encrypted || false,
|
|
282
|
+
read: true, // Reading marks it as read
|
|
283
|
+
branch: parsed.branch,
|
|
284
|
+
files: parsed.files,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async markRead(messageId) {
|
|
292
|
+
// mycmail's read command automatically marks as read
|
|
293
|
+
const message = await this.read(messageId);
|
|
294
|
+
return message !== null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=mycmail-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mycmail-adapter.js","sourceRoot":"","sources":["../../src/storage/mycmail-adapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spidersan",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "Branch coordination for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -87,4 +87,4 @@
|
|
|
87
87
|
"typescript": "^5.3.0",
|
|
88
88
|
"vitest": "^4.0.17"
|
|
89
89
|
}
|
|
90
|
-
}
|
|
90
|
+
}
|