steroids-cli 0.4.47
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/LICENSE +21 -0
- package/README.md +640 -0
- package/dist/cli/colors.d.ts +110 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +228 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/env.d.ts +159 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +227 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/errors.d.ts +166 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/errors.js +244 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/flags.d.ts +75 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +232 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/help.d.ts +97 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +275 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +58 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +127 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/output.d.ts +116 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +178 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/commands/about.d.ts +7 -0
- package/dist/commands/about.d.ts.map +1 -0
- package/dist/commands/about.js +259 -0
- package/dist/commands/about.js.map +1 -0
- package/dist/commands/ai.d.ts +6 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +382 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +528 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +405 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +665 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/disputes.d.ts +3 -0
- package/dist/commands/disputes.d.ts.map +1 -0
- package/dist/commands/disputes.js +499 -0
- package/dist/commands/disputes.js.map +1 -0
- package/dist/commands/gc.d.ts +3 -0
- package/dist/commands/gc.d.ts.map +1 -0
- package/dist/commands/gc.js +300 -0
- package/dist/commands/gc.js.map +1 -0
- package/dist/commands/git.d.ts +3 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +458 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +604 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/hooks.d.ts +6 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +529 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/llm.d.ts +7 -0
- package/dist/commands/llm.d.ts.map +1 -0
- package/dist/commands/llm.js +285 -0
- package/dist/commands/llm.js.map +1 -0
- package/dist/commands/locks.d.ts +3 -0
- package/dist/commands/locks.d.ts.map +1 -0
- package/dist/commands/locks.js +431 -0
- package/dist/commands/locks.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +487 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/loop-phases.d.ts +11 -0
- package/dist/commands/loop-phases.d.ts.map +1 -0
- package/dist/commands/loop-phases.js +204 -0
- package/dist/commands/loop-phases.js.map +1 -0
- package/dist/commands/loop.d.ts +3 -0
- package/dist/commands/loop.d.ts.map +1 -0
- package/dist/commands/loop.js +396 -0
- package/dist/commands/loop.js.map +1 -0
- package/dist/commands/projects.d.ts +6 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +362 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/purge.d.ts +3 -0
- package/dist/commands/purge.d.ts.map +1 -0
- package/dist/commands/purge.js +516 -0
- package/dist/commands/purge.js.map +1 -0
- package/dist/commands/runners.d.ts +3 -0
- package/dist/commands/runners.d.ts.map +1 -0
- package/dist/commands/runners.js +1076 -0
- package/dist/commands/runners.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +291 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/sections-commands.d.ts +9 -0
- package/dist/commands/sections-commands.d.ts.map +1 -0
- package/dist/commands/sections-commands.js +282 -0
- package/dist/commands/sections-commands.js.map +1 -0
- package/dist/commands/sections-graph.d.ts +25 -0
- package/dist/commands/sections-graph.d.ts.map +1 -0
- package/dist/commands/sections-graph.js +180 -0
- package/dist/commands/sections-graph.js.map +1 -0
- package/dist/commands/sections.d.ts +3 -0
- package/dist/commands/sections.d.ts.map +1 -0
- package/dist/commands/sections.js +376 -0
- package/dist/commands/sections.js.map +1 -0
- package/dist/commands/stats.d.ts +6 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +324 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/tasks.d.ts +3 -0
- package/dist/commands/tasks.d.ts.map +1 -0
- package/dist/commands/tasks.js +1115 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/web.d.ts +7 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +204 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/config/ai-setup.d.ts +27 -0
- package/dist/config/ai-setup.d.ts.map +1 -0
- package/dist/config/ai-setup.js +432 -0
- package/dist/config/ai-setup.js.map +1 -0
- package/dist/config/browser.d.ts +9 -0
- package/dist/config/browser.d.ts.map +1 -0
- package/dist/config/browser.js +200 -0
- package/dist/config/browser.js.map +1 -0
- package/dist/config/json-schema.d.ts +28 -0
- package/dist/config/json-schema.d.ts.map +1 -0
- package/dist/config/json-schema.js +84 -0
- package/dist/config/json-schema.js.map +1 -0
- package/dist/config/loader.d.ts +152 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +270 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +437 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +32 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +187 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/database/connection.d.ts +35 -0
- package/dist/database/connection.d.ts.map +1 -0
- package/dist/database/connection.js +208 -0
- package/dist/database/connection.js.map +1 -0
- package/dist/database/queries.d.ts +218 -0
- package/dist/database/queries.d.ts.map +1 -0
- package/dist/database/queries.js +613 -0
- package/dist/database/queries.js.map +1 -0
- package/dist/database/schema.d.ts +8 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +160 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/disputes/behavior.d.ts +106 -0
- package/dist/disputes/behavior.d.ts.map +1 -0
- package/dist/disputes/behavior.js +150 -0
- package/dist/disputes/behavior.js.map +1 -0
- package/dist/disputes/create.d.ts +59 -0
- package/dist/disputes/create.d.ts.map +1 -0
- package/dist/disputes/create.js +222 -0
- package/dist/disputes/create.js.map +1 -0
- package/dist/disputes/index.d.ts +21 -0
- package/dist/disputes/index.d.ts.map +1 -0
- package/dist/disputes/index.js +76 -0
- package/dist/disputes/index.js.map +1 -0
- package/dist/disputes/markdown.d.ts +41 -0
- package/dist/disputes/markdown.d.ts.map +1 -0
- package/dist/disputes/markdown.js +261 -0
- package/dist/disputes/markdown.js.map +1 -0
- package/dist/disputes/queries.d.ts +83 -0
- package/dist/disputes/queries.d.ts.map +1 -0
- package/dist/disputes/queries.js +180 -0
- package/dist/disputes/queries.js.map +1 -0
- package/dist/disputes/resolve.d.ts +57 -0
- package/dist/disputes/resolve.d.ts.map +1 -0
- package/dist/disputes/resolve.js +171 -0
- package/dist/disputes/resolve.js.map +1 -0
- package/dist/disputes/stale.d.ts +98 -0
- package/dist/disputes/stale.d.ts.map +1 -0
- package/dist/disputes/stale.js +205 -0
- package/dist/disputes/stale.js.map +1 -0
- package/dist/disputes/types.d.ts +92 -0
- package/dist/disputes/types.d.ts.map +1 -0
- package/dist/disputes/types.js +100 -0
- package/dist/disputes/types.js.map +1 -0
- package/dist/git/push.d.ts +26 -0
- package/dist/git/push.d.ts.map +1 -0
- package/dist/git/push.js +97 -0
- package/dist/git/push.js.map +1 -0
- package/dist/git/status.d.ts +61 -0
- package/dist/git/status.d.ts.map +1 -0
- package/dist/git/status.js +251 -0
- package/dist/git/status.js.map +1 -0
- package/dist/hooks/events.d.ts +72 -0
- package/dist/hooks/events.d.ts.map +1 -0
- package/dist/hooks/events.js +120 -0
- package/dist/hooks/events.js.map +1 -0
- package/dist/hooks/index.d.ts +19 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +48 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/integration.d.ts +69 -0
- package/dist/hooks/integration.d.ts.map +1 -0
- package/dist/hooks/integration.js +179 -0
- package/dist/hooks/integration.js.map +1 -0
- package/dist/hooks/merge.d.ts +115 -0
- package/dist/hooks/merge.d.ts.map +1 -0
- package/dist/hooks/merge.js +161 -0
- package/dist/hooks/merge.js.map +1 -0
- package/dist/hooks/orchestrator.d.ts +115 -0
- package/dist/hooks/orchestrator.d.ts.map +1 -0
- package/dist/hooks/orchestrator.js +226 -0
- package/dist/hooks/orchestrator.js.map +1 -0
- package/dist/hooks/payload.d.ts +294 -0
- package/dist/hooks/payload.d.ts.map +1 -0
- package/dist/hooks/payload.js +267 -0
- package/dist/hooks/payload.js.map +1 -0
- package/dist/hooks/script-runner.d.ts +63 -0
- package/dist/hooks/script-runner.d.ts.map +1 -0
- package/dist/hooks/script-runner.js +221 -0
- package/dist/hooks/script-runner.js.map +1 -0
- package/dist/hooks/templates.d.ts +104 -0
- package/dist/hooks/templates.d.ts.map +1 -0
- package/dist/hooks/templates.js +327 -0
- package/dist/hooks/templates.js.map +1 -0
- package/dist/hooks/webhook-runner.d.ts +69 -0
- package/dist/hooks/webhook-runner.d.ts.map +1 -0
- package/dist/hooks/webhook-runner.js +208 -0
- package/dist/hooks/webhook-runner.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +281 -0
- package/dist/index.js.map +1 -0
- package/dist/locking/cleanup.d.ts +70 -0
- package/dist/locking/cleanup.d.ts.map +1 -0
- package/dist/locking/cleanup.js +157 -0
- package/dist/locking/cleanup.js.map +1 -0
- package/dist/locking/queries.d.ts +116 -0
- package/dist/locking/queries.d.ts.map +1 -0
- package/dist/locking/queries.js +255 -0
- package/dist/locking/queries.js.map +1 -0
- package/dist/locking/section-lock.d.ts +74 -0
- package/dist/locking/section-lock.d.ts.map +1 -0
- package/dist/locking/section-lock.js +207 -0
- package/dist/locking/section-lock.js.map +1 -0
- package/dist/locking/task-lock.d.ts +92 -0
- package/dist/locking/task-lock.d.ts.map +1 -0
- package/dist/locking/task-lock.js +246 -0
- package/dist/locking/task-lock.js.map +1 -0
- package/dist/migrations/index.d.ts +7 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +37 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifest.d.ts +92 -0
- package/dist/migrations/manifest.d.ts.map +1 -0
- package/dist/migrations/manifest.js +270 -0
- package/dist/migrations/manifest.js.map +1 -0
- package/dist/migrations/runner.d.ts +84 -0
- package/dist/migrations/runner.d.ts.map +1 -0
- package/dist/migrations/runner.js +351 -0
- package/dist/migrations/runner.js.map +1 -0
- package/dist/orchestrator/coder.d.ts +32 -0
- package/dist/orchestrator/coder.d.ts.map +1 -0
- package/dist/orchestrator/coder.js +174 -0
- package/dist/orchestrator/coder.js.map +1 -0
- package/dist/orchestrator/coordinator.d.ts +28 -0
- package/dist/orchestrator/coordinator.d.ts.map +1 -0
- package/dist/orchestrator/coordinator.js +256 -0
- package/dist/orchestrator/coordinator.js.map +1 -0
- package/dist/orchestrator/reviewer.d.ts +35 -0
- package/dist/orchestrator/reviewer.d.ts.map +1 -0
- package/dist/orchestrator/reviewer.js +241 -0
- package/dist/orchestrator/reviewer.js.map +1 -0
- package/dist/orchestrator/task-selector.d.ts +102 -0
- package/dist/orchestrator/task-selector.d.ts.map +1 -0
- package/dist/orchestrator/task-selector.js +341 -0
- package/dist/orchestrator/task-selector.js.map +1 -0
- package/dist/prompts/coder.d.ts +36 -0
- package/dist/prompts/coder.d.ts.map +1 -0
- package/dist/prompts/coder.js +315 -0
- package/dist/prompts/coder.js.map +1 -0
- package/dist/prompts/prompt-helpers.d.ts +51 -0
- package/dist/prompts/prompt-helpers.d.ts.map +1 -0
- package/dist/prompts/prompt-helpers.js +312 -0
- package/dist/prompts/prompt-helpers.js.map +1 -0
- package/dist/prompts/reviewer.d.ts +40 -0
- package/dist/prompts/reviewer.d.ts.map +1 -0
- package/dist/prompts/reviewer.js +438 -0
- package/dist/prompts/reviewer.js.map +1 -0
- package/dist/providers/api-models.d.ts +65 -0
- package/dist/providers/api-models.d.ts.map +1 -0
- package/dist/providers/api-models.js +323 -0
- package/dist/providers/api-models.js.map +1 -0
- package/dist/providers/claude.d.ts +53 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +229 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/codex.d.ts +53 -0
- package/dist/providers/codex.d.ts.map +1 -0
- package/dist/providers/codex.js +214 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/gemini.d.ts +58 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +242 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +49 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/interface.d.ts +173 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +96 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/providers/invocation-logger.d.ts +114 -0
- package/dist/providers/invocation-logger.d.ts.map +1 -0
- package/dist/providers/invocation-logger.js +298 -0
- package/dist/providers/invocation-logger.js.map +1 -0
- package/dist/providers/openai.d.ts +53 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +232 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +100 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +178 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/runners/activity-log.d.ts +65 -0
- package/dist/runners/activity-log.d.ts.map +1 -0
- package/dist/runners/activity-log.js +148 -0
- package/dist/runners/activity-log.js.map +1 -0
- package/dist/runners/cron.d.ts +26 -0
- package/dist/runners/cron.d.ts.map +1 -0
- package/dist/runners/cron.js +176 -0
- package/dist/runners/cron.js.map +1 -0
- package/dist/runners/daemon.d.ts +71 -0
- package/dist/runners/daemon.d.ts.map +1 -0
- package/dist/runners/daemon.js +245 -0
- package/dist/runners/daemon.js.map +1 -0
- package/dist/runners/global-db.d.ts +31 -0
- package/dist/runners/global-db.d.ts.map +1 -0
- package/dist/runners/global-db.js +230 -0
- package/dist/runners/global-db.js.map +1 -0
- package/dist/runners/hang-detector.d.ts +38 -0
- package/dist/runners/hang-detector.d.ts.map +1 -0
- package/dist/runners/hang-detector.js +136 -0
- package/dist/runners/hang-detector.js.map +1 -0
- package/dist/runners/heartbeat.d.ts +39 -0
- package/dist/runners/heartbeat.d.ts.map +1 -0
- package/dist/runners/heartbeat.js +79 -0
- package/dist/runners/heartbeat.js.map +1 -0
- package/dist/runners/lock.d.ts +47 -0
- package/dist/runners/lock.d.ts.map +1 -0
- package/dist/runners/lock.js +150 -0
- package/dist/runners/lock.js.map +1 -0
- package/dist/runners/orchestrator-loop.d.ts +20 -0
- package/dist/runners/orchestrator-loop.d.ts.map +1 -0
- package/dist/runners/orchestrator-loop.js +285 -0
- package/dist/runners/orchestrator-loop.js.map +1 -0
- package/dist/runners/projects.d.ts +96 -0
- package/dist/runners/projects.d.ts.map +1 -0
- package/dist/runners/projects.js +255 -0
- package/dist/runners/projects.js.map +1 -0
- package/dist/runners/wakeup.d.ts +34 -0
- package/dist/runners/wakeup.d.ts.map +1 -0
- package/dist/runners/wakeup.js +291 -0
- package/dist/runners/wakeup.js.map +1 -0
- package/migrations/001_initial_schema.sql +106 -0
- package/migrations/002_add_commit_sha.sql +12 -0
- package/migrations/003_add_section_priority.sql +13 -0
- package/migrations/004_add_section_dependencies.sql +18 -0
- package/migrations/005_add_audit_actor_model.sql +10 -0
- package/migrations/006_add_task_invocations.sql +33 -0
- package/migrations/007_add_file_anchor.sql +14 -0
- package/migrations/manifest.json +62 -0
- package/package.json +49 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cron management for runner wake-up
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cronStatus = cronStatus;
|
|
7
|
+
exports.cronInstall = cronInstall;
|
|
8
|
+
exports.cronUninstall = cronUninstall;
|
|
9
|
+
const node_child_process_1 = require("node:child_process");
|
|
10
|
+
const node_os_1 = require("node:os");
|
|
11
|
+
const CRON_COMMENT = '# steroids-runners-wakeup';
|
|
12
|
+
const CRON_ENTRY = '* * * * * steroids runners wakeup --quiet';
|
|
13
|
+
/**
|
|
14
|
+
* Get current crontab contents
|
|
15
|
+
*/
|
|
16
|
+
function getCrontab() {
|
|
17
|
+
try {
|
|
18
|
+
const result = (0, node_child_process_1.spawnSync)('crontab', ['-l'], {
|
|
19
|
+
encoding: 'utf-8',
|
|
20
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
21
|
+
});
|
|
22
|
+
if (result.status !== 0) {
|
|
23
|
+
// "no crontab for user" is not an error for our purposes
|
|
24
|
+
if (result.stderr?.includes('no crontab')) {
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return result.stdout;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Set crontab contents
|
|
37
|
+
*/
|
|
38
|
+
function setCrontab(contents) {
|
|
39
|
+
try {
|
|
40
|
+
const result = (0, node_child_process_1.spawnSync)('crontab', ['-'], {
|
|
41
|
+
input: contents,
|
|
42
|
+
encoding: 'utf-8',
|
|
43
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
44
|
+
});
|
|
45
|
+
return result.status === 0;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Find the steroids binary path
|
|
53
|
+
*/
|
|
54
|
+
function findSteroidsPath() {
|
|
55
|
+
try {
|
|
56
|
+
const result = (0, node_child_process_1.execSync)('which steroids', { encoding: 'utf-8' }).trim();
|
|
57
|
+
return result || 'steroids';
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return 'steroids';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check cron installation status
|
|
65
|
+
*/
|
|
66
|
+
function cronStatus() {
|
|
67
|
+
if ((0, node_os_1.platform)() === 'win32') {
|
|
68
|
+
return {
|
|
69
|
+
installed: false,
|
|
70
|
+
error: 'Cron is not supported on Windows. Use Task Scheduler instead.',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const crontab = getCrontab();
|
|
74
|
+
if (crontab === null) {
|
|
75
|
+
return {
|
|
76
|
+
installed: false,
|
|
77
|
+
error: 'Failed to read crontab',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const lines = crontab.split('\n');
|
|
81
|
+
const steroidsLine = lines.find((line) => line.includes(CRON_COMMENT) || line.includes('steroids runners wakeup'));
|
|
82
|
+
if (steroidsLine) {
|
|
83
|
+
return {
|
|
84
|
+
installed: true,
|
|
85
|
+
entry: steroidsLine,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return { installed: false };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Install cron job for runner wake-up
|
|
92
|
+
*/
|
|
93
|
+
function cronInstall() {
|
|
94
|
+
if ((0, node_os_1.platform)() === 'win32') {
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
message: 'Cron not supported on Windows',
|
|
98
|
+
error: 'Use Task Scheduler to run: steroids runners wakeup --quiet',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Check if already installed
|
|
102
|
+
const status = cronStatus();
|
|
103
|
+
if (status.installed) {
|
|
104
|
+
return {
|
|
105
|
+
success: true,
|
|
106
|
+
message: 'Cron job already installed',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const crontab = getCrontab();
|
|
110
|
+
if (crontab === null) {
|
|
111
|
+
return {
|
|
112
|
+
success: false,
|
|
113
|
+
message: 'Failed to read crontab',
|
|
114
|
+
error: 'Could not access crontab. Check permissions.',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Find steroids path for full path in crontab
|
|
118
|
+
const steroidsPath = findSteroidsPath();
|
|
119
|
+
const cronLine = `${CRON_COMMENT}\n* * * * * ${steroidsPath} runners wakeup --quiet`;
|
|
120
|
+
// Append to existing crontab
|
|
121
|
+
const newCrontab = crontab.trim()
|
|
122
|
+
? `${crontab.trim()}\n${cronLine}\n`
|
|
123
|
+
: `${cronLine}\n`;
|
|
124
|
+
if (!setCrontab(newCrontab)) {
|
|
125
|
+
return {
|
|
126
|
+
success: false,
|
|
127
|
+
message: 'Failed to update crontab',
|
|
128
|
+
error: 'Could not write to crontab. Check permissions.',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
success: true,
|
|
133
|
+
message: `Cron job installed. Wake-up runs every minute.`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Uninstall cron job
|
|
138
|
+
*/
|
|
139
|
+
function cronUninstall() {
|
|
140
|
+
if ((0, node_os_1.platform)() === 'win32') {
|
|
141
|
+
return {
|
|
142
|
+
success: false,
|
|
143
|
+
message: 'Cron not supported on Windows',
|
|
144
|
+
error: 'Remove the Task Scheduler entry manually.',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const crontab = getCrontab();
|
|
148
|
+
if (crontab === null) {
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
message: 'Failed to read crontab',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// Remove lines containing steroids runners wakeup or our comment
|
|
155
|
+
const lines = crontab.split('\n');
|
|
156
|
+
const filteredLines = lines.filter((line) => !line.includes(CRON_COMMENT) &&
|
|
157
|
+
!line.includes('steroids runners wakeup'));
|
|
158
|
+
if (lines.length === filteredLines.length) {
|
|
159
|
+
return {
|
|
160
|
+
success: true,
|
|
161
|
+
message: 'No cron job found to remove',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const newCrontab = filteredLines.join('\n');
|
|
165
|
+
if (!setCrontab(newCrontab)) {
|
|
166
|
+
return {
|
|
167
|
+
success: false,
|
|
168
|
+
message: 'Failed to update crontab',
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
success: true,
|
|
173
|
+
message: 'Cron job removed',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/runners/cron.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner daemon - background process that executes tasks
|
|
3
|
+
*/
|
|
4
|
+
export type RunnerStatus = 'idle' | 'running' | 'stopping';
|
|
5
|
+
export interface Runner {
|
|
6
|
+
id: string;
|
|
7
|
+
status: RunnerStatus;
|
|
8
|
+
pid: number | null;
|
|
9
|
+
project_path: string | null;
|
|
10
|
+
section_id: string | null;
|
|
11
|
+
current_task_id: string | null;
|
|
12
|
+
started_at: string | null;
|
|
13
|
+
heartbeat_at: string;
|
|
14
|
+
}
|
|
15
|
+
export interface DaemonOptions {
|
|
16
|
+
projectPath?: string;
|
|
17
|
+
sectionId?: string;
|
|
18
|
+
onTaskStart?: (taskId: string) => void;
|
|
19
|
+
onTaskComplete?: (taskId: string) => void;
|
|
20
|
+
onShutdown?: () => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Register a new runner in the database
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerRunner(projectPath?: string, sectionId?: string): {
|
|
26
|
+
runnerId: string;
|
|
27
|
+
close: () => void;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Update runner status
|
|
31
|
+
*/
|
|
32
|
+
export declare function updateRunnerStatus(runnerId: string, status: RunnerStatus, currentTaskId?: string | null): void;
|
|
33
|
+
/**
|
|
34
|
+
* Update runner heartbeat timestamp
|
|
35
|
+
*/
|
|
36
|
+
export declare function updateRunnerHeartbeat(runnerId: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Sync project stats to global database
|
|
39
|
+
* Called during heartbeat to cache stats for API/WebUI
|
|
40
|
+
*/
|
|
41
|
+
export declare function syncProjectStats(projectPath: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Update runner's current task
|
|
44
|
+
*/
|
|
45
|
+
export declare function updateRunnerCurrentTask(runnerId: string, taskId: string | null): void;
|
|
46
|
+
/**
|
|
47
|
+
* Remove runner from database
|
|
48
|
+
*/
|
|
49
|
+
export declare function unregisterRunner(runnerId: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Get all runners
|
|
52
|
+
*/
|
|
53
|
+
export declare function listRunners(): Runner[];
|
|
54
|
+
/**
|
|
55
|
+
* Get runner by ID
|
|
56
|
+
*/
|
|
57
|
+
export declare function getRunner(runnerId: string): Runner | null;
|
|
58
|
+
/**
|
|
59
|
+
* Start the runner daemon
|
|
60
|
+
* This is the main entry point for background task processing
|
|
61
|
+
*/
|
|
62
|
+
export declare function startDaemon(options?: DaemonOptions): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Check if daemon can be started (no existing lock or project-specific runner)
|
|
65
|
+
*/
|
|
66
|
+
export declare function canStartDaemon(projectPath?: string): {
|
|
67
|
+
canStart: boolean;
|
|
68
|
+
reason?: string;
|
|
69
|
+
existingPid?: number;
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/runners/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAE3D,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAUzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,IAAI,CAiBN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAS5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAc1D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOvD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAOtC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASzD;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgG5E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAwBA"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Runner daemon - background process that executes tasks
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.registerRunner = registerRunner;
|
|
7
|
+
exports.updateRunnerStatus = updateRunnerStatus;
|
|
8
|
+
exports.updateRunnerHeartbeat = updateRunnerHeartbeat;
|
|
9
|
+
exports.syncProjectStats = syncProjectStats;
|
|
10
|
+
exports.updateRunnerCurrentTask = updateRunnerCurrentTask;
|
|
11
|
+
exports.unregisterRunner = unregisterRunner;
|
|
12
|
+
exports.listRunners = listRunners;
|
|
13
|
+
exports.getRunner = getRunner;
|
|
14
|
+
exports.startDaemon = startDaemon;
|
|
15
|
+
exports.canStartDaemon = canStartDaemon;
|
|
16
|
+
const node_path_1 = require("node:path");
|
|
17
|
+
const uuid_1 = require("uuid");
|
|
18
|
+
const global_db_js_1 = require("./global-db.js");
|
|
19
|
+
const heartbeat_js_1 = require("./heartbeat.js");
|
|
20
|
+
const wakeup_js_1 = require("./wakeup.js");
|
|
21
|
+
const orchestrator_loop_js_1 = require("./orchestrator-loop.js");
|
|
22
|
+
const projects_js_1 = require("./projects.js");
|
|
23
|
+
const connection_js_1 = require("../database/connection.js");
|
|
24
|
+
const queries_js_1 = require("../database/queries.js");
|
|
25
|
+
/**
|
|
26
|
+
* Register a new runner in the database
|
|
27
|
+
*/
|
|
28
|
+
function registerRunner(projectPath, sectionId) {
|
|
29
|
+
const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
|
|
30
|
+
const runnerId = (0, uuid_1.v4)();
|
|
31
|
+
db.prepare(`INSERT INTO runners (id, status, pid, project_path, section_id, started_at, heartbeat_at)
|
|
32
|
+
VALUES (?, 'idle', ?, ?, ?, datetime('now'), datetime('now'))`).run(runnerId, process.pid, projectPath ?? null, sectionId ?? null);
|
|
33
|
+
return { runnerId, close };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Update runner status
|
|
37
|
+
*/
|
|
38
|
+
function updateRunnerStatus(runnerId, status, currentTaskId) {
|
|
39
|
+
const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
|
|
40
|
+
try {
|
|
41
|
+
if (currentTaskId !== undefined) {
|
|
42
|
+
db.prepare(`UPDATE runners SET status = ?, current_task_id = ?, heartbeat_at = datetime('now')
|
|
43
|
+
WHERE id = ?`).run(status, currentTaskId, runnerId);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
db.prepare(`UPDATE runners SET status = ?, heartbeat_at = datetime('now')
|
|
47
|
+
WHERE id = ?`).run(status, runnerId);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
close();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Update runner heartbeat timestamp
|
|
56
|
+
*/
|
|
57
|
+
function updateRunnerHeartbeat(runnerId) {
|
|
58
|
+
const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
|
|
59
|
+
try {
|
|
60
|
+
db.prepare(`UPDATE runners SET heartbeat_at = datetime('now') WHERE id = ?`).run(runnerId);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Sync project stats to global database
|
|
68
|
+
* Called during heartbeat to cache stats for API/WebUI
|
|
69
|
+
*/
|
|
70
|
+
function syncProjectStats(projectPath) {
|
|
71
|
+
try {
|
|
72
|
+
const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
|
|
73
|
+
try {
|
|
74
|
+
const stats = (0, queries_js_1.getTaskCountsByStatus)(db);
|
|
75
|
+
(0, projects_js_1.updateProjectStats)(projectPath, stats);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
close();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
// Silently fail if project DB is unavailable
|
|
83
|
+
// (e.g., during initialization or corruption)
|
|
84
|
+
console.error(`Failed to sync stats for ${projectPath}:`, error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Update runner's current task
|
|
89
|
+
*/
|
|
90
|
+
function updateRunnerCurrentTask(runnerId, taskId) {
|
|
91
|
+
const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
|
|
92
|
+
try {
|
|
93
|
+
db.prepare(`UPDATE runners SET current_task_id = ?, heartbeat_at = datetime('now') WHERE id = ?`).run(taskId, runnerId);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
close();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Remove runner from database
|
|
101
|
+
*/
|
|
102
|
+
function unregisterRunner(runnerId) {
|
|
103
|
+
const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
|
|
104
|
+
try {
|
|
105
|
+
db.prepare('DELETE FROM runners WHERE id = ?').run(runnerId);
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
close();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get all runners
|
|
113
|
+
*/
|
|
114
|
+
function listRunners() {
|
|
115
|
+
const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
|
|
116
|
+
try {
|
|
117
|
+
return db.prepare('SELECT * FROM runners').all();
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
close();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get runner by ID
|
|
125
|
+
*/
|
|
126
|
+
function getRunner(runnerId) {
|
|
127
|
+
const { db, close } = (0, global_db_js_1.openGlobalDatabase)();
|
|
128
|
+
try {
|
|
129
|
+
return db
|
|
130
|
+
.prepare('SELECT * FROM runners WHERE id = ?')
|
|
131
|
+
.get(runnerId);
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Start the runner daemon
|
|
139
|
+
* This is the main entry point for background task processing
|
|
140
|
+
*/
|
|
141
|
+
async function startDaemon(options = {}) {
|
|
142
|
+
// Compute effective project path - default to cwd if not specified
|
|
143
|
+
// Always resolve to absolute path for consistent tracking
|
|
144
|
+
const effectiveProjectPath = (0, node_path_1.resolve)(options.projectPath ?? process.cwd());
|
|
145
|
+
// Check if project is disabled in the global registry
|
|
146
|
+
const registeredProject = (0, projects_js_1.getRegisteredProject)(effectiveProjectPath);
|
|
147
|
+
if (registeredProject && !registeredProject.enabled) {
|
|
148
|
+
console.error(`Project is disabled: ${effectiveProjectPath}`);
|
|
149
|
+
console.error('Run "steroids projects enable" to enable it.');
|
|
150
|
+
process.exit(7); // Project disabled exit code
|
|
151
|
+
}
|
|
152
|
+
// Check if there's already an active runner for this specific project
|
|
153
|
+
if ((0, wakeup_js_1.hasActiveRunnerForProject)(effectiveProjectPath)) {
|
|
154
|
+
console.error(`A runner is already active for project: ${effectiveProjectPath}`);
|
|
155
|
+
console.error('Only one runner per project is allowed.');
|
|
156
|
+
process.exit(6); // Resource locked exit code
|
|
157
|
+
}
|
|
158
|
+
// Register runner with effective project path and section ID
|
|
159
|
+
// Note: Per-project isolation is enforced by hasActiveRunnerForProject() above
|
|
160
|
+
const { runnerId, close: closeDb } = registerRunner(effectiveProjectPath, options.sectionId);
|
|
161
|
+
const { db } = (0, global_db_js_1.openGlobalDatabase)();
|
|
162
|
+
// Start heartbeat
|
|
163
|
+
const heartbeat = (0, heartbeat_js_1.createHeartbeatManager)(db, runnerId);
|
|
164
|
+
heartbeat.start();
|
|
165
|
+
let isShuttingDown = false;
|
|
166
|
+
// Graceful shutdown handler
|
|
167
|
+
const shutdown = async (signal) => {
|
|
168
|
+
if (isShuttingDown)
|
|
169
|
+
return;
|
|
170
|
+
isShuttingDown = true;
|
|
171
|
+
console.log(`\nReceived ${signal}, shutting down gracefully...`);
|
|
172
|
+
// Stop heartbeat
|
|
173
|
+
heartbeat.stop();
|
|
174
|
+
// Update status
|
|
175
|
+
updateRunnerStatus(runnerId, 'stopping');
|
|
176
|
+
// Call shutdown callback
|
|
177
|
+
if (options.onShutdown) {
|
|
178
|
+
options.onShutdown();
|
|
179
|
+
}
|
|
180
|
+
// Clean up
|
|
181
|
+
unregisterRunner(runnerId);
|
|
182
|
+
closeDb();
|
|
183
|
+
console.log('Runner stopped.');
|
|
184
|
+
process.exit(0);
|
|
185
|
+
};
|
|
186
|
+
// Register signal handlers
|
|
187
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
188
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
189
|
+
console.log(`Runner started (ID: ${runnerId}, PID: ${process.pid})`);
|
|
190
|
+
updateRunnerStatus(runnerId, 'running');
|
|
191
|
+
// Track if shutdown was requested
|
|
192
|
+
let shutdownRequested = false;
|
|
193
|
+
// Run the orchestrator loop
|
|
194
|
+
try {
|
|
195
|
+
await (0, orchestrator_loop_js_1.runOrchestratorLoop)({
|
|
196
|
+
projectPath: effectiveProjectPath,
|
|
197
|
+
sectionId: options.sectionId,
|
|
198
|
+
runnerId, // Pass runner ID for activity logging
|
|
199
|
+
shouldStop: () => shutdownRequested,
|
|
200
|
+
onIteration: (iteration) => {
|
|
201
|
+
// Update heartbeat on each iteration
|
|
202
|
+
updateRunnerHeartbeat(runnerId);
|
|
203
|
+
// Sync project stats to global DB for API/WebUI access
|
|
204
|
+
syncProjectStats(effectiveProjectPath);
|
|
205
|
+
},
|
|
206
|
+
onTaskStart: (taskId) => {
|
|
207
|
+
updateRunnerCurrentTask(runnerId, taskId);
|
|
208
|
+
},
|
|
209
|
+
onTaskComplete: () => {
|
|
210
|
+
updateRunnerCurrentTask(runnerId, null);
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
console.error('Loop error:', error);
|
|
216
|
+
}
|
|
217
|
+
// Cleanup and exit
|
|
218
|
+
shutdown('completed');
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Check if daemon can be started (no existing lock or project-specific runner)
|
|
222
|
+
*/
|
|
223
|
+
function canStartDaemon(projectPath) {
|
|
224
|
+
// Default to cwd if not specified for consistent per-project tracking
|
|
225
|
+
// Always resolve to absolute path
|
|
226
|
+
const effectivePath = (0, node_path_1.resolve)(projectPath ?? process.cwd());
|
|
227
|
+
// Check if project is disabled
|
|
228
|
+
const registeredProject = (0, projects_js_1.getRegisteredProject)(effectivePath);
|
|
229
|
+
if (registeredProject && !registeredProject.enabled) {
|
|
230
|
+
return {
|
|
231
|
+
canStart: false,
|
|
232
|
+
reason: `Project is disabled: ${effectivePath}. Run "steroids projects enable" to enable it.`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// Check for project-specific runner (one runner per project allowed)
|
|
236
|
+
if ((0, wakeup_js_1.hasActiveRunnerForProject)(effectivePath)) {
|
|
237
|
+
return {
|
|
238
|
+
canStart: false,
|
|
239
|
+
reason: `A runner is already active for project: ${effectivePath}`,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// Multiple projects can run in parallel - no global lock check
|
|
243
|
+
return { canStart: true };
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/runners/daemon.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAoCH,wCAaC;AAKD,gDAqBC;AAKD,sDASC;AAMD,4CAcC;AAKD,0DAYC;AAKD,4CAOC;AAKD,kCAOC;AAKD,8BASC;AAMD,kCAgGC;AAKD,wCA4BC;AAzSD,yCAAoC;AACpC,+BAAoC;AACpC,iDAAoD;AACpD,iDAAwD;AACxD,2CAAwD;AACxD,iEAA6D;AAC7D,+CAAyE;AACzE,6DAAyD;AACzD,uDAA+D;AAuB/D;;GAEG;AACH,SAAgB,cAAc,CAC5B,WAAoB,EACpB,SAAkB;IAElB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAA,SAAM,GAAE,CAAC;IAE1B,EAAE,CAAC,OAAO,CACR;mEAC+D,CAChE,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,WAAW,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC;IAErE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,QAAgB,EAChB,MAAoB,EACpB,aAA6B;IAE7B,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,IAAI,CAAC;QACH,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,EAAE,CAAC,OAAO,CACR;sBACc,CACf,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,OAAO,CACR;sBACc,CACf,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,QAAgB;IACpD,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CACR,gEAAgE,CACjE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,4BAAY,EAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAA,kCAAqB,EAAC,EAAE,CAAC,CAAC;YACxC,IAAA,gCAAkB,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6CAA6C;QAC7C,8CAA8C;QAC9C,OAAO,CAAC,KAAK,CAAC,4BAA4B,WAAW,GAAG,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CACrC,QAAgB,EAChB,MAAqB;IAErB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CACR,qFAAqF,CACtF,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1B,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,GAAG,EAAc,CAAC;IAC/D,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,QAAgB;IACxC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,EAAE;aACN,OAAO,CAAC,oCAAoC,CAAC;aAC7C,GAAG,CAAC,QAAQ,CAAkB,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,UAAyB,EAAE;IAC3D,mEAAmE;IACnE,0DAA0D;IAC1D,MAAM,oBAAoB,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE3E,sDAAsD;IACtD,MAAM,iBAAiB,GAAG,IAAA,kCAAoB,EAAC,oBAAoB,CAAC,CAAC;IACrE,IAAI,iBAAiB,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,wBAAwB,oBAAoB,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B;IAChD,CAAC;IAED,sEAAsE;IACtE,IAAI,IAAA,qCAAyB,EAAC,oBAAoB,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CACX,2CAA2C,oBAAoB,EAAE,CAClE,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;IAC/C,CAAC;IAED,6DAA6D;IAC7D,+EAA+E;IAC/E,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,oBAAoB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7F,MAAM,EAAE,EAAE,EAAE,GAAG,IAAA,iCAAkB,GAAE,CAAC;IAEpC,kBAAkB;IAClB,MAAM,SAAS,GAAG,IAAA,qCAAsB,EAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACvD,SAAS,CAAC,KAAK,EAAE,CAAC;IAElB,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;QACvD,IAAI,cAAc;YAAE,OAAO;QAC3B,cAAc,GAAG,IAAI,CAAC;QAEtB,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,+BAA+B,CAAC,CAAC;QAEjE,iBAAiB;QACjB,SAAS,CAAC,IAAI,EAAE,CAAC;QAEjB,gBAAgB;QAChB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEzC,yBAAyB;QACzB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,CAAC;QAED,WAAW;QACX,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,OAAO,EAAE,CAAC;QAEV,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,UAAU,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IACrE,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAExC,kCAAkC;IAClC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,IAAA,0CAAmB,EAAC;YACxB,WAAW,EAAE,oBAAoB;YACjC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAG,sCAAsC;YACjD,UAAU,EAAE,GAAG,EAAE,CAAC,iBAAiB;YACnC,WAAW,EAAE,CAAC,SAAS,EAAE,EAAE;gBACzB,qCAAqC;gBACrC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;gBAEhC,uDAAuD;gBACvD,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;YACzC,CAAC;YACD,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE;gBACtB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,mBAAmB;IACnB,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,WAAoB;IAKjD,sEAAsE;IACtE,kCAAkC;IAClC,MAAM,aAAa,GAAG,IAAA,mBAAO,EAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE5D,+BAA+B;IAC/B,MAAM,iBAAiB,GAAG,IAAA,kCAAoB,EAAC,aAAa,CAAC,CAAC;IAC9D,IAAI,iBAAiB,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACpD,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,wBAAwB,aAAa,gDAAgD;SAC9F,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,IAAI,IAAA,qCAAyB,EAAC,aAAa,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,2CAA2C,aAAa,EAAE;SACnE,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global database for runner state
|
|
3
|
+
* Located at ~/.steroids/steroids.db (user home, not project)
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
export interface GlobalDatabaseConnection {
|
|
7
|
+
db: Database.Database;
|
|
8
|
+
close: () => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get the path to the global steroids directory
|
|
12
|
+
*/
|
|
13
|
+
export declare function getGlobalSteroidsDir(): string;
|
|
14
|
+
/**
|
|
15
|
+
* Get the path to the global database
|
|
16
|
+
*/
|
|
17
|
+
export declare function getGlobalDbPath(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Check if global database exists
|
|
20
|
+
*/
|
|
21
|
+
export declare function isGlobalDbInitialized(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize and open the global database
|
|
24
|
+
* Creates it if it doesn't exist
|
|
25
|
+
*/
|
|
26
|
+
export declare function openGlobalDatabase(): GlobalDatabaseConnection;
|
|
27
|
+
/**
|
|
28
|
+
* Get global schema version
|
|
29
|
+
*/
|
|
30
|
+
export declare function getGlobalSchemaVersion(db: Database.Database): string | null;
|
|
31
|
+
//# sourceMappingURL=global-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-db.d.ts","sourceRoot":"","sources":["../../src/runners/global-db.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAQtC,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAuGD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,wBAAwB,CAyG7D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,GAAG,IAAI,CAS3E"}
|