spidersan 0.6.0 → 0.9.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 (214) hide show
  1. package/CHANGELOG.md +42 -52
  2. package/README.md +238 -3
  3. package/dist/bin/spidersan.d.ts.map +1 -1
  4. package/dist/bin/spidersan.js +13 -1
  5. package/dist/bin/spidersan.js.map +1 -1
  6. package/dist/commands/abandon.d.ts.map +1 -1
  7. package/dist/commands/abandon.js +1 -9
  8. package/dist/commands/abandon.js.map +1 -1
  9. package/dist/commands/ai.d.ts +15 -0
  10. package/dist/commands/ai.d.ts.map +1 -0
  11. package/dist/commands/ai.js +498 -0
  12. package/dist/commands/ai.js.map +1 -0
  13. package/dist/commands/auto.d.ts.map +1 -1
  14. package/dist/commands/auto.js +2 -1
  15. package/dist/commands/auto.js.map +1 -1
  16. package/dist/commands/bot.d.ts +16 -0
  17. package/dist/commands/bot.d.ts.map +1 -0
  18. package/dist/commands/bot.js +398 -0
  19. package/dist/commands/bot.js.map +1 -0
  20. package/dist/commands/conflicts.d.ts.map +1 -1
  21. package/dist/commands/conflicts.js +260 -277
  22. package/dist/commands/conflicts.js.map +1 -1
  23. package/dist/commands/context.d.ts +8 -0
  24. package/dist/commands/context.d.ts.map +1 -0
  25. package/dist/commands/context.js +104 -0
  26. package/dist/commands/context.js.map +1 -0
  27. package/dist/commands/cross-conflicts.d.ts.map +1 -1
  28. package/dist/commands/cross-conflicts.js +1 -41
  29. package/dist/commands/cross-conflicts.js.map +1 -1
  30. package/dist/commands/depends.d.ts.map +1 -1
  31. package/dist/commands/depends.js +1 -9
  32. package/dist/commands/depends.js.map +1 -1
  33. package/dist/commands/fleet-status.d.ts +14 -0
  34. package/dist/commands/fleet-status.d.ts.map +1 -0
  35. package/dist/commands/fleet-status.js +127 -0
  36. package/dist/commands/fleet-status.js.map +1 -0
  37. package/dist/commands/git-watch.d.ts +24 -0
  38. package/dist/commands/git-watch.d.ts.map +1 -0
  39. package/dist/commands/git-watch.js +84 -0
  40. package/dist/commands/git-watch.js.map +1 -0
  41. package/dist/commands/index.d.ts +5 -0
  42. package/dist/commands/index.d.ts.map +1 -1
  43. package/dist/commands/index.js +7 -0
  44. package/dist/commands/index.js.map +1 -1
  45. package/dist/commands/merge-order.d.ts.map +1 -1
  46. package/dist/commands/merge-order.js +18 -67
  47. package/dist/commands/merge-order.js.map +1 -1
  48. package/dist/commands/merged.d.ts.map +1 -1
  49. package/dist/commands/merged.js +1 -9
  50. package/dist/commands/merged.js.map +1 -1
  51. package/dist/commands/pulse.d.ts.map +1 -1
  52. package/dist/commands/pulse.js +134 -63
  53. package/dist/commands/pulse.js.map +1 -1
  54. package/dist/commands/queen.d.ts.map +1 -1
  55. package/dist/commands/queen.js +11 -7
  56. package/dist/commands/queen.js.map +1 -1
  57. package/dist/commands/ready-check.d.ts +2 -1
  58. package/dist/commands/ready-check.d.ts.map +1 -1
  59. package/dist/commands/ready-check.js +6 -30
  60. package/dist/commands/ready-check.js.map +1 -1
  61. package/dist/commands/register.d.ts.map +1 -1
  62. package/dist/commands/register.js +7 -29
  63. package/dist/commands/register.js.map +1 -1
  64. package/dist/commands/torrent.d.ts.map +1 -1
  65. package/dist/commands/torrent.js +29 -18
  66. package/dist/commands/torrent.js.map +1 -1
  67. package/dist/commands/watch.d.ts.map +1 -1
  68. package/dist/commands/watch.js +13 -34
  69. package/dist/commands/watch.js.map +1 -1
  70. package/dist/lib/ai/context-builder.d.ts +16 -0
  71. package/dist/lib/ai/context-builder.d.ts.map +1 -0
  72. package/dist/lib/ai/context-builder.js +216 -0
  73. package/dist/lib/ai/context-builder.js.map +1 -0
  74. package/dist/lib/ai/event-handler.d.ts +21 -0
  75. package/dist/lib/ai/event-handler.d.ts.map +1 -0
  76. package/dist/lib/ai/event-handler.js +98 -0
  77. package/dist/lib/ai/event-handler.js.map +1 -0
  78. package/dist/lib/ai/index.d.ts +13 -0
  79. package/dist/lib/ai/index.d.ts.map +1 -0
  80. package/dist/lib/ai/index.js +11 -0
  81. package/dist/lib/ai/index.js.map +1 -0
  82. package/dist/lib/ai/llm-client.d.ts +37 -0
  83. package/dist/lib/ai/llm-client.d.ts.map +1 -0
  84. package/dist/lib/ai/llm-client.js +225 -0
  85. package/dist/lib/ai/llm-client.js.map +1 -0
  86. package/dist/lib/ai/reasoner.d.ts +11 -0
  87. package/dist/lib/ai/reasoner.d.ts.map +1 -0
  88. package/dist/lib/ai/reasoner.js +246 -0
  89. package/dist/lib/ai/reasoner.js.map +1 -0
  90. package/dist/lib/ai/setup.d.ts +40 -0
  91. package/dist/lib/ai/setup.d.ts.map +1 -0
  92. package/dist/lib/ai/setup.js +154 -0
  93. package/dist/lib/ai/setup.js.map +1 -0
  94. package/dist/lib/ai/types.d.ts +135 -0
  95. package/dist/lib/ai/types.d.ts.map +1 -0
  96. package/dist/lib/ai/types.js +39 -0
  97. package/dist/lib/ai/types.js.map +1 -0
  98. package/dist/lib/colony-subscriber.d.ts +15 -12
  99. package/dist/lib/colony-subscriber.d.ts.map +1 -1
  100. package/dist/lib/colony-subscriber.js +146 -65
  101. package/dist/lib/colony-subscriber.js.map +1 -1
  102. package/dist/lib/config.d.ts.map +1 -1
  103. package/dist/lib/config.js +18 -4
  104. package/dist/lib/config.js.map +1 -1
  105. package/dist/lib/conflict-analyzer.d.ts +33 -0
  106. package/dist/lib/conflict-analyzer.d.ts.map +1 -0
  107. package/dist/lib/conflict-analyzer.js +114 -0
  108. package/dist/lib/conflict-analyzer.js.map +1 -0
  109. package/dist/lib/conflict-renderer.d.ts +7 -0
  110. package/dist/lib/conflict-renderer.d.ts.map +1 -0
  111. package/dist/lib/conflict-renderer.js +162 -0
  112. package/dist/lib/conflict-renderer.js.map +1 -0
  113. package/dist/lib/conflict-tier.d.ts +20 -0
  114. package/dist/lib/conflict-tier.d.ts.map +1 -0
  115. package/dist/lib/conflict-tier.js +49 -0
  116. package/dist/lib/conflict-tier.js.map +1 -0
  117. package/dist/lib/crypto.js +1 -1
  118. package/dist/lib/crypto.js.map +1 -1
  119. package/dist/lib/git-events-subscriber.d.ts +59 -0
  120. package/dist/lib/git-events-subscriber.d.ts.map +1 -0
  121. package/dist/lib/git-events-subscriber.js +779 -0
  122. package/dist/lib/git-events-subscriber.js.map +1 -0
  123. package/dist/lib/git.d.ts +15 -0
  124. package/dist/lib/git.d.ts.map +1 -0
  125. package/dist/lib/git.js +180 -0
  126. package/dist/lib/git.js.map +1 -0
  127. package/dist/lib/github.d.ts.map +1 -1
  128. package/dist/lib/github.js +14 -9
  129. package/dist/lib/github.js.map +1 -1
  130. package/dist/lib/graph.d.ts +23 -0
  131. package/dist/lib/graph.d.ts.map +1 -0
  132. package/dist/lib/graph.js +134 -0
  133. package/dist/lib/graph.js.map +1 -0
  134. package/dist/lib/hub.d.ts +31 -0
  135. package/dist/lib/hub.d.ts.map +1 -0
  136. package/dist/lib/hub.js +92 -0
  137. package/dist/lib/hub.js.map +1 -0
  138. package/dist/lib/remote-drift.d.ts +60 -0
  139. package/dist/lib/remote-drift.d.ts.map +1 -0
  140. package/dist/lib/remote-drift.js +225 -0
  141. package/dist/lib/remote-drift.js.map +1 -0
  142. package/dist/lib/salvage-analyzer.d.ts.map +1 -1
  143. package/dist/lib/salvage-analyzer.js +2 -3
  144. package/dist/lib/salvage-analyzer.js.map +1 -1
  145. package/dist/lib/security.d.ts +11 -0
  146. package/dist/lib/security.d.ts.map +1 -1
  147. package/dist/lib/security.js +24 -1
  148. package/dist/lib/security.js.map +1 -1
  149. package/dist/lib/session-logger.d.ts +54 -0
  150. package/dist/lib/session-logger.d.ts.map +1 -0
  151. package/dist/lib/session-logger.js +136 -0
  152. package/dist/lib/session-logger.js.map +1 -0
  153. package/dist/storage/adapter.d.ts +4 -0
  154. package/dist/storage/adapter.d.ts.map +1 -1
  155. package/dist/storage/branch-registry-store.d.ts +13 -0
  156. package/dist/storage/branch-registry-store.d.ts.map +1 -0
  157. package/dist/storage/branch-registry-store.js +2 -0
  158. package/dist/storage/branch-registry-store.js.map +1 -0
  159. package/dist/storage/factory.d.ts +4 -0
  160. package/dist/storage/factory.d.ts.map +1 -1
  161. package/dist/storage/factory.js +25 -9
  162. package/dist/storage/factory.js.map +1 -1
  163. package/dist/storage/git-messages.d.ts +53 -0
  164. package/dist/storage/git-messages.d.ts.map +1 -0
  165. package/dist/storage/git-messages.js +376 -0
  166. package/dist/storage/git-messages.js.map +1 -0
  167. package/dist/storage/index.d.ts +5 -0
  168. package/dist/storage/index.d.ts.map +1 -1
  169. package/dist/storage/index.js +5 -0
  170. package/dist/storage/index.js.map +1 -1
  171. package/dist/storage/json-branch-registry-store.d.ts +19 -0
  172. package/dist/storage/json-branch-registry-store.d.ts.map +1 -0
  173. package/dist/storage/json-branch-registry-store.js +112 -0
  174. package/dist/storage/json-branch-registry-store.js.map +1 -0
  175. package/dist/storage/local-messages.d.ts +37 -0
  176. package/dist/storage/local-messages.d.ts.map +1 -0
  177. package/dist/storage/local-messages.js +151 -0
  178. package/dist/storage/local-messages.js.map +1 -0
  179. package/dist/storage/local.d.ts +2 -6
  180. package/dist/storage/local.d.ts.map +1 -1
  181. package/dist/storage/local.js +13 -76
  182. package/dist/storage/local.js.map +1 -1
  183. package/dist/storage/memory-branch-registry-store.d.ts +16 -0
  184. package/dist/storage/memory-branch-registry-store.d.ts.map +1 -0
  185. package/dist/storage/memory-branch-registry-store.js +65 -0
  186. package/dist/storage/memory-branch-registry-store.js.map +1 -0
  187. package/dist/storage/message-adapter.d.ts +86 -0
  188. package/dist/storage/message-adapter.d.ts.map +1 -0
  189. package/dist/storage/message-adapter.js +28 -0
  190. package/dist/storage/message-adapter.js.map +1 -0
  191. package/dist/storage/message-factory.d.ts +36 -0
  192. package/dist/storage/message-factory.d.ts.map +1 -0
  193. package/dist/storage/message-factory.js +99 -0
  194. package/dist/storage/message-factory.js.map +1 -0
  195. package/dist/storage/mycmail-adapter.d.ts +38 -0
  196. package/dist/storage/mycmail-adapter.d.ts.map +1 -0
  197. package/dist/storage/mycmail-adapter.js +300 -0
  198. package/dist/storage/mycmail-adapter.js.map +1 -0
  199. package/dist/storage/supabase-registry-sync-client-impl.d.ts +46 -0
  200. package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
  201. package/dist/storage/supabase-registry-sync-client-impl.js +322 -0
  202. package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -0
  203. package/dist/storage/supabase-registry-sync-client.d.ts +9 -0
  204. package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -0
  205. package/dist/storage/supabase-registry-sync-client.js +2 -0
  206. package/dist/storage/supabase-registry-sync-client.js.map +1 -0
  207. package/dist/storage/supabase.d.ts +8 -46
  208. package/dist/storage/supabase.d.ts.map +1 -1
  209. package/dist/storage/supabase.js +30 -342
  210. package/dist/storage/supabase.js.map +1 -1
  211. package/dist/tui/screen.d.ts.map +1 -1
  212. package/dist/tui/screen.js +5 -3
  213. package/dist/tui/screen.js.map +1 -1
  214. package/package.json +92 -90
@@ -0,0 +1,376 @@
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 { spawnSync, execFileSync } from 'child_process';
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+ import { generateMessageId, subjectToSlug } from './message-adapter.js';
15
+ import { validateAgentId } from '../lib/security.js';
16
+ const MESSAGES_BRANCH = 'spidersan/messages';
17
+ export class GitMessagesAdapter {
18
+ basePath;
19
+ branchInitialized = null;
20
+ constructor(basePath = process.cwd()) {
21
+ this.basePath = basePath;
22
+ }
23
+ getTier() {
24
+ return 2;
25
+ }
26
+ getTierName() {
27
+ return 'git-coordination-branch';
28
+ }
29
+ async isAvailable() {
30
+ // Check if we're in a git repository
31
+ try {
32
+ execFileSync('git', ['rev-parse', '--git-dir'], {
33
+ cwd: this.basePath,
34
+ stdio: 'ignore',
35
+ });
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ async getStatus() {
43
+ const available = await this.isAvailable();
44
+ return {
45
+ tier: 2,
46
+ name: this.getTierName(),
47
+ available,
48
+ reason: available
49
+ ? 'Git repository detected'
50
+ : 'Not in a git repository',
51
+ };
52
+ }
53
+ /**
54
+ * Check if the messages branch exists
55
+ */
56
+ branchExists() {
57
+ try {
58
+ execFileSync('git', ['rev-parse', '--verify', MESSAGES_BRANCH], {
59
+ cwd: this.basePath,
60
+ stdio: 'ignore',
61
+ });
62
+ return true;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ /**
69
+ * Initialize the orphan branch if it doesn't exist
70
+ */
71
+ async ensureBranch() {
72
+ if (this.branchInitialized)
73
+ return;
74
+ if (!this.branchExists()) {
75
+ // Create orphan branch with an initial commit
76
+ const currentBranch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
77
+ cwd: this.basePath,
78
+ encoding: 'utf-8',
79
+ }).trim();
80
+ try {
81
+ // Create orphan branch
82
+ execFileSync('git', ['checkout', '--orphan', MESSAGES_BRANCH], {
83
+ cwd: this.basePath,
84
+ stdio: 'ignore',
85
+ });
86
+ // Remove all files from index
87
+ try {
88
+ execFileSync('git', ['rm', '-rf', '.'], {
89
+ cwd: this.basePath,
90
+ stdio: 'ignore',
91
+ });
92
+ }
93
+ catch {
94
+ // Ignore if nothing to remove
95
+ }
96
+ // Create initial structure
97
+ const inboxDir = path.join(this.basePath, 'inbox');
98
+ const outboxDir = path.join(this.basePath, 'outbox');
99
+ fs.mkdirSync(inboxDir, { recursive: true });
100
+ fs.mkdirSync(outboxDir, { recursive: true });
101
+ // Create .gitkeep files
102
+ fs.writeFileSync(path.join(inboxDir, '.gitkeep'), '');
103
+ fs.writeFileSync(path.join(outboxDir, '.gitkeep'), '');
104
+ execFileSync('git', ['add', 'inbox/.gitkeep', 'outbox/.gitkeep'], {
105
+ cwd: this.basePath,
106
+ stdio: 'ignore',
107
+ });
108
+ execFileSync('git', ['commit', '-m', 'Initialize spidersan messages branch'], {
109
+ cwd: this.basePath,
110
+ stdio: 'ignore',
111
+ });
112
+ // Return to original branch
113
+ execFileSync('git', ['checkout', currentBranch], {
114
+ cwd: this.basePath,
115
+ stdio: 'ignore',
116
+ });
117
+ }
118
+ catch (error) {
119
+ // Try to recover to original branch
120
+ try {
121
+ execFileSync('git', ['checkout', currentBranch], {
122
+ cwd: this.basePath,
123
+ stdio: 'ignore',
124
+ });
125
+ }
126
+ catch {
127
+ // Ignore recovery errors
128
+ }
129
+ throw error;
130
+ }
131
+ }
132
+ this.branchInitialized = true;
133
+ }
134
+ /**
135
+ * Generate filename for a message
136
+ */
137
+ generateFilename(message, isInbox) {
138
+ const timestamp = message.timestamp.getTime();
139
+ const otherAgent = isInbox ? message.from : message.to;
140
+ const slug = subjectToSlug(message.subject);
141
+ return `${timestamp}_${otherAgent}_${slug}.json`;
142
+ }
143
+ /**
144
+ * Read a file from the messages branch without checkout
145
+ */
146
+ readFromBranch(path) {
147
+ try {
148
+ const result = spawnSync('git', ['show', `${MESSAGES_BRANCH}:${path}`], {
149
+ cwd: this.basePath,
150
+ encoding: 'utf-8',
151
+ });
152
+ if (result.status !== 0)
153
+ return null;
154
+ return result.stdout;
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ }
160
+ /**
161
+ * List files in a directory on the messages branch
162
+ */
163
+ listFromBranch(path) {
164
+ try {
165
+ const result = spawnSync('git', ['ls-tree', '--name-only', `${MESSAGES_BRANCH}`, path + '/'], {
166
+ cwd: this.basePath,
167
+ encoding: 'utf-8',
168
+ });
169
+ if (result.status !== 0)
170
+ return [];
171
+ return result.stdout
172
+ .trim()
173
+ .split('\n')
174
+ .filter(line => line && line.endsWith('.json'));
175
+ }
176
+ catch {
177
+ return [];
178
+ }
179
+ }
180
+ /**
181
+ * Write a file to the messages branch
182
+ */
183
+ async writeToBranch(filePath, content) {
184
+ const currentBranch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
185
+ cwd: this.basePath,
186
+ encoding: 'utf-8',
187
+ }).trim();
188
+ // Stash any uncommitted changes
189
+ let hasStash = false;
190
+ try {
191
+ const stashResult = execFileSync('git', ['stash'], {
192
+ cwd: this.basePath,
193
+ encoding: 'utf-8',
194
+ });
195
+ hasStash = !stashResult.includes('No local changes');
196
+ }
197
+ catch {
198
+ // No changes to stash
199
+ }
200
+ try {
201
+ // Checkout messages branch
202
+ execFileSync('git', ['checkout', MESSAGES_BRANCH], {
203
+ cwd: this.basePath,
204
+ stdio: 'ignore',
205
+ });
206
+ // Ensure directory exists
207
+ const fullPath = path.join(this.basePath, filePath);
208
+ const dir = path.dirname(fullPath);
209
+ // Security: Use fs module instead of shell commands to prevent injection
210
+ fs.mkdirSync(dir, { recursive: true });
211
+ // Write file directly using fs
212
+ fs.writeFileSync(fullPath, content, { encoding: 'utf-8' });
213
+ // Commit
214
+ execFileSync('git', ['add', filePath], {
215
+ cwd: this.basePath,
216
+ stdio: 'ignore',
217
+ });
218
+ execFileSync('git', ['commit', '-m', `Add message: ${filePath}`], {
219
+ cwd: this.basePath,
220
+ stdio: 'ignore',
221
+ });
222
+ // Try to push if remote exists
223
+ try {
224
+ execFileSync('git', ['push', 'origin', 'spidersan/messages'], {
225
+ cwd: this.basePath,
226
+ stdio: 'ignore',
227
+ });
228
+ }
229
+ catch {
230
+ // No remote or push failed - that's okay
231
+ }
232
+ return true;
233
+ }
234
+ finally {
235
+ // Return to original branch
236
+ try {
237
+ // Security: Use execFileSync to prevent command injection from branch name
238
+ execFileSync('git', ['checkout', currentBranch], {
239
+ cwd: this.basePath,
240
+ stdio: 'ignore',
241
+ });
242
+ }
243
+ catch {
244
+ // Ignore recovery errors
245
+ }
246
+ // Restore stash if we had one
247
+ if (hasStash) {
248
+ try {
249
+ execFileSync('git', ['stash', 'pop'], {
250
+ cwd: this.basePath,
251
+ stdio: 'ignore',
252
+ });
253
+ }
254
+ catch {
255
+ // Stash pop failed - might have conflicts
256
+ }
257
+ }
258
+ }
259
+ }
260
+ /**
261
+ * Update a file on the messages branch (for marking read)
262
+ */
263
+ async updateOnBranch(path, content) {
264
+ return this.writeToBranch(path, content);
265
+ }
266
+ async send(input) {
267
+ await this.ensureBranch();
268
+ // Security: Validate agent IDs to prevent path traversal/injection
269
+ validateAgentId(input.from);
270
+ validateAgentId(input.to);
271
+ const message = {
272
+ id: generateMessageId(),
273
+ from: input.from,
274
+ to: input.to,
275
+ subject: input.subject,
276
+ body: input.body,
277
+ timestamp: new Date(),
278
+ type: input.type || 'info',
279
+ encrypted: input.encrypted || false,
280
+ read: false,
281
+ branch: input.branch,
282
+ files: input.files,
283
+ };
284
+ const filename = this.generateFilename(message, true);
285
+ const inboxPath = `inbox/${message.to}/${filename}`;
286
+ const outboxPath = `outbox/${message.from}/${filename}`;
287
+ const content = JSON.stringify(message, null, 2);
288
+ // Write to recipient's inbox
289
+ await this.writeToBranch(inboxPath, content);
290
+ // Write to sender's outbox (same content)
291
+ await this.writeToBranch(outboxPath, content);
292
+ return message;
293
+ }
294
+ async inbox(agentId, options = {}) {
295
+ validateAgentId(agentId);
296
+ await this.ensureBranch();
297
+ // Try to pull latest if remote exists
298
+ try {
299
+ execFileSync('git', ['fetch', 'origin', 'spidersan/messages:spidersan/messages'], {
300
+ cwd: this.basePath,
301
+ stdio: 'ignore',
302
+ });
303
+ }
304
+ catch {
305
+ // No remote or fetch failed
306
+ }
307
+ const files = this.listFromBranch(`inbox/${agentId}`);
308
+ const messages = [];
309
+ for (const file of files) {
310
+ const content = this.readFromBranch(file);
311
+ if (content) {
312
+ try {
313
+ const msg = JSON.parse(content);
314
+ msg.timestamp = new Date(msg.timestamp);
315
+ messages.push(msg);
316
+ }
317
+ catch {
318
+ // Skip invalid JSON
319
+ }
320
+ }
321
+ }
322
+ // Sort by timestamp descending
323
+ messages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
324
+ let result = messages;
325
+ if (options.unread) {
326
+ result = result.filter(msg => !msg.read);
327
+ }
328
+ if (options.limit && options.limit > 0) {
329
+ result = result.slice(0, options.limit);
330
+ }
331
+ return result;
332
+ }
333
+ async read(messageId) {
334
+ await this.ensureBranch();
335
+ // We need to search through all inbox directories
336
+ // This is inefficient but necessary without an index
337
+ try {
338
+ const result = spawnSync('git', ['ls-tree', '-r', '--name-only', MESSAGES_BRANCH, 'inbox/'], {
339
+ cwd: this.basePath,
340
+ encoding: 'utf-8',
341
+ });
342
+ if (result.status !== 0)
343
+ return null;
344
+ const files = result.stdout.trim().split('\n').filter(Boolean);
345
+ for (const file of files) {
346
+ const content = this.readFromBranch(file);
347
+ if (content) {
348
+ try {
349
+ const msg = JSON.parse(content);
350
+ if (msg.id === messageId) {
351
+ msg.timestamp = new Date(msg.timestamp);
352
+ return msg;
353
+ }
354
+ }
355
+ catch {
356
+ // Skip invalid JSON
357
+ }
358
+ }
359
+ }
360
+ }
361
+ catch {
362
+ // Error listing files
363
+ }
364
+ return null;
365
+ }
366
+ async markRead(messageId) {
367
+ const message = await this.read(messageId);
368
+ if (!message)
369
+ return false;
370
+ message.read = true;
371
+ const filename = this.generateFilename(message, true);
372
+ const inboxPath = `inbox/${message.to}/${filename}`;
373
+ return this.updateOnBranch(inboxPath, JSON.stringify(message, null, 2));
374
+ }
375
+ }
376
+ //# 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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"}
@@ -1,5 +1,10 @@
1
1
  export * from './adapter.js';
2
+ export * from './branch-registry-store.js';
2
3
  export * from './local.js';
4
+ export * from './json-branch-registry-store.js';
5
+ export * from './memory-branch-registry-store.js';
3
6
  export * from './supabase.js';
7
+ export * from './supabase-registry-sync-client.js';
8
+ export * from './supabase-registry-sync-client-impl.js';
4
9
  export * from './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":"AACA,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,4BAA4B,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,eAAe,CAAC;AAC9B,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,cAAc,CAAC"}
@@ -1,6 +1,11 @@
1
1
  // Branch storage adapters
2
2
  export * from './adapter.js';
3
+ export * from './branch-registry-store.js';
3
4
  export * from './local.js';
5
+ export * from './json-branch-registry-store.js';
6
+ export * from './memory-branch-registry-store.js';
4
7
  export * from './supabase.js';
8
+ export * from './supabase-registry-sync-client.js';
9
+ export * from './supabase-registry-sync-client-impl.js';
5
10
  export * from './factory.js';
6
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,eAAe,CAAC;AAC9B,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Branch } from './adapter.js';
2
+ import type { BranchRegistryStore } from './branch-registry-store.js';
3
+ export declare class JsonBranchRegistryStore implements BranchRegistryStore {
4
+ private basePath;
5
+ private registryPath;
6
+ constructor(basePath?: string);
7
+ init(): Promise<void>;
8
+ isInitialized(): Promise<boolean>;
9
+ list(): Promise<Branch[]>;
10
+ register(branch: Omit<Branch, 'registeredAt'>): Promise<Branch>;
11
+ update(name: string, updates: Partial<Branch>): Promise<Branch | null>;
12
+ unregister(name: string): Promise<boolean>;
13
+ get(name: string): Promise<Branch | null>;
14
+ findByFiles(files: string[]): Promise<Branch[]>;
15
+ cleanup(olderThan: Date): Promise<string[]>;
16
+ private load;
17
+ private save;
18
+ }
19
+ //# sourceMappingURL=json-branch-registry-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/json-branch-registry-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AA6BtE,qBAAa,uBAAwB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAKtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAetE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM/C,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAkBnC,IAAI;YASJ,IAAI;CAGrB"}
@@ -0,0 +1,112 @@
1
+ import { existsSync } from 'fs';
2
+ import { mkdir, readFile, writeFile } from 'fs/promises';
3
+ import { join } from 'path';
4
+ const SPIDERSAN_DIR = '.spidersan';
5
+ const REGISTRY_FILE = 'registry.json';
6
+ const REGISTRY_VERSION = '1.0';
7
+ function normalizeBranch(branch) {
8
+ return {
9
+ ...branch,
10
+ registeredAt: branch.registeredAt instanceof Date
11
+ ? branch.registeredAt
12
+ : new Date(branch.registeredAt),
13
+ };
14
+ }
15
+ function normalizeRegistry(registry) {
16
+ return {
17
+ ...registry,
18
+ branches: Object.fromEntries(Object.entries(registry.branches).map(([name, branch]) => [name, normalizeBranch(branch)])),
19
+ };
20
+ }
21
+ export class JsonBranchRegistryStore {
22
+ basePath;
23
+ registryPath;
24
+ constructor(basePath = process.cwd()) {
25
+ this.basePath = basePath;
26
+ this.registryPath = join(basePath, SPIDERSAN_DIR, REGISTRY_FILE);
27
+ }
28
+ async init() {
29
+ const dir = join(this.basePath, SPIDERSAN_DIR);
30
+ if (!existsSync(dir)) {
31
+ await mkdir(dir, { recursive: true });
32
+ }
33
+ if (!existsSync(this.registryPath)) {
34
+ await this.save({ branches: {}, version: REGISTRY_VERSION });
35
+ }
36
+ }
37
+ async isInitialized() {
38
+ return existsSync(this.registryPath);
39
+ }
40
+ async list() {
41
+ const registry = await this.load();
42
+ return Object.values(registry.branches);
43
+ }
44
+ async register(branch) {
45
+ const registry = await this.load();
46
+ const newBranch = {
47
+ ...branch,
48
+ registeredAt: new Date(),
49
+ };
50
+ registry.branches[branch.name] = newBranch;
51
+ await this.save(registry);
52
+ return newBranch;
53
+ }
54
+ async update(name, updates) {
55
+ const registry = await this.load();
56
+ if (!registry.branches[name]) {
57
+ return null;
58
+ }
59
+ registry.branches[name] = {
60
+ ...registry.branches[name],
61
+ ...updates,
62
+ name,
63
+ };
64
+ await this.save(registry);
65
+ return registry.branches[name];
66
+ }
67
+ async unregister(name) {
68
+ const registry = await this.load();
69
+ if (!registry.branches[name]) {
70
+ return false;
71
+ }
72
+ delete registry.branches[name];
73
+ await this.save(registry);
74
+ return true;
75
+ }
76
+ async get(name) {
77
+ const registry = await this.load();
78
+ return registry.branches[name] || null;
79
+ }
80
+ async findByFiles(files) {
81
+ const branches = await this.list();
82
+ const fileSet = new Set(files);
83
+ return branches.filter((branch) => branch.files.some((file) => fileSet.has(file)));
84
+ }
85
+ async cleanup(olderThan) {
86
+ const registry = await this.load();
87
+ const removedNames = [];
88
+ for (const [name, branch] of Object.entries(registry.branches)) {
89
+ if (branch.registeredAt < olderThan) {
90
+ delete registry.branches[name];
91
+ removedNames.push(name);
92
+ }
93
+ }
94
+ if (removedNames.length > 0) {
95
+ await this.save(registry);
96
+ }
97
+ return removedNames;
98
+ }
99
+ async load() {
100
+ try {
101
+ const data = await readFile(this.registryPath, 'utf-8');
102
+ return normalizeRegistry(JSON.parse(data));
103
+ }
104
+ catch {
105
+ return { branches: {}, version: REGISTRY_VERSION };
106
+ }
107
+ }
108
+ async save(registry) {
109
+ await writeFile(this.registryPath, JSON.stringify(registry, null, 2));
110
+ }
111
+ }
112
+ //# sourceMappingURL=json-branch-registry-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-branch-registry-store.js","sourceRoot":"","sources":["../../src/storage/json-branch-registry-store.ts"],"names":[],"mappings":"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"}
@@ -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"}