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,413 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Coordination System
|
|
3
|
+
*
|
|
4
|
+
* SQLite-based multi-agent task coordination.
|
|
5
|
+
* Enables N agents to claim and work on tasks from a shared pool
|
|
6
|
+
* with atomic claiming, lease-based ownership, and heartbeat monitoring.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { startSwarm, claimTask, completeTask, stopSwarm } from './swarm';
|
|
11
|
+
*
|
|
12
|
+
* // Initialize swarm with tasks
|
|
13
|
+
* await startSwarm({
|
|
14
|
+
* agentCount: 5,
|
|
15
|
+
* tasks: ['fix error in auth.ts', 'add tests for api.ts', ...],
|
|
16
|
+
* cwd: process.cwd()
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Each agent claims and works on tasks
|
|
20
|
+
* const claim = claimTask('agent-1');
|
|
21
|
+
* if (claim.success) {
|
|
22
|
+
* // Do work...
|
|
23
|
+
* completeTask('agent-1', claim.taskId!, 'Fixed the bug');
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* // Check status
|
|
27
|
+
* const status = getSwarmStatus();
|
|
28
|
+
*
|
|
29
|
+
* // Clean up when done
|
|
30
|
+
* stopSwarm();
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
import { randomUUID } from 'crypto';
|
|
34
|
+
import { existsSync, statSync } from 'fs';
|
|
35
|
+
import { join } from 'path';
|
|
36
|
+
import { DEFAULT_SWARM_CONFIG } from './types.js';
|
|
37
|
+
import { initDb, closeDb, deleteDb, isDbInitialized, initSession, loadState, saveState, addTasks, getTasks, getTasksByStatus, getTask, getStats, getHeartbeats, clearAllData } from './state.js';
|
|
38
|
+
import { claimTask as claimTaskInternal, releaseTask as releaseTaskInternal, completeTask as completeTaskInternal, failTask as failTaskInternal, heartbeat as heartbeatInternal, cleanupStaleClaims as cleanupStaleClaimsInternal, getTasksClaimedBy, hasPendingTasks, allTasksComplete, getActiveAgentCount, reclaimFailedTask } from './claiming.js';
|
|
39
|
+
import { canStartMode, createModeMarker, removeModeMarker } from '../mode-registry/index.js';
|
|
40
|
+
// Current working directory for the swarm
|
|
41
|
+
let currentCwd = null;
|
|
42
|
+
// Cleanup interval handle
|
|
43
|
+
let cleanupIntervalHandle = null;
|
|
44
|
+
/**
|
|
45
|
+
* Clean up resources on initialization failure
|
|
46
|
+
* Called when startSwarm fails after partial initialization
|
|
47
|
+
*/
|
|
48
|
+
function cleanupOnFailure(cwd) {
|
|
49
|
+
// Stop cleanup timer if started
|
|
50
|
+
if (cleanupIntervalHandle) {
|
|
51
|
+
clearInterval(cleanupIntervalHandle);
|
|
52
|
+
cleanupIntervalHandle = null;
|
|
53
|
+
}
|
|
54
|
+
// Close database
|
|
55
|
+
closeDb();
|
|
56
|
+
// Remove marker file
|
|
57
|
+
removeModeMarker('swarm', cwd);
|
|
58
|
+
// Reset state
|
|
59
|
+
currentCwd = null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Start a new swarm session
|
|
63
|
+
*
|
|
64
|
+
* Initializes the SQLite database, creates the task pool,
|
|
65
|
+
* and starts the stale claim cleanup timer.
|
|
66
|
+
*
|
|
67
|
+
* @param config - Swarm configuration
|
|
68
|
+
* @returns true if swarm was started successfully
|
|
69
|
+
*/
|
|
70
|
+
export async function startSwarm(config) {
|
|
71
|
+
const { agentCount, tasks, cwd = process.cwd(), leaseTimeout = DEFAULT_SWARM_CONFIG.leaseTimeout } = config;
|
|
72
|
+
if (tasks.length === 0) {
|
|
73
|
+
console.error('Cannot start swarm with no tasks');
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (agentCount < 1) {
|
|
77
|
+
console.error('Agent count must be at least 1');
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
// Mutual exclusion check via mode-registry
|
|
81
|
+
const canStart = canStartMode('swarm', cwd);
|
|
82
|
+
if (!canStart.allowed) {
|
|
83
|
+
console.error(canStart.message);
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
// Initialize database
|
|
87
|
+
const dbInitialized = await initDb(cwd);
|
|
88
|
+
if (!dbInitialized) {
|
|
89
|
+
console.error('Failed to initialize swarm database');
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// Create marker file to indicate swarm is active
|
|
93
|
+
createModeMarker('swarm', cwd, {
|
|
94
|
+
agentCount,
|
|
95
|
+
taskCount: tasks.length
|
|
96
|
+
});
|
|
97
|
+
currentCwd = cwd;
|
|
98
|
+
// Clear any existing data
|
|
99
|
+
clearAllData();
|
|
100
|
+
// Create session
|
|
101
|
+
const sessionId = randomUUID();
|
|
102
|
+
if (!initSession(sessionId, agentCount)) {
|
|
103
|
+
console.error('Failed to initialize swarm session');
|
|
104
|
+
cleanupOnFailure(cwd);
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
// Add tasks to pool
|
|
108
|
+
const taskRecords = tasks.map((description, index) => ({
|
|
109
|
+
id: `task-${index + 1}`,
|
|
110
|
+
description
|
|
111
|
+
}));
|
|
112
|
+
if (!addTasks(taskRecords)) {
|
|
113
|
+
console.error('Failed to add tasks to pool');
|
|
114
|
+
cleanupOnFailure(cwd);
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
// Start cleanup timer (runs every minute)
|
|
118
|
+
cleanupIntervalHandle = setInterval(() => {
|
|
119
|
+
cleanupStaleClaimsInternal(leaseTimeout);
|
|
120
|
+
}, 60 * 1000);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Stop the swarm and clean up resources
|
|
125
|
+
*
|
|
126
|
+
* Stops the cleanup timer and optionally deletes the database.
|
|
127
|
+
*
|
|
128
|
+
* @param deleteDatabase - Whether to delete the database file (default: false)
|
|
129
|
+
* @returns true if swarm was stopped successfully
|
|
130
|
+
*/
|
|
131
|
+
export function stopSwarm(deleteDatabase = false) {
|
|
132
|
+
// Stop cleanup timer
|
|
133
|
+
if (cleanupIntervalHandle) {
|
|
134
|
+
clearInterval(cleanupIntervalHandle);
|
|
135
|
+
cleanupIntervalHandle = null;
|
|
136
|
+
}
|
|
137
|
+
// Mark session as inactive
|
|
138
|
+
saveState({ active: false, completedAt: Date.now() });
|
|
139
|
+
// Close database
|
|
140
|
+
closeDb();
|
|
141
|
+
// Optionally delete database
|
|
142
|
+
if (deleteDatabase && currentCwd) {
|
|
143
|
+
deleteDb(currentCwd);
|
|
144
|
+
}
|
|
145
|
+
// Remove marker file
|
|
146
|
+
if (currentCwd) {
|
|
147
|
+
removeModeMarker('swarm', currentCwd);
|
|
148
|
+
}
|
|
149
|
+
currentCwd = null;
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the current swarm status
|
|
154
|
+
*
|
|
155
|
+
* @returns SwarmState or null if swarm is not active
|
|
156
|
+
*/
|
|
157
|
+
export function getSwarmStatus() {
|
|
158
|
+
return loadState();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get swarm statistics
|
|
162
|
+
*
|
|
163
|
+
* @returns SwarmStats with task counts and timing info
|
|
164
|
+
*/
|
|
165
|
+
export function getSwarmStats() {
|
|
166
|
+
return getStats();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Claim the next available task
|
|
170
|
+
*
|
|
171
|
+
* @param agentId - Unique identifier for the claiming agent
|
|
172
|
+
* @returns ClaimResult with success status and task details
|
|
173
|
+
*/
|
|
174
|
+
export function claimTask(agentId) {
|
|
175
|
+
return claimTaskInternal(agentId);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Release a claimed task back to the pool
|
|
179
|
+
*
|
|
180
|
+
* @param agentId - Agent releasing the task
|
|
181
|
+
* @param taskId - Task to release
|
|
182
|
+
* @returns true if release was successful
|
|
183
|
+
*/
|
|
184
|
+
export function releaseTask(agentId, taskId) {
|
|
185
|
+
return releaseTaskInternal(agentId, taskId);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Mark a task as completed
|
|
189
|
+
*
|
|
190
|
+
* @param agentId - Agent that completed the task
|
|
191
|
+
* @param taskId - Completed task ID
|
|
192
|
+
* @param result - Optional result/output from the task
|
|
193
|
+
* @returns true if completion was recorded
|
|
194
|
+
*/
|
|
195
|
+
export function completeTask(agentId, taskId, result) {
|
|
196
|
+
const success = completeTaskInternal(agentId, taskId, result);
|
|
197
|
+
// Check if all tasks are complete
|
|
198
|
+
if (success && allTasksComplete()) {
|
|
199
|
+
saveState({ completedAt: Date.now() });
|
|
200
|
+
}
|
|
201
|
+
return success;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Mark a task as failed
|
|
205
|
+
*
|
|
206
|
+
* @param agentId - Agent that failed the task
|
|
207
|
+
* @param taskId - Failed task ID
|
|
208
|
+
* @param error - Error message/reason for failure
|
|
209
|
+
* @returns true if failure was recorded
|
|
210
|
+
*/
|
|
211
|
+
export function failTask(agentId, taskId, error) {
|
|
212
|
+
return failTaskInternal(agentId, taskId, error);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Send a heartbeat to indicate the agent is still alive
|
|
216
|
+
*
|
|
217
|
+
* Agents should call this every 60 seconds while working on tasks.
|
|
218
|
+
*
|
|
219
|
+
* @param agentId - Agent sending heartbeat
|
|
220
|
+
* @returns true if heartbeat was recorded
|
|
221
|
+
*/
|
|
222
|
+
export function heartbeat(agentId) {
|
|
223
|
+
return heartbeatInternal(agentId);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Clean up stale claims from dead agents
|
|
227
|
+
*
|
|
228
|
+
* Called automatically by the cleanup timer, but can also be called manually.
|
|
229
|
+
*
|
|
230
|
+
* @param leaseTimeout - Lease timeout in milliseconds (default: 5 minutes)
|
|
231
|
+
* @returns Number of tasks released
|
|
232
|
+
*/
|
|
233
|
+
export function cleanupStaleClaims(leaseTimeout) {
|
|
234
|
+
return cleanupStaleClaimsInternal(leaseTimeout);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Check if there are pending tasks
|
|
238
|
+
*
|
|
239
|
+
* @returns true if there are tasks waiting to be claimed
|
|
240
|
+
*/
|
|
241
|
+
export function hasPendingWork() {
|
|
242
|
+
return hasPendingTasks();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Check if all tasks are complete
|
|
246
|
+
*
|
|
247
|
+
* @returns true if all tasks are done or failed
|
|
248
|
+
*/
|
|
249
|
+
export function isSwarmComplete() {
|
|
250
|
+
return allTasksComplete();
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get the number of active agents
|
|
254
|
+
*
|
|
255
|
+
* @returns Number of agents with recent heartbeats
|
|
256
|
+
*/
|
|
257
|
+
export function getActiveAgents() {
|
|
258
|
+
return getActiveAgentCount();
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get all tasks
|
|
262
|
+
*
|
|
263
|
+
* @returns Array of all tasks in the swarm
|
|
264
|
+
*/
|
|
265
|
+
export function getAllTasks() {
|
|
266
|
+
return getTasks();
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get tasks by status
|
|
270
|
+
*
|
|
271
|
+
* @param status - Task status to filter by
|
|
272
|
+
* @returns Array of tasks with the given status
|
|
273
|
+
*/
|
|
274
|
+
export function getTasksWithStatus(status) {
|
|
275
|
+
return getTasksByStatus(status);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get a specific task
|
|
279
|
+
*
|
|
280
|
+
* @param taskId - Task ID to retrieve
|
|
281
|
+
* @returns Task or null if not found
|
|
282
|
+
*/
|
|
283
|
+
export function getTaskById(taskId) {
|
|
284
|
+
return getTask(taskId);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get tasks claimed by a specific agent
|
|
288
|
+
*
|
|
289
|
+
* @param agentId - Agent to query
|
|
290
|
+
* @returns Array of tasks claimed by the agent
|
|
291
|
+
*/
|
|
292
|
+
export function getAgentTasks(agentId) {
|
|
293
|
+
return getTasksClaimedBy(agentId);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Get all agent heartbeats
|
|
297
|
+
*
|
|
298
|
+
* @returns Array of agent heartbeat records
|
|
299
|
+
*/
|
|
300
|
+
export function getAllHeartbeats() {
|
|
301
|
+
return getHeartbeats();
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Retry a failed task
|
|
305
|
+
*
|
|
306
|
+
* @param agentId - Agent attempting to retry
|
|
307
|
+
* @param taskId - Failed task to retry
|
|
308
|
+
* @returns ClaimResult
|
|
309
|
+
*/
|
|
310
|
+
export function retryTask(agentId, taskId) {
|
|
311
|
+
return reclaimFailedTask(agentId, taskId);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Check if swarm database is initialized
|
|
315
|
+
*
|
|
316
|
+
* @returns true if database is ready
|
|
317
|
+
*/
|
|
318
|
+
export function isSwarmReady() {
|
|
319
|
+
return isDbInitialized();
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Initialize database without starting a swarm
|
|
323
|
+
*
|
|
324
|
+
* Useful for agents that join an existing swarm.
|
|
325
|
+
*
|
|
326
|
+
* @param cwd - Working directory
|
|
327
|
+
* @returns true if database was initialized
|
|
328
|
+
*/
|
|
329
|
+
export async function connectToSwarm(cwd) {
|
|
330
|
+
if (isDbInitialized()) {
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
const success = await initDb(cwd);
|
|
334
|
+
if (success) {
|
|
335
|
+
currentCwd = cwd;
|
|
336
|
+
}
|
|
337
|
+
return success;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Disconnect from swarm without stopping it
|
|
341
|
+
*
|
|
342
|
+
* @returns true if disconnected successfully
|
|
343
|
+
*/
|
|
344
|
+
export function disconnectFromSwarm() {
|
|
345
|
+
closeDb();
|
|
346
|
+
currentCwd = null;
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Check if swarm is currently active
|
|
351
|
+
*
|
|
352
|
+
* Used by cancel skill to detect active swarm.
|
|
353
|
+
* Checks if database exists and session is active.
|
|
354
|
+
*
|
|
355
|
+
* @param cwd - Working directory to check
|
|
356
|
+
* @returns true if swarm is active
|
|
357
|
+
*/
|
|
358
|
+
export function isSwarmActive(cwd) {
|
|
359
|
+
// If database is already connected, check state directly
|
|
360
|
+
if (isDbInitialized()) {
|
|
361
|
+
const state = loadState();
|
|
362
|
+
return state !== null && state.active === true;
|
|
363
|
+
}
|
|
364
|
+
// Otherwise, check if database file exists and is non-empty
|
|
365
|
+
const dbPath = join(cwd, '.omc', 'state', 'swarm.db');
|
|
366
|
+
if (!existsSync(dbPath)) {
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
const stats = statSync(dbPath);
|
|
371
|
+
return stats.size > 0;
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Cancel active swarm
|
|
379
|
+
*
|
|
380
|
+
* Used by cancel skill to stop swarm cleanly.
|
|
381
|
+
*
|
|
382
|
+
* @param cwd - Working directory
|
|
383
|
+
* @returns CancelResult with success status and message
|
|
384
|
+
*/
|
|
385
|
+
export async function cancelSwarm(cwd) {
|
|
386
|
+
// Connect if not already connected
|
|
387
|
+
if (!isDbInitialized()) {
|
|
388
|
+
const connected = await connectToSwarm(cwd);
|
|
389
|
+
if (!connected) {
|
|
390
|
+
return {
|
|
391
|
+
success: false,
|
|
392
|
+
message: 'Failed to connect to swarm database'
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const state = getSwarmStatus();
|
|
397
|
+
if (!state || !state.active) {
|
|
398
|
+
return {
|
|
399
|
+
success: false,
|
|
400
|
+
message: 'No active swarm session found'
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
const stats = getSwarmStats();
|
|
404
|
+
// Stop the swarm (preserves database for analysis)
|
|
405
|
+
stopSwarm(false);
|
|
406
|
+
return {
|
|
407
|
+
success: true,
|
|
408
|
+
message: `Swarm cancelled. ${stats?.doneTasks ?? 0}/${stats?.totalTasks ?? 0} tasks completed.`,
|
|
409
|
+
stats
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
export { DEFAULT_SWARM_CONFIG } from './types.js';
|
|
413
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/swarm/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|