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.
Files changed (112) hide show
  1. package/agents/executor-high.md +2 -0
  2. package/agents/executor-low.md +2 -0
  3. package/agents/executor.md +2 -0
  4. package/agents/templates/base-agent.md +9 -0
  5. package/commands/cancel.md +8 -8
  6. package/commands/swarm.md +350 -148
  7. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
  8. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
  9. package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
  10. package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
  11. package/dist/__tests__/hooks/learner/bridge.test.d.ts +11 -0
  12. package/dist/__tests__/hooks/learner/bridge.test.d.ts.map +1 -0
  13. package/dist/__tests__/hooks/learner/bridge.test.js +199 -0
  14. package/dist/__tests__/hooks/learner/bridge.test.js.map +1 -0
  15. package/dist/__tests__/hooks.test.js +10 -9
  16. package/dist/__tests__/hooks.test.js.map +1 -1
  17. package/dist/__tests__/installer.test.js +1 -1
  18. package/dist/agents/codex-agents.d.ts +20 -0
  19. package/dist/agents/codex-agents.d.ts.map +1 -0
  20. package/dist/agents/codex-agents.js +36 -0
  21. package/dist/agents/codex-agents.js.map +1 -0
  22. package/dist/agents/preamble.d.ts +14 -0
  23. package/dist/agents/preamble.d.ts.map +1 -0
  24. package/dist/agents/preamble.js +26 -0
  25. package/dist/agents/preamble.js.map +1 -0
  26. package/dist/hooks/autopilot/__tests__/cancel.test.js +14 -4
  27. package/dist/hooks/autopilot/__tests__/cancel.test.js.map +1 -1
  28. package/dist/hooks/autopilot/__tests__/state.test.js +1 -0
  29. package/dist/hooks/autopilot/__tests__/state.test.js.map +1 -1
  30. package/dist/hooks/autopilot/__tests__/summary.test.js +38 -3
  31. package/dist/hooks/autopilot/__tests__/summary.test.js.map +1 -1
  32. package/dist/hooks/autopilot/state.d.ts +1 -1
  33. package/dist/hooks/autopilot/state.d.ts.map +1 -1
  34. package/dist/hooks/autopilot/state.js +15 -8
  35. package/dist/hooks/autopilot/state.js.map +1 -1
  36. package/dist/hooks/index.d.ts +2 -0
  37. package/dist/hooks/index.d.ts.map +1 -1
  38. package/dist/hooks/index.js +7 -0
  39. package/dist/hooks/index.js.map +1 -1
  40. package/dist/hooks/learner/bridge.d.ts +71 -0
  41. package/dist/hooks/learner/bridge.d.ts.map +1 -0
  42. package/dist/hooks/learner/bridge.js +426 -0
  43. package/dist/hooks/learner/bridge.js.map +1 -0
  44. package/dist/hooks/mode-registry/index.d.ts +135 -0
  45. package/dist/hooks/mode-registry/index.d.ts.map +1 -0
  46. package/dist/hooks/mode-registry/index.js +445 -0
  47. package/dist/hooks/mode-registry/index.js.map +1 -0
  48. package/dist/hooks/mode-registry/types.d.ts +31 -0
  49. package/dist/hooks/mode-registry/types.d.ts.map +1 -0
  50. package/dist/hooks/mode-registry/types.js +7 -0
  51. package/dist/hooks/mode-registry/types.js.map +1 -0
  52. package/dist/hooks/ralph/loop.js +6 -6
  53. package/dist/hooks/ralph/loop.js.map +1 -1
  54. package/dist/hooks/skill-bridge.cjs +349 -0
  55. package/dist/hooks/swarm/__tests__/claiming.test.d.ts +2 -0
  56. package/dist/hooks/swarm/__tests__/claiming.test.d.ts.map +1 -0
  57. package/dist/hooks/swarm/__tests__/claiming.test.js +170 -0
  58. package/dist/hooks/swarm/__tests__/claiming.test.js.map +1 -0
  59. package/dist/hooks/swarm/__tests__/index.test.d.ts +2 -0
  60. package/dist/hooks/swarm/__tests__/index.test.d.ts.map +1 -0
  61. package/dist/hooks/swarm/__tests__/index.test.js +157 -0
  62. package/dist/hooks/swarm/__tests__/index.test.js.map +1 -0
  63. package/dist/hooks/swarm/__tests__/mode-registry.test.d.ts +2 -0
  64. package/dist/hooks/swarm/__tests__/mode-registry.test.d.ts.map +1 -0
  65. package/dist/hooks/swarm/__tests__/mode-registry.test.js +177 -0
  66. package/dist/hooks/swarm/__tests__/mode-registry.test.js.map +1 -0
  67. package/dist/hooks/swarm/claiming.d.ts +101 -0
  68. package/dist/hooks/swarm/claiming.d.ts.map +1 -0
  69. package/dist/hooks/swarm/claiming.js +460 -0
  70. package/dist/hooks/swarm/claiming.js.map +1 -0
  71. package/dist/hooks/swarm/index.d.ts +221 -0
  72. package/dist/hooks/swarm/index.d.ts.map +1 -0
  73. package/dist/hooks/swarm/index.js +413 -0
  74. package/dist/hooks/swarm/index.js.map +1 -0
  75. package/dist/hooks/swarm/state.d.ts +94 -0
  76. package/dist/hooks/swarm/state.d.ts.map +1 -0
  77. package/dist/hooks/swarm/state.js +530 -0
  78. package/dist/hooks/swarm/state.js.map +1 -0
  79. package/dist/hooks/swarm/types.d.ts +116 -0
  80. package/dist/hooks/swarm/types.d.ts.map +1 -0
  81. package/dist/hooks/swarm/types.js +22 -0
  82. package/dist/hooks/swarm/types.js.map +1 -0
  83. package/dist/hooks/ultrapilot/decomposer.d.ts +141 -0
  84. package/dist/hooks/ultrapilot/decomposer.d.ts.map +1 -0
  85. package/dist/hooks/ultrapilot/decomposer.js +377 -0
  86. package/dist/hooks/ultrapilot/decomposer.js.map +1 -0
  87. package/dist/hooks/ultrapilot/index.d.ts +31 -0
  88. package/dist/hooks/ultrapilot/index.d.ts.map +1 -1
  89. package/dist/hooks/ultrapilot/index.js +43 -2
  90. package/dist/hooks/ultrapilot/index.js.map +1 -1
  91. package/dist/hooks/ultrapilot/state.d.ts +1 -1
  92. package/dist/hooks/ultrapilot/state.d.ts.map +1 -1
  93. package/dist/hooks/ultrapilot/state.js +7 -0
  94. package/dist/hooks/ultrapilot/state.js.map +1 -1
  95. package/dist/hooks/ultraqa/index.js +5 -5
  96. package/dist/hooks/ultraqa/index.js.map +1 -1
  97. package/dist/hooks/ultrawork/index.js +3 -3
  98. package/dist/hooks/ultrawork/index.js.map +1 -1
  99. package/dist/installer/index.d.ts +1 -1
  100. package/dist/installer/index.js +1 -1
  101. package/package.json +6 -2
  102. package/scripts/build-skill-bridge.mjs +32 -0
  103. package/scripts/skill-injector.mjs +77 -26
  104. package/skills/autopilot/SKILL.md +18 -0
  105. package/skills/cancel/SKILL.md +166 -141
  106. package/skills/ecomode/SKILL.md +14 -0
  107. package/skills/pipeline/SKILL.md +13 -0
  108. package/skills/ralph/SKILL.md +22 -1
  109. package/skills/swarm/SKILL.md +521 -197
  110. package/skills/ultrapilot/SKILL.md +82 -13
  111. package/skills/ultraqa/SKILL.md +13 -0
  112. 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"}