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,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reviewer invocation
|
|
4
|
+
* Uses AI provider system for flexible LLM support
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.invokeReviewer = invokeReviewer;
|
|
8
|
+
exports.invokeReviewerBatch = invokeReviewerBatch;
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const node_os_1 = require("node:os");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const queries_js_1 = require("../database/queries.js");
|
|
13
|
+
const connection_js_1 = require("../database/connection.js");
|
|
14
|
+
const reviewer_js_1 = require("../prompts/reviewer.js");
|
|
15
|
+
const status_js_1 = require("../git/status.js");
|
|
16
|
+
const loader_js_1 = require("../config/loader.js");
|
|
17
|
+
const registry_js_1 = require("../providers/registry.js");
|
|
18
|
+
const invocation_logger_js_1 = require("../providers/invocation-logger.js");
|
|
19
|
+
/**
|
|
20
|
+
* Write prompt to temp file
|
|
21
|
+
*/
|
|
22
|
+
function writePromptToTempFile(prompt) {
|
|
23
|
+
const tempPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `steroids-reviewer-${Date.now()}.txt`);
|
|
24
|
+
(0, node_fs_1.writeFileSync)(tempPath, prompt, 'utf-8');
|
|
25
|
+
return tempPath;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parse reviewer output for decision
|
|
29
|
+
*/
|
|
30
|
+
function parseReviewerDecision(output) {
|
|
31
|
+
const upperOutput = output.toUpperCase();
|
|
32
|
+
// Look for explicit decision markers
|
|
33
|
+
if (upperOutput.includes('DECISION: APPROVE') || upperOutput.includes('**APPROVE**') || /\bAPPROVE\b/.test(upperOutput)) {
|
|
34
|
+
// Extract notes if present
|
|
35
|
+
const notesMatch = output.match(/(?:notes?|feedback|comments?):\s*["']?([^"'\n]+)/i);
|
|
36
|
+
return { decision: 'approve', notes: notesMatch?.[1]?.trim() };
|
|
37
|
+
}
|
|
38
|
+
if (upperOutput.includes('DECISION: REJECT') || upperOutput.includes('**REJECT**') || /\bREJECT\b/.test(upperOutput)) {
|
|
39
|
+
// Extract rejection notes
|
|
40
|
+
const notesMatch = output.match(/(?:notes?|reason|feedback|issues?):\s*["']?([^"'\n]+)/i);
|
|
41
|
+
return { decision: 'reject', notes: notesMatch?.[1]?.trim() || 'See reviewer output for details' };
|
|
42
|
+
}
|
|
43
|
+
if (upperOutput.includes('DECISION: DISPUTE') || upperOutput.includes('**DISPUTE**') || /\bDISPUTE\b/.test(upperOutput)) {
|
|
44
|
+
const notesMatch = output.match(/(?:reason|notes?):\s*["']?([^"'\n]+)/i);
|
|
45
|
+
return { decision: 'dispute', notes: notesMatch?.[1]?.trim() };
|
|
46
|
+
}
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Invoke AI provider with prompt
|
|
51
|
+
* Uses configuration to determine which provider to use
|
|
52
|
+
*/
|
|
53
|
+
async function invokeProvider(promptFile, timeoutMs = 600_000, // 10 minutes default for reviewer
|
|
54
|
+
taskId, projectPath) {
|
|
55
|
+
// Load configuration to get reviewer provider settings
|
|
56
|
+
// Project config overrides global config
|
|
57
|
+
const config = (0, loader_js_1.loadConfig)(projectPath);
|
|
58
|
+
const reviewerConfig = config.ai?.reviewer;
|
|
59
|
+
if (!reviewerConfig?.provider || !reviewerConfig?.model) {
|
|
60
|
+
throw new Error('Reviewer AI provider not configured. Run "steroids config ai reviewer" to configure.');
|
|
61
|
+
}
|
|
62
|
+
// Get the provider from registry
|
|
63
|
+
const registry = (0, registry_js_1.getProviderRegistry)();
|
|
64
|
+
const provider = registry.get(reviewerConfig.provider);
|
|
65
|
+
// Check if provider is available
|
|
66
|
+
if (!(await provider.isAvailable())) {
|
|
67
|
+
throw new Error(`Provider '${reviewerConfig.provider}' is not available. ` +
|
|
68
|
+
`Ensure the CLI is installed and in PATH.`);
|
|
69
|
+
}
|
|
70
|
+
// Read prompt content
|
|
71
|
+
const promptContent = (0, node_fs_1.readFileSync)(promptFile, 'utf-8');
|
|
72
|
+
// Invoke the provider
|
|
73
|
+
const result = await provider.invoke(promptContent, {
|
|
74
|
+
model: reviewerConfig.model,
|
|
75
|
+
timeout: timeoutMs,
|
|
76
|
+
cwd: process.cwd(),
|
|
77
|
+
promptFile,
|
|
78
|
+
role: 'reviewer',
|
|
79
|
+
streamOutput: true,
|
|
80
|
+
});
|
|
81
|
+
// Log the invocation (to both file and database)
|
|
82
|
+
(0, invocation_logger_js_1.logInvocation)(promptContent, result, {
|
|
83
|
+
role: 'reviewer',
|
|
84
|
+
provider: reviewerConfig.provider,
|
|
85
|
+
model: reviewerConfig.model,
|
|
86
|
+
taskId,
|
|
87
|
+
projectPath,
|
|
88
|
+
});
|
|
89
|
+
// Parse the decision from output
|
|
90
|
+
const { decision, notes } = parseReviewerDecision(result.stdout);
|
|
91
|
+
return {
|
|
92
|
+
success: result.success,
|
|
93
|
+
exitCode: result.exitCode,
|
|
94
|
+
stdout: result.stdout,
|
|
95
|
+
stderr: result.stderr,
|
|
96
|
+
duration: result.duration,
|
|
97
|
+
timedOut: result.timedOut,
|
|
98
|
+
decision,
|
|
99
|
+
notes,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Invoke reviewer for a task
|
|
104
|
+
* @param coordinatorGuidance Optional guidance from coordinator after repeated rejections
|
|
105
|
+
* @param coordinatorDecision Optional decision type from coordinator
|
|
106
|
+
*/
|
|
107
|
+
async function invokeReviewer(task, projectPath, coordinatorGuidance, coordinatorDecision) {
|
|
108
|
+
// Load config to show provider/model being used
|
|
109
|
+
const config = (0, loader_js_1.loadConfig)(projectPath);
|
|
110
|
+
const reviewerConfig = config.ai?.reviewer;
|
|
111
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
112
|
+
console.log(`REVIEWER: ${task.title}`);
|
|
113
|
+
console.log(`Task ID: ${task.id}`);
|
|
114
|
+
console.log(`Rejection count: ${task.rejection_count}/15`);
|
|
115
|
+
console.log(`Provider: ${reviewerConfig?.provider ?? 'not configured'}`);
|
|
116
|
+
console.log(`Model: ${reviewerConfig?.model ?? 'not configured'}`);
|
|
117
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
118
|
+
// Try to find the specific commit for this task
|
|
119
|
+
let gitDiff;
|
|
120
|
+
let modifiedFiles;
|
|
121
|
+
const commitHash = (0, status_js_1.findTaskCommit)(projectPath, task.title);
|
|
122
|
+
if (commitHash) {
|
|
123
|
+
console.log(`Found task commit: ${commitHash}`);
|
|
124
|
+
gitDiff = (0, status_js_1.getCommitDiff)(projectPath, commitHash);
|
|
125
|
+
modifiedFiles = (0, status_js_1.getCommitFiles)(projectPath, commitHash);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// Fallback to HEAD~1 if no matching commit found
|
|
129
|
+
console.log('No matching commit found, using HEAD~1 diff');
|
|
130
|
+
gitDiff = (0, status_js_1.getGitDiff)(projectPath, 'HEAD~1');
|
|
131
|
+
modifiedFiles = (0, status_js_1.getModifiedFiles)(projectPath);
|
|
132
|
+
}
|
|
133
|
+
// Fetch other tasks in the same section for context
|
|
134
|
+
let sectionTasks = [];
|
|
135
|
+
let rejectionHistory = [];
|
|
136
|
+
let submissionNotes = null;
|
|
137
|
+
try {
|
|
138
|
+
const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
|
|
139
|
+
// Get section tasks
|
|
140
|
+
if (task.section_id) {
|
|
141
|
+
const allSectionTasks = (0, queries_js_1.listTasks)(db, { sectionId: task.section_id });
|
|
142
|
+
sectionTasks = allSectionTasks.map(t => ({
|
|
143
|
+
id: t.id,
|
|
144
|
+
title: t.title,
|
|
145
|
+
status: t.status,
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
// Get rejection history - ALWAYS fetch this so reviewer can see past attempts
|
|
149
|
+
rejectionHistory = (0, queries_js_1.getTaskRejections)(db, task.id);
|
|
150
|
+
if (rejectionHistory.length > 0) {
|
|
151
|
+
console.log(`Found ${rejectionHistory.length} previous rejection(s) for this task`);
|
|
152
|
+
}
|
|
153
|
+
// Get coder's submission notes (if any)
|
|
154
|
+
submissionNotes = (0, queries_js_1.getLatestSubmissionNotes)(db, task.id);
|
|
155
|
+
if (submissionNotes) {
|
|
156
|
+
console.log(`Coder included notes with submission`);
|
|
157
|
+
}
|
|
158
|
+
close();
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
console.warn('Could not fetch task context:', error);
|
|
162
|
+
}
|
|
163
|
+
// Reuse config loaded earlier, get reviewer model
|
|
164
|
+
const reviewerModel = reviewerConfig?.model || 'unknown';
|
|
165
|
+
const context = {
|
|
166
|
+
task,
|
|
167
|
+
projectPath,
|
|
168
|
+
reviewerModel,
|
|
169
|
+
gitDiff,
|
|
170
|
+
modifiedFiles,
|
|
171
|
+
sectionTasks,
|
|
172
|
+
rejectionHistory,
|
|
173
|
+
submissionNotes,
|
|
174
|
+
config,
|
|
175
|
+
coordinatorGuidance,
|
|
176
|
+
coordinatorDecision,
|
|
177
|
+
};
|
|
178
|
+
const prompt = (0, reviewer_js_1.generateReviewerPrompt)(context);
|
|
179
|
+
// Write prompt to temp file
|
|
180
|
+
const promptFile = writePromptToTempFile(prompt);
|
|
181
|
+
try {
|
|
182
|
+
const result = await invokeProvider(promptFile, 600_000, task.id, projectPath);
|
|
183
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
184
|
+
console.log(`REVIEWER COMPLETED`);
|
|
185
|
+
console.log(`Exit code: ${result.exitCode}`);
|
|
186
|
+
console.log(`Duration: ${(result.duration / 1000).toFixed(1)}s`);
|
|
187
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
// Clean up temp file
|
|
192
|
+
if ((0, node_fs_1.existsSync)(promptFile)) {
|
|
193
|
+
(0, node_fs_1.unlinkSync)(promptFile);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Invoke reviewer for a batch of tasks
|
|
199
|
+
*/
|
|
200
|
+
async function invokeReviewerBatch(tasks, sectionName, projectPath) {
|
|
201
|
+
// Load config for quality settings and to show provider/model being used
|
|
202
|
+
const config = (0, loader_js_1.loadConfig)(projectPath);
|
|
203
|
+
const reviewerConfig = config.ai?.reviewer;
|
|
204
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
205
|
+
console.log(`BATCH REVIEWER: Section "${sectionName}"`);
|
|
206
|
+
console.log(`Tasks: ${tasks.length}`);
|
|
207
|
+
tasks.forEach((t, i) => console.log(` ${i + 1}. ${t.title} (${t.id})`));
|
|
208
|
+
console.log(`Provider: ${reviewerConfig?.provider ?? 'not configured'}`);
|
|
209
|
+
console.log(`Model: ${reviewerConfig?.model ?? 'not configured'}`);
|
|
210
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
211
|
+
// Get combined git diff for all tasks (compare against base before batch started)
|
|
212
|
+
// We look for the earliest task's commit and diff from there
|
|
213
|
+
const gitDiff = (0, status_js_1.getGitDiff)(projectPath, 'HEAD~' + tasks.length);
|
|
214
|
+
const modifiedFiles = (0, status_js_1.getModifiedFiles)(projectPath);
|
|
215
|
+
const context = {
|
|
216
|
+
tasks,
|
|
217
|
+
projectPath,
|
|
218
|
+
sectionName,
|
|
219
|
+
gitDiff,
|
|
220
|
+
modifiedFiles,
|
|
221
|
+
config,
|
|
222
|
+
};
|
|
223
|
+
const prompt = (0, reviewer_js_1.generateBatchReviewerPrompt)(context);
|
|
224
|
+
const promptFile = writePromptToTempFile(prompt);
|
|
225
|
+
try {
|
|
226
|
+
// Longer timeout for batch: base 20 minutes + 3 minutes per task
|
|
227
|
+
const timeoutMs = 20 * 60 * 1000 + tasks.length * 3 * 60 * 1000;
|
|
228
|
+
const result = await invokeProvider(promptFile, timeoutMs, undefined, projectPath);
|
|
229
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
230
|
+
console.log(`BATCH REVIEWER COMPLETED`);
|
|
231
|
+
console.log(`Duration: ${(result.duration / 1000).toFixed(1)}s`);
|
|
232
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
233
|
+
return { ...result, taskCount: tasks.length };
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
if ((0, node_fs_1.existsSync)(promptFile)) {
|
|
237
|
+
(0, node_fs_1.unlinkSync)(promptFile);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/orchestrator/reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task selection algorithm with locking integration
|
|
3
|
+
* Following ORCHESTRATOR.md specification
|
|
4
|
+
*/
|
|
5
|
+
import type Database from 'better-sqlite3';
|
|
6
|
+
import type { Task } from '../database/queries.js';
|
|
7
|
+
import { isTaskLocked, type LockAcquisitionResult, type LockReleaseResult, type HeartbeatHandle } from '../locking/task-lock.js';
|
|
8
|
+
import { acquireSectionLock, releaseSectionLock, isSectionLocked } from '../locking/section-lock.js';
|
|
9
|
+
export interface SelectedTask {
|
|
10
|
+
task: Task;
|
|
11
|
+
action: 'review' | 'resume' | 'start';
|
|
12
|
+
rejectionNotes?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SelectedTaskWithLock extends SelectedTask {
|
|
15
|
+
lockResult: LockAcquisitionResult;
|
|
16
|
+
heartbeat?: HeartbeatHandle;
|
|
17
|
+
}
|
|
18
|
+
export interface TaskSelectionOptions {
|
|
19
|
+
runnerId: string;
|
|
20
|
+
timeoutMinutes?: number;
|
|
21
|
+
noWait?: boolean;
|
|
22
|
+
waitTimeoutMs?: number;
|
|
23
|
+
pollIntervalMs?: number;
|
|
24
|
+
sectionId?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Select the next task to work on
|
|
28
|
+
*
|
|
29
|
+
* Priority order:
|
|
30
|
+
* 1. Tasks in 'review' status (complete review loop first)
|
|
31
|
+
* 2. Tasks in 'in_progress' status (resume incomplete work)
|
|
32
|
+
* 3. Tasks in 'pending' status (start new work)
|
|
33
|
+
*
|
|
34
|
+
* Within each priority, tasks are ordered by:
|
|
35
|
+
* - Section position (lower first)
|
|
36
|
+
* - Creation time (older first)
|
|
37
|
+
*/
|
|
38
|
+
export declare function selectNextTask(db: Database.Database, sectionId?: string): SelectedTask | null;
|
|
39
|
+
/**
|
|
40
|
+
* Batch of tasks from a single section
|
|
41
|
+
*/
|
|
42
|
+
export interface TaskBatch {
|
|
43
|
+
tasks: Task[];
|
|
44
|
+
sectionId: string;
|
|
45
|
+
sectionName: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Select a batch of pending tasks from the first available section
|
|
49
|
+
* Used when batch mode is enabled
|
|
50
|
+
*/
|
|
51
|
+
export declare function selectTaskBatch(db: Database.Database, maxSize?: number): TaskBatch | null;
|
|
52
|
+
/**
|
|
53
|
+
* Mark a task as in_progress when starting
|
|
54
|
+
*/
|
|
55
|
+
export declare function markTaskInProgress(db: Database.Database, taskId: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Check if all tasks are completed
|
|
58
|
+
*/
|
|
59
|
+
export declare function areAllTasksComplete(db: Database.Database, sectionId?: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Count tasks by status
|
|
62
|
+
*/
|
|
63
|
+
export declare function getTaskCounts(db: Database.Database, sectionId?: string): {
|
|
64
|
+
pending: number;
|
|
65
|
+
in_progress: number;
|
|
66
|
+
review: number;
|
|
67
|
+
completed: number;
|
|
68
|
+
disputed: number;
|
|
69
|
+
failed: number;
|
|
70
|
+
total: number;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Select the next task and acquire a lock on it
|
|
74
|
+
* Skips tasks that are already locked by other runners
|
|
75
|
+
*/
|
|
76
|
+
export declare function selectNextTaskWithLock(db: Database.Database, options: TaskSelectionOptions): SelectedTaskWithLock | null;
|
|
77
|
+
/**
|
|
78
|
+
* Select next task with wait behavior
|
|
79
|
+
* Waits for a locked task if no unlocked tasks are available
|
|
80
|
+
*/
|
|
81
|
+
export declare function selectNextTaskWithWait(db: Database.Database, options: TaskSelectionOptions): Promise<SelectedTaskWithLock | null>;
|
|
82
|
+
/**
|
|
83
|
+
* Release task lock after completion
|
|
84
|
+
*/
|
|
85
|
+
export declare function releaseTaskLockAfterCompletion(db: Database.Database, taskId: string, runnerId: string, heartbeat?: HeartbeatHandle): LockReleaseResult;
|
|
86
|
+
/**
|
|
87
|
+
* Mark task in progress and acquire lock
|
|
88
|
+
*/
|
|
89
|
+
export declare function startTaskWithLock(db: Database.Database, taskId: string, runnerId: string, timeoutMinutes?: number): {
|
|
90
|
+
success: boolean;
|
|
91
|
+
heartbeat?: HeartbeatHandle;
|
|
92
|
+
error?: string;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Complete task and release lock
|
|
96
|
+
*/
|
|
97
|
+
export declare function completeTaskWithLock(db: Database.Database, taskId: string, runnerId: string, newStatus: 'review' | 'completed', heartbeat?: HeartbeatHandle): {
|
|
98
|
+
success: boolean;
|
|
99
|
+
error?: string;
|
|
100
|
+
};
|
|
101
|
+
export { isTaskLocked, isSectionLocked, acquireSectionLock, releaseSectionLock, };
|
|
102
|
+
//# sourceMappingURL=task-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-selector.d.ts","sourceRoot":"","sources":["../../src/orchestrator/task-selector.ts"],"names":[],"mappings":"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"}
|