spidersan 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +3 -1
  3. package/dist/commands/conflicts.d.ts.map +1 -1
  4. package/dist/commands/conflicts.js +14 -46
  5. package/dist/commands/conflicts.js.map +1 -1
  6. package/dist/commands/cross-conflicts.d.ts.map +1 -1
  7. package/dist/commands/cross-conflicts.js +5 -2
  8. package/dist/commands/cross-conflicts.js.map +1 -1
  9. package/dist/commands/doctor.d.ts.map +1 -1
  10. package/dist/commands/doctor.js +117 -59
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/pulse.d.ts.map +1 -1
  13. package/dist/commands/pulse.js +11 -19
  14. package/dist/commands/pulse.js.map +1 -1
  15. package/dist/commands/queen.d.ts.map +1 -1
  16. package/dist/commands/queen.js +27 -14
  17. package/dist/commands/queen.js.map +1 -1
  18. package/dist/commands/stale.d.ts +1 -9
  19. package/dist/commands/stale.d.ts.map +1 -1
  20. package/dist/commands/stale.js +1 -42
  21. package/dist/commands/stale.js.map +1 -1
  22. package/dist/lib/agent-errors.js +2 -2
  23. package/dist/lib/agent-errors.js.map +1 -1
  24. package/dist/lib/daily-bridge.d.ts.map +1 -1
  25. package/dist/lib/daily-bridge.js +3 -2
  26. package/dist/lib/daily-bridge.js.map +1 -1
  27. package/dist/lib/regex-utils.d.ts +6 -0
  28. package/dist/lib/regex-utils.d.ts.map +1 -0
  29. package/dist/lib/regex-utils.js +24 -0
  30. package/dist/lib/regex-utils.js.map +1 -0
  31. package/dist/lib/repo-scanner.d.ts +0 -4
  32. package/dist/lib/repo-scanner.d.ts.map +1 -1
  33. package/dist/lib/repo-scanner.js +2 -1
  34. package/dist/lib/repo-scanner.js.map +1 -1
  35. package/dist/lib/security.d.ts +6 -0
  36. package/dist/lib/security.d.ts.map +1 -1
  37. package/dist/lib/security.js +10 -0
  38. package/dist/lib/security.js.map +1 -1
  39. package/dist/storage/index.d.ts +0 -5
  40. package/dist/storage/index.d.ts.map +1 -1
  41. package/dist/storage/index.js +0 -6
  42. package/dist/storage/index.js.map +1 -1
  43. package/package.json +90 -92
  44. package/dist/storage/git-messages.d.ts +0 -53
  45. package/dist/storage/git-messages.d.ts.map +0 -1
  46. package/dist/storage/git-messages.js +0 -376
  47. package/dist/storage/git-messages.js.map +0 -1
  48. package/dist/storage/local-messages.d.ts +0 -37
  49. package/dist/storage/local-messages.d.ts.map +0 -1
  50. package/dist/storage/local-messages.js +0 -151
  51. package/dist/storage/local-messages.js.map +0 -1
  52. package/dist/storage/message-adapter.d.ts +0 -86
  53. package/dist/storage/message-adapter.d.ts.map +0 -1
  54. package/dist/storage/message-adapter.js +0 -28
  55. package/dist/storage/message-adapter.js.map +0 -1
  56. package/dist/storage/message-factory.d.ts +0 -36
  57. package/dist/storage/message-factory.d.ts.map +0 -1
  58. package/dist/storage/message-factory.js +0 -99
  59. package/dist/storage/message-factory.js.map +0 -1
  60. package/dist/storage/mycmail-adapter.d.ts +0 -38
  61. package/dist/storage/mycmail-adapter.d.ts.map +0 -1
  62. package/dist/storage/mycmail-adapter.js +0 -302
  63. package/dist/storage/mycmail-adapter.js.map +0 -1
@@ -1 +0,0 @@
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"}
@@ -1,28 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,36 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,99 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-factory.js","sourceRoot":"","sources":["../../src/storage/message-factory.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
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
@@ -1 +0,0 @@
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;IAK5B,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;YACW,mBAAmB;IA6B3B,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;IA2C/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAsDtE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA2ChD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAKtD"}
@@ -1,302 +0,0 @@
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 { execFileSync, 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
- const rawAgentId = agentId || process.env.SPIDERSAN_AGENT || 'cli-agent';
27
- this.agentId = validateAgentId(rawAgentId);
28
- }
29
- getTier() {
30
- return 1;
31
- }
32
- getTierName() {
33
- return 'mycmail-supabase';
34
- }
35
- /**
36
- * Check if mycmail CLI is installed
37
- */
38
- isMycmailInstalled() {
39
- if (this.mycmailAvailable !== null) {
40
- return this.mycmailAvailable;
41
- }
42
- try {
43
- execFileSync('which', ['mycmail'], { stdio: 'ignore' });
44
- this.mycmailAvailable = true;
45
- return true;
46
- }
47
- catch {
48
- this.mycmailAvailable = false;
49
- return false;
50
- }
51
- }
52
- /**
53
- * Check if Supabase is configured and responding
54
- */
55
- async isSupabaseAvailable() {
56
- if (this.supabaseAvailable !== null) {
57
- return this.supabaseAvailable;
58
- }
59
- // Check for Supabase environment variables
60
- if (!process.env.SUPABASE_URL || !process.env.SUPABASE_KEY) {
61
- this.supabaseAvailable = false;
62
- return false;
63
- }
64
- // Try a simple mycmail command to verify connectivity
65
- try {
66
- const safeAgentId = validateAgentId(this.agentId);
67
- const result = spawnSync('mycmail', ['inbox'], {
68
- encoding: 'utf-8',
69
- env: { ...process.env, MYCELIUMAIL_AGENT_ID: safeAgentId },
70
- timeout: 5000, // 5 second timeout
71
- });
72
- // If mycmail works without error, Supabase is available
73
- this.supabaseAvailable = result.status === 0;
74
- return this.supabaseAvailable;
75
- }
76
- catch {
77
- this.supabaseAvailable = false;
78
- return false;
79
- }
80
- }
81
- async isAvailable() {
82
- if (!this.isMycmailInstalled()) {
83
- return false;
84
- }
85
- return this.isSupabaseAvailable();
86
- }
87
- async getStatus() {
88
- if (!this.isMycmailInstalled()) {
89
- return {
90
- tier: 1,
91
- name: this.getTierName(),
92
- available: false,
93
- reason: 'mycmail CLI not installed (npm install -g myceliumail)',
94
- };
95
- }
96
- if (!process.env.SUPABASE_URL || !process.env.SUPABASE_KEY) {
97
- return {
98
- tier: 1,
99
- name: this.getTierName(),
100
- available: false,
101
- reason: 'SUPABASE_URL and SUPABASE_KEY not configured',
102
- };
103
- }
104
- const supabaseUp = await this.isSupabaseAvailable();
105
- if (!supabaseUp) {
106
- return {
107
- tier: 1,
108
- name: this.getTierName(),
109
- available: false,
110
- reason: 'Supabase not responding',
111
- };
112
- }
113
- return {
114
- tier: 1,
115
- name: this.getTierName(),
116
- available: true,
117
- reason: 'Mycmail + Supabase available',
118
- };
119
- }
120
- /**
121
- * Format message body with Spidersan context
122
- */
123
- formatMessageBody(input) {
124
- let contextHeader = '';
125
- if (input.type && input.type !== 'info') {
126
- contextHeader += `Type: ${input.type}\n`;
127
- }
128
- if (input.branch) {
129
- contextHeader += `Branch: ${input.branch}\n`;
130
- }
131
- if (input.files && input.files.length > 0) {
132
- contextHeader += `Files: ${input.files.join(', ')}\n`;
133
- }
134
- return contextHeader ? `${contextHeader}\n${input.body}` : input.body;
135
- }
136
- /**
137
- * Parse message body to extract Spidersan context
138
- */
139
- parseMessageBody(rawBody) {
140
- const lines = rawBody.split('\n');
141
- let body = rawBody;
142
- let type = 'info';
143
- let branch;
144
- let files;
145
- // Look for context header
146
- let headerEnd = 0;
147
- for (let i = 0; i < lines.length; i++) {
148
- const line = lines[i];
149
- if (line.startsWith('Type: ')) {
150
- type = line.substring(6);
151
- headerEnd = i + 1;
152
- }
153
- else if (line.startsWith('Branch: ')) {
154
- branch = line.substring(8);
155
- headerEnd = i + 1;
156
- }
157
- else if (line.startsWith('Files: ')) {
158
- files = line.substring(7).split(', ');
159
- headerEnd = i + 1;
160
- }
161
- else if (line === '' && headerEnd > 0) {
162
- // Empty line after headers - skip it
163
- headerEnd = i + 1;
164
- break;
165
- }
166
- else if (headerEnd === 0) {
167
- // No header found
168
- break;
169
- }
170
- }
171
- if (headerEnd > 0) {
172
- body = lines.slice(headerEnd).join('\n');
173
- }
174
- return { body, type, branch, files };
175
- }
176
- async send(input) {
177
- const safeFrom = validateAgentId(input.from);
178
- const safeTo = validateAgentId(input.to);
179
- const safeSubject = sanitizeText(input.subject);
180
- const fullMessage = this.formatMessageBody(input);
181
- const safeMessage = sanitizeText(fullMessage);
182
- const args = ['send', safeTo, safeSubject, '--message', safeMessage];
183
- if (input.encrypted) {
184
- args.push('--encrypt');
185
- }
186
- const result = spawnSync('mycmail', args, {
187
- encoding: 'utf-8',
188
- env: { ...process.env, MYCELIUMAIL_AGENT_ID: safeFrom },
189
- });
190
- if (result.error) {
191
- throw result.error;
192
- }
193
- if (result.status !== 0) {
194
- throw new Error(`mycmail send failed: ${result.stderr || result.stdout}`);
195
- }
196
- // Create synthetic message object since mycmail doesn't return structured data
197
- const message = {
198
- id: generateMessageId(),
199
- from: input.from,
200
- to: input.to,
201
- subject: input.subject,
202
- body: input.body,
203
- timestamp: new Date(),
204
- type: input.type || 'info',
205
- encrypted: input.encrypted || false,
206
- read: false,
207
- branch: input.branch,
208
- files: input.files,
209
- };
210
- return message;
211
- }
212
- async inbox(agentId, options = {}) {
213
- const safeAgentId = validateAgentId(agentId);
214
- const result = spawnSync('mycmail', ['inbox', '--json'], {
215
- encoding: 'utf-8',
216
- env: { ...process.env, MYCELIUMAIL_AGENT_ID: safeAgentId },
217
- });
218
- if (result.error) {
219
- throw result.error;
220
- }
221
- // Try to parse JSON output
222
- try {
223
- const data = JSON.parse(result.stdout);
224
- // Map mycmail format to our Message format
225
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
226
- let messages = (data.messages || data || []).map((msg) => {
227
- const parsed = this.parseMessageBody(msg.body || msg.content || '');
228
- return {
229
- id: msg.id || generateMessageId(),
230
- from: msg.from || msg.sender || 'unknown',
231
- to: msg.to || msg.recipient || agentId,
232
- subject: msg.subject || '(no subject)',
233
- body: parsed.body,
234
- timestamp: new Date(msg.timestamp || msg.created_at || Date.now()),
235
- type: parsed.type,
236
- encrypted: msg.encrypted || false,
237
- read: msg.read || false,
238
- branch: parsed.branch,
239
- files: parsed.files,
240
- };
241
- });
242
- // Sort by timestamp descending
243
- messages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
244
- if (options.unread) {
245
- messages = messages.filter(msg => !msg.read);
246
- }
247
- if (options.limit && options.limit > 0) {
248
- messages = messages.slice(0, options.limit);
249
- }
250
- return messages;
251
- }
252
- catch {
253
- // If JSON parsing fails, return empty array
254
- // (mycmail might not support --json yet)
255
- return [];
256
- }
257
- }
258
- async read(messageId) {
259
- // Validate message ID format
260
- const VALID_MESSAGE_ID = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,64}$/;
261
- if (!VALID_MESSAGE_ID.test(messageId)) {
262
- throw new Error(`Invalid message ID: "${messageId.slice(0, 20)}..."`);
263
- }
264
- const safeAgentId = validateAgentId(this.agentId);
265
- const result = spawnSync('mycmail', ['read', messageId, '--json'], {
266
- encoding: 'utf-8',
267
- env: { ...process.env, MYCELIUMAIL_AGENT_ID: safeAgentId },
268
- });
269
- if (result.error) {
270
- throw result.error;
271
- }
272
- if (result.status !== 0) {
273
- return null;
274
- }
275
- try {
276
- const msg = JSON.parse(result.stdout);
277
- const parsed = this.parseMessageBody(msg.body || msg.content || '');
278
- return {
279
- id: msg.id || messageId,
280
- from: msg.from || msg.sender || 'unknown',
281
- to: msg.to || msg.recipient || this.agentId,
282
- subject: msg.subject || '(no subject)',
283
- body: parsed.body,
284
- timestamp: new Date(msg.timestamp || msg.created_at || Date.now()),
285
- type: parsed.type,
286
- encrypted: msg.encrypted || false,
287
- read: true, // Reading marks it as read
288
- branch: parsed.branch,
289
- files: parsed.files,
290
- };
291
- }
292
- catch {
293
- return null;
294
- }
295
- }
296
- async markRead(messageId) {
297
- // mycmail's read command automatically marks as read
298
- const message = await this.read(messageId);
299
- return message !== null;
300
- }
301
- }
302
- //# sourceMappingURL=mycmail-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mycmail-adapter.js","sourceRoot":"","sources":["../../src/storage/mycmail-adapter.ts"],"names":[],"mappings":"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"}