kitty-hive 0.1.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/dist/db.js ADDED
@@ -0,0 +1,395 @@
1
+ import Database from 'better-sqlite3';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { mkdirSync } from 'node:fs';
5
+ import { ulid, generateToken, nowISO } from './utils.js';
6
+ let db;
7
+ export function initDB(dbPath) {
8
+ const resolvedPath = dbPath || join(homedir(), '.kitty-hive', 'hive.db');
9
+ mkdirSync(join(resolvedPath, '..'), { recursive: true });
10
+ db = new Database(resolvedPath);
11
+ db.pragma('journal_mode = WAL');
12
+ db.pragma('synchronous = NORMAL');
13
+ db.pragma('busy_timeout = 5000');
14
+ db.pragma('cache_size = -8192');
15
+ db.exec(`
16
+ CREATE TABLE IF NOT EXISTS agents (
17
+ id TEXT PRIMARY KEY,
18
+ display_name TEXT NOT NULL,
19
+ token TEXT UNIQUE NOT NULL,
20
+ tool TEXT DEFAULT '',
21
+ roles TEXT DEFAULT '',
22
+ expertise TEXT DEFAULT '',
23
+ status TEXT DEFAULT 'active'
24
+ CHECK(status IN ('active','idle','busy','offline')),
25
+ created_at TEXT NOT NULL,
26
+ last_seen TEXT NOT NULL
27
+ );
28
+ CREATE INDEX IF NOT EXISTS idx_agents_token ON agents(token);
29
+ CREATE INDEX IF NOT EXISTS idx_agents_roles ON agents(roles);
30
+
31
+ CREATE TABLE IF NOT EXISTS rooms (
32
+ id TEXT PRIMARY KEY,
33
+ name TEXT,
34
+ kind TEXT NOT NULL CHECK(kind IN ('lobby','dm','team')),
35
+ host_agent_id TEXT REFERENCES agents(id),
36
+ created_at TEXT NOT NULL,
37
+ closed_at TEXT
38
+ );
39
+ CREATE INDEX IF NOT EXISTS idx_rooms_kind ON rooms(kind);
40
+
41
+ CREATE TABLE IF NOT EXISTS room_events (
42
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
43
+ room_id TEXT NOT NULL REFERENCES rooms(id),
44
+ seq INTEGER NOT NULL,
45
+ type TEXT NOT NULL CHECK(type IN ('join','leave','message')),
46
+ actor_agent_id TEXT REFERENCES agents(id),
47
+ payload_json TEXT DEFAULT '{}',
48
+ ts TEXT NOT NULL
49
+ );
50
+ CREATE INDEX IF NOT EXISTS idx_room_events_room_seq ON room_events(room_id, seq);
51
+
52
+ CREATE TABLE IF NOT EXISTS tasks (
53
+ id TEXT PRIMARY KEY,
54
+ title TEXT NOT NULL,
55
+ creator_agent_id TEXT NOT NULL REFERENCES agents(id),
56
+ assignee_agent_id TEXT REFERENCES agents(id),
57
+ status TEXT NOT NULL DEFAULT 'created'
58
+ CHECK(status IN ('created','proposing','approved','in_progress','completed','failed','canceled')),
59
+ workflow_json TEXT,
60
+ current_step INTEGER DEFAULT 0,
61
+ source_room_id TEXT REFERENCES rooms(id),
62
+ input_json TEXT DEFAULT '{}',
63
+ created_at TEXT NOT NULL,
64
+ completed_at TEXT
65
+ );
66
+ CREATE INDEX IF NOT EXISTS idx_tasks_creator ON tasks(creator_agent_id);
67
+ CREATE INDEX IF NOT EXISTS idx_tasks_assignee ON tasks(assignee_agent_id);
68
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
69
+
70
+ CREATE TABLE IF NOT EXISTS task_events (
71
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
72
+ task_id TEXT NOT NULL REFERENCES tasks(id),
73
+ seq INTEGER NOT NULL,
74
+ type TEXT NOT NULL,
75
+ actor_agent_id TEXT REFERENCES agents(id),
76
+ payload_json TEXT DEFAULT '{}',
77
+ ts TEXT NOT NULL
78
+ );
79
+ CREATE INDEX IF NOT EXISTS idx_task_events_task_seq ON task_events(task_id, seq);
80
+
81
+ CREATE TABLE IF NOT EXISTS read_cursors (
82
+ agent_id TEXT NOT NULL REFERENCES agents(id),
83
+ target_type TEXT NOT NULL CHECK(target_type IN ('room','task')),
84
+ target_id TEXT NOT NULL,
85
+ last_seq INTEGER NOT NULL DEFAULT 0,
86
+ PRIMARY KEY (agent_id, target_type, target_id)
87
+ );
88
+
89
+ CREATE TABLE IF NOT EXISTS peers (
90
+ id TEXT PRIMARY KEY,
91
+ name TEXT UNIQUE NOT NULL,
92
+ url TEXT NOT NULL,
93
+ secret TEXT NOT NULL,
94
+ exposed TEXT DEFAULT '',
95
+ status TEXT DEFAULT 'active' CHECK(status IN ('active','inactive')),
96
+ created_at TEXT NOT NULL,
97
+ last_seen TEXT
98
+ );
99
+ `);
100
+ return db;
101
+ }
102
+ export function getDB() {
103
+ if (!db)
104
+ throw new Error('Database not initialized. Call initDB() first.');
105
+ return db;
106
+ }
107
+ // --- Agent queries ---
108
+ export function createAgent(displayName, tool, roles, expertise) {
109
+ const agent = {
110
+ id: ulid(), display_name: displayName, token: generateToken(),
111
+ tool, roles, expertise, status: 'active',
112
+ created_at: nowISO(), last_seen: nowISO(),
113
+ };
114
+ getDB().prepare(`
115
+ INSERT INTO agents (id, display_name, token, tool, roles, expertise, status, created_at, last_seen)
116
+ VALUES (@id, @display_name, @token, @tool, @roles, @expertise, @status, @created_at, @last_seen)
117
+ `).run(agent);
118
+ return agent;
119
+ }
120
+ export function getAgentByToken(token) {
121
+ return getDB().prepare('SELECT * FROM agents WHERE token = ?').get(token);
122
+ }
123
+ export function getAgentById(id) {
124
+ return getDB().prepare('SELECT * FROM agents WHERE id = ?').get(id);
125
+ }
126
+ export function getAgentByName(name) {
127
+ return getDB().prepare('SELECT * FROM agents WHERE display_name = ?').get(name);
128
+ }
129
+ export function findAgentByRole(role) {
130
+ return getDB().prepare("SELECT * FROM agents WHERE roles LIKE ? AND status = 'active' ORDER BY last_seen DESC LIMIT 1").get(`%${role}%`);
131
+ }
132
+ export function touchAgent(id) {
133
+ getDB().prepare('UPDATE agents SET last_seen = ? WHERE id = ?').run(nowISO(), id);
134
+ }
135
+ // --- Room queries ---
136
+ export function createRoom(kind, hostAgentId, name) {
137
+ const room = {
138
+ id: ulid(), name: name ?? null, kind: kind,
139
+ host_agent_id: hostAgentId, created_at: nowISO(), closed_at: null,
140
+ };
141
+ getDB().prepare(`
142
+ INSERT INTO rooms (id, name, kind, host_agent_id, created_at, closed_at)
143
+ VALUES (@id, @name, @kind, @host_agent_id, @created_at, @closed_at)
144
+ `).run(room);
145
+ return room;
146
+ }
147
+ export function getRoomById(id) {
148
+ return getDB().prepare('SELECT * FROM rooms WHERE id = ?').get(id);
149
+ }
150
+ export function getLobby() {
151
+ return getDB().prepare("SELECT * FROM rooms WHERE kind = 'lobby' LIMIT 1").get();
152
+ }
153
+ export function findDMRoom(agentA, agentB) {
154
+ return getDB().prepare(`
155
+ SELECT r.* FROM rooms r
156
+ WHERE r.kind = 'dm'
157
+ AND EXISTS (SELECT 1 FROM room_events e WHERE e.room_id = r.id AND e.type = 'join' AND e.actor_agent_id = ?)
158
+ AND EXISTS (SELECT 1 FROM room_events e WHERE e.room_id = r.id AND e.type = 'join' AND e.actor_agent_id = ?)
159
+ LIMIT 1
160
+ `).get(agentA, agentB);
161
+ }
162
+ export function listTeams() {
163
+ return getDB().prepare("SELECT * FROM rooms WHERE kind = 'team' AND closed_at IS NULL ORDER BY created_at DESC").all();
164
+ }
165
+ // --- Room event queries ---
166
+ export function appendRoomEvent(roomId, type, actorAgentId, payload = {}) {
167
+ const d = getDB();
168
+ const ts = nowISO();
169
+ const payloadJson = JSON.stringify(payload);
170
+ const insert = d.transaction(() => {
171
+ const maxSeq = d.prepare('SELECT COALESCE(MAX(seq), 0) as max_seq FROM room_events WHERE room_id = ?').get(roomId);
172
+ const seq = maxSeq.max_seq + 1;
173
+ const result = d.prepare('INSERT INTO room_events (room_id, seq, type, actor_agent_id, payload_json, ts) VALUES (?, ?, ?, ?, ?, ?)').run(roomId, seq, type, actorAgentId, payloadJson, ts);
174
+ return { id: result.lastInsertRowid, seq };
175
+ });
176
+ const { id, seq } = insert();
177
+ return { id, room_id: roomId, seq, type, actor_agent_id: actorAgentId, payload_json: payloadJson, ts };
178
+ }
179
+ export function getRoomEvents(roomId, since = 0, limit = 50) {
180
+ return getDB().prepare('SELECT * FROM room_events WHERE room_id = ? AND seq > ? ORDER BY seq ASC LIMIT ?').all(roomId, since, limit);
181
+ }
182
+ export function getLastRoomEventTs(roomId) {
183
+ const row = getDB().prepare('SELECT ts FROM room_events WHERE room_id = ? ORDER BY seq DESC LIMIT 1').get(roomId);
184
+ return row?.ts ?? null;
185
+ }
186
+ export function getLatestRoomEvents(roomId, limit = 10) {
187
+ return getDB().prepare('SELECT * FROM (SELECT * FROM room_events WHERE room_id = ? ORDER BY seq DESC LIMIT ?) ORDER BY seq ASC').all(roomId, limit);
188
+ }
189
+ export function getRoomMembers(roomId) {
190
+ const events = getDB().prepare("SELECT type, actor_agent_id FROM room_events WHERE room_id = ? AND type IN ('join', 'leave') ORDER BY seq ASC").all(roomId);
191
+ const members = new Set();
192
+ for (const e of events) {
193
+ if (e.type === 'join')
194
+ members.add(e.actor_agent_id);
195
+ if (e.type === 'leave')
196
+ members.delete(e.actor_agent_id);
197
+ }
198
+ return [...members];
199
+ }
200
+ export function isMember(roomId, agentId) {
201
+ return getRoomMembers(roomId).includes(agentId);
202
+ }
203
+ export function getAgentRooms(agentId, kind, activeOnly) {
204
+ let sql = `
205
+ SELECT DISTINCT r.* FROM rooms r
206
+ JOIN room_events e ON e.room_id = r.id AND e.type = 'join' AND e.actor_agent_id = ?
207
+ WHERE NOT EXISTS (
208
+ SELECT 1 FROM room_events e2
209
+ WHERE e2.room_id = r.id AND e2.type = 'leave' AND e2.actor_agent_id = ? AND e2.seq > e.seq
210
+ )
211
+ `;
212
+ const params = [agentId, agentId];
213
+ if (kind) {
214
+ sql += ' AND r.kind = ?';
215
+ params.push(kind);
216
+ }
217
+ if (activeOnly) {
218
+ sql += ' AND r.closed_at IS NULL';
219
+ }
220
+ return getDB().prepare(sql).all(...params);
221
+ }
222
+ // --- Task queries ---
223
+ export function createTask(title, creatorId, assigneeId, sourceRoomId, input) {
224
+ const task = {
225
+ id: ulid(), title, creator_agent_id: creatorId,
226
+ assignee_agent_id: assigneeId ?? null,
227
+ status: 'created', workflow_json: null, current_step: 0,
228
+ source_room_id: sourceRoomId ?? null,
229
+ input_json: JSON.stringify(input ?? {}),
230
+ created_at: nowISO(), completed_at: null,
231
+ };
232
+ getDB().prepare(`
233
+ INSERT INTO tasks (id, title, creator_agent_id, assignee_agent_id, status, workflow_json, current_step, source_room_id, input_json, created_at, completed_at)
234
+ VALUES (@id, @title, @creator_agent_id, @assignee_agent_id, @status, @workflow_json, @current_step, @source_room_id, @input_json, @created_at, @completed_at)
235
+ `).run(task);
236
+ return task;
237
+ }
238
+ export function getTaskById(id) {
239
+ return getDB().prepare('SELECT * FROM tasks WHERE id = ?').get(id);
240
+ }
241
+ export function updateTaskStatus(id, status, extras) {
242
+ let sql = 'UPDATE tasks SET status = ?';
243
+ const params = [status];
244
+ if (extras) {
245
+ for (const [k, v] of Object.entries(extras)) {
246
+ sql += `, ${k} = ?`;
247
+ params.push(v);
248
+ }
249
+ }
250
+ sql += ' WHERE id = ?';
251
+ params.push(id);
252
+ getDB().prepare(sql).run(...params);
253
+ }
254
+ export function getAgentTasks(agentId, status) {
255
+ let sql = 'SELECT * FROM tasks WHERE (creator_agent_id = ? OR assignee_agent_id = ?)';
256
+ const params = [agentId, agentId];
257
+ if (status) {
258
+ sql += ' AND status = ?';
259
+ params.push(status);
260
+ }
261
+ sql += ' ORDER BY created_at DESC';
262
+ return getDB().prepare(sql).all(...params);
263
+ }
264
+ // --- Task event queries ---
265
+ export function appendTaskEvent(taskId, type, actorAgentId, payload = {}) {
266
+ const d = getDB();
267
+ const ts = nowISO();
268
+ const payloadJson = JSON.stringify(payload);
269
+ const insert = d.transaction(() => {
270
+ const maxSeq = d.prepare('SELECT COALESCE(MAX(seq), 0) as max_seq FROM task_events WHERE task_id = ?').get(taskId);
271
+ const seq = maxSeq.max_seq + 1;
272
+ const result = d.prepare('INSERT INTO task_events (task_id, seq, type, actor_agent_id, payload_json, ts) VALUES (?, ?, ?, ?, ?, ?)').run(taskId, seq, type, actorAgentId, payloadJson, ts);
273
+ return { id: result.lastInsertRowid, seq };
274
+ });
275
+ const { id, seq } = insert();
276
+ return { id, task_id: taskId, seq, type, actor_agent_id: actorAgentId, payload_json: payloadJson, ts };
277
+ }
278
+ export function getTaskEvents(taskId, since = 0, limit = 100) {
279
+ return getDB().prepare('SELECT * FROM task_events WHERE task_id = ? AND seq > ? ORDER BY seq ASC LIMIT ?').all(taskId, since, limit);
280
+ }
281
+ // --- Read cursors ---
282
+ export function getReadCursor(agentId, targetType, targetId) {
283
+ const row = getDB().prepare('SELECT last_seq FROM read_cursors WHERE agent_id = ? AND target_type = ? AND target_id = ?').get(agentId, targetType, targetId);
284
+ return row?.last_seq ?? 0;
285
+ }
286
+ export function setReadCursor(agentId, targetType, targetId, seq) {
287
+ getDB().prepare(`
288
+ INSERT INTO read_cursors (agent_id, target_type, target_id, last_seq) VALUES (?, ?, ?, ?)
289
+ ON CONFLICT(agent_id, target_type, target_id) DO UPDATE SET last_seq = excluded.last_seq
290
+ `).run(agentId, targetType, targetId, seq);
291
+ }
292
+ export function getUnreadForAgent(agentId) {
293
+ const result = [];
294
+ // Room unread
295
+ const rooms = getAgentRooms(agentId, undefined, true);
296
+ for (const room of rooms) {
297
+ const cursor = getReadCursor(agentId, 'room', room.id);
298
+ const unread = getDB().prepare('SELECT * FROM room_events WHERE room_id = ? AND seq > ? AND actor_agent_id != ? ORDER BY seq ASC LIMIT 10').all(room.id, cursor, agentId);
299
+ if (unread.length === 0)
300
+ continue;
301
+ const totalUnread = getDB().prepare('SELECT COUNT(*) as cnt FROM room_events WHERE room_id = ? AND seq > ? AND actor_agent_id != ?').get(room.id, cursor, agentId).cnt;
302
+ const latest = unread.slice(-5).map(e => {
303
+ const actor = getAgentById(e.actor_agent_id ?? '');
304
+ let preview = '';
305
+ try {
306
+ const p = JSON.parse(e.payload_json);
307
+ preview = p.content || '';
308
+ }
309
+ catch { }
310
+ return {
311
+ from: actor?.display_name ?? 'unknown', type: e.type,
312
+ preview: preview.length > 200 ? preview.slice(0, 200) + ' [summary — this is a preview, not a broken message]' : preview,
313
+ ts: e.ts,
314
+ };
315
+ });
316
+ result.push({ type: 'room', id: room.id, name: room.name, kind: room.kind, unread_count: totalUnread, latest });
317
+ }
318
+ // Task unread
319
+ const tasks = getAgentTasks(agentId);
320
+ for (const task of tasks) {
321
+ if (['completed', 'failed', 'canceled'].includes(task.status))
322
+ continue;
323
+ const cursor = getReadCursor(agentId, 'task', task.id);
324
+ const unread = getDB().prepare('SELECT * FROM task_events WHERE task_id = ? AND seq > ? AND actor_agent_id != ? ORDER BY seq ASC LIMIT 10').all(task.id, cursor, agentId);
325
+ if (unread.length === 0)
326
+ continue;
327
+ const totalUnread = getDB().prepare('SELECT COUNT(*) as cnt FROM task_events WHERE task_id = ? AND seq > ? AND actor_agent_id != ?').get(task.id, cursor, agentId).cnt;
328
+ const latest = unread.slice(-5).map(e => {
329
+ const actor = getAgentById(e.actor_agent_id ?? '');
330
+ let preview = '';
331
+ try {
332
+ const p = JSON.parse(e.payload_json);
333
+ preview = p.result || p.reason || '';
334
+ }
335
+ catch { }
336
+ return {
337
+ from: actor?.display_name ?? 'system', type: e.type,
338
+ preview: preview.length > 100 ? preview.slice(0, 100) + '...' : preview,
339
+ ts: e.ts,
340
+ };
341
+ });
342
+ result.push({ type: 'task', id: task.id, name: task.title, kind: task.status, unread_count: totalUnread, latest });
343
+ }
344
+ return result;
345
+ }
346
+ export function addPeer(name, url, secret, exposed = '') {
347
+ const peer = {
348
+ id: ulid(), name, url, secret, exposed, status: 'active',
349
+ created_at: nowISO(), last_seen: null,
350
+ };
351
+ getDB().prepare(`
352
+ INSERT INTO peers (id, name, url, secret, exposed, status, created_at, last_seen)
353
+ VALUES (@id, @name, @url, @secret, @exposed, @status, @created_at, @last_seen)
354
+ `).run(peer);
355
+ return peer;
356
+ }
357
+ export function getPeerByName(name) {
358
+ return getDB().prepare('SELECT * FROM peers WHERE name = ?').get(name);
359
+ }
360
+ export function getPeerBySecret(secret) {
361
+ return getDB().prepare('SELECT * FROM peers WHERE secret = ? AND status = ?').get(secret, 'active');
362
+ }
363
+ export function listPeers() {
364
+ return getDB().prepare('SELECT * FROM peers ORDER BY created_at DESC').all();
365
+ }
366
+ export function removePeer(name) {
367
+ const result = getDB().prepare('DELETE FROM peers WHERE name = ?').run(name);
368
+ return result.changes > 0;
369
+ }
370
+ export function updatePeerExposed(name, exposed) {
371
+ getDB().prepare('UPDATE peers SET exposed = ? WHERE name = ?').run(exposed, name);
372
+ }
373
+ export function touchPeer(name) {
374
+ getDB().prepare('UPDATE peers SET last_seen = ? WHERE name = ?').run(nowISO(), name);
375
+ }
376
+ export function isPeerExposed(peerName, agentName) {
377
+ const peer = getPeerByName(peerName);
378
+ if (!peer || !peer.exposed)
379
+ return false;
380
+ const exposed = peer.exposed.split(',').map(s => s.trim());
381
+ return exposed.includes(agentName);
382
+ }
383
+ // --- Cleanup ---
384
+ export function cleanupStaleTasks(maxAgeDays = 7) {
385
+ const cutoff = new Date(Date.now() - maxAgeDays * 24 * 60 * 60 * 1000).toISOString();
386
+ const d = getDB();
387
+ const stale = d.prepare("SELECT id FROM tasks WHERE status IN ('completed','failed','canceled') AND completed_at IS NOT NULL AND completed_at < ?").all(cutoff);
388
+ for (const t of stale) {
389
+ d.prepare('DELETE FROM read_cursors WHERE target_type = ? AND target_id = ?').run('task', t.id);
390
+ d.prepare('DELETE FROM task_events WHERE task_id = ?').run(t.id);
391
+ d.prepare('DELETE FROM tasks WHERE id = ?').run(t.id);
392
+ }
393
+ return stale.length;
394
+ }
395
+ //# sourceMappingURL=db.js.map
package/dist/db.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};