steroids-api 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/API/src/index.d.ts +10 -0
- package/dist/API/src/index.d.ts.map +1 -0
- package/dist/API/src/index.js +130 -0
- package/dist/API/src/index.js.map +1 -0
- package/dist/API/src/routes/activity.d.ts +7 -0
- package/dist/API/src/routes/activity.d.ts.map +1 -0
- package/dist/API/src/routes/activity.js +252 -0
- package/dist/API/src/routes/activity.js.map +1 -0
- package/dist/API/src/routes/config.d.ts +7 -0
- package/dist/API/src/routes/config.d.ts.map +1 -0
- package/dist/API/src/routes/config.js +521 -0
- package/dist/API/src/routes/config.js.map +1 -0
- package/dist/API/src/routes/health.d.ts +7 -0
- package/dist/API/src/routes/health.d.ts.map +1 -0
- package/dist/API/src/routes/health.js +172 -0
- package/dist/API/src/routes/health.js.map +1 -0
- package/dist/API/src/routes/incidents.d.ts +7 -0
- package/dist/API/src/routes/incidents.d.ts.map +1 -0
- package/dist/API/src/routes/incidents.js +117 -0
- package/dist/API/src/routes/incidents.js.map +1 -0
- package/dist/API/src/routes/projects.d.ts +7 -0
- package/dist/API/src/routes/projects.d.ts.map +1 -0
- package/dist/API/src/routes/projects.js +398 -0
- package/dist/API/src/routes/projects.js.map +1 -0
- package/dist/API/src/routes/runners.d.ts +7 -0
- package/dist/API/src/routes/runners.d.ts.map +1 -0
- package/dist/API/src/routes/runners.js +242 -0
- package/dist/API/src/routes/runners.js.map +1 -0
- package/dist/API/src/routes/tasks.d.ts +7 -0
- package/dist/API/src/routes/tasks.d.ts.map +1 -0
- package/dist/API/src/routes/tasks.js +1007 -0
- package/dist/API/src/routes/tasks.js.map +1 -0
- package/dist/API/src/utils/validation.d.ts +22 -0
- package/dist/API/src/utils/validation.d.ts.map +1 -0
- package/dist/API/src/utils/validation.js +50 -0
- package/dist/API/src/utils/validation.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/activity.d.ts +7 -0
- package/dist/routes/activity.d.ts.map +1 -0
- package/dist/routes/activity.js +252 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/config.d.ts +7 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +647 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/credit-alerts.d.ts +2 -0
- package/dist/routes/credit-alerts.d.ts.map +1 -0
- package/dist/routes/credit-alerts.js +97 -0
- package/dist/routes/credit-alerts.js.map +1 -0
- package/dist/routes/health.d.ts +7 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +200 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/incidents.d.ts +7 -0
- package/dist/routes/incidents.d.ts.map +1 -0
- package/dist/routes/incidents.js +117 -0
- package/dist/routes/incidents.js.map +1 -0
- package/dist/routes/projects.d.ts +7 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +643 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/runners.d.ts +7 -0
- package/dist/routes/runners.d.ts.map +1 -0
- package/dist/routes/runners.js +299 -0
- package/dist/routes/runners.js.map +1 -0
- package/dist/routes/skills.d.ts +3 -0
- package/dist/routes/skills.d.ts.map +1 -0
- package/dist/routes/skills.js +109 -0
- package/dist/routes/skills.js.map +1 -0
- package/dist/routes/storage.d.ts +7 -0
- package/dist/routes/storage.d.ts.map +1 -0
- package/dist/routes/storage.js +93 -0
- package/dist/routes/storage.js.map +1 -0
- package/dist/routes/tasks.d.ts +7 -0
- package/dist/routes/tasks.d.ts.map +1 -0
- package/dist/routes/tasks.js +1145 -0
- package/dist/routes/tasks.js.map +1 -0
- package/dist/src/cleanup/invocation-logs.d.ts +30 -0
- package/dist/src/cleanup/invocation-logs.d.ts.map +1 -0
- package/dist/src/cleanup/invocation-logs.js +66 -0
- package/dist/src/cleanup/invocation-logs.js.map +1 -0
- package/dist/src/commands/loop-phases.d.ts +11 -0
- package/dist/src/commands/loop-phases.d.ts.map +1 -0
- package/dist/src/commands/loop-phases.js +304 -0
- package/dist/src/commands/loop-phases.js.map +1 -0
- package/dist/src/config/loader.d.ts +160 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +276 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/database/connection.d.ts +35 -0
- package/dist/src/database/connection.d.ts.map +1 -0
- package/dist/src/database/connection.js +197 -0
- package/dist/src/database/connection.js.map +1 -0
- package/dist/src/database/queries.d.ts +220 -0
- package/dist/src/database/queries.d.ts.map +1 -0
- package/dist/src/database/queries.js +589 -0
- package/dist/src/database/queries.js.map +1 -0
- package/dist/src/database/schema.d.ts +8 -0
- package/dist/src/database/schema.d.ts.map +1 -0
- package/dist/src/database/schema.js +184 -0
- package/dist/src/database/schema.js.map +1 -0
- package/dist/src/git/push.d.ts +26 -0
- package/dist/src/git/push.d.ts.map +1 -0
- package/dist/src/git/push.js +91 -0
- package/dist/src/git/push.js.map +1 -0
- package/dist/src/git/status.d.ts +83 -0
- package/dist/src/git/status.d.ts.map +1 -0
- package/dist/src/git/status.js +315 -0
- package/dist/src/git/status.js.map +1 -0
- package/dist/src/health/stuck-task-detector.d.ts +131 -0
- package/dist/src/health/stuck-task-detector.d.ts.map +1 -0
- package/dist/src/health/stuck-task-detector.js +233 -0
- package/dist/src/health/stuck-task-detector.js.map +1 -0
- package/dist/src/health/stuck-task-recovery.d.ts +45 -0
- package/dist/src/health/stuck-task-recovery.d.ts.map +1 -0
- package/dist/src/health/stuck-task-recovery.js +309 -0
- package/dist/src/health/stuck-task-recovery.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +130 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/locking/queries.d.ts +116 -0
- package/dist/src/locking/queries.d.ts.map +1 -0
- package/dist/src/locking/queries.js +232 -0
- package/dist/src/locking/queries.js.map +1 -0
- package/dist/src/locking/section-lock.d.ts +74 -0
- package/dist/src/locking/section-lock.d.ts.map +1 -0
- package/dist/src/locking/section-lock.js +196 -0
- package/dist/src/locking/section-lock.js.map +1 -0
- package/dist/src/locking/task-lock.d.ts +92 -0
- package/dist/src/locking/task-lock.d.ts.map +1 -0
- package/dist/src/locking/task-lock.js +233 -0
- package/dist/src/locking/task-lock.js.map +1 -0
- package/dist/src/migrations/index.d.ts +7 -0
- package/dist/src/migrations/index.d.ts.map +1 -0
- package/dist/src/migrations/index.js +9 -0
- package/dist/src/migrations/index.js.map +1 -0
- package/dist/src/migrations/manifest.d.ts +92 -0
- package/dist/src/migrations/manifest.d.ts.map +1 -0
- package/dist/src/migrations/manifest.js +255 -0
- package/dist/src/migrations/manifest.js.map +1 -0
- package/dist/src/migrations/runner.d.ts +84 -0
- package/dist/src/migrations/runner.d.ts.map +1 -0
- package/dist/src/migrations/runner.js +338 -0
- package/dist/src/migrations/runner.js.map +1 -0
- package/dist/src/orchestrator/coder.d.ts +32 -0
- package/dist/src/orchestrator/coder.d.ts.map +1 -0
- package/dist/src/orchestrator/coder.js +170 -0
- package/dist/src/orchestrator/coder.js.map +1 -0
- package/dist/src/orchestrator/coordinator.d.ts +28 -0
- package/dist/src/orchestrator/coordinator.d.ts.map +1 -0
- package/dist/src/orchestrator/coordinator.js +252 -0
- package/dist/src/orchestrator/coordinator.js.map +1 -0
- package/dist/src/orchestrator/fallback-handler.d.ts +24 -0
- package/dist/src/orchestrator/fallback-handler.d.ts.map +1 -0
- package/dist/src/orchestrator/fallback-handler.js +280 -0
- package/dist/src/orchestrator/fallback-handler.js.map +1 -0
- package/dist/src/orchestrator/invoke.d.ts +14 -0
- package/dist/src/orchestrator/invoke.d.ts.map +1 -0
- package/dist/src/orchestrator/invoke.js +76 -0
- package/dist/src/orchestrator/invoke.js.map +1 -0
- package/dist/src/orchestrator/post-coder.d.ts +10 -0
- package/dist/src/orchestrator/post-coder.d.ts.map +1 -0
- package/dist/src/orchestrator/post-coder.js +198 -0
- package/dist/src/orchestrator/post-coder.js.map +1 -0
- package/dist/src/orchestrator/post-reviewer.d.ts +10 -0
- package/dist/src/orchestrator/post-reviewer.d.ts.map +1 -0
- package/dist/src/orchestrator/post-reviewer.js +199 -0
- package/dist/src/orchestrator/post-reviewer.js.map +1 -0
- package/dist/src/orchestrator/reviewer.d.ts +35 -0
- package/dist/src/orchestrator/reviewer.d.ts.map +1 -0
- package/dist/src/orchestrator/reviewer.js +237 -0
- package/dist/src/orchestrator/reviewer.js.map +1 -0
- package/dist/src/orchestrator/schemas.d.ts +10 -0
- package/dist/src/orchestrator/schemas.d.ts.map +1 -0
- package/dist/src/orchestrator/schemas.js +81 -0
- package/dist/src/orchestrator/schemas.js.map +1 -0
- package/dist/src/orchestrator/task-selector.d.ts +102 -0
- package/dist/src/orchestrator/task-selector.d.ts.map +1 -0
- package/dist/src/orchestrator/task-selector.js +326 -0
- package/dist/src/orchestrator/task-selector.js.map +1 -0
- package/dist/src/orchestrator/types.d.ts +74 -0
- package/dist/src/orchestrator/types.d.ts.map +1 -0
- package/dist/src/orchestrator/types.js +5 -0
- package/dist/src/orchestrator/types.js.map +1 -0
- package/dist/src/prompts/coder.d.ts +36 -0
- package/dist/src/prompts/coder.d.ts.map +1 -0
- package/dist/src/prompts/coder.js +303 -0
- package/dist/src/prompts/coder.js.map +1 -0
- package/dist/src/prompts/prompt-helpers.d.ts +51 -0
- package/dist/src/prompts/prompt-helpers.d.ts.map +1 -0
- package/dist/src/prompts/prompt-helpers.js +299 -0
- package/dist/src/prompts/prompt-helpers.js.map +1 -0
- package/dist/src/prompts/reviewer.d.ts +40 -0
- package/dist/src/prompts/reviewer.d.ts.map +1 -0
- package/dist/src/prompts/reviewer.js +416 -0
- package/dist/src/prompts/reviewer.js.map +1 -0
- package/dist/src/providers/claude.d.ts +53 -0
- package/dist/src/providers/claude.d.ts.map +1 -0
- package/dist/src/providers/claude.js +227 -0
- package/dist/src/providers/claude.js.map +1 -0
- package/dist/src/providers/codex.d.ts +53 -0
- package/dist/src/providers/codex.d.ts.map +1 -0
- package/dist/src/providers/codex.js +253 -0
- package/dist/src/providers/codex.js.map +1 -0
- package/dist/src/providers/gemini.d.ts +58 -0
- package/dist/src/providers/gemini.d.ts.map +1 -0
- package/dist/src/providers/gemini.js +240 -0
- package/dist/src/providers/gemini.js.map +1 -0
- package/dist/src/providers/interface.d.ts +185 -0
- package/dist/src/providers/interface.d.ts.map +1 -0
- package/dist/src/providers/interface.js +92 -0
- package/dist/src/providers/interface.js.map +1 -0
- package/dist/src/providers/invocation-logger.d.ts +97 -0
- package/dist/src/providers/invocation-logger.d.ts.map +1 -0
- package/dist/src/providers/invocation-logger.js +378 -0
- package/dist/src/providers/invocation-logger.js.map +1 -0
- package/dist/src/providers/openai.d.ts +53 -0
- package/dist/src/providers/openai.d.ts.map +1 -0
- package/dist/src/providers/openai.js +230 -0
- package/dist/src/providers/openai.js.map +1 -0
- package/dist/src/providers/registry.d.ts +100 -0
- package/dist/src/providers/registry.d.ts.map +1 -0
- package/dist/src/providers/registry.js +170 -0
- package/dist/src/providers/registry.js.map +1 -0
- package/dist/src/routes/activity.d.ts +7 -0
- package/dist/src/routes/activity.d.ts.map +1 -0
- package/dist/src/routes/activity.js +252 -0
- package/dist/src/routes/activity.js.map +1 -0
- package/dist/src/routes/config.d.ts +7 -0
- package/dist/src/routes/config.d.ts.map +1 -0
- package/dist/src/routes/config.js +521 -0
- package/dist/src/routes/config.js.map +1 -0
- package/dist/src/routes/health.d.ts +7 -0
- package/dist/src/routes/health.d.ts.map +1 -0
- package/dist/src/routes/health.js +172 -0
- package/dist/src/routes/health.js.map +1 -0
- package/dist/src/routes/incidents.d.ts +7 -0
- package/dist/src/routes/incidents.d.ts.map +1 -0
- package/dist/src/routes/incidents.js +117 -0
- package/dist/src/routes/incidents.js.map +1 -0
- package/dist/src/routes/projects.d.ts +7 -0
- package/dist/src/routes/projects.d.ts.map +1 -0
- package/dist/src/routes/projects.js +398 -0
- package/dist/src/routes/projects.js.map +1 -0
- package/dist/src/routes/runners.d.ts +7 -0
- package/dist/src/routes/runners.d.ts.map +1 -0
- package/dist/src/routes/runners.js +242 -0
- package/dist/src/routes/runners.js.map +1 -0
- package/dist/src/routes/tasks.d.ts +7 -0
- package/dist/src/routes/tasks.d.ts.map +1 -0
- package/dist/src/routes/tasks.js +1007 -0
- package/dist/src/routes/tasks.js.map +1 -0
- package/dist/src/runners/activity-log.d.ts +65 -0
- package/dist/src/runners/activity-log.d.ts.map +1 -0
- package/dist/src/runners/activity-log.js +140 -0
- package/dist/src/runners/activity-log.js.map +1 -0
- package/dist/src/runners/cron.d.ts +30 -0
- package/dist/src/runners/cron.d.ts.map +1 -0
- package/dist/src/runners/cron.js +333 -0
- package/dist/src/runners/cron.js.map +1 -0
- package/dist/src/runners/daemon.d.ts +71 -0
- package/dist/src/runners/daemon.d.ts.map +1 -0
- package/dist/src/runners/daemon.js +233 -0
- package/dist/src/runners/daemon.js.map +1 -0
- package/dist/src/runners/global-db.d.ts +31 -0
- package/dist/src/runners/global-db.d.ts.map +1 -0
- package/dist/src/runners/global-db.js +220 -0
- package/dist/src/runners/global-db.js.map +1 -0
- package/dist/src/runners/hang-detector.d.ts +38 -0
- package/dist/src/runners/hang-detector.d.ts.map +1 -0
- package/dist/src/runners/hang-detector.js +130 -0
- package/dist/src/runners/hang-detector.js.map +1 -0
- package/dist/src/runners/heartbeat.d.ts +39 -0
- package/dist/src/runners/heartbeat.d.ts.map +1 -0
- package/dist/src/runners/heartbeat.js +71 -0
- package/dist/src/runners/heartbeat.js.map +1 -0
- package/dist/src/runners/lock.d.ts +47 -0
- package/dist/src/runners/lock.d.ts.map +1 -0
- package/dist/src/runners/lock.js +140 -0
- package/dist/src/runners/lock.js.map +1 -0
- package/dist/src/runners/orchestrator-loop.d.ts +20 -0
- package/dist/src/runners/orchestrator-loop.d.ts.map +1 -0
- package/dist/src/runners/orchestrator-loop.js +208 -0
- package/dist/src/runners/orchestrator-loop.js.map +1 -0
- package/dist/src/runners/projects.d.ts +96 -0
- package/dist/src/runners/projects.d.ts.map +1 -0
- package/dist/src/runners/projects.js +243 -0
- package/dist/src/runners/projects.js.map +1 -0
- package/dist/src/runners/wakeup.d.ts +37 -0
- package/dist/src/runners/wakeup.d.ts.map +1 -0
- package/dist/src/runners/wakeup.js +355 -0
- package/dist/src/runners/wakeup.js.map +1 -0
- package/dist/src/utils/validation.d.ts +22 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/src/utils/validation.js +50 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/utils/sqlite.d.ts +17 -0
- package/dist/utils/sqlite.d.ts.map +1 -0
- package/dist/utils/sqlite.js +27 -0
- package/dist/utils/sqlite.js.map +1 -0
- package/dist/utils/storage-cache.d.ts +33 -0
- package/dist/utils/storage-cache.d.ts.map +1 -0
- package/dist/utils/storage-cache.js +81 -0
- package/dist/utils/storage-cache.js.map +1 -0
- package/dist/utils/validation.d.ts +22 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +51 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +39 -0
- package/src/index.ts +199 -0
- package/src/routes/activity.ts +302 -0
- package/src/routes/config.ts +723 -0
- package/src/routes/credit-alerts.ts +73 -0
- package/src/routes/health.ts +219 -0
- package/src/routes/incidents.ts +131 -0
- package/src/routes/projects.ts +854 -0
- package/src/routes/runners.ts +357 -0
- package/src/routes/skills.ts +127 -0
- package/src/routes/storage.ts +108 -0
- package/src/routes/tasks.ts +1372 -0
- package/src/utils/sqlite.ts +36 -0
- package/src/utils/storage-cache.ts +107 -0
- package/src/utils/validation.ts +61 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator loop - core task processing logic
|
|
3
|
+
* Used by both the daemon and the loop command
|
|
4
|
+
*/
|
|
5
|
+
import { openDatabase, getDbPath } from '../database/connection.js';
|
|
6
|
+
import { autoMigrate } from '../migrations/index.js';
|
|
7
|
+
import { getTask, getSection } from '../database/queries.js';
|
|
8
|
+
import { selectNextTask, selectTaskBatch, markTaskInProgress, getTaskCounts, } from '../orchestrator/task-selector.js';
|
|
9
|
+
import { invokeCoderBatch } from '../orchestrator/coder.js';
|
|
10
|
+
import { loadConfig } from '../config/loader.js';
|
|
11
|
+
import { invokeReviewerBatch } from '../orchestrator/reviewer.js';
|
|
12
|
+
import { logActivity } from './activity-log.js';
|
|
13
|
+
import { getRegisteredProject } from './projects.js';
|
|
14
|
+
import { execSync } from 'node:child_process';
|
|
15
|
+
import { runCoderPhase, runReviewerPhase } from '../commands/loop-phases.js';
|
|
16
|
+
function sleep(ms) {
|
|
17
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Run the orchestrator loop
|
|
21
|
+
* Processes tasks until all are complete or shouldStop returns true
|
|
22
|
+
*/
|
|
23
|
+
export async function runOrchestratorLoop(options) {
|
|
24
|
+
const { projectPath, once = false, shouldStop, sectionId } = options;
|
|
25
|
+
const { db, close } = openDatabase(projectPath);
|
|
26
|
+
// Auto-migrate database if needed
|
|
27
|
+
const dbPath = getDbPath(projectPath);
|
|
28
|
+
const migrationResult = autoMigrate(db, dbPath);
|
|
29
|
+
if (migrationResult.applied) {
|
|
30
|
+
console.log(`Applied ${migrationResult.migrations.length} migration(s): ${migrationResult.migrations.join(', ')}`);
|
|
31
|
+
}
|
|
32
|
+
else if (migrationResult.error) {
|
|
33
|
+
console.error(`Migration error: ${migrationResult.error}`);
|
|
34
|
+
close();
|
|
35
|
+
throw new Error(`Database migration failed: ${migrationResult.error}`);
|
|
36
|
+
}
|
|
37
|
+
// Load batch mode config
|
|
38
|
+
const config = loadConfig(projectPath);
|
|
39
|
+
const batchMode = config.sections?.batchMode ?? false;
|
|
40
|
+
const maxBatchSize = config.sections?.maxBatchSize ?? 10;
|
|
41
|
+
try {
|
|
42
|
+
let iteration = 0;
|
|
43
|
+
while (true) {
|
|
44
|
+
// Check if we should stop
|
|
45
|
+
if (shouldStop?.()) {
|
|
46
|
+
console.log('\nLoop stopped by signal');
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
// Check if project has been disabled
|
|
50
|
+
const registeredProject = getRegisteredProject(projectPath);
|
|
51
|
+
if (registeredProject && !registeredProject.enabled) {
|
|
52
|
+
console.log('\nProject has been disabled. Stopping loop.');
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
iteration++;
|
|
56
|
+
console.log(`\n─── Iteration ${iteration} ───\n`);
|
|
57
|
+
options.onIteration?.(iteration);
|
|
58
|
+
// Batch mode: process multiple pending tasks at once
|
|
59
|
+
// Only active when not focusing on a specific section and batch mode is enabled
|
|
60
|
+
if (batchMode && !sectionId) {
|
|
61
|
+
const batch = selectTaskBatch(db, maxBatchSize);
|
|
62
|
+
if (batch && batch.tasks.length > 0) {
|
|
63
|
+
console.log(`[BATCH MODE] Section "${batch.sectionName}" - ${batch.tasks.length} tasks`);
|
|
64
|
+
// Mark all tasks as in_progress
|
|
65
|
+
for (const task of batch.tasks) {
|
|
66
|
+
markTaskInProgress(db, task.id);
|
|
67
|
+
options.onTaskStart?.(task.id, 'batch');
|
|
68
|
+
}
|
|
69
|
+
// Invoke batch coder
|
|
70
|
+
console.log('\n>>> Invoking BATCH CODER...\n');
|
|
71
|
+
await invokeCoderBatch(batch.tasks, batch.sectionName, projectPath);
|
|
72
|
+
// Check which tasks are now in review status
|
|
73
|
+
const tasksInReview = batch.tasks
|
|
74
|
+
.map(t => getTask(db, t.id))
|
|
75
|
+
.filter((t) => t !== null && t.status === 'review');
|
|
76
|
+
if (tasksInReview.length > 0) {
|
|
77
|
+
console.log(`\n[BATCH MODE] ${tasksInReview.length} tasks ready for batch review\n`);
|
|
78
|
+
// Invoke batch reviewer
|
|
79
|
+
console.log('\n>>> Invoking BATCH REVIEWER...\n');
|
|
80
|
+
await invokeReviewerBatch(tasksInReview, batch.sectionName, projectPath);
|
|
81
|
+
// Handle results for each reviewed task
|
|
82
|
+
for (const task of tasksInReview) {
|
|
83
|
+
const updatedTask = getTask(db, task.id);
|
|
84
|
+
if (!updatedTask)
|
|
85
|
+
continue;
|
|
86
|
+
const section = task.section_id ? getSection(db, task.section_id) : null;
|
|
87
|
+
const sectionName = section?.name ?? null;
|
|
88
|
+
if (updatedTask.status === 'completed' && options.runnerId) {
|
|
89
|
+
// Get commit message for activity log
|
|
90
|
+
let commitMessage = null;
|
|
91
|
+
try {
|
|
92
|
+
commitMessage = execSync('git log -1 --format=%B', {
|
|
93
|
+
cwd: projectPath,
|
|
94
|
+
encoding: 'utf-8',
|
|
95
|
+
}).trim();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Ignore error
|
|
99
|
+
}
|
|
100
|
+
logActivity(projectPath, options.runnerId, task.id, task.title, sectionName, 'completed', commitMessage);
|
|
101
|
+
}
|
|
102
|
+
else if (updatedTask.status === 'failed' && options.runnerId) {
|
|
103
|
+
logActivity(projectPath, options.runnerId, task.id, task.title, sectionName, 'failed');
|
|
104
|
+
}
|
|
105
|
+
else if (updatedTask.status === 'disputed' && options.runnerId) {
|
|
106
|
+
logActivity(projectPath, options.runnerId, task.id, task.title, sectionName, 'disputed');
|
|
107
|
+
}
|
|
108
|
+
else if (updatedTask.status === 'skipped' && options.runnerId) {
|
|
109
|
+
logActivity(projectPath, options.runnerId, task.id, task.title, sectionName, 'skipped');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Push changes after batch review if any tasks were approved
|
|
113
|
+
const approvedTasks = tasksInReview.filter(t => {
|
|
114
|
+
const updated = getTask(db, t.id);
|
|
115
|
+
return updated?.status === 'completed';
|
|
116
|
+
});
|
|
117
|
+
if (approvedTasks.length > 0) {
|
|
118
|
+
try {
|
|
119
|
+
console.log('Pushing batch changes to git...');
|
|
120
|
+
execSync('git push', { cwd: projectPath, stdio: 'inherit' });
|
|
121
|
+
console.log(`Pushed ${approvedTasks.length} approved task(s)`);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.warn('Failed to push:', error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Notify completion for each task
|
|
129
|
+
for (const task of batch.tasks) {
|
|
130
|
+
options.onTaskComplete?.(task.id);
|
|
131
|
+
}
|
|
132
|
+
if (once) {
|
|
133
|
+
console.log('\n[--once] Stopping after one batch');
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
await sleep(1000);
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Select next task
|
|
141
|
+
const selected = selectNextTask(db, sectionId);
|
|
142
|
+
if (!selected) {
|
|
143
|
+
console.log('');
|
|
144
|
+
console.log('╔════════════════════════════════════════════════════════════╗');
|
|
145
|
+
console.log('║ ALL TASKS COMPLETE ║');
|
|
146
|
+
console.log('╚════════════════════════════════════════════════════════════╝');
|
|
147
|
+
console.log('');
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
const { task, action } = selected;
|
|
151
|
+
console.log(`Task: ${task.title}`);
|
|
152
|
+
console.log(`Action: ${action}`);
|
|
153
|
+
console.log(`Status: ${task.status}`);
|
|
154
|
+
options.onTaskStart?.(task.id, action);
|
|
155
|
+
if (action === 'start') {
|
|
156
|
+
markTaskInProgress(db, task.id);
|
|
157
|
+
await runCoderPhase(db, task, projectPath, 'start', false);
|
|
158
|
+
}
|
|
159
|
+
else if (action === 'resume') {
|
|
160
|
+
await runCoderPhase(db, task, projectPath, 'resume', false);
|
|
161
|
+
}
|
|
162
|
+
else if (action === 'review') {
|
|
163
|
+
await runReviewerPhase(db, task, projectPath, false);
|
|
164
|
+
}
|
|
165
|
+
// Log activity if task reached terminal status
|
|
166
|
+
if (options.runnerId) {
|
|
167
|
+
const updatedTask = getTask(db, task.id);
|
|
168
|
+
if (updatedTask && ['completed', 'failed', 'disputed', 'skipped'].includes(updatedTask.status)) {
|
|
169
|
+
const section = updatedTask.section_id ? getSection(db, updatedTask.section_id) : null;
|
|
170
|
+
const sectionName = section?.name ?? null;
|
|
171
|
+
// Get commit message for completed tasks
|
|
172
|
+
let commitMessage = null;
|
|
173
|
+
if (updatedTask.status === 'completed') {
|
|
174
|
+
try {
|
|
175
|
+
commitMessage = execSync('git log -1 --format=%B', {
|
|
176
|
+
cwd: projectPath,
|
|
177
|
+
encoding: 'utf-8',
|
|
178
|
+
}).trim();
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Ignore error
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
logActivity(projectPath, options.runnerId, updatedTask.id, updatedTask.title, sectionName, updatedTask.status, commitMessage);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
options.onTaskComplete?.(task.id);
|
|
188
|
+
if (once) {
|
|
189
|
+
console.log('\n[--once] Stopping after one iteration');
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
// Brief pause between iterations
|
|
193
|
+
await sleep(1000);
|
|
194
|
+
}
|
|
195
|
+
// Final status
|
|
196
|
+
const finalCounts = getTaskCounts(db, sectionId);
|
|
197
|
+
console.log('\nFinal Status:');
|
|
198
|
+
console.log(` Completed: ${finalCounts.completed}`);
|
|
199
|
+
console.log(` Failed: ${finalCounts.failed}`);
|
|
200
|
+
console.log(` Disputed: ${finalCounts.disputed}`);
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
close();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Note: runCoderPhase and runReviewerPhase are now imported from ../commands/loop-phases.js
|
|
207
|
+
// They implement the orchestrator-driven architecture where the orchestrator makes all status decisions
|
|
208
|
+
//# sourceMappingURL=orchestrator-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-loop.js","sourceRoot":"","sources":["../../../../src/runners/orchestrator-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global project registry management
|
|
3
|
+
* Tracks all registered steroids projects across the system
|
|
4
|
+
*/
|
|
5
|
+
export interface RegisteredProject {
|
|
6
|
+
path: string;
|
|
7
|
+
name: string | null;
|
|
8
|
+
registered_at: string;
|
|
9
|
+
last_seen_at: string;
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
pending_count?: number;
|
|
12
|
+
in_progress_count?: number;
|
|
13
|
+
review_count?: number;
|
|
14
|
+
completed_count?: number;
|
|
15
|
+
stats_updated_at?: string | null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Register a project in the global registry
|
|
19
|
+
* Idempotent - updates last_seen_at if project already exists
|
|
20
|
+
*
|
|
21
|
+
* @param path - Absolute path to project directory
|
|
22
|
+
* @param name - Optional project name
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerProject(path: string, name?: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get all registered projects (enabled only by default)
|
|
27
|
+
*
|
|
28
|
+
* @param includeDisabled - If true, includes disabled projects
|
|
29
|
+
* @returns Array of registered projects
|
|
30
|
+
*/
|
|
31
|
+
export declare function getRegisteredProjects(includeDisabled?: boolean): RegisteredProject[];
|
|
32
|
+
/**
|
|
33
|
+
* Get a single registered project by path
|
|
34
|
+
*
|
|
35
|
+
* @param path - Project path to look up
|
|
36
|
+
* @returns Project if found, null otherwise
|
|
37
|
+
*/
|
|
38
|
+
export declare function getRegisteredProject(path: string): RegisteredProject | null;
|
|
39
|
+
/**
|
|
40
|
+
* Unregister a project from the global registry
|
|
41
|
+
* Removes it completely from the database
|
|
42
|
+
*
|
|
43
|
+
* @param path - Project path to unregister
|
|
44
|
+
*/
|
|
45
|
+
export declare function unregisterProject(path: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Disable a project (skip in wakeup, but keep in registry)
|
|
48
|
+
*
|
|
49
|
+
* @param path - Project path to disable
|
|
50
|
+
*/
|
|
51
|
+
export declare function disableProject(path: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Enable a project (include in wakeup)
|
|
54
|
+
*
|
|
55
|
+
* @param path - Project path to enable
|
|
56
|
+
*/
|
|
57
|
+
export declare function enableProject(path: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Remove projects that no longer exist on disk
|
|
60
|
+
* Returns the number of projects removed
|
|
61
|
+
*
|
|
62
|
+
* @returns Number of projects pruned
|
|
63
|
+
*/
|
|
64
|
+
export declare function pruneProjects(): number;
|
|
65
|
+
/**
|
|
66
|
+
* Update last_seen_at timestamp for a project
|
|
67
|
+
* Used by runners to track when project was last active
|
|
68
|
+
*
|
|
69
|
+
* @param path - Project path to update
|
|
70
|
+
*/
|
|
71
|
+
export declare function updateProjectLastSeen(path: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* Check if a project is registered
|
|
74
|
+
*
|
|
75
|
+
* @param path - Project path to check
|
|
76
|
+
* @returns True if project is registered
|
|
77
|
+
*/
|
|
78
|
+
export declare function isProjectRegistered(path: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Task count statistics for a project
|
|
81
|
+
*/
|
|
82
|
+
export interface ProjectStats {
|
|
83
|
+
pending: number;
|
|
84
|
+
in_progress: number;
|
|
85
|
+
review: number;
|
|
86
|
+
completed: number;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Update project stats in global database
|
|
90
|
+
* Called by runner heartbeat to cache stats for API/WebUI access
|
|
91
|
+
*
|
|
92
|
+
* @param path - Project path
|
|
93
|
+
* @param stats - Task counts by status
|
|
94
|
+
*/
|
|
95
|
+
export declare function updateProjectStats(path: string, stats: ProjectStats): void;
|
|
96
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../../src/runners/projects.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAmBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAejE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,UAAQ,GAAG,iBAAiB,EAAE,CAoClF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAuC3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASjD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAShD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAsBtC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAWxD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAazD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAuB1E"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global project registry management
|
|
3
|
+
* Tracks all registered steroids projects across the system
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
6
|
+
import { join, resolve } from 'node:path';
|
|
7
|
+
import { openGlobalDatabase } from './global-db.js';
|
|
8
|
+
/**
|
|
9
|
+
* Normalize a project path to its canonical form
|
|
10
|
+
* - Resolves symlinks
|
|
11
|
+
* - Removes trailing slashes
|
|
12
|
+
* - Returns absolute path
|
|
13
|
+
*/
|
|
14
|
+
function normalizePath(p) {
|
|
15
|
+
try {
|
|
16
|
+
const resolved = resolve(p);
|
|
17
|
+
const realPath = realpathSync(resolved);
|
|
18
|
+
return realPath.replace(/\/+$/, '');
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
// If path doesn't exist or can't be resolved, just clean up the input
|
|
22
|
+
return resolve(p).replace(/\/+$/, '');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Register a project in the global registry
|
|
27
|
+
* Idempotent - updates last_seen_at if project already exists
|
|
28
|
+
*
|
|
29
|
+
* @param path - Absolute path to project directory
|
|
30
|
+
* @param name - Optional project name
|
|
31
|
+
*/
|
|
32
|
+
export function registerProject(path, name) {
|
|
33
|
+
const normalizedPath = normalizePath(path);
|
|
34
|
+
const { db, close } = openGlobalDatabase();
|
|
35
|
+
try {
|
|
36
|
+
db.prepare(`
|
|
37
|
+
INSERT INTO projects (path, name, registered_at, last_seen_at, enabled)
|
|
38
|
+
VALUES (?, ?, datetime('now'), datetime('now'), 1)
|
|
39
|
+
ON CONFLICT(path) DO UPDATE SET
|
|
40
|
+
name = COALESCE(excluded.name, name),
|
|
41
|
+
last_seen_at = datetime('now')
|
|
42
|
+
`).run(normalizedPath, name ?? null);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
close();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get all registered projects (enabled only by default)
|
|
50
|
+
*
|
|
51
|
+
* @param includeDisabled - If true, includes disabled projects
|
|
52
|
+
* @returns Array of registered projects
|
|
53
|
+
*/
|
|
54
|
+
export function getRegisteredProjects(includeDisabled = false) {
|
|
55
|
+
const { db, close } = openGlobalDatabase();
|
|
56
|
+
try {
|
|
57
|
+
const query = includeDisabled
|
|
58
|
+
? 'SELECT * FROM projects'
|
|
59
|
+
: 'SELECT * FROM projects WHERE enabled = 1';
|
|
60
|
+
const rows = db.prepare(query).all();
|
|
61
|
+
return rows.map((row) => ({
|
|
62
|
+
path: row.path,
|
|
63
|
+
name: row.name,
|
|
64
|
+
registered_at: row.registered_at,
|
|
65
|
+
last_seen_at: row.last_seen_at,
|
|
66
|
+
enabled: row.enabled === 1,
|
|
67
|
+
pending_count: row.pending_count,
|
|
68
|
+
in_progress_count: row.in_progress_count,
|
|
69
|
+
review_count: row.review_count,
|
|
70
|
+
completed_count: row.completed_count,
|
|
71
|
+
stats_updated_at: row.stats_updated_at,
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get a single registered project by path
|
|
80
|
+
*
|
|
81
|
+
* @param path - Project path to look up
|
|
82
|
+
* @returns Project if found, null otherwise
|
|
83
|
+
*/
|
|
84
|
+
export function getRegisteredProject(path) {
|
|
85
|
+
const normalizedPath = normalizePath(path);
|
|
86
|
+
const { db, close } = openGlobalDatabase();
|
|
87
|
+
try {
|
|
88
|
+
const row = db
|
|
89
|
+
.prepare('SELECT * FROM projects WHERE path = ?')
|
|
90
|
+
.get(normalizedPath);
|
|
91
|
+
if (!row) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
path: row.path,
|
|
96
|
+
name: row.name,
|
|
97
|
+
registered_at: row.registered_at,
|
|
98
|
+
last_seen_at: row.last_seen_at,
|
|
99
|
+
enabled: row.enabled === 1,
|
|
100
|
+
pending_count: row.pending_count,
|
|
101
|
+
in_progress_count: row.in_progress_count,
|
|
102
|
+
review_count: row.review_count,
|
|
103
|
+
completed_count: row.completed_count,
|
|
104
|
+
stats_updated_at: row.stats_updated_at,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
close();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Unregister a project from the global registry
|
|
113
|
+
* Removes it completely from the database
|
|
114
|
+
*
|
|
115
|
+
* @param path - Project path to unregister
|
|
116
|
+
*/
|
|
117
|
+
export function unregisterProject(path) {
|
|
118
|
+
const normalizedPath = normalizePath(path);
|
|
119
|
+
const { db, close } = openGlobalDatabase();
|
|
120
|
+
try {
|
|
121
|
+
db.prepare('DELETE FROM projects WHERE path = ?').run(normalizedPath);
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
close();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Disable a project (skip in wakeup, but keep in registry)
|
|
129
|
+
*
|
|
130
|
+
* @param path - Project path to disable
|
|
131
|
+
*/
|
|
132
|
+
export function disableProject(path) {
|
|
133
|
+
const normalizedPath = normalizePath(path);
|
|
134
|
+
const { db, close } = openGlobalDatabase();
|
|
135
|
+
try {
|
|
136
|
+
db.prepare('UPDATE projects SET enabled = 0 WHERE path = ?').run(normalizedPath);
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
close();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Enable a project (include in wakeup)
|
|
144
|
+
*
|
|
145
|
+
* @param path - Project path to enable
|
|
146
|
+
*/
|
|
147
|
+
export function enableProject(path) {
|
|
148
|
+
const normalizedPath = normalizePath(path);
|
|
149
|
+
const { db, close } = openGlobalDatabase();
|
|
150
|
+
try {
|
|
151
|
+
db.prepare('UPDATE projects SET enabled = 1 WHERE path = ?').run(normalizedPath);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
close();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Remove projects that no longer exist on disk
|
|
159
|
+
* Returns the number of projects removed
|
|
160
|
+
*
|
|
161
|
+
* @returns Number of projects pruned
|
|
162
|
+
*/
|
|
163
|
+
export function pruneProjects() {
|
|
164
|
+
const { db, close } = openGlobalDatabase();
|
|
165
|
+
try {
|
|
166
|
+
const projects = db.prepare('SELECT path FROM projects').all();
|
|
167
|
+
let removed = 0;
|
|
168
|
+
for (const project of projects) {
|
|
169
|
+
const steroidsDir = join(project.path, '.steroids');
|
|
170
|
+
const steroidsDb = join(steroidsDir, 'steroids.db');
|
|
171
|
+
// Remove if project directory or .steroids directory doesn't exist
|
|
172
|
+
if (!existsSync(project.path) || !existsSync(steroidsDir) || !existsSync(steroidsDb)) {
|
|
173
|
+
db.prepare('DELETE FROM projects WHERE path = ?').run(project.path);
|
|
174
|
+
removed++;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return removed;
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
close();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Update last_seen_at timestamp for a project
|
|
185
|
+
* Used by runners to track when project was last active
|
|
186
|
+
*
|
|
187
|
+
* @param path - Project path to update
|
|
188
|
+
*/
|
|
189
|
+
export function updateProjectLastSeen(path) {
|
|
190
|
+
const normalizedPath = normalizePath(path);
|
|
191
|
+
const { db, close } = openGlobalDatabase();
|
|
192
|
+
try {
|
|
193
|
+
db.prepare("UPDATE projects SET last_seen_at = datetime('now') WHERE path = ?").run(normalizedPath);
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
close();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if a project is registered
|
|
201
|
+
*
|
|
202
|
+
* @param path - Project path to check
|
|
203
|
+
* @returns True if project is registered
|
|
204
|
+
*/
|
|
205
|
+
export function isProjectRegistered(path) {
|
|
206
|
+
const normalizedPath = normalizePath(path);
|
|
207
|
+
const { db, close } = openGlobalDatabase();
|
|
208
|
+
try {
|
|
209
|
+
const row = db
|
|
210
|
+
.prepare('SELECT 1 FROM projects WHERE path = ?')
|
|
211
|
+
.get(normalizedPath);
|
|
212
|
+
return row !== undefined;
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
close();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Update project stats in global database
|
|
220
|
+
* Called by runner heartbeat to cache stats for API/WebUI access
|
|
221
|
+
*
|
|
222
|
+
* @param path - Project path
|
|
223
|
+
* @param stats - Task counts by status
|
|
224
|
+
*/
|
|
225
|
+
export function updateProjectStats(path, stats) {
|
|
226
|
+
const normalizedPath = normalizePath(path);
|
|
227
|
+
const { db, close } = openGlobalDatabase();
|
|
228
|
+
try {
|
|
229
|
+
db.prepare(`
|
|
230
|
+
UPDATE projects SET
|
|
231
|
+
pending_count = ?,
|
|
232
|
+
in_progress_count = ?,
|
|
233
|
+
review_count = ?,
|
|
234
|
+
completed_count = ?,
|
|
235
|
+
stats_updated_at = datetime('now')
|
|
236
|
+
WHERE path = ?
|
|
237
|
+
`).run(stats.pending, stats.in_progress, stats.review, stats.completed, normalizedPath);
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
close();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../../src/runners/projects.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAepD;;;;;GAKG;AACH,SAAS,aAAa,CAAC,CAAS;IAC9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sEAAsE;QACtE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAa;IACzD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC;;;;;;KAMV,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,eAAe,GAAG,KAAK;IAC3D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,eAAe;YAC3B,CAAC,CAAC,wBAAwB;YAC1B,CAAC,CAAC,0CAA0C,CAAC;QAE/C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAWhC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC;YAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;SACvC,CAAC,CAAC,CAAC;IACN,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,uCAAuC,CAAC;aAChD,GAAG,CAAC,cAAc,CAWN,CAAC;QAEhB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,CAAC;YAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;SACvC,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnF,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnF,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,GAAG,EAA6B,CAAC;QAC1F,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAEpD,mEAAmE;YACnE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrF,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpE,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CACjF,cAAc,CACf,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,uCAAuC,CAAC;aAChD,GAAG,CAAC,cAAc,CAA8B,CAAC;QAEpD,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,KAAmB;IAClE,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC;;;;;;;;KAQV,CAAC,CAAC,GAAG,CACJ,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,SAAS,EACf,cAAc,CACf,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron wake-up command for restarting stale/dead runners
|
|
3
|
+
*/
|
|
4
|
+
export interface WakeupOptions {
|
|
5
|
+
quiet?: boolean;
|
|
6
|
+
dryRun?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface WakeupResult {
|
|
9
|
+
action: 'none' | 'started' | 'restarted' | 'cleaned' | 'would_start';
|
|
10
|
+
reason: string;
|
|
11
|
+
runnerId?: string;
|
|
12
|
+
pid?: number;
|
|
13
|
+
staleRunners?: number;
|
|
14
|
+
pendingTasks?: number;
|
|
15
|
+
projectPath?: string;
|
|
16
|
+
recoveredActions?: number;
|
|
17
|
+
skippedRecoveryDueToSafetyLimit?: boolean;
|
|
18
|
+
deletedInvocationLogs?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if there's an active runner for a specific project
|
|
22
|
+
* Exported for use in daemon startup checks
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasActiveRunnerForProject(projectPath: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get the last wakeup invocation time
|
|
27
|
+
*/
|
|
28
|
+
export declare function getLastWakeupTime(): string | null;
|
|
29
|
+
export declare function wakeup(options?: WakeupOptions): Promise<WakeupResult[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Check if wake-up is needed without taking action
|
|
32
|
+
*/
|
|
33
|
+
export declare function checkWakeupNeeded(): Promise<{
|
|
34
|
+
needed: boolean;
|
|
35
|
+
reason: string;
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=wakeup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wakeup.d.ts","sourceRoot":"","sources":["../../../../src/runners/wakeup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AA8BD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBtE;AA2DD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAUjD;AAED,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwMjF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAyCD"}
|