agent-relay 1.0.6 → 1.0.8
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/README.md +18 -6
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +344 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/agent-registry.d.ts +60 -0
- package/dist/daemon/agent-registry.d.ts.map +1 -0
- package/dist/daemon/agent-registry.js +158 -0
- package/dist/daemon/agent-registry.js.map +1 -0
- package/dist/daemon/connection.d.ts +11 -1
- package/dist/daemon/connection.d.ts.map +1 -1
- package/dist/daemon/connection.js +31 -2
- package/dist/daemon/connection.js.map +1 -1
- package/dist/daemon/index.d.ts +2 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +2 -0
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/registry.d.ts +9 -0
- package/dist/daemon/registry.d.ts.map +1 -0
- package/dist/daemon/registry.js +9 -0
- package/dist/daemon/registry.js.map +1 -0
- package/dist/daemon/router.d.ts +34 -2
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +111 -1
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts +1 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +60 -13
- package/dist/daemon/server.js.map +1 -1
- package/dist/dashboard/public/index.html +625 -16
- package/dist/dashboard/server.d.ts +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +125 -7
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/protocol/types.d.ts +15 -1
- package/dist/protocol/types.d.ts.map +1 -1
- package/dist/storage/adapter.d.ts +53 -0
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/adapter.js +3 -0
- package/dist/storage/adapter.js.map +1 -1
- package/dist/storage/sqlite-adapter.d.ts +58 -1
- package/dist/storage/sqlite-adapter.d.ts.map +1 -1
- package/dist/storage/sqlite-adapter.js +374 -47
- package/dist/storage/sqlite-adapter.js.map +1 -1
- package/dist/utils/project-namespace.d.ts.map +1 -1
- package/dist/utils/project-namespace.js +22 -1
- package/dist/utils/project-namespace.js.map +1 -1
- package/dist/wrapper/client.d.ts +22 -3
- package/dist/wrapper/client.d.ts.map +1 -1
- package/dist/wrapper/client.js +59 -9
- package/dist/wrapper/client.js.map +1 -1
- package/dist/wrapper/parser.d.ts +110 -4
- package/dist/wrapper/parser.d.ts.map +1 -1
- package/dist/wrapper/parser.js +296 -84
- package/dist/wrapper/parser.js.map +1 -1
- package/dist/wrapper/tmux-wrapper.d.ts +100 -9
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +441 -83
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/AGENTS.md +27 -27
- package/docs/CHANGELOG.md +1 -1
- package/docs/DESIGN_V2.md +1079 -0
- package/docs/INTEGRATION-GUIDE.md +926 -0
- package/docs/PROPOSAL-trajectories.md +1582 -0
- package/docs/PROTOCOL.md +3 -3
- package/docs/SCALING_ANALYSIS.md +280 -0
- package/docs/TMUX_IMPLEMENTATION_NOTES.md +9 -9
- package/docs/TMUX_IMPROVEMENTS.md +968 -0
- package/docs/competitive-analysis-mcp-agent-mail.md +389 -0
- package/package.json +6 -2
|
@@ -1,97 +1,266 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
2
1
|
import path from 'node:path';
|
|
3
2
|
import fs from 'node:fs';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
/** Default retention: 7 days */
|
|
5
|
+
const DEFAULT_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
|
|
6
|
+
/** Default cleanup interval: 1 hour */
|
|
7
|
+
const DEFAULT_CLEANUP_INTERVAL_MS = 60 * 60 * 1000;
|
|
4
8
|
export class SqliteStorageAdapter {
|
|
5
9
|
dbPath;
|
|
6
10
|
db;
|
|
7
11
|
insertStmt;
|
|
12
|
+
insertSessionStmt;
|
|
13
|
+
driver;
|
|
14
|
+
retentionMs;
|
|
15
|
+
cleanupIntervalMs;
|
|
16
|
+
cleanupTimer;
|
|
8
17
|
constructor(options) {
|
|
9
18
|
this.dbPath = options.dbPath;
|
|
19
|
+
this.retentionMs = options.messageRetentionMs ?? DEFAULT_RETENTION_MS;
|
|
20
|
+
this.cleanupIntervalMs = options.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS;
|
|
21
|
+
}
|
|
22
|
+
resolvePreferredDriver() {
|
|
23
|
+
const raw = process.env.AGENT_RELAY_SQLITE_DRIVER?.trim().toLowerCase();
|
|
24
|
+
if (!raw)
|
|
25
|
+
return undefined;
|
|
26
|
+
if (raw === 'node' || raw === 'node:sqlite' || raw === 'nodesqlite')
|
|
27
|
+
return 'node';
|
|
28
|
+
if (raw === 'better-sqlite3' || raw === 'better' || raw === 'bss')
|
|
29
|
+
return 'better-sqlite3';
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
async openDatabase(driver) {
|
|
33
|
+
if (driver === 'node') {
|
|
34
|
+
// Use require() to avoid toolchains that don't recognize node:sqlite yet (Vitest/Vite).
|
|
35
|
+
const require = createRequire(import.meta.url);
|
|
36
|
+
const mod = require('node:sqlite');
|
|
37
|
+
const db = new mod.DatabaseSync(this.dbPath);
|
|
38
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
39
|
+
return db;
|
|
40
|
+
}
|
|
41
|
+
const mod = await import('better-sqlite3');
|
|
42
|
+
const DatabaseCtor = mod.default ?? mod;
|
|
43
|
+
const db = new DatabaseCtor(this.dbPath);
|
|
44
|
+
if (typeof db.pragma === 'function') {
|
|
45
|
+
db.pragma('journal_mode = WAL');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
49
|
+
}
|
|
50
|
+
return db;
|
|
10
51
|
}
|
|
11
52
|
async init() {
|
|
12
53
|
const dir = path.dirname(this.dbPath);
|
|
13
54
|
if (!fs.existsSync(dir)) {
|
|
14
55
|
fs.mkdirSync(dir, { recursive: true });
|
|
15
56
|
}
|
|
16
|
-
|
|
17
|
-
|
|
57
|
+
const preferred = this.resolvePreferredDriver();
|
|
58
|
+
const attempts = preferred
|
|
59
|
+
? [preferred, preferred === 'better-sqlite3' ? 'node' : 'better-sqlite3']
|
|
60
|
+
: ['better-sqlite3', 'node'];
|
|
61
|
+
let lastError = null;
|
|
62
|
+
for (const driver of attempts) {
|
|
63
|
+
try {
|
|
64
|
+
this.db = await this.openDatabase(driver);
|
|
65
|
+
this.driver = driver;
|
|
66
|
+
lastError = null;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
lastError = err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!this.db) {
|
|
74
|
+
throw new Error(`Failed to initialize SQLite storage at ${this.dbPath}: ${lastError instanceof Error ? lastError.message : String(lastError)}`);
|
|
75
|
+
}
|
|
76
|
+
// Check if messages table exists for migration decisions
|
|
77
|
+
const messagesTableExists = this.db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='messages'").get();
|
|
78
|
+
if (!messagesTableExists) {
|
|
79
|
+
// Fresh install: create messages table with all columns
|
|
80
|
+
this.db.exec(`
|
|
81
|
+
CREATE TABLE messages (
|
|
82
|
+
id TEXT PRIMARY KEY,
|
|
83
|
+
ts INTEGER NOT NULL,
|
|
84
|
+
sender TEXT NOT NULL,
|
|
85
|
+
recipient TEXT NOT NULL,
|
|
86
|
+
topic TEXT,
|
|
87
|
+
kind TEXT NOT NULL,
|
|
88
|
+
body TEXT NOT NULL,
|
|
89
|
+
data TEXT,
|
|
90
|
+
thread TEXT,
|
|
91
|
+
delivery_seq INTEGER,
|
|
92
|
+
delivery_session_id TEXT,
|
|
93
|
+
session_id TEXT,
|
|
94
|
+
status TEXT NOT NULL DEFAULT 'unread',
|
|
95
|
+
is_urgent INTEGER NOT NULL DEFAULT 0
|
|
96
|
+
);
|
|
97
|
+
CREATE INDEX idx_messages_ts ON messages (ts);
|
|
98
|
+
CREATE INDEX idx_messages_sender ON messages (sender);
|
|
99
|
+
CREATE INDEX idx_messages_recipient ON messages (recipient);
|
|
100
|
+
CREATE INDEX idx_messages_topic ON messages (topic);
|
|
101
|
+
CREATE INDEX idx_messages_thread ON messages (thread);
|
|
102
|
+
CREATE INDEX idx_messages_status ON messages (status);
|
|
103
|
+
CREATE INDEX idx_messages_is_urgent ON messages (is_urgent);
|
|
104
|
+
`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Existing database: run migrations for missing columns
|
|
108
|
+
const columns = this.db.prepare("PRAGMA table_info(messages)").all();
|
|
109
|
+
const columnNames = new Set(columns.map(c => c.name));
|
|
110
|
+
if (!columnNames.has('thread')) {
|
|
111
|
+
this.db.exec('ALTER TABLE messages ADD COLUMN thread TEXT');
|
|
112
|
+
this.db.exec('CREATE INDEX IF NOT EXISTS idx_messages_thread ON messages (thread)');
|
|
113
|
+
}
|
|
114
|
+
if (!columnNames.has('status')) {
|
|
115
|
+
this.db.exec("ALTER TABLE messages ADD COLUMN status TEXT NOT NULL DEFAULT 'unread'");
|
|
116
|
+
this.db.exec('CREATE INDEX IF NOT EXISTS idx_messages_status ON messages (status)');
|
|
117
|
+
}
|
|
118
|
+
if (!columnNames.has('is_urgent')) {
|
|
119
|
+
this.db.exec("ALTER TABLE messages ADD COLUMN is_urgent INTEGER NOT NULL DEFAULT 0");
|
|
120
|
+
this.db.exec('CREATE INDEX IF NOT EXISTS idx_messages_is_urgent ON messages (is_urgent)');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Create sessions table (IF NOT EXISTS is safe here - no new columns to migrate)
|
|
18
124
|
this.db.exec(`
|
|
19
|
-
CREATE TABLE IF NOT EXISTS
|
|
125
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
20
126
|
id TEXT PRIMARY KEY,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
127
|
+
agent_name TEXT NOT NULL,
|
|
128
|
+
cli TEXT,
|
|
129
|
+
project_id TEXT,
|
|
130
|
+
project_root TEXT,
|
|
131
|
+
started_at INTEGER NOT NULL,
|
|
132
|
+
ended_at INTEGER,
|
|
133
|
+
message_count INTEGER DEFAULT 0,
|
|
134
|
+
summary TEXT,
|
|
135
|
+
closed_by TEXT
|
|
136
|
+
);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_agent ON sessions (agent_name);
|
|
138
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions (started_at);
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions (project_id);
|
|
140
|
+
`);
|
|
141
|
+
// Create agent_summaries table (IF NOT EXISTS is safe here - no new columns to migrate)
|
|
142
|
+
this.db.exec(`
|
|
143
|
+
CREATE TABLE IF NOT EXISTS agent_summaries (
|
|
144
|
+
agent_name TEXT PRIMARY KEY,
|
|
145
|
+
project_id TEXT,
|
|
146
|
+
last_updated INTEGER NOT NULL,
|
|
147
|
+
current_task TEXT,
|
|
148
|
+
completed_tasks TEXT,
|
|
149
|
+
decisions TEXT,
|
|
150
|
+
context TEXT,
|
|
151
|
+
files TEXT
|
|
31
152
|
);
|
|
32
|
-
CREATE INDEX IF NOT EXISTS
|
|
33
|
-
CREATE INDEX IF NOT EXISTS idx_messages_sender ON messages (sender);
|
|
34
|
-
CREATE INDEX IF NOT EXISTS idx_messages_recipient ON messages (recipient);
|
|
35
|
-
CREATE INDEX IF NOT EXISTS idx_messages_topic ON messages (topic);
|
|
153
|
+
CREATE INDEX IF NOT EXISTS idx_summaries_updated ON agent_summaries (last_updated);
|
|
36
154
|
`);
|
|
37
155
|
this.insertStmt = this.db.prepare(`
|
|
38
156
|
INSERT OR REPLACE INTO messages
|
|
39
|
-
(id, ts, sender, recipient, topic, kind, body, data, delivery_seq, delivery_session_id, session_id)
|
|
40
|
-
VALUES (
|
|
157
|
+
(id, ts, sender, recipient, topic, kind, body, data, thread, delivery_seq, delivery_session_id, session_id, status, is_urgent)
|
|
158
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
41
159
|
`);
|
|
160
|
+
// Start automatic cleanup if enabled
|
|
161
|
+
if (this.cleanupIntervalMs > 0) {
|
|
162
|
+
this.startCleanupTimer();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Start the automatic cleanup timer
|
|
167
|
+
*/
|
|
168
|
+
startCleanupTimer() {
|
|
169
|
+
// Run cleanup once at startup (async, don't block)
|
|
170
|
+
this.cleanupExpiredMessages().catch(() => { });
|
|
171
|
+
// Schedule periodic cleanup
|
|
172
|
+
this.cleanupTimer = setInterval(() => {
|
|
173
|
+
this.cleanupExpiredMessages().catch(() => { });
|
|
174
|
+
}, this.cleanupIntervalMs);
|
|
175
|
+
// Prevent timer from keeping process alive
|
|
176
|
+
if (this.cleanupTimer.unref) {
|
|
177
|
+
this.cleanupTimer.unref();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Clean up messages older than the retention period
|
|
182
|
+
* @returns Number of messages deleted
|
|
183
|
+
*/
|
|
184
|
+
async cleanupExpiredMessages() {
|
|
185
|
+
if (!this.db) {
|
|
186
|
+
return 0;
|
|
187
|
+
}
|
|
188
|
+
const cutoffTs = Date.now() - this.retentionMs;
|
|
189
|
+
const stmt = this.db.prepare('DELETE FROM messages WHERE ts < ?');
|
|
190
|
+
const result = stmt.run(cutoffTs);
|
|
191
|
+
const deleted = result.changes ?? 0;
|
|
192
|
+
if (deleted > 0) {
|
|
193
|
+
console.log(`[storage] Cleaned up ${deleted} expired messages (older than ${Math.round(this.retentionMs / 86400000)}d)`);
|
|
194
|
+
}
|
|
195
|
+
return deleted;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get storage statistics
|
|
199
|
+
*/
|
|
200
|
+
async getStats() {
|
|
201
|
+
if (!this.db) {
|
|
202
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
203
|
+
}
|
|
204
|
+
const msgCount = this.db.prepare('SELECT COUNT(*) as count FROM messages').get();
|
|
205
|
+
const sessionCount = this.db.prepare('SELECT COUNT(*) as count FROM sessions').get();
|
|
206
|
+
const oldest = this.db.prepare('SELECT MIN(ts) as ts FROM messages').get();
|
|
207
|
+
return {
|
|
208
|
+
messageCount: msgCount.count,
|
|
209
|
+
sessionCount: sessionCount.count,
|
|
210
|
+
oldestMessageTs: oldest.ts ?? undefined,
|
|
211
|
+
};
|
|
42
212
|
}
|
|
43
213
|
async saveMessage(message) {
|
|
44
214
|
if (!this.db || !this.insertStmt) {
|
|
45
215
|
throw new Error('SqliteStorageAdapter not initialized');
|
|
46
216
|
}
|
|
47
|
-
|
|
48
|
-
id: message.id,
|
|
49
|
-
ts: message.ts,
|
|
50
|
-
sender: message.from,
|
|
51
|
-
recipient: message.to,
|
|
52
|
-
topic: message.topic ?? null,
|
|
53
|
-
kind: message.kind,
|
|
54
|
-
body: message.body,
|
|
55
|
-
data: message.data ? JSON.stringify(message.data) : null,
|
|
56
|
-
delivery_seq: message.deliverySeq ?? null,
|
|
57
|
-
delivery_session_id: message.deliverySessionId ?? null,
|
|
58
|
-
session_id: message.sessionId ?? null,
|
|
59
|
-
};
|
|
60
|
-
this.insertStmt.run(payload);
|
|
217
|
+
this.insertStmt.run(message.id, message.ts, message.from, message.to, message.topic ?? null, message.kind, message.body, message.data ? JSON.stringify(message.data) : null, message.thread ?? null, message.deliverySeq ?? null, message.deliverySessionId ?? null, message.sessionId ?? null, message.status, message.is_urgent ? 1 : 0);
|
|
61
218
|
}
|
|
62
219
|
async getMessages(query = {}) {
|
|
63
220
|
if (!this.db) {
|
|
64
221
|
throw new Error('SqliteStorageAdapter not initialized');
|
|
65
222
|
}
|
|
66
223
|
const clauses = [];
|
|
67
|
-
const params =
|
|
224
|
+
const params = [];
|
|
68
225
|
if (query.sinceTs) {
|
|
69
|
-
clauses.push('ts >=
|
|
70
|
-
params.
|
|
226
|
+
clauses.push('ts >= ?');
|
|
227
|
+
params.push(query.sinceTs);
|
|
71
228
|
}
|
|
72
229
|
if (query.from) {
|
|
73
|
-
clauses.push('sender =
|
|
74
|
-
params.
|
|
230
|
+
clauses.push('sender = ?');
|
|
231
|
+
params.push(query.from);
|
|
75
232
|
}
|
|
76
233
|
if (query.to) {
|
|
77
|
-
clauses.push('recipient =
|
|
78
|
-
params.
|
|
234
|
+
clauses.push('recipient = ?');
|
|
235
|
+
params.push(query.to);
|
|
79
236
|
}
|
|
80
237
|
if (query.topic) {
|
|
81
|
-
clauses.push('topic =
|
|
82
|
-
params.
|
|
238
|
+
clauses.push('topic = ?');
|
|
239
|
+
params.push(query.topic);
|
|
240
|
+
}
|
|
241
|
+
if (query.thread) {
|
|
242
|
+
clauses.push('thread = ?');
|
|
243
|
+
params.push(query.thread);
|
|
244
|
+
}
|
|
245
|
+
if (query.unreadOnly) {
|
|
246
|
+
clauses.push('status = ?');
|
|
247
|
+
params.push('unread');
|
|
248
|
+
}
|
|
249
|
+
if (query.urgentOnly) {
|
|
250
|
+
clauses.push('is_urgent = ?');
|
|
251
|
+
params.push(1);
|
|
83
252
|
}
|
|
84
253
|
const where = clauses.length ? `WHERE ${clauses.join(' AND ')}` : '';
|
|
85
254
|
const order = query.order === 'asc' ? 'ASC' : 'DESC';
|
|
86
255
|
const limit = query.limit ?? 200;
|
|
87
256
|
const stmt = this.db.prepare(`
|
|
88
|
-
SELECT id, ts, sender, recipient, topic, kind, body, data, delivery_seq, delivery_session_id, session_id
|
|
257
|
+
SELECT id, ts, sender, recipient, topic, kind, body, data, thread, delivery_seq, delivery_session_id, session_id, status, is_urgent
|
|
89
258
|
FROM messages
|
|
90
259
|
${where}
|
|
91
260
|
ORDER BY ts ${order}
|
|
92
|
-
LIMIT
|
|
261
|
+
LIMIT ?
|
|
93
262
|
`);
|
|
94
|
-
const rows = stmt.all(
|
|
263
|
+
const rows = stmt.all(...params, limit);
|
|
95
264
|
return rows.map((row) => ({
|
|
96
265
|
id: row.id,
|
|
97
266
|
ts: row.ts,
|
|
@@ -101,18 +270,28 @@ export class SqliteStorageAdapter {
|
|
|
101
270
|
kind: row.kind,
|
|
102
271
|
body: row.body,
|
|
103
272
|
data: row.data ? JSON.parse(row.data) : undefined,
|
|
273
|
+
thread: row.thread ?? undefined,
|
|
104
274
|
deliverySeq: row.delivery_seq ?? undefined,
|
|
105
275
|
deliverySessionId: row.delivery_session_id ?? undefined,
|
|
106
276
|
sessionId: row.session_id ?? undefined,
|
|
277
|
+
status: row.status,
|
|
278
|
+
is_urgent: row.is_urgent === 1,
|
|
107
279
|
}));
|
|
108
280
|
}
|
|
281
|
+
async updateMessageStatus(id, status) {
|
|
282
|
+
if (!this.db) {
|
|
283
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
284
|
+
}
|
|
285
|
+
const stmt = this.db.prepare('UPDATE messages SET status = ? WHERE id = ?');
|
|
286
|
+
stmt.run(status, id);
|
|
287
|
+
}
|
|
109
288
|
async getMessageById(id) {
|
|
110
289
|
if (!this.db) {
|
|
111
290
|
throw new Error('SqliteStorageAdapter not initialized');
|
|
112
291
|
}
|
|
113
292
|
// Support both exact match and prefix match (for short IDs like "06eb33da")
|
|
114
293
|
const stmt = this.db.prepare(`
|
|
115
|
-
SELECT id, ts, sender, recipient, topic, kind, body, data, delivery_seq, delivery_session_id, session_id
|
|
294
|
+
SELECT id, ts, sender, recipient, topic, kind, body, data, thread, delivery_seq, delivery_session_id, session_id, status, is_urgent
|
|
116
295
|
FROM messages
|
|
117
296
|
WHERE id = ? OR id LIKE ?
|
|
118
297
|
ORDER BY ts DESC
|
|
@@ -130,16 +309,164 @@ export class SqliteStorageAdapter {
|
|
|
130
309
|
kind: row.kind,
|
|
131
310
|
body: row.body,
|
|
132
311
|
data: row.data ? JSON.parse(row.data) : undefined,
|
|
312
|
+
thread: row.thread ?? undefined,
|
|
133
313
|
deliverySeq: row.delivery_seq ?? undefined,
|
|
134
314
|
deliverySessionId: row.delivery_session_id ?? undefined,
|
|
135
315
|
sessionId: row.session_id ?? undefined,
|
|
316
|
+
status: row.status ?? 'unread',
|
|
317
|
+
is_urgent: row.is_urgent === 1,
|
|
136
318
|
};
|
|
137
319
|
}
|
|
138
320
|
async close() {
|
|
321
|
+
// Stop cleanup timer
|
|
322
|
+
if (this.cleanupTimer) {
|
|
323
|
+
clearInterval(this.cleanupTimer);
|
|
324
|
+
this.cleanupTimer = undefined;
|
|
325
|
+
}
|
|
139
326
|
if (this.db) {
|
|
140
327
|
this.db.close();
|
|
141
328
|
this.db = undefined;
|
|
142
329
|
}
|
|
143
330
|
}
|
|
331
|
+
// ============ Session Management ============
|
|
332
|
+
async startSession(session) {
|
|
333
|
+
if (!this.db) {
|
|
334
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
335
|
+
}
|
|
336
|
+
const stmt = this.db.prepare(`
|
|
337
|
+
INSERT OR REPLACE INTO sessions
|
|
338
|
+
(id, agent_name, cli, project_id, project_root, started_at, ended_at, message_count, summary)
|
|
339
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
340
|
+
`);
|
|
341
|
+
stmt.run(session.id, session.agentName, session.cli ?? null, session.projectId ?? null, session.projectRoot ?? null, session.startedAt, session.endedAt ?? null, 0, session.summary ?? null);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* End a session and optionally set a summary.
|
|
345
|
+
*
|
|
346
|
+
* Note: The summary uses COALESCE(?, summary) - if a summary was previously
|
|
347
|
+
* set (e.g., during startSession or a prior endSession call), passing null/undefined
|
|
348
|
+
* for summary will preserve the existing value rather than clearing it.
|
|
349
|
+
* To explicitly clear a summary, pass an empty string.
|
|
350
|
+
*/
|
|
351
|
+
async endSession(sessionId, options) {
|
|
352
|
+
if (!this.db) {
|
|
353
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
354
|
+
}
|
|
355
|
+
const stmt = this.db.prepare(`
|
|
356
|
+
UPDATE sessions
|
|
357
|
+
SET ended_at = ?, summary = COALESCE(?, summary), closed_by = ?
|
|
358
|
+
WHERE id = ?
|
|
359
|
+
`);
|
|
360
|
+
stmt.run(Date.now(), options?.summary ?? null, options?.closedBy ?? null, sessionId);
|
|
361
|
+
}
|
|
362
|
+
async incrementSessionMessageCount(sessionId) {
|
|
363
|
+
if (!this.db) {
|
|
364
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
365
|
+
}
|
|
366
|
+
const stmt = this.db.prepare(`
|
|
367
|
+
UPDATE sessions SET message_count = message_count + 1 WHERE id = ?
|
|
368
|
+
`);
|
|
369
|
+
stmt.run(sessionId);
|
|
370
|
+
}
|
|
371
|
+
async getSessions(query = {}) {
|
|
372
|
+
if (!this.db) {
|
|
373
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
374
|
+
}
|
|
375
|
+
const clauses = [];
|
|
376
|
+
const params = [];
|
|
377
|
+
if (query.agentName) {
|
|
378
|
+
clauses.push('agent_name = ?');
|
|
379
|
+
params.push(query.agentName);
|
|
380
|
+
}
|
|
381
|
+
if (query.projectId) {
|
|
382
|
+
clauses.push('project_id = ?');
|
|
383
|
+
params.push(query.projectId);
|
|
384
|
+
}
|
|
385
|
+
if (query.since) {
|
|
386
|
+
clauses.push('started_at >= ?');
|
|
387
|
+
params.push(query.since);
|
|
388
|
+
}
|
|
389
|
+
const where = clauses.length ? `WHERE ${clauses.join(' AND ')}` : '';
|
|
390
|
+
const limit = query.limit ?? 50;
|
|
391
|
+
const stmt = this.db.prepare(`
|
|
392
|
+
SELECT id, agent_name, cli, project_id, project_root, started_at, ended_at, message_count, summary, closed_by
|
|
393
|
+
FROM sessions
|
|
394
|
+
${where}
|
|
395
|
+
ORDER BY started_at DESC
|
|
396
|
+
LIMIT ?
|
|
397
|
+
`);
|
|
398
|
+
const rows = stmt.all(...params, limit);
|
|
399
|
+
return rows.map((row) => ({
|
|
400
|
+
id: row.id,
|
|
401
|
+
agentName: row.agent_name,
|
|
402
|
+
cli: row.cli ?? undefined,
|
|
403
|
+
projectId: row.project_id ?? undefined,
|
|
404
|
+
projectRoot: row.project_root ?? undefined,
|
|
405
|
+
startedAt: row.started_at,
|
|
406
|
+
endedAt: row.ended_at ?? undefined,
|
|
407
|
+
messageCount: row.message_count,
|
|
408
|
+
summary: row.summary ?? undefined,
|
|
409
|
+
closedBy: row.closed_by ?? undefined,
|
|
410
|
+
}));
|
|
411
|
+
}
|
|
412
|
+
async getRecentSessions(limit = 10) {
|
|
413
|
+
return this.getSessions({ limit });
|
|
414
|
+
}
|
|
415
|
+
// ============ Agent Summaries ============
|
|
416
|
+
async saveAgentSummary(summary) {
|
|
417
|
+
if (!this.db) {
|
|
418
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
419
|
+
}
|
|
420
|
+
const stmt = this.db.prepare(`
|
|
421
|
+
INSERT OR REPLACE INTO agent_summaries
|
|
422
|
+
(agent_name, project_id, last_updated, current_task, completed_tasks, decisions, context, files)
|
|
423
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
424
|
+
`);
|
|
425
|
+
stmt.run(summary.agentName, summary.projectId ?? null, Date.now(), summary.currentTask ?? null, summary.completedTasks ? JSON.stringify(summary.completedTasks) : null, summary.decisions ? JSON.stringify(summary.decisions) : null, summary.context ?? null, summary.files ? JSON.stringify(summary.files) : null);
|
|
426
|
+
}
|
|
427
|
+
async getAgentSummary(agentName) {
|
|
428
|
+
if (!this.db) {
|
|
429
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
430
|
+
}
|
|
431
|
+
const stmt = this.db.prepare(`
|
|
432
|
+
SELECT agent_name, project_id, last_updated, current_task, completed_tasks, decisions, context, files
|
|
433
|
+
FROM agent_summaries
|
|
434
|
+
WHERE agent_name = ?
|
|
435
|
+
`);
|
|
436
|
+
const row = stmt.get(agentName);
|
|
437
|
+
if (!row)
|
|
438
|
+
return null;
|
|
439
|
+
return {
|
|
440
|
+
agentName: row.agent_name,
|
|
441
|
+
projectId: row.project_id ?? undefined,
|
|
442
|
+
lastUpdated: row.last_updated,
|
|
443
|
+
currentTask: row.current_task ?? undefined,
|
|
444
|
+
completedTasks: row.completed_tasks ? JSON.parse(row.completed_tasks) : undefined,
|
|
445
|
+
decisions: row.decisions ? JSON.parse(row.decisions) : undefined,
|
|
446
|
+
context: row.context ?? undefined,
|
|
447
|
+
files: row.files ? JSON.parse(row.files) : undefined,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
async getAllAgentSummaries() {
|
|
451
|
+
if (!this.db) {
|
|
452
|
+
throw new Error('SqliteStorageAdapter not initialized');
|
|
453
|
+
}
|
|
454
|
+
const stmt = this.db.prepare(`
|
|
455
|
+
SELECT agent_name, project_id, last_updated, current_task, completed_tasks, decisions, context, files
|
|
456
|
+
FROM agent_summaries
|
|
457
|
+
ORDER BY last_updated DESC
|
|
458
|
+
`);
|
|
459
|
+
const rows = stmt.all();
|
|
460
|
+
return rows.map((row) => ({
|
|
461
|
+
agentName: row.agent_name,
|
|
462
|
+
projectId: row.project_id ?? undefined,
|
|
463
|
+
lastUpdated: row.last_updated,
|
|
464
|
+
currentTask: row.current_task ?? undefined,
|
|
465
|
+
completedTasks: row.completed_tasks ? JSON.parse(row.completed_tasks) : undefined,
|
|
466
|
+
decisions: row.decisions ? JSON.parse(row.decisions) : undefined,
|
|
467
|
+
context: row.context ?? undefined,
|
|
468
|
+
files: row.files ? JSON.parse(row.files) : undefined,
|
|
469
|
+
}));
|
|
470
|
+
}
|
|
144
471
|
}
|
|
145
472
|
//# sourceMappingURL=sqlite-adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/storage/sqlite-adapter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/storage/sqlite-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-namespace.d.ts","sourceRoot":"","sources":["../../src/utils/project-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"project-namespace.d.ts","sourceRoot":"","sources":["../../src/utils/project-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyCH;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAiBxE;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAalE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAS7C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAmBnE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BjG"}
|
|
@@ -8,7 +8,28 @@
|
|
|
8
8
|
import crypto from 'node:crypto';
|
|
9
9
|
import path from 'node:path';
|
|
10
10
|
import fs from 'node:fs';
|
|
11
|
-
|
|
11
|
+
import os from 'node:os';
|
|
12
|
+
/**
|
|
13
|
+
* Get the base directory for agent-relay data.
|
|
14
|
+
* Priority:
|
|
15
|
+
* 1. AGENT_RELAY_DATA_DIR environment variable
|
|
16
|
+
* 2. XDG_DATA_HOME/agent-relay (Linux/macOS standard)
|
|
17
|
+
* 3. ~/.agent-relay (fallback)
|
|
18
|
+
*/
|
|
19
|
+
function getBaseDir() {
|
|
20
|
+
// Explicit override
|
|
21
|
+
if (process.env.AGENT_RELAY_DATA_DIR) {
|
|
22
|
+
return process.env.AGENT_RELAY_DATA_DIR;
|
|
23
|
+
}
|
|
24
|
+
// XDG Base Directory Specification
|
|
25
|
+
const xdgDataHome = process.env.XDG_DATA_HOME;
|
|
26
|
+
if (xdgDataHome) {
|
|
27
|
+
return path.join(xdgDataHome, 'agent-relay');
|
|
28
|
+
}
|
|
29
|
+
// Default: ~/.agent-relay
|
|
30
|
+
return path.join(os.homedir(), '.agent-relay');
|
|
31
|
+
}
|
|
32
|
+
const BASE_DIR = getBaseDir();
|
|
12
33
|
/**
|
|
13
34
|
* Generate a short hash of a path for namespacing
|
|
14
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-namespace.js","sourceRoot":"","sources":["../../src/utils/project-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"project-namespace.js","sourceRoot":"","sources":["../../src/utils/project-namespace.ts"],"names":[],"mappings":"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"}
|