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.
- package/CHANGELOG.md +25 -10
- package/LICENSE.md +3 -77
- package/README.md +49 -76
- package/dist/bin/spidersan.d.ts.map +1 -1
- package/dist/bin/spidersan.js +16 -93
- 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/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +0 -8
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/ecosystem-loader.d.ts +14 -0
- package/dist/commands/ecosystem-loader.d.ts.map +1 -0
- package/dist/commands/ecosystem-loader.js +78 -0
- package/dist/commands/ecosystem-loader.js.map +1 -0
- 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 +2 -32
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -52
- 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/register.d.ts.map +1 -1
- package/dist/commands/register.js +0 -6
- package/dist/commands/register.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/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- 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 +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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"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/storage/index.js
CHANGED
|
@@ -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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,aAAa,GAAG,YAAY,CAAC;AACnC,MAAM,aAAa,GAAG,eAAe,CAAC;AAOtC,MAAM,OAAO,oBAAoB;IACrB,QAAQ,CAAS;IACjB,YAAY,CAAS;IAE7B,YAAY,WAAmB,OAAO,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACH,OAAO,CAAC,CAAC;IACb,CAAC;IAED,WAAW;QACP,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,WAAW;QACb,oCAAoC;QACpC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,SAAS;QACX,OAAO;YACH,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,wCAAwC;SACnD,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,SAAS;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,IAAI;QACd,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC;YACtD,iDAAiD;YACjD,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC9C,GAAG,GAAG;gBACN,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;aACrC,CAAC,CAAC,CAAC;YACJ,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC5C,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,QAA0B;QACzC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAuB;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEnC,MAAM,OAAO,GAAY;YACrB,EAAE,EAAE,iBAAiB,EAAE;YACvB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK;YACnC,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;SACrB,CAAC;QAEF,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1B,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,UAAwB,EAAE;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QAEnE,8CAA8C;QAC9C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAEvE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACrC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACpE,OAAO,OAAO,IAAI,IAAI,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAEpE,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,UAAwB,EAAE;QACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAErE,8CAA8C;QAC9C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAEvE,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACrC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAEvE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,SAAe;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE/C,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CACxC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,SAAS,CACpC,CAAC;QAEF,MAAM,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
|