oh-my-claude-sisyphus 3.5.8 → 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.test.js +10 -9
- package/dist/__tests__/hooks.test.js.map +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/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/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/package.json +3 -1
- 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,94 @@
|
|
|
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 type BetterSqlite3 from 'better-sqlite3';
|
|
9
|
+
import type { SwarmTask, SwarmState, AgentHeartbeat, SwarmStats } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Initialize the SQLite database
|
|
12
|
+
* Creates tables if they don't exist
|
|
13
|
+
*/
|
|
14
|
+
export declare function initDb(cwd: string): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Close the database connection
|
|
17
|
+
*/
|
|
18
|
+
export declare function closeDb(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Delete the database file (for cleanup)
|
|
21
|
+
*/
|
|
22
|
+
export declare function deleteDb(cwd: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Check if database is initialized and connected
|
|
25
|
+
*/
|
|
26
|
+
export declare function isDbInitialized(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Initialize a new swarm session
|
|
29
|
+
*/
|
|
30
|
+
export declare function initSession(sessionId: string, agentCount: number): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Load the current swarm state
|
|
33
|
+
*/
|
|
34
|
+
export declare function loadState(): SwarmState | null;
|
|
35
|
+
/**
|
|
36
|
+
* Save swarm state (updates session info only, tasks are updated individually)
|
|
37
|
+
*/
|
|
38
|
+
export declare function saveState(state: Partial<SwarmState>): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Add a task to the pool
|
|
41
|
+
*/
|
|
42
|
+
export declare function addTask(id: string, description: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Add multiple tasks in a transaction
|
|
45
|
+
*/
|
|
46
|
+
export declare function addTasks(tasks: Array<{
|
|
47
|
+
id: string;
|
|
48
|
+
description: string;
|
|
49
|
+
}>): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Get all tasks
|
|
52
|
+
*/
|
|
53
|
+
export declare function getTasks(): SwarmTask[];
|
|
54
|
+
/**
|
|
55
|
+
* Get tasks by status
|
|
56
|
+
*/
|
|
57
|
+
export declare function getTasksByStatus(status: SwarmTask['status']): SwarmTask[];
|
|
58
|
+
/**
|
|
59
|
+
* Get a specific task by ID
|
|
60
|
+
*/
|
|
61
|
+
export declare function getTask(taskId: string): SwarmTask | null;
|
|
62
|
+
/**
|
|
63
|
+
* Update a task's status and metadata
|
|
64
|
+
*/
|
|
65
|
+
export declare function updateTask(taskId: string, updates: Partial<Omit<SwarmTask, 'id' | 'description'>>): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Get swarm statistics
|
|
68
|
+
*/
|
|
69
|
+
export declare function getStats(): SwarmStats | null;
|
|
70
|
+
/**
|
|
71
|
+
* Record an agent heartbeat
|
|
72
|
+
*/
|
|
73
|
+
export declare function recordHeartbeat(agentId: string, currentTaskId: string | null): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Get all agent heartbeats
|
|
76
|
+
*/
|
|
77
|
+
export declare function getHeartbeats(): AgentHeartbeat[];
|
|
78
|
+
/**
|
|
79
|
+
* Remove an agent's heartbeat record
|
|
80
|
+
*/
|
|
81
|
+
export declare function removeHeartbeat(agentId: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Clear all data (for reset)
|
|
84
|
+
*/
|
|
85
|
+
export declare function clearAllData(): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Run a function within a transaction
|
|
88
|
+
*/
|
|
89
|
+
export declare function runTransaction<T>(fn: () => T): T | null;
|
|
90
|
+
/**
|
|
91
|
+
* Get the raw database instance (for advanced use)
|
|
92
|
+
*/
|
|
93
|
+
export declare function getDb(): BetterSqlite3.Database | null;
|
|
94
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/hooks/swarm/state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,UAAU,EACX,MAAM,YAAY,CAAC;AA2BpB;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAsE1D;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAK9B;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAiB7C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAc1E;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,UAAU,GAAG,IAAI,CAoD7C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CA2B7D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAchE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAqBnF;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,SAAS,EAAE,CA8BtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,SAAS,EAAE,CA8BzE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAgCxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC,GACtD,OAAO,CA0CT;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,UAAU,GAAG,IAAI,CA+C5C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CActF;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,cAAc,EAAE,CAoBhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAWxD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CActC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CASvD;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,aAAa,CAAC,QAAQ,GAAG,IAAI,CAErD"}
|
|
@@ -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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"}
|