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.
- package/CHANGELOG.md +42 -52
- package/README.md +238 -3
- package/dist/bin/spidersan.d.ts.map +1 -1
- package/dist/bin/spidersan.js +13 -1
- package/dist/bin/spidersan.js.map +1 -1
- package/dist/commands/abandon.d.ts.map +1 -1
- package/dist/commands/abandon.js +1 -9
- package/dist/commands/abandon.js.map +1 -1
- package/dist/commands/ai.d.ts +15 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +498 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/auto.d.ts.map +1 -1
- package/dist/commands/auto.js +2 -1
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/bot.d.ts +16 -0
- package/dist/commands/bot.d.ts.map +1 -0
- package/dist/commands/bot.js +398 -0
- package/dist/commands/bot.js.map +1 -0
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +260 -277
- package/dist/commands/conflicts.js.map +1 -1
- package/dist/commands/context.d.ts +8 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +104 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/cross-conflicts.d.ts.map +1 -1
- package/dist/commands/cross-conflicts.js +1 -41
- package/dist/commands/cross-conflicts.js.map +1 -1
- package/dist/commands/depends.d.ts.map +1 -1
- package/dist/commands/depends.js +1 -9
- package/dist/commands/depends.js.map +1 -1
- package/dist/commands/fleet-status.d.ts +14 -0
- package/dist/commands/fleet-status.d.ts.map +1 -0
- package/dist/commands/fleet-status.js +127 -0
- package/dist/commands/fleet-status.js.map +1 -0
- package/dist/commands/git-watch.d.ts +24 -0
- package/dist/commands/git-watch.d.ts.map +1 -0
- package/dist/commands/git-watch.js +84 -0
- package/dist/commands/git-watch.js.map +1 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +7 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/merge-order.d.ts.map +1 -1
- package/dist/commands/merge-order.js +18 -67
- package/dist/commands/merge-order.js.map +1 -1
- package/dist/commands/merged.d.ts.map +1 -1
- package/dist/commands/merged.js +1 -9
- package/dist/commands/merged.js.map +1 -1
- package/dist/commands/pulse.d.ts.map +1 -1
- package/dist/commands/pulse.js +134 -63
- package/dist/commands/pulse.js.map +1 -1
- package/dist/commands/queen.d.ts.map +1 -1
- package/dist/commands/queen.js +11 -7
- package/dist/commands/queen.js.map +1 -1
- package/dist/commands/ready-check.d.ts +2 -1
- package/dist/commands/ready-check.d.ts.map +1 -1
- package/dist/commands/ready-check.js +6 -30
- package/dist/commands/ready-check.js.map +1 -1
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +7 -29
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/torrent.d.ts.map +1 -1
- package/dist/commands/torrent.js +29 -18
- package/dist/commands/torrent.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +13 -34
- package/dist/commands/watch.js.map +1 -1
- package/dist/lib/ai/context-builder.d.ts +16 -0
- package/dist/lib/ai/context-builder.d.ts.map +1 -0
- package/dist/lib/ai/context-builder.js +216 -0
- package/dist/lib/ai/context-builder.js.map +1 -0
- package/dist/lib/ai/event-handler.d.ts +21 -0
- package/dist/lib/ai/event-handler.d.ts.map +1 -0
- package/dist/lib/ai/event-handler.js +98 -0
- package/dist/lib/ai/event-handler.js.map +1 -0
- package/dist/lib/ai/index.d.ts +13 -0
- package/dist/lib/ai/index.d.ts.map +1 -0
- package/dist/lib/ai/index.js +11 -0
- package/dist/lib/ai/index.js.map +1 -0
- package/dist/lib/ai/llm-client.d.ts +37 -0
- package/dist/lib/ai/llm-client.d.ts.map +1 -0
- package/dist/lib/ai/llm-client.js +225 -0
- package/dist/lib/ai/llm-client.js.map +1 -0
- package/dist/lib/ai/reasoner.d.ts +11 -0
- package/dist/lib/ai/reasoner.d.ts.map +1 -0
- package/dist/lib/ai/reasoner.js +246 -0
- package/dist/lib/ai/reasoner.js.map +1 -0
- package/dist/lib/ai/setup.d.ts +40 -0
- package/dist/lib/ai/setup.d.ts.map +1 -0
- package/dist/lib/ai/setup.js +154 -0
- package/dist/lib/ai/setup.js.map +1 -0
- package/dist/lib/ai/types.d.ts +135 -0
- package/dist/lib/ai/types.d.ts.map +1 -0
- package/dist/lib/ai/types.js +39 -0
- package/dist/lib/ai/types.js.map +1 -0
- package/dist/lib/colony-subscriber.d.ts +15 -12
- package/dist/lib/colony-subscriber.d.ts.map +1 -1
- package/dist/lib/colony-subscriber.js +146 -65
- package/dist/lib/colony-subscriber.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +18 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/conflict-analyzer.d.ts +33 -0
- package/dist/lib/conflict-analyzer.d.ts.map +1 -0
- package/dist/lib/conflict-analyzer.js +114 -0
- package/dist/lib/conflict-analyzer.js.map +1 -0
- package/dist/lib/conflict-renderer.d.ts +7 -0
- package/dist/lib/conflict-renderer.d.ts.map +1 -0
- package/dist/lib/conflict-renderer.js +162 -0
- package/dist/lib/conflict-renderer.js.map +1 -0
- package/dist/lib/conflict-tier.d.ts +20 -0
- package/dist/lib/conflict-tier.d.ts.map +1 -0
- package/dist/lib/conflict-tier.js +49 -0
- package/dist/lib/conflict-tier.js.map +1 -0
- package/dist/lib/crypto.js +1 -1
- package/dist/lib/crypto.js.map +1 -1
- package/dist/lib/git-events-subscriber.d.ts +59 -0
- package/dist/lib/git-events-subscriber.d.ts.map +1 -0
- package/dist/lib/git-events-subscriber.js +779 -0
- package/dist/lib/git-events-subscriber.js.map +1 -0
- package/dist/lib/git.d.ts +15 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +180 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/github.js +14 -9
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/graph.d.ts +23 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +134 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/hub.d.ts +31 -0
- package/dist/lib/hub.d.ts.map +1 -0
- package/dist/lib/hub.js +92 -0
- package/dist/lib/hub.js.map +1 -0
- package/dist/lib/remote-drift.d.ts +60 -0
- package/dist/lib/remote-drift.d.ts.map +1 -0
- package/dist/lib/remote-drift.js +225 -0
- package/dist/lib/remote-drift.js.map +1 -0
- package/dist/lib/salvage-analyzer.d.ts.map +1 -1
- package/dist/lib/salvage-analyzer.js +2 -3
- package/dist/lib/salvage-analyzer.js.map +1 -1
- package/dist/lib/security.d.ts +11 -0
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +24 -1
- package/dist/lib/security.js.map +1 -1
- package/dist/lib/session-logger.d.ts +54 -0
- package/dist/lib/session-logger.d.ts.map +1 -0
- package/dist/lib/session-logger.js +136 -0
- package/dist/lib/session-logger.js.map +1 -0
- package/dist/storage/adapter.d.ts +4 -0
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/branch-registry-store.d.ts +13 -0
- package/dist/storage/branch-registry-store.d.ts.map +1 -0
- package/dist/storage/branch-registry-store.js +2 -0
- package/dist/storage/branch-registry-store.js.map +1 -0
- package/dist/storage/factory.d.ts +4 -0
- package/dist/storage/factory.d.ts.map +1 -1
- package/dist/storage/factory.js +25 -9
- package/dist/storage/factory.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 +376 -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 +5 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/json-branch-registry-store.d.ts +19 -0
- package/dist/storage/json-branch-registry-store.d.ts.map +1 -0
- package/dist/storage/json-branch-registry-store.js +112 -0
- package/dist/storage/json-branch-registry-store.js.map +1 -0
- 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/local.d.ts +2 -6
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +13 -76
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/memory-branch-registry-store.d.ts +16 -0
- package/dist/storage/memory-branch-registry-store.d.ts.map +1 -0
- package/dist/storage/memory-branch-registry-store.js +65 -0
- package/dist/storage/memory-branch-registry-store.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 +300 -0
- package/dist/storage/mycmail-adapter.js.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts +46 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.js +322 -0
- package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -0
- package/dist/storage/supabase-registry-sync-client.d.ts +9 -0
- package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -0
- package/dist/storage/supabase-registry-sync-client.js +2 -0
- package/dist/storage/supabase-registry-sync-client.js.map +1 -0
- package/dist/storage/supabase.d.ts +8 -46
- package/dist/storage/supabase.d.ts.map +1 -1
- package/dist/storage/supabase.js +30 -342
- package/dist/storage/supabase.js.map +1 -1
- package/dist/tui/screen.d.ts.map +1 -1
- package/dist/tui/screen.js +5 -3
- package/dist/tui/screen.js.map +1 -1
- 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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"}
|
package/dist/storage/local.d.ts
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Local JSON Storage Adapter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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
|
|
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
|
|
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"}
|
package/dist/storage/local.js
CHANGED
|
@@ -1,103 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Local JSON Storage Adapter
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* This is the default free-tier storage.
|
|
4
|
+
* Thin compatibility wrapper over JsonBranchRegistryStore.
|
|
6
5
|
*/
|
|
7
|
-
import {
|
|
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
|
-
|
|
15
|
-
registryPath;
|
|
8
|
+
store;
|
|
16
9
|
constructor(basePath = process.cwd()) {
|
|
17
|
-
this.
|
|
18
|
-
this.registryPath = join(basePath, SPIDERSAN_DIR, REGISTRY_FILE);
|
|
10
|
+
this.store = new JsonBranchRegistryStore(basePath);
|
|
19
11
|
}
|
|
20
12
|
async init() {
|
|
21
|
-
|
|
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
|
|
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
|
-
|
|
46
|
-
return Object.values(registry.branches);
|
|
19
|
+
return this.store.list();
|
|
47
20
|
}
|
|
48
21
|
async register(branch) {
|
|
49
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
80
|
-
return registry.branches[name] || null;
|
|
31
|
+
return this.store.get(name);
|
|
81
32
|
}
|
|
82
33
|
async findByFiles(files) {
|
|
83
|
-
|
|
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
|
-
|
|
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":"AAAA
|
|
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":"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"}
|
|
@@ -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"}
|