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.
Files changed (51) hide show
  1. package/README.md +7 -43
  2. package/dist/bin/spidersan.d.ts.map +1 -1
  3. package/dist/bin/spidersan.js +2 -1
  4. package/dist/bin/spidersan.js.map +1 -1
  5. package/dist/commands/demo.d.ts.map +1 -1
  6. package/dist/commands/demo.js +24 -19
  7. package/dist/commands/demo.js.map +1 -1
  8. package/dist/commands/inbox.d.ts.map +1 -1
  9. package/dist/commands/inbox.js +81 -27
  10. package/dist/commands/inbox.js.map +1 -1
  11. package/dist/commands/index.d.ts +1 -0
  12. package/dist/commands/index.d.ts.map +1 -1
  13. package/dist/commands/index.js +1 -0
  14. package/dist/commands/index.js.map +1 -1
  15. package/dist/commands/msg-read.d.ts.map +1 -1
  16. package/dist/commands/msg-read.js +59 -34
  17. package/dist/commands/msg-read.js.map +1 -1
  18. package/dist/commands/semantic.d.ts.map +1 -1
  19. package/dist/commands/semantic.js.map +1 -1
  20. package/dist/commands/send.d.ts.map +1 -1
  21. package/dist/commands/send.js +53 -66
  22. package/dist/commands/send.js.map +1 -1
  23. package/dist/commands/welcome.d.ts +3 -0
  24. package/dist/commands/welcome.d.ts.map +1 -0
  25. package/dist/commands/welcome.js +92 -0
  26. package/dist/commands/welcome.js.map +1 -0
  27. package/dist/storage/git-messages.d.ts +53 -0
  28. package/dist/storage/git-messages.d.ts.map +1 -0
  29. package/dist/storage/git-messages.js +372 -0
  30. package/dist/storage/git-messages.js.map +1 -0
  31. package/dist/storage/index.d.ts +5 -0
  32. package/dist/storage/index.d.ts.map +1 -1
  33. package/dist/storage/index.js +7 -0
  34. package/dist/storage/index.js.map +1 -1
  35. package/dist/storage/local-messages.d.ts +37 -0
  36. package/dist/storage/local-messages.d.ts.map +1 -0
  37. package/dist/storage/local-messages.js +151 -0
  38. package/dist/storage/local-messages.js.map +1 -0
  39. package/dist/storage/message-adapter.d.ts +86 -0
  40. package/dist/storage/message-adapter.d.ts.map +1 -0
  41. package/dist/storage/message-adapter.js +28 -0
  42. package/dist/storage/message-adapter.js.map +1 -0
  43. package/dist/storage/message-factory.d.ts +36 -0
  44. package/dist/storage/message-factory.d.ts.map +1 -0
  45. package/dist/storage/message-factory.js +99 -0
  46. package/dist/storage/message-factory.js.map +1 -0
  47. package/dist/storage/mycmail-adapter.d.ts +38 -0
  48. package/dist/storage/mycmail-adapter.d.ts.map +1 -0
  49. package/dist/storage/mycmail-adapter.js +297 -0
  50. package/dist/storage/mycmail-adapter.js.map +1 -0
  51. 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.0",
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
+ }