spidersan 0.3.0 → 0.4.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 (67) hide show
  1. package/CHANGELOG.md +25 -10
  2. package/LICENSE.md +3 -77
  3. package/README.md +49 -76
  4. package/dist/bin/spidersan.d.ts.map +1 -1
  5. package/dist/bin/spidersan.js +16 -93
  6. package/dist/bin/spidersan.js.map +1 -1
  7. package/dist/commands/demo.d.ts.map +1 -1
  8. package/dist/commands/demo.js +24 -19
  9. package/dist/commands/demo.js.map +1 -1
  10. package/dist/commands/doctor.d.ts.map +1 -1
  11. package/dist/commands/doctor.js +0 -8
  12. package/dist/commands/doctor.js.map +1 -1
  13. package/dist/commands/ecosystem-loader.d.ts +14 -0
  14. package/dist/commands/ecosystem-loader.d.ts.map +1 -0
  15. package/dist/commands/ecosystem-loader.js +78 -0
  16. package/dist/commands/ecosystem-loader.js.map +1 -0
  17. package/dist/commands/inbox.d.ts.map +1 -1
  18. package/dist/commands/inbox.js +81 -27
  19. package/dist/commands/inbox.js.map +1 -1
  20. package/dist/commands/index.d.ts +2 -32
  21. package/dist/commands/index.d.ts.map +1 -1
  22. package/dist/commands/index.js +2 -52
  23. package/dist/commands/index.js.map +1 -1
  24. package/dist/commands/msg-read.d.ts.map +1 -1
  25. package/dist/commands/msg-read.js +59 -34
  26. package/dist/commands/msg-read.js.map +1 -1
  27. package/dist/commands/register.d.ts.map +1 -1
  28. package/dist/commands/register.js +0 -6
  29. package/dist/commands/register.js.map +1 -1
  30. package/dist/commands/semantic.d.ts.map +1 -1
  31. package/dist/commands/semantic.js.map +1 -1
  32. package/dist/commands/send.d.ts.map +1 -1
  33. package/dist/commands/send.js +53 -66
  34. package/dist/commands/send.js.map +1 -1
  35. package/dist/commands/welcome.d.ts +3 -0
  36. package/dist/commands/welcome.d.ts.map +1 -0
  37. package/dist/commands/welcome.js +92 -0
  38. package/dist/commands/welcome.js.map +1 -0
  39. package/dist/index.d.ts +5 -0
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +5 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/storage/git-messages.d.ts +53 -0
  44. package/dist/storage/git-messages.d.ts.map +1 -0
  45. package/dist/storage/git-messages.js +372 -0
  46. package/dist/storage/git-messages.js.map +1 -0
  47. package/dist/storage/index.d.ts +5 -0
  48. package/dist/storage/index.d.ts.map +1 -1
  49. package/dist/storage/index.js +7 -0
  50. package/dist/storage/index.js.map +1 -1
  51. package/dist/storage/local-messages.d.ts +37 -0
  52. package/dist/storage/local-messages.d.ts.map +1 -0
  53. package/dist/storage/local-messages.js +151 -0
  54. package/dist/storage/local-messages.js.map +1 -0
  55. package/dist/storage/message-adapter.d.ts +86 -0
  56. package/dist/storage/message-adapter.d.ts.map +1 -0
  57. package/dist/storage/message-adapter.js +28 -0
  58. package/dist/storage/message-adapter.js.map +1 -0
  59. package/dist/storage/message-factory.d.ts +36 -0
  60. package/dist/storage/message-factory.d.ts.map +1 -0
  61. package/dist/storage/message-factory.js +99 -0
  62. package/dist/storage/message-factory.js.map +1 -0
  63. package/dist/storage/mycmail-adapter.d.ts +38 -0
  64. package/dist/storage/mycmail-adapter.d.ts.map +1 -0
  65. package/dist/storage/mycmail-adapter.js +297 -0
  66. package/dist/storage/mycmail-adapter.js.map +1 -0
  67. package/package.json +3 -2
@@ -0,0 +1,372 @@
1
+ /**
2
+ * Git Coordination Branch Message Storage Adapter (Tier 2)
3
+ *
4
+ * Stores messages in an orphan branch: spidersan/messages
5
+ * Structure:
6
+ * inbox/<agent-id>/<timestamp>_<from>_<subject-slug>.json
7
+ * outbox/<agent-id>/<timestamp>_<to>_<subject-slug>.json
8
+ *
9
+ * Near-real-time coordination on pull. Works across machines with git remote.
10
+ */
11
+ import { execSync, spawnSync } from 'child_process';
12
+ import { generateMessageId, subjectToSlug } from './message-adapter.js';
13
+ const MESSAGES_BRANCH = 'spidersan/messages';
14
+ export class GitMessagesAdapter {
15
+ basePath;
16
+ branchInitialized = null;
17
+ constructor(basePath = process.cwd()) {
18
+ this.basePath = basePath;
19
+ }
20
+ getTier() {
21
+ return 2;
22
+ }
23
+ getTierName() {
24
+ return 'git-coordination-branch';
25
+ }
26
+ async isAvailable() {
27
+ // Check if we're in a git repository
28
+ try {
29
+ execSync('git rev-parse --git-dir', {
30
+ cwd: this.basePath,
31
+ stdio: 'ignore',
32
+ });
33
+ return true;
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ async getStatus() {
40
+ const available = await this.isAvailable();
41
+ return {
42
+ tier: 2,
43
+ name: this.getTierName(),
44
+ available,
45
+ reason: available
46
+ ? 'Git repository detected'
47
+ : 'Not in a git repository',
48
+ };
49
+ }
50
+ /**
51
+ * Check if the messages branch exists
52
+ */
53
+ branchExists() {
54
+ try {
55
+ execSync(`git rev-parse --verify ${MESSAGES_BRANCH}`, {
56
+ cwd: this.basePath,
57
+ stdio: 'ignore',
58
+ });
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ /**
66
+ * Initialize the orphan branch if it doesn't exist
67
+ */
68
+ async ensureBranch() {
69
+ if (this.branchInitialized)
70
+ return;
71
+ if (!this.branchExists()) {
72
+ // Create orphan branch with an initial commit
73
+ const currentBranch = execSync('git rev-parse --abbrev-ref HEAD', {
74
+ cwd: this.basePath,
75
+ encoding: 'utf-8',
76
+ }).trim();
77
+ try {
78
+ // Create orphan branch
79
+ execSync(`git checkout --orphan ${MESSAGES_BRANCH}`, {
80
+ cwd: this.basePath,
81
+ stdio: 'ignore',
82
+ });
83
+ // Remove all files from index
84
+ execSync('git rm -rf . 2>/dev/null || true', {
85
+ cwd: this.basePath,
86
+ stdio: 'ignore',
87
+ shell: '/bin/bash',
88
+ });
89
+ // Create initial structure
90
+ execSync('mkdir -p inbox outbox', {
91
+ cwd: this.basePath,
92
+ stdio: 'ignore',
93
+ shell: '/bin/bash',
94
+ });
95
+ // Create .gitkeep files
96
+ execSync('touch inbox/.gitkeep outbox/.gitkeep', {
97
+ cwd: this.basePath,
98
+ stdio: 'ignore',
99
+ shell: '/bin/bash',
100
+ });
101
+ execSync('git add inbox/.gitkeep outbox/.gitkeep', {
102
+ cwd: this.basePath,
103
+ stdio: 'ignore',
104
+ });
105
+ execSync('git commit -m "Initialize spidersan messages branch"', {
106
+ cwd: this.basePath,
107
+ stdio: 'ignore',
108
+ });
109
+ // Return to original branch
110
+ execSync(`git checkout ${currentBranch}`, {
111
+ cwd: this.basePath,
112
+ stdio: 'ignore',
113
+ });
114
+ }
115
+ catch (error) {
116
+ // Try to recover to original branch
117
+ try {
118
+ execSync(`git checkout ${currentBranch}`, {
119
+ cwd: this.basePath,
120
+ stdio: 'ignore',
121
+ });
122
+ }
123
+ catch {
124
+ // Ignore recovery errors
125
+ }
126
+ throw error;
127
+ }
128
+ }
129
+ this.branchInitialized = true;
130
+ }
131
+ /**
132
+ * Generate filename for a message
133
+ */
134
+ generateFilename(message, isInbox) {
135
+ const timestamp = message.timestamp.getTime();
136
+ const otherAgent = isInbox ? message.from : message.to;
137
+ const slug = subjectToSlug(message.subject);
138
+ return `${timestamp}_${otherAgent}_${slug}.json`;
139
+ }
140
+ /**
141
+ * Read a file from the messages branch without checkout
142
+ */
143
+ readFromBranch(path) {
144
+ try {
145
+ const result = spawnSync('git', ['show', `${MESSAGES_BRANCH}:${path}`], {
146
+ cwd: this.basePath,
147
+ encoding: 'utf-8',
148
+ });
149
+ if (result.status !== 0)
150
+ return null;
151
+ return result.stdout;
152
+ }
153
+ catch {
154
+ return null;
155
+ }
156
+ }
157
+ /**
158
+ * List files in a directory on the messages branch
159
+ */
160
+ listFromBranch(path) {
161
+ try {
162
+ const result = spawnSync('git', ['ls-tree', '--name-only', `${MESSAGES_BRANCH}`, path + '/'], {
163
+ cwd: this.basePath,
164
+ encoding: 'utf-8',
165
+ });
166
+ if (result.status !== 0)
167
+ return [];
168
+ return result.stdout
169
+ .trim()
170
+ .split('\n')
171
+ .filter(line => line && line.endsWith('.json'));
172
+ }
173
+ catch {
174
+ return [];
175
+ }
176
+ }
177
+ /**
178
+ * Write a file to the messages branch
179
+ */
180
+ async writeToBranch(path, content) {
181
+ const currentBranch = execSync('git rev-parse --abbrev-ref HEAD', {
182
+ cwd: this.basePath,
183
+ encoding: 'utf-8',
184
+ }).trim();
185
+ // Stash any uncommitted changes
186
+ let hasStash = false;
187
+ try {
188
+ const stashResult = execSync('git stash', {
189
+ cwd: this.basePath,
190
+ encoding: 'utf-8',
191
+ });
192
+ hasStash = !stashResult.includes('No local changes');
193
+ }
194
+ catch {
195
+ // No changes to stash
196
+ }
197
+ try {
198
+ // Checkout messages branch
199
+ execSync(`git checkout ${MESSAGES_BRANCH}`, {
200
+ cwd: this.basePath,
201
+ stdio: 'ignore',
202
+ });
203
+ // Ensure directory exists
204
+ const dir = path.substring(0, path.lastIndexOf('/'));
205
+ execSync(`mkdir -p ${dir}`, {
206
+ cwd: this.basePath,
207
+ stdio: 'ignore',
208
+ shell: '/bin/bash',
209
+ });
210
+ // Write file using echo with proper escaping
211
+ const escapedContent = content.replace(/'/g, "'\\''");
212
+ execSync(`echo '${escapedContent}' > ${path}`, {
213
+ cwd: this.basePath,
214
+ stdio: 'ignore',
215
+ shell: '/bin/bash',
216
+ });
217
+ // Commit
218
+ execSync(`git add ${path}`, {
219
+ cwd: this.basePath,
220
+ stdio: 'ignore',
221
+ });
222
+ execSync(`git commit -m "Add message: ${path}"`, {
223
+ cwd: this.basePath,
224
+ stdio: 'ignore',
225
+ });
226
+ // Try to push if remote exists
227
+ try {
228
+ execSync('git push origin spidersan/messages 2>/dev/null', {
229
+ cwd: this.basePath,
230
+ stdio: 'ignore',
231
+ shell: '/bin/bash',
232
+ });
233
+ }
234
+ catch {
235
+ // No remote or push failed - that's okay
236
+ }
237
+ return true;
238
+ }
239
+ finally {
240
+ // Return to original branch
241
+ execSync(`git checkout ${currentBranch}`, {
242
+ cwd: this.basePath,
243
+ stdio: 'ignore',
244
+ });
245
+ // Restore stash if we had one
246
+ if (hasStash) {
247
+ try {
248
+ execSync('git stash pop', {
249
+ cwd: this.basePath,
250
+ stdio: 'ignore',
251
+ });
252
+ }
253
+ catch {
254
+ // Stash pop failed - might have conflicts
255
+ }
256
+ }
257
+ }
258
+ }
259
+ /**
260
+ * Update a file on the messages branch (for marking read)
261
+ */
262
+ async updateOnBranch(path, content) {
263
+ return this.writeToBranch(path, content);
264
+ }
265
+ async send(input) {
266
+ await this.ensureBranch();
267
+ const message = {
268
+ id: generateMessageId(),
269
+ from: input.from,
270
+ to: input.to,
271
+ subject: input.subject,
272
+ body: input.body,
273
+ timestamp: new Date(),
274
+ type: input.type || 'info',
275
+ encrypted: input.encrypted || false,
276
+ read: false,
277
+ branch: input.branch,
278
+ files: input.files,
279
+ };
280
+ const filename = this.generateFilename(message, true);
281
+ const inboxPath = `inbox/${message.to}/${filename}`;
282
+ const outboxPath = `outbox/${message.from}/${filename}`;
283
+ const content = JSON.stringify(message, null, 2);
284
+ // Write to recipient's inbox
285
+ await this.writeToBranch(inboxPath, content);
286
+ // Write to sender's outbox (same content)
287
+ await this.writeToBranch(outboxPath, content);
288
+ return message;
289
+ }
290
+ async inbox(agentId, options = {}) {
291
+ await this.ensureBranch();
292
+ // Try to pull latest if remote exists
293
+ try {
294
+ execSync('git fetch origin spidersan/messages:spidersan/messages 2>/dev/null', {
295
+ cwd: this.basePath,
296
+ stdio: 'ignore',
297
+ shell: '/bin/bash',
298
+ });
299
+ }
300
+ catch {
301
+ // No remote or fetch failed
302
+ }
303
+ const files = this.listFromBranch(`inbox/${agentId}`);
304
+ const messages = [];
305
+ for (const file of files) {
306
+ const content = this.readFromBranch(`inbox/${agentId}/${file}`);
307
+ if (content) {
308
+ try {
309
+ const msg = JSON.parse(content);
310
+ msg.timestamp = new Date(msg.timestamp);
311
+ messages.push(msg);
312
+ }
313
+ catch {
314
+ // Skip invalid JSON
315
+ }
316
+ }
317
+ }
318
+ // Sort by timestamp descending
319
+ messages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
320
+ let result = messages;
321
+ if (options.unread) {
322
+ result = result.filter(msg => !msg.read);
323
+ }
324
+ if (options.limit && options.limit > 0) {
325
+ result = result.slice(0, options.limit);
326
+ }
327
+ return result;
328
+ }
329
+ async read(messageId) {
330
+ await this.ensureBranch();
331
+ // We need to search through all inbox directories
332
+ // This is inefficient but necessary without an index
333
+ try {
334
+ const result = spawnSync('git', ['ls-tree', '-r', '--name-only', MESSAGES_BRANCH, 'inbox/'], {
335
+ cwd: this.basePath,
336
+ encoding: 'utf-8',
337
+ });
338
+ if (result.status !== 0)
339
+ return null;
340
+ const files = result.stdout.trim().split('\n').filter(Boolean);
341
+ for (const file of files) {
342
+ const content = this.readFromBranch(file);
343
+ if (content) {
344
+ try {
345
+ const msg = JSON.parse(content);
346
+ if (msg.id === messageId) {
347
+ msg.timestamp = new Date(msg.timestamp);
348
+ return msg;
349
+ }
350
+ }
351
+ catch {
352
+ // Skip invalid JSON
353
+ }
354
+ }
355
+ }
356
+ }
357
+ catch {
358
+ // Error listing files
359
+ }
360
+ return null;
361
+ }
362
+ async markRead(messageId) {
363
+ const message = await this.read(messageId);
364
+ if (!message)
365
+ return false;
366
+ message.read = true;
367
+ const filename = this.generateFilename(message, true);
368
+ const inboxPath = `inbox/${message.to}/${filename}`;
369
+ return this.updateOnBranch(inboxPath, JSON.stringify(message, null, 2));
370
+ }
371
+ }
372
+ //# sourceMappingURL=git-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-messages.js","sourceRoot":"","sources":["../../src/storage/git-messages.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,9 @@ export * from './adapter.js';
2
2
  export * from './local.js';
3
3
  export * from './supabase.js';
4
4
  export * from './factory.js';
5
+ export * from './message-adapter.js';
6
+ export * from './local-messages.js';
7
+ export * from './git-messages.js';
8
+ export * from './mycmail-adapter.js';
9
+ export * from './message-factory.js';
5
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAG7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC"}
@@ -1,5 +1,12 @@
1
+ // Branch storage adapters
1
2
  export * from './adapter.js';
2
3
  export * from './local.js';
3
4
  export * from './supabase.js';
4
5
  export * from './factory.js';
6
+ // Message storage adapters (tiered fallback)
7
+ export * from './message-adapter.js';
8
+ export * from './local-messages.js';
9
+ export * from './git-messages.js';
10
+ export * from './mycmail-adapter.js';
11
+ export * from './message-factory.js';
5
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAE7B,6CAA6C;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Local JSON Message Storage Adapter (Tier 3)
3
+ *
4
+ * Stores messages in .spidersan/messages.json
5
+ * This is the fallback when git and mycmail are unavailable.
6
+ * Single-machine only - no cross-agent coordination.
7
+ */
8
+ import type { MessageStorageAdapter, Message, SendMessageInput, InboxOptions, TierStatus } from './message-adapter.js';
9
+ export declare class LocalMessagesAdapter implements MessageStorageAdapter {
10
+ private basePath;
11
+ private messagesPath;
12
+ constructor(basePath?: string);
13
+ getTier(): number;
14
+ getTierName(): string;
15
+ isAvailable(): Promise<boolean>;
16
+ getStatus(): Promise<TierStatus>;
17
+ private ensureDir;
18
+ private load;
19
+ private save;
20
+ send(input: SendMessageInput): Promise<Message>;
21
+ inbox(agentId: string, options?: InboxOptions): Promise<Message[]>;
22
+ read(messageId: string): Promise<Message | null>;
23
+ markRead(messageId: string): Promise<boolean>;
24
+ /**
25
+ * Get sent messages (outbox) for an agent
26
+ */
27
+ outbox(agentId: string, options?: InboxOptions): Promise<Message[]>;
28
+ /**
29
+ * Delete a message
30
+ */
31
+ delete(messageId: string): Promise<boolean>;
32
+ /**
33
+ * Clean up old messages
34
+ */
35
+ cleanup(olderThan: Date): Promise<number>;
36
+ }
37
+ //# sourceMappingURL=local-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-messages.d.ts","sourceRoot":"","sources":["../../src/storage/local-messages.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EACR,qBAAqB,EACrB,OAAO,EACP,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACb,MAAM,sBAAsB,CAAC;AAW9B,qBAAa,oBAAqB,YAAW,qBAAqB;IAC9D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAK5C,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;IAIf,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAK/B,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;YASxB,SAAS;YAOT,IAAI;YAeJ,IAAI;IAKZ,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAmBtE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAMhD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAanD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAe7E;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAajD;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAelD"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Local JSON Message Storage Adapter (Tier 3)
3
+ *
4
+ * Stores messages in .spidersan/messages.json
5
+ * This is the fallback when git and mycmail are unavailable.
6
+ * Single-machine only - no cross-agent coordination.
7
+ */
8
+ import { readFile, writeFile, mkdir } from 'fs/promises';
9
+ import { existsSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { generateMessageId } from './message-adapter.js';
12
+ const SPIDERSAN_DIR = '.spidersan';
13
+ const MESSAGES_FILE = 'messages.json';
14
+ export class LocalMessagesAdapter {
15
+ basePath;
16
+ messagesPath;
17
+ constructor(basePath = process.cwd()) {
18
+ this.basePath = basePath;
19
+ this.messagesPath = join(basePath, SPIDERSAN_DIR, MESSAGES_FILE);
20
+ }
21
+ getTier() {
22
+ return 3;
23
+ }
24
+ getTierName() {
25
+ return 'local-json';
26
+ }
27
+ async isAvailable() {
28
+ // Local storage is always available
29
+ return true;
30
+ }
31
+ async getStatus() {
32
+ return {
33
+ tier: 3,
34
+ name: this.getTierName(),
35
+ available: true,
36
+ reason: 'Local JSON storage is always available',
37
+ };
38
+ }
39
+ async ensureDir() {
40
+ const dir = join(this.basePath, SPIDERSAN_DIR);
41
+ if (!existsSync(dir)) {
42
+ await mkdir(dir, { recursive: true });
43
+ }
44
+ }
45
+ async load() {
46
+ try {
47
+ const data = await readFile(this.messagesPath, 'utf-8');
48
+ const registry = JSON.parse(data);
49
+ // Convert timestamp strings back to Date objects
50
+ registry.messages = registry.messages.map(msg => ({
51
+ ...msg,
52
+ timestamp: new Date(msg.timestamp),
53
+ }));
54
+ return registry;
55
+ }
56
+ catch {
57
+ return { version: '1.0', messages: [] };
58
+ }
59
+ }
60
+ async save(registry) {
61
+ await this.ensureDir();
62
+ await writeFile(this.messagesPath, JSON.stringify(registry, null, 2));
63
+ }
64
+ async send(input) {
65
+ const registry = await this.load();
66
+ const message = {
67
+ id: generateMessageId(),
68
+ from: input.from,
69
+ to: input.to,
70
+ subject: input.subject,
71
+ body: input.body,
72
+ timestamp: new Date(),
73
+ type: input.type || 'info',
74
+ encrypted: input.encrypted || false,
75
+ read: false,
76
+ branch: input.branch,
77
+ files: input.files,
78
+ };
79
+ registry.messages.push(message);
80
+ await this.save(registry);
81
+ return message;
82
+ }
83
+ async inbox(agentId, options = {}) {
84
+ const registry = await this.load();
85
+ let messages = registry.messages.filter(msg => msg.to === agentId);
86
+ // Sort by timestamp descending (newest first)
87
+ messages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
88
+ if (options.unread) {
89
+ messages = messages.filter(msg => !msg.read);
90
+ }
91
+ if (options.limit && options.limit > 0) {
92
+ messages = messages.slice(0, options.limit);
93
+ }
94
+ return messages;
95
+ }
96
+ async read(messageId) {
97
+ const registry = await this.load();
98
+ const message = registry.messages.find(msg => msg.id === messageId);
99
+ return message || null;
100
+ }
101
+ async markRead(messageId) {
102
+ const registry = await this.load();
103
+ const message = registry.messages.find(msg => msg.id === messageId);
104
+ if (!message) {
105
+ return false;
106
+ }
107
+ message.read = true;
108
+ await this.save(registry);
109
+ return true;
110
+ }
111
+ /**
112
+ * Get sent messages (outbox) for an agent
113
+ */
114
+ async outbox(agentId, options = {}) {
115
+ const registry = await this.load();
116
+ let messages = registry.messages.filter(msg => msg.from === agentId);
117
+ // Sort by timestamp descending (newest first)
118
+ messages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
119
+ if (options.limit && options.limit > 0) {
120
+ messages = messages.slice(0, options.limit);
121
+ }
122
+ return messages;
123
+ }
124
+ /**
125
+ * Delete a message
126
+ */
127
+ async delete(messageId) {
128
+ const registry = await this.load();
129
+ const index = registry.messages.findIndex(msg => msg.id === messageId);
130
+ if (index === -1) {
131
+ return false;
132
+ }
133
+ registry.messages.splice(index, 1);
134
+ await this.save(registry);
135
+ return true;
136
+ }
137
+ /**
138
+ * Clean up old messages
139
+ */
140
+ async cleanup(olderThan) {
141
+ const registry = await this.load();
142
+ const originalCount = registry.messages.length;
143
+ registry.messages = registry.messages.filter(msg => msg.timestamp >= olderThan);
144
+ const removed = originalCount - registry.messages.length;
145
+ if (removed > 0) {
146
+ await this.save(registry);
147
+ }
148
+ return removed;
149
+ }
150
+ }
151
+ //# sourceMappingURL=local-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-messages.js","sourceRoot":"","sources":["../../src/storage/local-messages.ts"],"names":[],"mappings":"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"}