oh-my-claude-sisyphus 3.5.7 → 3.6.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/agents/executor-high.md +2 -0
- package/agents/executor-low.md +2 -0
- package/agents/executor.md +2 -0
- package/agents/templates/base-agent.md +9 -0
- package/commands/cancel.md +8 -8
- package/commands/swarm.md +350 -148
- package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
- package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
- package/dist/__tests__/hooks/learner/bridge.test.d.ts +11 -0
- package/dist/__tests__/hooks/learner/bridge.test.d.ts.map +1 -0
- package/dist/__tests__/hooks/learner/bridge.test.js +199 -0
- package/dist/__tests__/hooks/learner/bridge.test.js.map +1 -0
- package/dist/__tests__/hooks.test.js +10 -9
- package/dist/__tests__/hooks.test.js.map +1 -1
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/agents/codex-agents.d.ts +20 -0
- package/dist/agents/codex-agents.d.ts.map +1 -0
- package/dist/agents/codex-agents.js +36 -0
- package/dist/agents/codex-agents.js.map +1 -0
- package/dist/agents/preamble.d.ts +14 -0
- package/dist/agents/preamble.d.ts.map +1 -0
- package/dist/agents/preamble.js +26 -0
- package/dist/agents/preamble.js.map +1 -0
- package/dist/hooks/autopilot/__tests__/cancel.test.js +14 -4
- package/dist/hooks/autopilot/__tests__/cancel.test.js.map +1 -1
- package/dist/hooks/autopilot/__tests__/state.test.js +1 -0
- package/dist/hooks/autopilot/__tests__/state.test.js.map +1 -1
- package/dist/hooks/autopilot/__tests__/summary.test.js +38 -3
- package/dist/hooks/autopilot/__tests__/summary.test.js.map +1 -1
- package/dist/hooks/autopilot/state.d.ts +1 -1
- package/dist/hooks/autopilot/state.d.ts.map +1 -1
- package/dist/hooks/autopilot/state.js +15 -8
- package/dist/hooks/autopilot/state.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/learner/bridge.d.ts +71 -0
- package/dist/hooks/learner/bridge.d.ts.map +1 -0
- package/dist/hooks/learner/bridge.js +426 -0
- package/dist/hooks/learner/bridge.js.map +1 -0
- package/dist/hooks/mode-registry/index.d.ts +135 -0
- package/dist/hooks/mode-registry/index.d.ts.map +1 -0
- package/dist/hooks/mode-registry/index.js +445 -0
- package/dist/hooks/mode-registry/index.js.map +1 -0
- package/dist/hooks/mode-registry/types.d.ts +31 -0
- package/dist/hooks/mode-registry/types.d.ts.map +1 -0
- package/dist/hooks/mode-registry/types.js +7 -0
- package/dist/hooks/mode-registry/types.js.map +1 -0
- package/dist/hooks/ralph/loop.js +6 -6
- package/dist/hooks/ralph/loop.js.map +1 -1
- package/dist/hooks/skill-bridge.cjs +349 -0
- package/dist/hooks/swarm/__tests__/claiming.test.d.ts +2 -0
- package/dist/hooks/swarm/__tests__/claiming.test.d.ts.map +1 -0
- package/dist/hooks/swarm/__tests__/claiming.test.js +170 -0
- package/dist/hooks/swarm/__tests__/claiming.test.js.map +1 -0
- package/dist/hooks/swarm/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/swarm/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/swarm/__tests__/index.test.js +157 -0
- package/dist/hooks/swarm/__tests__/index.test.js.map +1 -0
- package/dist/hooks/swarm/__tests__/mode-registry.test.d.ts +2 -0
- package/dist/hooks/swarm/__tests__/mode-registry.test.d.ts.map +1 -0
- package/dist/hooks/swarm/__tests__/mode-registry.test.js +177 -0
- package/dist/hooks/swarm/__tests__/mode-registry.test.js.map +1 -0
- package/dist/hooks/swarm/claiming.d.ts +101 -0
- package/dist/hooks/swarm/claiming.d.ts.map +1 -0
- package/dist/hooks/swarm/claiming.js +460 -0
- package/dist/hooks/swarm/claiming.js.map +1 -0
- package/dist/hooks/swarm/index.d.ts +221 -0
- package/dist/hooks/swarm/index.d.ts.map +1 -0
- package/dist/hooks/swarm/index.js +413 -0
- package/dist/hooks/swarm/index.js.map +1 -0
- package/dist/hooks/swarm/state.d.ts +94 -0
- package/dist/hooks/swarm/state.d.ts.map +1 -0
- package/dist/hooks/swarm/state.js +530 -0
- package/dist/hooks/swarm/state.js.map +1 -0
- package/dist/hooks/swarm/types.d.ts +116 -0
- package/dist/hooks/swarm/types.d.ts.map +1 -0
- package/dist/hooks/swarm/types.js +22 -0
- package/dist/hooks/swarm/types.js.map +1 -0
- package/dist/hooks/ultrapilot/decomposer.d.ts +141 -0
- package/dist/hooks/ultrapilot/decomposer.d.ts.map +1 -0
- package/dist/hooks/ultrapilot/decomposer.js +377 -0
- package/dist/hooks/ultrapilot/decomposer.js.map +1 -0
- package/dist/hooks/ultrapilot/index.d.ts +31 -0
- package/dist/hooks/ultrapilot/index.d.ts.map +1 -1
- package/dist/hooks/ultrapilot/index.js +43 -2
- package/dist/hooks/ultrapilot/index.js.map +1 -1
- package/dist/hooks/ultrapilot/state.d.ts +1 -1
- package/dist/hooks/ultrapilot/state.d.ts.map +1 -1
- package/dist/hooks/ultrapilot/state.js +7 -0
- package/dist/hooks/ultrapilot/state.js.map +1 -1
- package/dist/hooks/ultraqa/index.js +5 -5
- package/dist/hooks/ultraqa/index.js.map +1 -1
- package/dist/hooks/ultrawork/index.js +3 -3
- package/dist/hooks/ultrawork/index.js.map +1 -1
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.js +1 -1
- package/package.json +6 -2
- package/scripts/build-skill-bridge.mjs +32 -0
- package/scripts/skill-injector.mjs +77 -26
- package/skills/autopilot/SKILL.md +18 -0
- package/skills/cancel/SKILL.md +166 -141
- package/skills/ecomode/SKILL.md +14 -0
- package/skills/pipeline/SKILL.md +13 -0
- package/skills/ralph/SKILL.md +22 -1
- package/skills/swarm/SKILL.md +521 -197
- package/skills/ultrapilot/SKILL.md +82 -13
- package/skills/ultraqa/SKILL.md +13 -0
- package/skills/ultrawork/SKILL.md +14 -0
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm State Management
|
|
3
|
+
*
|
|
4
|
+
* SQLite-based persistent state for swarm coordination.
|
|
5
|
+
* Uses better-sqlite3 for synchronous operations with transaction support.
|
|
6
|
+
* All state is stored in .omc/state/swarm.db
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, unlinkSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { DB_SCHEMA_VERSION } from './types.js';
|
|
11
|
+
// Dynamic import for better-sqlite3 to handle environments where it's not installed
|
|
12
|
+
let Database = null;
|
|
13
|
+
let db = null;
|
|
14
|
+
/**
|
|
15
|
+
* Get the database file path
|
|
16
|
+
*/
|
|
17
|
+
function getDbPath(cwd) {
|
|
18
|
+
return join(cwd, '.omc', 'state', 'swarm.db');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Ensure the state directory exists
|
|
22
|
+
*/
|
|
23
|
+
function ensureStateDir(cwd) {
|
|
24
|
+
const stateDir = join(cwd, '.omc', 'state');
|
|
25
|
+
if (!existsSync(stateDir)) {
|
|
26
|
+
mkdirSync(stateDir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the SQLite database
|
|
31
|
+
* Creates tables if they don't exist
|
|
32
|
+
*/
|
|
33
|
+
export async function initDb(cwd) {
|
|
34
|
+
try {
|
|
35
|
+
// Dynamic import of better-sqlite3
|
|
36
|
+
if (!Database) {
|
|
37
|
+
const betterSqlite3 = await import('better-sqlite3');
|
|
38
|
+
Database = betterSqlite3.default;
|
|
39
|
+
}
|
|
40
|
+
ensureStateDir(cwd);
|
|
41
|
+
const dbPath = getDbPath(cwd);
|
|
42
|
+
db = new Database(dbPath);
|
|
43
|
+
// Enable WAL mode for better concurrency
|
|
44
|
+
db.pragma('journal_mode = WAL');
|
|
45
|
+
// Create tables
|
|
46
|
+
db.exec(`
|
|
47
|
+
-- Schema version tracking
|
|
48
|
+
CREATE TABLE IF NOT EXISTS schema_info (
|
|
49
|
+
key TEXT PRIMARY KEY,
|
|
50
|
+
value TEXT NOT NULL
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
-- Swarm session state
|
|
54
|
+
CREATE TABLE IF NOT EXISTS swarm_session (
|
|
55
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
56
|
+
session_id TEXT NOT NULL,
|
|
57
|
+
active INTEGER NOT NULL DEFAULT 1,
|
|
58
|
+
agent_count INTEGER NOT NULL,
|
|
59
|
+
started_at INTEGER NOT NULL,
|
|
60
|
+
completed_at INTEGER
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- Task pool
|
|
64
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
65
|
+
id TEXT PRIMARY KEY,
|
|
66
|
+
description TEXT NOT NULL,
|
|
67
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'claimed', 'done', 'failed')),
|
|
68
|
+
claimed_by TEXT,
|
|
69
|
+
claimed_at INTEGER,
|
|
70
|
+
completed_at INTEGER,
|
|
71
|
+
error TEXT,
|
|
72
|
+
result TEXT
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
-- Agent heartbeats
|
|
76
|
+
CREATE TABLE IF NOT EXISTS heartbeats (
|
|
77
|
+
agent_id TEXT PRIMARY KEY,
|
|
78
|
+
last_heartbeat INTEGER NOT NULL,
|
|
79
|
+
current_task_id TEXT
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
-- Indexes for performance
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
84
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_claimed_by ON tasks(claimed_by);
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_heartbeats_last ON heartbeats(last_heartbeat);
|
|
86
|
+
`);
|
|
87
|
+
// Set schema version
|
|
88
|
+
const setVersion = db.prepare('INSERT OR REPLACE INTO schema_info (key, value) VALUES (?, ?)');
|
|
89
|
+
setVersion.run('version', String(DB_SCHEMA_VERSION));
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error('Failed to initialize swarm database:', error);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Close the database connection
|
|
99
|
+
*/
|
|
100
|
+
export function closeDb() {
|
|
101
|
+
if (db) {
|
|
102
|
+
db.close();
|
|
103
|
+
db = null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Delete the database file (for cleanup)
|
|
108
|
+
*/
|
|
109
|
+
export function deleteDb(cwd) {
|
|
110
|
+
try {
|
|
111
|
+
closeDb();
|
|
112
|
+
const dbPath = getDbPath(cwd);
|
|
113
|
+
if (existsSync(dbPath)) {
|
|
114
|
+
unlinkSync(dbPath);
|
|
115
|
+
}
|
|
116
|
+
// Also remove WAL and SHM files
|
|
117
|
+
const walPath = dbPath + '-wal';
|
|
118
|
+
const shmPath = dbPath + '-shm';
|
|
119
|
+
if (existsSync(walPath))
|
|
120
|
+
unlinkSync(walPath);
|
|
121
|
+
if (existsSync(shmPath))
|
|
122
|
+
unlinkSync(shmPath);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error('Failed to delete swarm database:', error);
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if database is initialized and connected
|
|
132
|
+
*/
|
|
133
|
+
export function isDbInitialized() {
|
|
134
|
+
return db !== null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Initialize a new swarm session
|
|
138
|
+
*/
|
|
139
|
+
export function initSession(sessionId, agentCount) {
|
|
140
|
+
if (!db)
|
|
141
|
+
return false;
|
|
142
|
+
try {
|
|
143
|
+
const stmt = db.prepare(`
|
|
144
|
+
INSERT OR REPLACE INTO swarm_session (id, session_id, active, agent_count, started_at, completed_at)
|
|
145
|
+
VALUES (1, ?, 1, ?, ?, NULL)
|
|
146
|
+
`);
|
|
147
|
+
stmt.run(sessionId, agentCount, Date.now());
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error('Failed to initialize session:', error);
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Load the current swarm state
|
|
157
|
+
*/
|
|
158
|
+
export function loadState() {
|
|
159
|
+
if (!db)
|
|
160
|
+
return null;
|
|
161
|
+
try {
|
|
162
|
+
// Get session info
|
|
163
|
+
const sessionStmt = db.prepare('SELECT * FROM swarm_session WHERE id = 1');
|
|
164
|
+
const session = sessionStmt.get();
|
|
165
|
+
if (!session)
|
|
166
|
+
return null;
|
|
167
|
+
// Get all tasks
|
|
168
|
+
const tasksStmt = db.prepare('SELECT * FROM tasks ORDER BY id');
|
|
169
|
+
const taskRows = tasksStmt.all();
|
|
170
|
+
const tasks = taskRows.map(row => ({
|
|
171
|
+
id: row.id,
|
|
172
|
+
description: row.description,
|
|
173
|
+
status: row.status,
|
|
174
|
+
claimedBy: row.claimed_by,
|
|
175
|
+
claimedAt: row.claimed_at,
|
|
176
|
+
completedAt: row.completed_at,
|
|
177
|
+
error: row.error ?? undefined,
|
|
178
|
+
result: row.result ?? undefined
|
|
179
|
+
}));
|
|
180
|
+
return {
|
|
181
|
+
active: session.active === 1,
|
|
182
|
+
sessionId: session.session_id,
|
|
183
|
+
agentCount: session.agent_count,
|
|
184
|
+
tasks,
|
|
185
|
+
startedAt: session.started_at,
|
|
186
|
+
completedAt: session.completed_at
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
console.error('Failed to load swarm state:', error);
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Save swarm state (updates session info only, tasks are updated individually)
|
|
196
|
+
*/
|
|
197
|
+
export function saveState(state) {
|
|
198
|
+
if (!db)
|
|
199
|
+
return false;
|
|
200
|
+
try {
|
|
201
|
+
if (state.active !== undefined || state.completedAt !== undefined) {
|
|
202
|
+
const updates = [];
|
|
203
|
+
const values = [];
|
|
204
|
+
if (state.active !== undefined) {
|
|
205
|
+
updates.push('active = ?');
|
|
206
|
+
values.push(state.active ? 1 : 0);
|
|
207
|
+
}
|
|
208
|
+
if (state.completedAt !== undefined) {
|
|
209
|
+
updates.push('completed_at = ?');
|
|
210
|
+
values.push(state.completedAt);
|
|
211
|
+
}
|
|
212
|
+
if (updates.length > 0) {
|
|
213
|
+
const stmt = db.prepare(`UPDATE swarm_session SET ${updates.join(', ')} WHERE id = 1`);
|
|
214
|
+
stmt.run(...values);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
console.error('Failed to save swarm state:', error);
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Add a task to the pool
|
|
226
|
+
*/
|
|
227
|
+
export function addTask(id, description) {
|
|
228
|
+
if (!db)
|
|
229
|
+
return false;
|
|
230
|
+
try {
|
|
231
|
+
const stmt = db.prepare(`
|
|
232
|
+
INSERT INTO tasks (id, description, status, claimed_by, claimed_at, completed_at, error, result)
|
|
233
|
+
VALUES (?, ?, 'pending', NULL, NULL, NULL, NULL, NULL)
|
|
234
|
+
`);
|
|
235
|
+
stmt.run(id, description);
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
console.error('Failed to add task:', error);
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Add multiple tasks in a transaction
|
|
245
|
+
*/
|
|
246
|
+
export function addTasks(tasks) {
|
|
247
|
+
if (!db)
|
|
248
|
+
return false;
|
|
249
|
+
try {
|
|
250
|
+
const stmt = db.prepare(`
|
|
251
|
+
INSERT INTO tasks (id, description, status, claimed_by, claimed_at, completed_at, error, result)
|
|
252
|
+
VALUES (?, ?, 'pending', NULL, NULL, NULL, NULL, NULL)
|
|
253
|
+
`);
|
|
254
|
+
const insertMany = db.transaction((taskList) => {
|
|
255
|
+
for (const task of taskList) {
|
|
256
|
+
stmt.run(task.id, task.description);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
insertMany(tasks);
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
console.error('Failed to add tasks:', error);
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Get all tasks
|
|
269
|
+
*/
|
|
270
|
+
export function getTasks() {
|
|
271
|
+
if (!db)
|
|
272
|
+
return [];
|
|
273
|
+
try {
|
|
274
|
+
const stmt = db.prepare('SELECT * FROM tasks ORDER BY id');
|
|
275
|
+
const rows = stmt.all();
|
|
276
|
+
return rows.map(row => ({
|
|
277
|
+
id: row.id,
|
|
278
|
+
description: row.description,
|
|
279
|
+
status: row.status,
|
|
280
|
+
claimedBy: row.claimed_by,
|
|
281
|
+
claimedAt: row.claimed_at,
|
|
282
|
+
completedAt: row.completed_at,
|
|
283
|
+
error: row.error ?? undefined,
|
|
284
|
+
result: row.result ?? undefined
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
console.error('Failed to get tasks:', error);
|
|
289
|
+
return [];
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Get tasks by status
|
|
294
|
+
*/
|
|
295
|
+
export function getTasksByStatus(status) {
|
|
296
|
+
if (!db)
|
|
297
|
+
return [];
|
|
298
|
+
try {
|
|
299
|
+
const stmt = db.prepare('SELECT * FROM tasks WHERE status = ? ORDER BY id');
|
|
300
|
+
const rows = stmt.all(status);
|
|
301
|
+
return rows.map(row => ({
|
|
302
|
+
id: row.id,
|
|
303
|
+
description: row.description,
|
|
304
|
+
status: row.status,
|
|
305
|
+
claimedBy: row.claimed_by,
|
|
306
|
+
claimedAt: row.claimed_at,
|
|
307
|
+
completedAt: row.completed_at,
|
|
308
|
+
error: row.error ?? undefined,
|
|
309
|
+
result: row.result ?? undefined
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
console.error('Failed to get tasks by status:', error);
|
|
314
|
+
return [];
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Get a specific task by ID
|
|
319
|
+
*/
|
|
320
|
+
export function getTask(taskId) {
|
|
321
|
+
if (!db)
|
|
322
|
+
return null;
|
|
323
|
+
try {
|
|
324
|
+
const stmt = db.prepare('SELECT * FROM tasks WHERE id = ?');
|
|
325
|
+
const row = stmt.get(taskId);
|
|
326
|
+
if (!row)
|
|
327
|
+
return null;
|
|
328
|
+
return {
|
|
329
|
+
id: row.id,
|
|
330
|
+
description: row.description,
|
|
331
|
+
status: row.status,
|
|
332
|
+
claimedBy: row.claimed_by,
|
|
333
|
+
claimedAt: row.claimed_at,
|
|
334
|
+
completedAt: row.completed_at,
|
|
335
|
+
error: row.error ?? undefined,
|
|
336
|
+
result: row.result ?? undefined
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
console.error('Failed to get task:', error);
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Update a task's status and metadata
|
|
346
|
+
*/
|
|
347
|
+
export function updateTask(taskId, updates) {
|
|
348
|
+
if (!db)
|
|
349
|
+
return false;
|
|
350
|
+
try {
|
|
351
|
+
const setClauses = [];
|
|
352
|
+
const values = [];
|
|
353
|
+
if (updates.status !== undefined) {
|
|
354
|
+
setClauses.push('status = ?');
|
|
355
|
+
values.push(updates.status);
|
|
356
|
+
}
|
|
357
|
+
if (updates.claimedBy !== undefined) {
|
|
358
|
+
setClauses.push('claimed_by = ?');
|
|
359
|
+
values.push(updates.claimedBy);
|
|
360
|
+
}
|
|
361
|
+
if (updates.claimedAt !== undefined) {
|
|
362
|
+
setClauses.push('claimed_at = ?');
|
|
363
|
+
values.push(updates.claimedAt);
|
|
364
|
+
}
|
|
365
|
+
if (updates.completedAt !== undefined) {
|
|
366
|
+
setClauses.push('completed_at = ?');
|
|
367
|
+
values.push(updates.completedAt);
|
|
368
|
+
}
|
|
369
|
+
if (updates.error !== undefined) {
|
|
370
|
+
setClauses.push('error = ?');
|
|
371
|
+
values.push(updates.error ?? null);
|
|
372
|
+
}
|
|
373
|
+
if (updates.result !== undefined) {
|
|
374
|
+
setClauses.push('result = ?');
|
|
375
|
+
values.push(updates.result ?? null);
|
|
376
|
+
}
|
|
377
|
+
if (setClauses.length === 0)
|
|
378
|
+
return true;
|
|
379
|
+
values.push(taskId);
|
|
380
|
+
const stmt = db.prepare(`UPDATE tasks SET ${setClauses.join(', ')} WHERE id = ?`);
|
|
381
|
+
stmt.run(...values);
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
console.error('Failed to update task:', error);
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get swarm statistics
|
|
391
|
+
*/
|
|
392
|
+
export function getStats() {
|
|
393
|
+
if (!db)
|
|
394
|
+
return null;
|
|
395
|
+
try {
|
|
396
|
+
// Get task counts by status
|
|
397
|
+
const countStmt = db.prepare(`
|
|
398
|
+
SELECT status, COUNT(*) as count FROM tasks GROUP BY status
|
|
399
|
+
`);
|
|
400
|
+
const counts = countStmt.all();
|
|
401
|
+
const statusCounts = {
|
|
402
|
+
pending: 0,
|
|
403
|
+
claimed: 0,
|
|
404
|
+
done: 0,
|
|
405
|
+
failed: 0
|
|
406
|
+
};
|
|
407
|
+
for (const row of counts) {
|
|
408
|
+
statusCounts[row.status] = row.count;
|
|
409
|
+
}
|
|
410
|
+
// Get active agents count
|
|
411
|
+
const agentStmt = db.prepare(`
|
|
412
|
+
SELECT COUNT(*) as count FROM heartbeats
|
|
413
|
+
WHERE last_heartbeat > ?
|
|
414
|
+
`);
|
|
415
|
+
const fiveMinutesAgo = Date.now() - 5 * 60 * 1000;
|
|
416
|
+
const agentCount = agentStmt.get(fiveMinutesAgo).count;
|
|
417
|
+
// Get session start time
|
|
418
|
+
const sessionStmt = db.prepare('SELECT started_at FROM swarm_session WHERE id = 1');
|
|
419
|
+
const session = sessionStmt.get();
|
|
420
|
+
const startedAt = session?.started_at ?? Date.now();
|
|
421
|
+
return {
|
|
422
|
+
totalTasks: statusCounts.pending + statusCounts.claimed + statusCounts.done + statusCounts.failed,
|
|
423
|
+
pendingTasks: statusCounts.pending,
|
|
424
|
+
claimedTasks: statusCounts.claimed,
|
|
425
|
+
doneTasks: statusCounts.done,
|
|
426
|
+
failedTasks: statusCounts.failed,
|
|
427
|
+
activeAgents: agentCount,
|
|
428
|
+
elapsedTime: Date.now() - startedAt
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
catch (error) {
|
|
432
|
+
console.error('Failed to get stats:', error);
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Record an agent heartbeat
|
|
438
|
+
*/
|
|
439
|
+
export function recordHeartbeat(agentId, currentTaskId) {
|
|
440
|
+
if (!db)
|
|
441
|
+
return false;
|
|
442
|
+
try {
|
|
443
|
+
const stmt = db.prepare(`
|
|
444
|
+
INSERT OR REPLACE INTO heartbeats (agent_id, last_heartbeat, current_task_id)
|
|
445
|
+
VALUES (?, ?, ?)
|
|
446
|
+
`);
|
|
447
|
+
stmt.run(agentId, Date.now(), currentTaskId);
|
|
448
|
+
return true;
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
console.error('Failed to record heartbeat:', error);
|
|
452
|
+
return false;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Get all agent heartbeats
|
|
457
|
+
*/
|
|
458
|
+
export function getHeartbeats() {
|
|
459
|
+
if (!db)
|
|
460
|
+
return [];
|
|
461
|
+
try {
|
|
462
|
+
const stmt = db.prepare('SELECT * FROM heartbeats ORDER BY agent_id');
|
|
463
|
+
const rows = stmt.all();
|
|
464
|
+
return rows.map(row => ({
|
|
465
|
+
agentId: row.agent_id,
|
|
466
|
+
lastHeartbeat: row.last_heartbeat,
|
|
467
|
+
currentTaskId: row.current_task_id
|
|
468
|
+
}));
|
|
469
|
+
}
|
|
470
|
+
catch (error) {
|
|
471
|
+
console.error('Failed to get heartbeats:', error);
|
|
472
|
+
return [];
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Remove an agent's heartbeat record
|
|
477
|
+
*/
|
|
478
|
+
export function removeHeartbeat(agentId) {
|
|
479
|
+
if (!db)
|
|
480
|
+
return false;
|
|
481
|
+
try {
|
|
482
|
+
const stmt = db.prepare('DELETE FROM heartbeats WHERE agent_id = ?');
|
|
483
|
+
stmt.run(agentId);
|
|
484
|
+
return true;
|
|
485
|
+
}
|
|
486
|
+
catch (error) {
|
|
487
|
+
console.error('Failed to remove heartbeat:', error);
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Clear all data (for reset)
|
|
493
|
+
*/
|
|
494
|
+
export function clearAllData() {
|
|
495
|
+
if (!db)
|
|
496
|
+
return false;
|
|
497
|
+
try {
|
|
498
|
+
db.exec(`
|
|
499
|
+
DELETE FROM tasks;
|
|
500
|
+
DELETE FROM heartbeats;
|
|
501
|
+
DELETE FROM swarm_session;
|
|
502
|
+
`);
|
|
503
|
+
return true;
|
|
504
|
+
}
|
|
505
|
+
catch (error) {
|
|
506
|
+
console.error('Failed to clear data:', error);
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Run a function within a transaction
|
|
512
|
+
*/
|
|
513
|
+
export function runTransaction(fn) {
|
|
514
|
+
if (!db)
|
|
515
|
+
return null;
|
|
516
|
+
try {
|
|
517
|
+
return db.transaction(fn)();
|
|
518
|
+
}
|
|
519
|
+
catch (error) {
|
|
520
|
+
console.error('Transaction failed:', error);
|
|
521
|
+
return null;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Get the raw database instance (for advanced use)
|
|
526
|
+
*/
|
|
527
|
+
export function getDb() {
|
|
528
|
+
return db;
|
|
529
|
+
}
|
|
530
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/hooks/swarm/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Coordination Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the SQLite-based swarm coordination system.
|
|
5
|
+
* Swarm enables multiple agents to claim and work on tasks atomically
|
|
6
|
+
* with lease-based ownership and heartbeat monitoring.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* A task in the swarm task pool
|
|
10
|
+
*/
|
|
11
|
+
export interface SwarmTask {
|
|
12
|
+
/** Unique task identifier */
|
|
13
|
+
id: string;
|
|
14
|
+
/** Human-readable task description */
|
|
15
|
+
description: string;
|
|
16
|
+
/** Current task status */
|
|
17
|
+
status: 'pending' | 'claimed' | 'done' | 'failed';
|
|
18
|
+
/** Agent ID that claimed this task (null if unclaimed) */
|
|
19
|
+
claimedBy: string | null;
|
|
20
|
+
/** Unix timestamp when task was claimed (null if unclaimed) */
|
|
21
|
+
claimedAt: number | null;
|
|
22
|
+
/** Unix timestamp when task was completed (null if incomplete) */
|
|
23
|
+
completedAt: number | null;
|
|
24
|
+
/** Error message if task failed */
|
|
25
|
+
error?: string;
|
|
26
|
+
/** Result/output from completed task */
|
|
27
|
+
result?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Overall swarm state
|
|
31
|
+
*/
|
|
32
|
+
export interface SwarmState {
|
|
33
|
+
/** Whether swarm is currently active */
|
|
34
|
+
active: boolean;
|
|
35
|
+
/** Unique session identifier */
|
|
36
|
+
sessionId: string;
|
|
37
|
+
/** Number of agents participating in the swarm */
|
|
38
|
+
agentCount: number;
|
|
39
|
+
/** All tasks in the swarm */
|
|
40
|
+
tasks: SwarmTask[];
|
|
41
|
+
/** Timestamp when swarm was started */
|
|
42
|
+
startedAt: number;
|
|
43
|
+
/** Timestamp when swarm completed (null if still running) */
|
|
44
|
+
completedAt: number | null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Result of attempting to claim a task
|
|
48
|
+
*/
|
|
49
|
+
export interface ClaimResult {
|
|
50
|
+
/** Whether the claim was successful */
|
|
51
|
+
success: boolean;
|
|
52
|
+
/** ID of the claimed task (null if claim failed) */
|
|
53
|
+
taskId: string | null;
|
|
54
|
+
/** Task description (for convenience) */
|
|
55
|
+
description?: string;
|
|
56
|
+
/** Reason for failure if claim was unsuccessful */
|
|
57
|
+
reason?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Configuration for swarm initialization
|
|
61
|
+
*/
|
|
62
|
+
export interface SwarmConfig {
|
|
63
|
+
/** Number of agents to spawn */
|
|
64
|
+
agentCount: number;
|
|
65
|
+
/** Task descriptions to add to the pool */
|
|
66
|
+
tasks: string[];
|
|
67
|
+
/** Agent type/model to use (default: executor) */
|
|
68
|
+
agentType?: string;
|
|
69
|
+
/** Lease timeout in milliseconds (default: 5 minutes) */
|
|
70
|
+
leaseTimeout?: number;
|
|
71
|
+
/** Heartbeat interval in milliseconds (default: 60 seconds) */
|
|
72
|
+
heartbeatInterval?: number;
|
|
73
|
+
/** Working directory */
|
|
74
|
+
cwd?: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Agent heartbeat record
|
|
78
|
+
*/
|
|
79
|
+
export interface AgentHeartbeat {
|
|
80
|
+
/** Agent identifier */
|
|
81
|
+
agentId: string;
|
|
82
|
+
/** Unix timestamp of last heartbeat */
|
|
83
|
+
lastHeartbeat: number;
|
|
84
|
+
/** Task currently being worked on (null if idle) */
|
|
85
|
+
currentTaskId: string | null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Swarm statistics
|
|
89
|
+
*/
|
|
90
|
+
export interface SwarmStats {
|
|
91
|
+
/** Total number of tasks */
|
|
92
|
+
totalTasks: number;
|
|
93
|
+
/** Number of pending tasks */
|
|
94
|
+
pendingTasks: number;
|
|
95
|
+
/** Number of claimed/in-progress tasks */
|
|
96
|
+
claimedTasks: number;
|
|
97
|
+
/** Number of completed tasks */
|
|
98
|
+
doneTasks: number;
|
|
99
|
+
/** Number of failed tasks */
|
|
100
|
+
failedTasks: number;
|
|
101
|
+
/** Number of active agents */
|
|
102
|
+
activeAgents: number;
|
|
103
|
+
/** Elapsed time in milliseconds */
|
|
104
|
+
elapsedTime: number;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Default configuration values
|
|
108
|
+
*/
|
|
109
|
+
export declare const DEFAULT_SWARM_CONFIG: Required<Omit<SwarmConfig, 'tasks' | 'cwd'>> & {
|
|
110
|
+
tasks: string[];
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Database schema version for migrations
|
|
114
|
+
*/
|
|
115
|
+
export declare const DB_SCHEMA_VERSION = 1;
|
|
116
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/hooks/swarm/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClD,0DAA0D;IAC1D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kEAAkE;IAClE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAMlG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Coordination Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the SQLite-based swarm coordination system.
|
|
5
|
+
* Swarm enables multiple agents to claim and work on tasks atomically
|
|
6
|
+
* with lease-based ownership and heartbeat monitoring.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Default configuration values
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_SWARM_CONFIG = {
|
|
12
|
+
agentCount: 3,
|
|
13
|
+
tasks: [],
|
|
14
|
+
agentType: 'executor',
|
|
15
|
+
leaseTimeout: 5 * 60 * 1000, // 5 minutes
|
|
16
|
+
heartbeatInterval: 60 * 1000 // 60 seconds
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Database schema version for migrations
|
|
20
|
+
*/
|
|
21
|
+
export const DB_SCHEMA_VERSION = 1;
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hooks/swarm/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0GH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAuE;IACtG,UAAU,EAAE,CAAC;IACb,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,UAAU;IACrB,YAAY,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY;IACzC,iBAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa;CAC3C,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC"}
|