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,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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"}
@@ -1,18 +1,14 @@
1
1
  /**
2
2
  * Local JSON Storage Adapter
3
3
  *
4
- * Stores branch registry in .spidersan/registry.json
5
- * This is the default free-tier storage.
4
+ * Thin compatibility wrapper over JsonBranchRegistryStore.
6
5
  */
7
6
  import type { StorageAdapter, Branch } from './adapter.js';
8
7
  export declare class LocalStorage implements StorageAdapter {
9
- private basePath;
10
- private registryPath;
8
+ private store;
11
9
  constructor(basePath?: string);
12
10
  init(): Promise<void>;
13
11
  isInitialized(): Promise<boolean>;
14
- private load;
15
- private save;
16
12
  list(): Promise<Branch[]>;
17
13
  register(branch: Omit<Branch, 'registeredAt'>): Promise<Branch>;
18
14
  update(name: string, updates: Partial<Branch>): Promise<Branch | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AAM3E,qBAAa,YAAa,YAAW,cAAc;IAC/C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,QAAQ,GAAE,MAAsB;IAKtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAUrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;YAIzB,IAAI;YASJ,IAAI;IAIZ,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAW/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAatE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1C,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;IAS/C,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAgBpD"}
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3D,qBAAa,YAAa,YAAW,cAAc;IAC/C,OAAO,CAAC,KAAK,CAA0B;gBAE3B,QAAQ,GAAE,MAAsB;IAItC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAItE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIzC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI/C,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAGpD"}
@@ -1,103 +1,40 @@
1
1
  /**
2
2
  * Local JSON Storage Adapter
3
3
  *
4
- * Stores branch registry in .spidersan/registry.json
5
- * This is the default free-tier storage.
4
+ * Thin compatibility wrapper over JsonBranchRegistryStore.
6
5
  */
7
- import { readFile, writeFile, mkdir } from 'fs/promises';
8
- import { existsSync } from 'fs';
9
- import { join } from 'path';
10
- const SPIDERSAN_DIR = '.spidersan';
11
- const REGISTRY_FILE = 'registry.json';
12
- const REGISTRY_VERSION = '1.0';
6
+ import { JsonBranchRegistryStore } from './json-branch-registry-store.js';
13
7
  export class LocalStorage {
14
- basePath;
15
- registryPath;
8
+ store;
16
9
  constructor(basePath = process.cwd()) {
17
- this.basePath = basePath;
18
- this.registryPath = join(basePath, SPIDERSAN_DIR, REGISTRY_FILE);
10
+ this.store = new JsonBranchRegistryStore(basePath);
19
11
  }
20
12
  async init() {
21
- const dir = join(this.basePath, SPIDERSAN_DIR);
22
- if (!existsSync(dir)) {
23
- await mkdir(dir, { recursive: true });
24
- }
25
- if (!existsSync(this.registryPath)) {
26
- await this.save({ branches: {}, version: REGISTRY_VERSION });
27
- }
13
+ await this.store.init();
28
14
  }
29
15
  async isInitialized() {
30
- return existsSync(this.registryPath);
31
- }
32
- async load() {
33
- try {
34
- const data = await readFile(this.registryPath, 'utf-8');
35
- return JSON.parse(data);
36
- }
37
- catch {
38
- return { branches: {}, version: REGISTRY_VERSION };
39
- }
40
- }
41
- async save(registry) {
42
- await writeFile(this.registryPath, JSON.stringify(registry, null, 2));
16
+ return this.store.isInitialized();
43
17
  }
44
18
  async list() {
45
- const registry = await this.load();
46
- return Object.values(registry.branches);
19
+ return this.store.list();
47
20
  }
48
21
  async register(branch) {
49
- const registry = await this.load();
50
- const newBranch = {
51
- ...branch,
52
- registeredAt: new Date(),
53
- };
54
- registry.branches[branch.name] = newBranch;
55
- await this.save(registry);
56
- return newBranch;
22
+ return this.store.register(branch);
57
23
  }
58
24
  async update(name, updates) {
59
- const registry = await this.load();
60
- if (!registry.branches[name])
61
- return null;
62
- registry.branches[name] = {
63
- ...registry.branches[name],
64
- ...updates,
65
- name, // ensure name doesn't change
66
- };
67
- await this.save(registry);
68
- return registry.branches[name];
25
+ return this.store.update(name, updates);
69
26
  }
70
27
  async unregister(name) {
71
- const registry = await this.load();
72
- if (!registry.branches[name])
73
- return false;
74
- delete registry.branches[name];
75
- await this.save(registry);
76
- return true;
28
+ return this.store.unregister(name);
77
29
  }
78
30
  async get(name) {
79
- const registry = await this.load();
80
- return registry.branches[name] || null;
31
+ return this.store.get(name);
81
32
  }
82
33
  async findByFiles(files) {
83
- const branches = await this.list();
84
- // Performance: Convert array to Set outside the loop to reduce O(N*M) to O(N+M)
85
- const fileSet = new Set(files);
86
- return branches.filter(branch => branch.files.some(file => fileSet.has(file)));
34
+ return this.store.findByFiles(files);
87
35
  }
88
36
  async cleanup(olderThan) {
89
- const registry = await this.load();
90
- const removedNames = [];
91
- for (const [name, branch] of Object.entries(registry.branches)) {
92
- if (new Date(branch.registeredAt) < olderThan) {
93
- delete registry.branches[name];
94
- removedNames.push(name);
95
- }
96
- }
97
- if (removedNames.length > 0) {
98
- await this.save(registry);
99
- }
100
- return removedNames;
37
+ return this.store.cleanup(olderThan);
101
38
  }
102
39
  }
103
40
  //# sourceMappingURL=local.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,MAAM,OAAO,YAAY;IACb,KAAK,CAA0B;IAEvC,YAAY,WAAmB,OAAO,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,aAAa;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAoC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,OAAwB;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAe;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAe;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;CACJ"}
@@ -0,0 +1,16 @@
1
+ import type { Branch } from './adapter.js';
2
+ import type { BranchRegistryStore } from './branch-registry-store.js';
3
+ export declare class MemoryBranchRegistryStore implements BranchRegistryStore {
4
+ private initialized;
5
+ private branches;
6
+ init(): Promise<void>;
7
+ isInitialized(): Promise<boolean>;
8
+ list(): Promise<Branch[]>;
9
+ register(branch: Omit<Branch, 'registeredAt'>): Promise<Branch>;
10
+ update(name: string, updates: Partial<Branch>): Promise<Branch | null>;
11
+ unregister(name: string): Promise<boolean>;
12
+ get(name: string): Promise<Branch | null>;
13
+ findByFiles(files: string[]): Promise<Branch[]>;
14
+ cleanup(olderThan: Date): Promise<string[]>;
15
+ }
16
+ //# sourceMappingURL=memory-branch-registry-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-branch-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/memory-branch-registry-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAUtE,qBAAa,yBAA0B,YAAW,mBAAmB;IACjE,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAA6B;IAEvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAS/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;IAI1C,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;IAO/C,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAUpD"}
@@ -0,0 +1,65 @@
1
+ function cloneBranch(branch) {
2
+ return {
3
+ ...branch,
4
+ files: [...branch.files],
5
+ registeredAt: new Date(branch.registeredAt),
6
+ };
7
+ }
8
+ export class MemoryBranchRegistryStore {
9
+ initialized = false;
10
+ branches = new Map();
11
+ async init() {
12
+ this.initialized = true;
13
+ }
14
+ async isInitialized() {
15
+ return this.initialized;
16
+ }
17
+ async list() {
18
+ return Array.from(this.branches.values()).map(cloneBranch);
19
+ }
20
+ async register(branch) {
21
+ const created = {
22
+ ...branch,
23
+ registeredAt: new Date(),
24
+ };
25
+ this.branches.set(branch.name, created);
26
+ return cloneBranch(created);
27
+ }
28
+ async update(name, updates) {
29
+ const existing = this.branches.get(name);
30
+ if (!existing) {
31
+ return null;
32
+ }
33
+ const updated = {
34
+ ...existing,
35
+ ...updates,
36
+ name,
37
+ };
38
+ this.branches.set(name, updated);
39
+ return cloneBranch(updated);
40
+ }
41
+ async unregister(name) {
42
+ return this.branches.delete(name);
43
+ }
44
+ async get(name) {
45
+ const branch = this.branches.get(name);
46
+ return branch ? cloneBranch(branch) : null;
47
+ }
48
+ async findByFiles(files) {
49
+ const fileSet = new Set(files);
50
+ return Array.from(this.branches.values())
51
+ .filter((branch) => branch.files.some((file) => fileSet.has(file)))
52
+ .map(cloneBranch);
53
+ }
54
+ async cleanup(olderThan) {
55
+ const removed = [];
56
+ for (const [name, branch] of this.branches.entries()) {
57
+ if (branch.registeredAt < olderThan) {
58
+ this.branches.delete(name);
59
+ removed.push(name);
60
+ }
61
+ }
62
+ return removed;
63
+ }
64
+ }
65
+ //# sourceMappingURL=memory-branch-registry-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-branch-registry-store.js","sourceRoot":"","sources":["../../src/storage/memory-branch-registry-store.ts"],"names":[],"mappings":"AAGA,SAAS,WAAW,CAAC,MAAc;IAC/B,OAAO;QACH,GAAG,MAAM;QACT,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACxB,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;KAC9C,CAAC;AACN,CAAC;AAED,MAAM,OAAO,yBAAyB;IAC1B,WAAW,GAAG,KAAK,CAAC;IACpB,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,KAAK,CAAC,IAAI;QACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,aAAa;QACf,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAoC;QAC/C,MAAM,OAAO,GAAW;YACpB,GAAG,MAAM;YACT,YAAY,EAAE,IAAI,IAAI,EAAE;SAC3B,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,OAAwB;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAW;YACpB,GAAG,QAAQ;YACX,GAAG,OAAO;YACV,IAAI;SACP,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAe;QAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;aACpC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;aAClE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAe;QACzB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACnD,IAAI,MAAM,CAAC,YAAY,GAAG,SAAS,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Message Storage Adapter Interface
3
+ *
4
+ * Abstract interface for tiered message storage.
5
+ * Implementations:
6
+ * Tier 1: MycmailAdapter (real-time, full features via Supabase)
7
+ * Tier 2: GitMessagesAdapter (git orphan branch coordination)
8
+ * Tier 3: LocalMessagesAdapter (single-machine fallback)
9
+ */
10
+ export type MessageType = 'info' | 'question' | 'alert' | 'handoff' | 'file_share';
11
+ export interface Message {
12
+ id: string;
13
+ from: string;
14
+ to: string;
15
+ subject: string;
16
+ body: string;
17
+ timestamp: Date;
18
+ type: MessageType;
19
+ encrypted: boolean;
20
+ read: boolean;
21
+ branch?: string;
22
+ files?: string[];
23
+ }
24
+ export interface SendMessageInput {
25
+ from: string;
26
+ to: string;
27
+ subject: string;
28
+ body: string;
29
+ type?: MessageType;
30
+ encrypted?: boolean;
31
+ branch?: string;
32
+ files?: string[];
33
+ }
34
+ export interface InboxOptions {
35
+ unread?: boolean;
36
+ limit?: number;
37
+ }
38
+ export interface TierStatus {
39
+ tier: number;
40
+ name: string;
41
+ available: boolean;
42
+ reason?: string;
43
+ }
44
+ export interface MessageStorageAdapter {
45
+ /**
46
+ * Get the tier number (1 = highest priority, 3 = lowest)
47
+ */
48
+ getTier(): number;
49
+ /**
50
+ * Get the human-readable tier name
51
+ */
52
+ getTierName(): string;
53
+ /**
54
+ * Check if this storage backend is available
55
+ */
56
+ isAvailable(): Promise<boolean>;
57
+ /**
58
+ * Get detailed availability status
59
+ */
60
+ getStatus(): Promise<TierStatus>;
61
+ /**
62
+ * Send a message
63
+ */
64
+ send(message: SendMessageInput): Promise<Message>;
65
+ /**
66
+ * Get inbox messages for an agent
67
+ */
68
+ inbox(agentId: string, options?: InboxOptions): Promise<Message[]>;
69
+ /**
70
+ * Read a specific message by ID
71
+ */
72
+ read(messageId: string): Promise<Message | null>;
73
+ /**
74
+ * Mark a message as read
75
+ */
76
+ markRead(messageId: string): Promise<boolean>;
77
+ }
78
+ /**
79
+ * Generate a unique message ID
80
+ */
81
+ export declare function generateMessageId(): string;
82
+ /**
83
+ * Create a slug from subject for file naming
84
+ */
85
+ export declare function subjectToSlug(subject: string): string;
86
+ //# sourceMappingURL=message-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/message-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;AAEnF,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,OAAO,IAAI,MAAM,CAAC;IAElB;;OAEG;IACH,WAAW,IAAI,MAAM,CAAC;IAEtB;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAElD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnE;;OAEG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAEjD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrD"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Message Storage Adapter Interface
3
+ *
4
+ * Abstract interface for tiered message storage.
5
+ * Implementations:
6
+ * Tier 1: MycmailAdapter (real-time, full features via Supabase)
7
+ * Tier 2: GitMessagesAdapter (git orphan branch coordination)
8
+ * Tier 3: LocalMessagesAdapter (single-machine fallback)
9
+ */
10
+ /**
11
+ * Generate a unique message ID
12
+ */
13
+ export function generateMessageId() {
14
+ const timestamp = Date.now().toString(36);
15
+ const random = Math.random().toString(36).substring(2, 8);
16
+ return `msg_${timestamp}_${random}`;
17
+ }
18
+ /**
19
+ * Create a slug from subject for file naming
20
+ */
21
+ export function subjectToSlug(subject) {
22
+ return subject
23
+ .toLowerCase()
24
+ .replace(/[^a-z0-9]+/g, '-')
25
+ .replace(/^-|-$/g, '')
26
+ .substring(0, 30);
27
+ }
28
+ //# sourceMappingURL=message-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-adapter.js","sourceRoot":"","sources":["../../src/storage/message-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmFH;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,SAAS,IAAI,MAAM,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IACzC,OAAO,OAAO;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Message Storage Factory - Tiered Selection Logic
3
+ *
4
+ * Selects the best available message storage backend:
5
+ * Tier 1: Mycmail/Supabase (real-time, full features)
6
+ * Tier 2: Git coordination branch (near-real-time on pull)
7
+ * Tier 3: Local JSON (single-machine only)
8
+ */
9
+ import type { MessageStorageAdapter, TierStatus } from './message-adapter.js';
10
+ export interface MessageStorageOptions {
11
+ /** Force a specific tier (1, 2, or 3) */
12
+ forceTier?: number;
13
+ /** Agent ID for mycmail */
14
+ agentId?: string;
15
+ /** Base path for git/local storage */
16
+ basePath?: string;
17
+ /** Enable verbose logging */
18
+ verbose?: boolean;
19
+ }
20
+ /**
21
+ * Get the best available message storage adapter
22
+ */
23
+ export declare function getMessageStorage(options?: MessageStorageOptions): Promise<MessageStorageAdapter>;
24
+ /**
25
+ * Get status of all message storage tiers
26
+ */
27
+ export declare function getAllTierStatus(options?: MessageStorageOptions): Promise<TierStatus[]>;
28
+ /**
29
+ * Print tier status to console
30
+ */
31
+ export declare function printTierStatus(options?: MessageStorageOptions): Promise<void>;
32
+ /**
33
+ * Parse tier option from command line
34
+ */
35
+ export declare function parseTierOption(tierArg: string | undefined): number | undefined;
36
+ //# sourceMappingURL=message-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-factory.d.ts","sourceRoot":"","sources":["../../src/storage/message-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IAClC,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACnC,OAAO,GAAE,qBAA0B,GACpC,OAAO,CAAC,qBAAqB,CAAC,CAmChC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAClC,OAAO,GAAE,qBAA0B,GACpC,OAAO,CAAC,UAAU,EAAE,CAAC,CAcvB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACjC,OAAO,GAAE,qBAA0B,GACpC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAU/E"}