agent-nuvira 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +891 -0
- package/dist/agent-sdk/src/agent.d.ts +118 -0
- package/dist/agent-sdk/src/agent.d.ts.map +1 -0
- package/dist/agent-sdk/src/agent.js +88 -0
- package/dist/agent-sdk/src/agent.js.map +1 -0
- package/dist/agent-sdk/src/index.d.ts +33 -0
- package/dist/agent-sdk/src/index.d.ts.map +1 -0
- package/dist/agent-sdk/src/index.js +32 -0
- package/dist/agent-sdk/src/index.js.map +1 -0
- package/dist/agent-sdk/src/register.d.ts +70 -0
- package/dist/agent-sdk/src/register.d.ts.map +1 -0
- package/dist/agent-sdk/src/register.js +181 -0
- package/dist/agent-sdk/src/register.js.map +1 -0
- package/dist/agent-sdk/src/scaffold.d.ts +50 -0
- package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
- package/dist/agent-sdk/src/scaffold.js +291 -0
- package/dist/agent-sdk/src/scaffold.js.map +1 -0
- package/dist/agent-sdk/src/testing.d.ts +187 -0
- package/dist/agent-sdk/src/testing.d.ts.map +1 -0
- package/dist/agent-sdk/src/testing.js +243 -0
- package/dist/agent-sdk/src/testing.js.map +1 -0
- package/dist/agent-sdk/src/types.d.ts +202 -0
- package/dist/agent-sdk/src/types.d.ts.map +1 -0
- package/dist/agent-sdk/src/types.js +11 -0
- package/dist/agent-sdk/src/types.js.map +1 -0
- package/dist/agents/agent.d.ts +132 -0
- package/dist/agents/agent.d.ts.map +1 -0
- package/dist/agents/agent.js +19 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agents/context-gatherer.d.ts +42 -0
- package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
- package/dist/agents/agents/context-gatherer.js +366 -0
- package/dist/agents/agents/context-gatherer.js.map +1 -0
- package/dist/agents/agents/debugger.d.ts +58 -0
- package/dist/agents/agents/debugger.d.ts.map +1 -0
- package/dist/agents/agents/debugger.js +257 -0
- package/dist/agents/agents/debugger.js.map +1 -0
- package/dist/agents/agents/git-agent.d.ts +34 -0
- package/dist/agents/agents/git-agent.d.ts.map +1 -0
- package/dist/agents/agents/git-agent.js +200 -0
- package/dist/agents/agents/git-agent.js.map +1 -0
- package/dist/agents/agents/github-release-agent.d.ts +65 -0
- package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
- package/dist/agents/agents/github-release-agent.js +439 -0
- package/dist/agents/agents/github-release-agent.js.map +1 -0
- package/dist/agents/agents/package-agent.d.ts +33 -0
- package/dist/agents/agents/package-agent.d.ts.map +1 -0
- package/dist/agents/agents/package-agent.js +233 -0
- package/dist/agents/agents/package-agent.js.map +1 -0
- package/dist/agents/agents/planner.d.ts +26 -0
- package/dist/agents/agents/planner.d.ts.map +1 -0
- package/dist/agents/agents/planner.js +222 -0
- package/dist/agents/agents/planner.js.map +1 -0
- package/dist/agents/agents/reviewer.d.ts +34 -0
- package/dist/agents/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/agents/reviewer.js +159 -0
- package/dist/agents/agents/reviewer.js.map +1 -0
- package/dist/agents/agents/runner.d.ts +73 -0
- package/dist/agents/agents/runner.d.ts.map +1 -0
- package/dist/agents/agents/runner.js +299 -0
- package/dist/agents/agents/runner.js.map +1 -0
- package/dist/agents/agents/security-agent.d.ts +33 -0
- package/dist/agents/agents/security-agent.d.ts.map +1 -0
- package/dist/agents/agents/security-agent.js +184 -0
- package/dist/agents/agents/security-agent.js.map +1 -0
- package/dist/agents/agents/tester.d.ts +96 -0
- package/dist/agents/agents/tester.d.ts.map +1 -0
- package/dist/agents/agents/tester.js +410 -0
- package/dist/agents/agents/tester.js.map +1 -0
- package/dist/agents/agents/writer.d.ts +51 -0
- package/dist/agents/agents/writer.d.ts.map +1 -0
- package/dist/agents/agents/writer.js +384 -0
- package/dist/agents/agents/writer.js.map +1 -0
- package/dist/agents/context-vault.d.ts +49 -0
- package/dist/agents/context-vault.d.ts.map +1 -0
- package/dist/agents/context-vault.js +134 -0
- package/dist/agents/context-vault.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +97 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +696 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/utils/file-tree.d.ts +28 -0
- package/dist/agents/utils/file-tree.d.ts.map +1 -0
- package/dist/agents/utils/file-tree.js +93 -0
- package/dist/agents/utils/file-tree.js.map +1 -0
- package/dist/cli/agent.d.ts +25 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +374 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/benchmark.d.ts +24 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +235 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/cache.d.ts +12 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +58 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/chat.d.ts +37 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +393 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/commands.d.ts +24 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +18 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +162 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dashboard.d.ts +34 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +126 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/doctor.d.ts +68 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +585 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/edit.d.ts +11 -0
- package/dist/cli/edit.d.ts.map +1 -0
- package/dist/cli/edit.js +86 -0
- package/dist/cli/edit.js.map +1 -0
- package/dist/cli/execute.d.ts +25 -0
- package/dist/cli/execute.d.ts.map +1 -0
- package/dist/cli/execute.js +186 -0
- package/dist/cli/execute.js.map +1 -0
- package/dist/cli/federation.d.ts +31 -0
- package/dist/cli/federation.d.ts.map +1 -0
- package/dist/cli/federation.js +387 -0
- package/dist/cli/federation.js.map +1 -0
- package/dist/cli/history.d.ts +22 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +140 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/init.d.ts +49 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +423 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/learn.d.ts +31 -0
- package/dist/cli/learn.d.ts.map +1 -0
- package/dist/cli/learn.js +320 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/memory.d.ts +38 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +295 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model-picker.d.ts +18 -0
- package/dist/cli/model-picker.d.ts.map +1 -0
- package/dist/cli/model-picker.js +225 -0
- package/dist/cli/model-picker.js.map +1 -0
- package/dist/cli/models.d.ts +11 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +132 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/plan.d.ts +11 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +94 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/plugins.d.ts +15 -0
- package/dist/cli/plugins.d.ts.map +1 -0
- package/dist/cli/plugins.js +123 -0
- package/dist/cli/plugins.js.map +1 -0
- package/dist/cli/router.d.ts +20 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +142 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +110 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/sandbox.d.ts +27 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +264 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sdk.d.ts +27 -0
- package/dist/cli/sdk.d.ts.map +1 -0
- package/dist/cli/sdk.js +204 -0
- package/dist/cli/sdk.js.map +1 -0
- package/dist/cli/stats.d.ts +18 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +78 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/team.d.ts +42 -0
- package/dist/cli/team.d.ts.map +1 -0
- package/dist/cli/team.js +473 -0
- package/dist/cli/team.js.map +1 -0
- package/dist/cli/workflow.d.ts +27 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +347 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/config/manager.d.ts +37 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +147 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +53 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context/cache.d.ts +27 -0
- package/dist/context/cache.d.ts.map +1 -0
- package/dist/context/cache.js +116 -0
- package/dist/context/cache.js.map +1 -0
- package/dist/context/history.d.ts +87 -0
- package/dist/context/history.d.ts.map +1 -0
- package/dist/context/history.js +249 -0
- package/dist/context/history.js.map +1 -0
- package/dist/context/parser.d.ts +61 -0
- package/dist/context/parser.d.ts.map +1 -0
- package/dist/context/parser.js +194 -0
- package/dist/context/parser.js.map +1 -0
- package/dist/federation/client.d.ts +49 -0
- package/dist/federation/client.d.ts.map +1 -0
- package/dist/federation/client.js +239 -0
- package/dist/federation/client.js.map +1 -0
- package/dist/federation/protocol.d.ts +155 -0
- package/dist/federation/protocol.d.ts.map +1 -0
- package/dist/federation/protocol.js +57 -0
- package/dist/federation/protocol.js.map +1 -0
- package/dist/federation/server.d.ts +25 -0
- package/dist/federation/server.d.ts.map +1 -0
- package/dist/federation/server.js +401 -0
- package/dist/federation/server.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/factory.d.ts +20 -0
- package/dist/inference/factory.d.ts.map +1 -0
- package/dist/inference/factory.js +46 -0
- package/dist/inference/factory.js.map +1 -0
- package/dist/inference/gemini-adapter.d.ts +17 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -0
- package/dist/inference/gemini-adapter.js +176 -0
- package/dist/inference/gemini-adapter.js.map +1 -0
- package/dist/inference/groq-adapter.d.ts +17 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -0
- package/dist/inference/groq-adapter.js +103 -0
- package/dist/inference/groq-adapter.js.map +1 -0
- package/dist/inference/interface.d.ts +49 -0
- package/dist/inference/interface.d.ts.map +1 -0
- package/dist/inference/interface.js +2 -0
- package/dist/inference/interface.js.map +1 -0
- package/dist/inference/local-adapter.d.ts +35 -0
- package/dist/inference/local-adapter.d.ts.map +1 -0
- package/dist/inference/local-adapter.js +311 -0
- package/dist/inference/local-adapter.js.map +1 -0
- package/dist/inference/model-catalog.d.ts +53 -0
- package/dist/inference/model-catalog.d.ts.map +1 -0
- package/dist/inference/model-catalog.js +306 -0
- package/dist/inference/model-catalog.js.map +1 -0
- package/dist/inference/nim-adapter.d.ts +17 -0
- package/dist/inference/nim-adapter.d.ts.map +1 -0
- package/dist/inference/nim-adapter.js +103 -0
- package/dist/inference/nim-adapter.js.map +1 -0
- package/dist/inference/openrouter-adapter.d.ts +17 -0
- package/dist/inference/openrouter-adapter.d.ts.map +1 -0
- package/dist/inference/openrouter-adapter.js +105 -0
- package/dist/inference/openrouter-adapter.js.map +1 -0
- package/dist/inference/sse.d.ts +20 -0
- package/dist/inference/sse.d.ts.map +1 -0
- package/dist/inference/sse.js +91 -0
- package/dist/inference/sse.js.map +1 -0
- package/dist/learning/agent-stats.d.ts +109 -0
- package/dist/learning/agent-stats.d.ts.map +1 -0
- package/dist/learning/agent-stats.js +240 -0
- package/dist/learning/agent-stats.js.map +1 -0
- package/dist/learning/benchmark.d.ts +161 -0
- package/dist/learning/benchmark.d.ts.map +1 -0
- package/dist/learning/benchmark.js +589 -0
- package/dist/learning/benchmark.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts +101 -0
- package/dist/learning/cost-tracker.d.ts.map +1 -0
- package/dist/learning/cost-tracker.js +224 -0
- package/dist/learning/cost-tracker.js.map +1 -0
- package/dist/learning/feedback.d.ts +88 -0
- package/dist/learning/feedback.d.ts.map +1 -0
- package/dist/learning/feedback.js +169 -0
- package/dist/learning/feedback.js.map +1 -0
- package/dist/learning/hybrid-router.d.ts +201 -0
- package/dist/learning/hybrid-router.d.ts.map +1 -0
- package/dist/learning/hybrid-router.js +450 -0
- package/dist/learning/hybrid-router.js.map +1 -0
- package/dist/learning/model-compare.d.ts +76 -0
- package/dist/learning/model-compare.d.ts.map +1 -0
- package/dist/learning/model-compare.js +252 -0
- package/dist/learning/model-compare.js.map +1 -0
- package/dist/learning/model-router.d.ts +68 -0
- package/dist/learning/model-router.d.ts.map +1 -0
- package/dist/learning/model-router.js +140 -0
- package/dist/learning/model-router.js.map +1 -0
- package/dist/learning/pattern-extractor.d.ts +99 -0
- package/dist/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/learning/pattern-extractor.js +310 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/learning/scorer.d.ts +51 -0
- package/dist/learning/scorer.d.ts.map +1 -0
- package/dist/learning/scorer.js +64 -0
- package/dist/learning/scorer.js.map +1 -0
- package/dist/learning/self-improver.d.ts +48 -0
- package/dist/learning/self-improver.d.ts.map +1 -0
- package/dist/learning/self-improver.js +161 -0
- package/dist/learning/self-improver.js.map +1 -0
- package/dist/memory/embedder.d.ts +65 -0
- package/dist/memory/embedder.d.ts.map +1 -0
- package/dist/memory/embedder.js +424 -0
- package/dist/memory/embedder.js.map +1 -0
- package/dist/memory/memory-integration.d.ts +56 -0
- package/dist/memory/memory-integration.d.ts.map +1 -0
- package/dist/memory/memory-integration.js +95 -0
- package/dist/memory/memory-integration.js.map +1 -0
- package/dist/memory/trajectory-store.d.ts +149 -0
- package/dist/memory/trajectory-store.d.ts.map +1 -0
- package/dist/memory/trajectory-store.js +476 -0
- package/dist/memory/trajectory-store.js.map +1 -0
- package/dist/memory/vector-store.d.ts +78 -0
- package/dist/memory/vector-store.d.ts.map +1 -0
- package/dist/memory/vector-store.js +186 -0
- package/dist/memory/vector-store.js.map +1 -0
- package/dist/plugins/agent-plugin.d.ts +73 -0
- package/dist/plugins/agent-plugin.d.ts.map +1 -0
- package/dist/plugins/agent-plugin.js +199 -0
- package/dist/plugins/agent-plugin.js.map +1 -0
- package/dist/plugins/registry.d.ts +61 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +67 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/sandbox/images.d.ts +31 -0
- package/dist/sandbox/images.d.ts.map +1 -0
- package/dist/sandbox/images.js +129 -0
- package/dist/sandbox/images.js.map +1 -0
- package/dist/sandbox/manager.d.ts +134 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +470 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/types.d.ts +113 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +107 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/security/scanner.d.ts +53 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +271 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/team/config.d.ts +50 -0
- package/dist/team/config.d.ts.map +1 -0
- package/dist/team/config.js +108 -0
- package/dist/team/config.js.map +1 -0
- package/dist/team/memory.d.ts +63 -0
- package/dist/team/memory.d.ts.map +1 -0
- package/dist/team/memory.js +282 -0
- package/dist/team/memory.js.map +1 -0
- package/dist/team/review.d.ts +123 -0
- package/dist/team/review.d.ts.map +1 -0
- package/dist/team/review.js +293 -0
- package/dist/team/review.js.map +1 -0
- package/dist/utils/env.d.ts +19 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +250 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/web-dashboard/server.d.ts +59 -0
- package/dist/web-dashboard/server.d.ts.map +1 -0
- package/dist/web-dashboard/server.js +418 -0
- package/dist/web-dashboard/server.js.map +1 -0
- package/dist/workflow/registry.d.ts +127 -0
- package/dist/workflow/registry.d.ts.map +1 -0
- package/dist/workflow/registry.js +482 -0
- package/dist/workflow/registry.js.map +1 -0
- package/dist/workflow/templates.d.ts +93 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +481 -0
- package/dist/workflow/templates.js.map +1 -0
- package/package.json +78 -0
- package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
- package/src/web-dashboard/public/index.html +13 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TesterAgent — Creates a sandboxed test environment, copies the project,
|
|
3
|
+
* installs dependencies, runs tests, and reports pass/fail results.
|
|
4
|
+
*
|
|
5
|
+
* The sandbox is created in a temp directory to avoid modifying the original project.
|
|
6
|
+
* Tests are run via `npm test` (or a custom command), and full stdout/stderr + exit
|
|
7
|
+
* code are captured and returned.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync, rmSync, readdirSync } from 'node:fs';
|
|
10
|
+
import { join, dirname } from 'node:path';
|
|
11
|
+
import { tmpdir } from 'node:os';
|
|
12
|
+
import { mkdtempSync } from 'node:fs';
|
|
13
|
+
import { execSync } from 'node:child_process';
|
|
14
|
+
import { Agent } from '../agent.js';
|
|
15
|
+
import { SandboxManager } from '../../sandbox/manager.js';
|
|
16
|
+
import { detectProjectImage } from '../../sandbox/images.js';
|
|
17
|
+
import { getSandboxConfig } from '../../sandbox/types.js';
|
|
18
|
+
/** Common directories to exclude when copying to the sandbox */
|
|
19
|
+
const EXCLUDE_DIRS = ['node_modules', '.git', 'dist', '.next', 'coverage', '.cache'];
|
|
20
|
+
/** Default test command */
|
|
21
|
+
const DEFAULT_TEST_COMMAND = 'npm test 2>&1';
|
|
22
|
+
/** Maximum sandbox age before cleanup (30 minutes) */
|
|
23
|
+
const SANDBOX_MAX_AGE_MS = 30 * 60 * 1000;
|
|
24
|
+
/** Track sandbox directories for cleanup */
|
|
25
|
+
const activeSandboxes = [];
|
|
26
|
+
/**
|
|
27
|
+
* Clean up any sandbox directories on process exit.
|
|
28
|
+
* This prevents temp directory accumulation.
|
|
29
|
+
*/
|
|
30
|
+
function registerCleanup() {
|
|
31
|
+
const cleanup = () => {
|
|
32
|
+
for (const dir of activeSandboxes) {
|
|
33
|
+
try {
|
|
34
|
+
rmSync(dir, { recursive: true, force: true });
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Best-effort cleanup
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
process.on('exit', cleanup);
|
|
42
|
+
process.on('SIGINT', () => { cleanup(); process.exit(1); });
|
|
43
|
+
process.on('SIGTERM', cleanup);
|
|
44
|
+
}
|
|
45
|
+
// Register cleanup once
|
|
46
|
+
let cleanupRegistered = false;
|
|
47
|
+
function ensureCleanupRegistered() {
|
|
48
|
+
if (!cleanupRegistered) {
|
|
49
|
+
registerCleanup();
|
|
50
|
+
cleanupRegistered = true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* TesterAgent — Sandboxed test runner.
|
|
55
|
+
*
|
|
56
|
+
* Usage in task plans:
|
|
57
|
+
* ```json
|
|
58
|
+
* { "id": "step-05-test", "description": "Run tests to verify the changes", "agentType": "tester", "dependsOn": ["step-04-write"] }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export class TesterAgent extends Agent {
|
|
62
|
+
name = 'Tester';
|
|
63
|
+
description = 'Runs tests in a sandboxed environment';
|
|
64
|
+
/**
|
|
65
|
+
* Execute tests in a sandboxed copy of the project.
|
|
66
|
+
*
|
|
67
|
+
* Steps:
|
|
68
|
+
* 1. Create a temp directory
|
|
69
|
+
* 2. Copy project files (excluding node_modules, .git, etc.)
|
|
70
|
+
* 3. Run `npm install` in the sandbox
|
|
71
|
+
* 4. Run `npm test` in the sandbox
|
|
72
|
+
* 5. Parse and return the results
|
|
73
|
+
*/
|
|
74
|
+
async execute(context, _callLLM) {
|
|
75
|
+
ensureCleanupRegistered();
|
|
76
|
+
// Check if Docker sandbox should be used
|
|
77
|
+
// Skip if we already tried Docker and it was unavailable
|
|
78
|
+
const triedDocker = context.metadata._dockerTried === true;
|
|
79
|
+
const useDocker = !triedDocker && (context.metadata.useDockerSandbox === true ||
|
|
80
|
+
getSandboxConfig().enabled === true);
|
|
81
|
+
if (useDocker) {
|
|
82
|
+
return this.executeWithDocker(context, _callLLM);
|
|
83
|
+
}
|
|
84
|
+
let sandboxPath = '';
|
|
85
|
+
try {
|
|
86
|
+
// 1. Detect test command from package.json
|
|
87
|
+
const testCommand = this.detectTestCommand(context.workingDirectory);
|
|
88
|
+
// 2. Create sandbox
|
|
89
|
+
sandboxPath = mkdtempSync(join(tmpdir(), 'buff-sandbox-'));
|
|
90
|
+
activeSandboxes.push(sandboxPath);
|
|
91
|
+
if (context.metadata.verboseLogging) {
|
|
92
|
+
// verbose logging enabled
|
|
93
|
+
}
|
|
94
|
+
// 3. Copy project files to sandbox
|
|
95
|
+
this.copyProject(context.workingDirectory, sandboxPath);
|
|
96
|
+
// 4. Apply file changes from context to the sandbox
|
|
97
|
+
this.applyChangesToSandbox(sandboxPath, context.fileChanges);
|
|
98
|
+
// 5. Install dependencies
|
|
99
|
+
const installOutput = this.runInstall(sandboxPath);
|
|
100
|
+
// 6. Run tests
|
|
101
|
+
const testResult = this.runTests(sandboxPath, testCommand);
|
|
102
|
+
// 7. Parse test results
|
|
103
|
+
const parsed = this.parseTestOutput(testResult.output);
|
|
104
|
+
// 8. Store test result in context metadata for other agents
|
|
105
|
+
context.metadata['testResult'] = {
|
|
106
|
+
success: testResult.success,
|
|
107
|
+
output: testResult.output,
|
|
108
|
+
exitCode: testResult.exitCode,
|
|
109
|
+
sandboxPath,
|
|
110
|
+
...parsed,
|
|
111
|
+
};
|
|
112
|
+
// 9. Build summary
|
|
113
|
+
const summaryLines = [];
|
|
114
|
+
if (parsed.total !== undefined) {
|
|
115
|
+
summaryLines.push(`${parsed.passed}/${parsed.total} tests passed`);
|
|
116
|
+
}
|
|
117
|
+
summaryLines.push(testResult.success ? '✅ All tests passed' : `❌ Tests failed (exit code ${testResult.exitCode})`);
|
|
118
|
+
const details = testResult.success
|
|
119
|
+
? undefined
|
|
120
|
+
: `Test output:\n${this.truncateOutput(testResult.output, 2000)}`;
|
|
121
|
+
return {
|
|
122
|
+
success: testResult.success,
|
|
123
|
+
summary: summaryLines.join(' — '),
|
|
124
|
+
details,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
summary: 'Test execution failed',
|
|
132
|
+
error: msg,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Execute tests inside a Docker sandbox container.
|
|
138
|
+
* Falls back to filesystem sandbox if Docker is not available.
|
|
139
|
+
*/
|
|
140
|
+
async executeWithDocker(context, callLLM) {
|
|
141
|
+
const sandboxManager = new SandboxManager();
|
|
142
|
+
let containerId = '';
|
|
143
|
+
try {
|
|
144
|
+
// Check Docker availability
|
|
145
|
+
const dockerAvailable = await sandboxManager.isDockerAvailable();
|
|
146
|
+
if (!dockerAvailable) {
|
|
147
|
+
// Fall back to filesystem sandbox — prevent infinite loop
|
|
148
|
+
// by temporarily disabling the Docker sandbox flag
|
|
149
|
+
if (context.metadata.verboseLogging) {
|
|
150
|
+
// Docker not available — falling back to filesystem sandbox
|
|
151
|
+
}
|
|
152
|
+
// Mark that we tried Docker to prevent infinite loop via config
|
|
153
|
+
context.metadata._dockerTried = true;
|
|
154
|
+
return this.execute(context, callLLM);
|
|
155
|
+
}
|
|
156
|
+
// Detect the right image for the project
|
|
157
|
+
const image = detectProjectImage(context.workingDirectory);
|
|
158
|
+
if (context.metadata.verboseLogging) {
|
|
159
|
+
// verbose logging enabled
|
|
160
|
+
}
|
|
161
|
+
// Create a Docker container for the sandbox
|
|
162
|
+
containerId = await sandboxManager.createContainer(image.image, {
|
|
163
|
+
memoryLimit: '1g',
|
|
164
|
+
cpuLimit: 1,
|
|
165
|
+
timeoutMs: 300_000,
|
|
166
|
+
networkAccess: false,
|
|
167
|
+
});
|
|
168
|
+
// Copy project files to the container
|
|
169
|
+
await sandboxManager.copyProjectToContainer(containerId, context.workingDirectory);
|
|
170
|
+
// Apply file changes from context to the container via heredoc
|
|
171
|
+
for (const change of context.fileChanges) {
|
|
172
|
+
if (change.status === 'deleted' || !change.newContent)
|
|
173
|
+
continue;
|
|
174
|
+
// Use a heredoc to write files with proper newline handling
|
|
175
|
+
const dir = `$(dirname "${change.path}")`;
|
|
176
|
+
await sandboxManager.runCommand(containerId, `mkdir -p ${dir} && cat > "${change.path}" << 'BUFFEOF'
|
|
177
|
+
${change.newContent}
|
|
178
|
+
BUFFEOF`, 30_000);
|
|
179
|
+
}
|
|
180
|
+
// Install dependencies inside the container
|
|
181
|
+
await sandboxManager.runCommand(containerId, image.installCommand || 'npm install', 120_000);
|
|
182
|
+
// Run tests inside the container
|
|
183
|
+
const testCommand = this.detectTestCommand(context.workingDirectory);
|
|
184
|
+
const testResult = await sandboxManager.runCommand(containerId, testCommand, 180_000);
|
|
185
|
+
// Parse test results
|
|
186
|
+
const parsed = this.parseTestOutput(testResult.stdout);
|
|
187
|
+
// Store test result in context metadata
|
|
188
|
+
const output = testResult.stdout + (testResult.stderr ? '\n' + testResult.stderr : '');
|
|
189
|
+
context.metadata['testResult'] = {
|
|
190
|
+
success: testResult.success,
|
|
191
|
+
output,
|
|
192
|
+
exitCode: testResult.exitCode,
|
|
193
|
+
sandboxPath: `docker:${containerId.slice(0, 12)}`,
|
|
194
|
+
...parsed,
|
|
195
|
+
};
|
|
196
|
+
// Build summary
|
|
197
|
+
const summaryLines = [];
|
|
198
|
+
if (parsed.total !== undefined) {
|
|
199
|
+
summaryLines.push(`${parsed.passed}/${parsed.total} tests passed`);
|
|
200
|
+
}
|
|
201
|
+
summaryLines.push(testResult.success ? '✅ All tests passed (Docker)' : `❌ Tests failed (exit code ${testResult.exitCode})`);
|
|
202
|
+
// Clean up the container
|
|
203
|
+
await sandboxManager.destroyContainer(containerId).catch(() => { });
|
|
204
|
+
return {
|
|
205
|
+
success: testResult.success,
|
|
206
|
+
summary: summaryLines.join(' — '),
|
|
207
|
+
details: testResult.success ? undefined : `Test output:\n${this.truncateOutput(output, 2000)}`,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
// Clean up on error
|
|
212
|
+
if (containerId) {
|
|
213
|
+
await sandboxManager.destroyContainer(containerId).catch(() => { });
|
|
214
|
+
}
|
|
215
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
summary: 'Docker sandbox test execution failed',
|
|
219
|
+
error: msg,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Detect the test command from package.json scripts.
|
|
225
|
+
* Falls back to the default if not found.
|
|
226
|
+
*/
|
|
227
|
+
detectTestCommand(workingDir) {
|
|
228
|
+
try {
|
|
229
|
+
const pkgPath = join(workingDir, 'package.json');
|
|
230
|
+
if (existsSync(pkgPath)) {
|
|
231
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
232
|
+
if (pkg.scripts?.test) {
|
|
233
|
+
return `npm run test 2>&1`;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Fall through
|
|
239
|
+
}
|
|
240
|
+
return DEFAULT_TEST_COMMAND;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Copy project files to the sandbox directory, excluding large/generated dirs.
|
|
244
|
+
*/
|
|
245
|
+
copyProject(sourceDir, targetDir) {
|
|
246
|
+
const entries = this.getDirectoryEntries(sourceDir);
|
|
247
|
+
for (const entry of entries) {
|
|
248
|
+
const srcPath = join(sourceDir, entry);
|
|
249
|
+
const tgtPath = join(targetDir, entry);
|
|
250
|
+
try {
|
|
251
|
+
if (entry.startsWith('.'))
|
|
252
|
+
continue; // Skip hidden files
|
|
253
|
+
if (EXCLUDE_DIRS.includes(entry))
|
|
254
|
+
continue; // Skip excluded dirs
|
|
255
|
+
if (existsSync(srcPath)) {
|
|
256
|
+
cpSync(srcPath, tgtPath, { recursive: true, force: true });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
// Skip files we can't copy
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get sorted directory entries to ensure deterministic copy order.
|
|
266
|
+
*/
|
|
267
|
+
getDirectoryEntries(dir) {
|
|
268
|
+
try {
|
|
269
|
+
return readdirSync(dir).sort();
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return [];
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Apply the file changes from the execution context to the sandbox.
|
|
277
|
+
*/
|
|
278
|
+
applyChangesToSandbox(sandboxPath, changes) {
|
|
279
|
+
for (const change of changes) {
|
|
280
|
+
if (change.status === 'deleted')
|
|
281
|
+
continue;
|
|
282
|
+
if (!change.newContent)
|
|
283
|
+
continue;
|
|
284
|
+
const filePath = join(sandboxPath, change.path);
|
|
285
|
+
const dir = dirname(filePath);
|
|
286
|
+
if (!existsSync(dir)) {
|
|
287
|
+
mkdirSync(dir, { recursive: true });
|
|
288
|
+
}
|
|
289
|
+
writeFileSync(filePath, change.newContent, 'utf-8');
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Run npm install in the sandbox.
|
|
294
|
+
*/
|
|
295
|
+
runInstall(sandboxPath) {
|
|
296
|
+
try {
|
|
297
|
+
return execSync('npm install --prefer-offline --no-audit --no-fund 2>&1', {
|
|
298
|
+
cwd: sandboxPath,
|
|
299
|
+
timeout: 120_000, // 2 minutes
|
|
300
|
+
stdio: 'pipe',
|
|
301
|
+
encoding: 'utf-8',
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
const output = err instanceof Error ? err.message : String(err);
|
|
306
|
+
// npm install warnings are normal — only throw on critical errors
|
|
307
|
+
return output;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Run the test command and capture output.
|
|
312
|
+
*/
|
|
313
|
+
runTests(sandboxPath, command) {
|
|
314
|
+
try {
|
|
315
|
+
const output = execSync(command, {
|
|
316
|
+
cwd: sandboxPath,
|
|
317
|
+
timeout: 180_000, // 3 minutes
|
|
318
|
+
stdio: 'pipe',
|
|
319
|
+
encoding: 'utf-8',
|
|
320
|
+
});
|
|
321
|
+
return {
|
|
322
|
+
success: true,
|
|
323
|
+
output,
|
|
324
|
+
exitCode: 0,
|
|
325
|
+
sandboxPath,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
catch (err) {
|
|
329
|
+
const error = err;
|
|
330
|
+
const output = [
|
|
331
|
+
error.stdout || '',
|
|
332
|
+
error.stderr || '',
|
|
333
|
+
error.message || '',
|
|
334
|
+
].filter(Boolean).join('\n');
|
|
335
|
+
return {
|
|
336
|
+
success: false,
|
|
337
|
+
output,
|
|
338
|
+
exitCode: error.status ?? 1,
|
|
339
|
+
sandboxPath,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Parse test output to extract pass/fail/total counts.
|
|
345
|
+
* Supports common test runners: vitest, jest, mocha, etc.
|
|
346
|
+
*/
|
|
347
|
+
parseTestOutput(output) {
|
|
348
|
+
// Try vitest format: "Tests 1 failed | 3 passed (4)"
|
|
349
|
+
const vitestMatch = output.match(/Tests\s+(?:(?:(\d+)\s+failed)\s*)?(?:\|?\s*)?(?:(\d+)\s+passed)?\s*\((\d+)\)/);
|
|
350
|
+
if (vitestMatch) {
|
|
351
|
+
return {
|
|
352
|
+
failed: vitestMatch[1] ? parseInt(vitestMatch[1], 10) : 0,
|
|
353
|
+
passed: vitestMatch[2] ? parseInt(vitestMatch[2], 10) : 0,
|
|
354
|
+
total: parseInt(vitestMatch[3], 10),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
// Try jest format: "Tests: 1 failed, 3 passed, 4 total"
|
|
358
|
+
const jestMatch = output.match(/Tests:\s*(?:(\d+)\s+failed,?\s*)?(?:(\d+)\s+passed,?\s*)?(\d+)\s+total/);
|
|
359
|
+
if (jestMatch) {
|
|
360
|
+
return {
|
|
361
|
+
failed: jestMatch[1] ? parseInt(jestMatch[1], 10) : 0,
|
|
362
|
+
passed: jestMatch[2] ? parseInt(jestMatch[2], 10) : 0,
|
|
363
|
+
total: parseInt(jestMatch[3], 10),
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
// Try generic: "X passing, Y failing"
|
|
367
|
+
const genericMatch = output.match(/(\d+)\s+passing,?\s*(?:(\d+)\s+failing)?/);
|
|
368
|
+
if (genericMatch) {
|
|
369
|
+
return {
|
|
370
|
+
passed: parseInt(genericMatch[1], 10),
|
|
371
|
+
failed: genericMatch[2] ? parseInt(genericMatch[2], 10) : 0,
|
|
372
|
+
total: (genericMatch[2] ? parseInt(genericMatch[1], 10) + parseInt(genericMatch[2], 10) : parseInt(genericMatch[1], 10)),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
// Count lines with ✗, ✓, PASS, FAIL markers as a rough estimate
|
|
376
|
+
const failLines = (output.match(/[✗❌]|FAIL|failed/g) || []).length;
|
|
377
|
+
const passLines = (output.match(/[✓✅]|PASS|passed/g) || []).length;
|
|
378
|
+
if (passLines > 0 || failLines > 0) {
|
|
379
|
+
return {
|
|
380
|
+
passed: passLines,
|
|
381
|
+
failed: failLines,
|
|
382
|
+
total: passLines + failLines,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
return {};
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Truncate long output to avoid huge result strings.
|
|
389
|
+
*/
|
|
390
|
+
truncateOutput(output, maxLength) {
|
|
391
|
+
if (output.length <= maxLength)
|
|
392
|
+
return output;
|
|
393
|
+
return output.slice(0, maxLength) + '\n... (output truncated)';
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Clean up a specific sandbox directory.
|
|
398
|
+
*/
|
|
399
|
+
export function cleanupSandbox(sandboxPath) {
|
|
400
|
+
try {
|
|
401
|
+
rmSync(sandboxPath, { recursive: true, force: true });
|
|
402
|
+
const idx = activeSandboxes.indexOf(sandboxPath);
|
|
403
|
+
if (idx >= 0)
|
|
404
|
+
activeSandboxes.splice(idx, 1);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// Best-effort
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tester.js","sourceRoot":"","sources":["../../../src/agents/agents/tester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WriterAgent — Proposes code changes based on the task plan and gathered context.
|
|
3
|
+
*
|
|
4
|
+
* For each "writer" step in the execution plan, this agent:
|
|
5
|
+
* 1. Reads the relevant source files (from artifacts in the context bus)
|
|
6
|
+
* 2. Generates modified versions using the LLM
|
|
7
|
+
* 3. Stores FileChange objects in the context bus for the orchestrator to apply
|
|
8
|
+
*
|
|
9
|
+
* The agent does NOT write to disk — it only proposes changes.
|
|
10
|
+
* The orchestrator decides whether to apply them (based on dry-run mode).
|
|
11
|
+
*/
|
|
12
|
+
import { Agent, type AgentContext, type AgentResult, type LLMCallFn } from '../agent.js';
|
|
13
|
+
/**
|
|
14
|
+
* WriterAgent — Proposes code changes by reading files, generating new versions
|
|
15
|
+
* via the LLM, and storing FileChange objects in the shared context.
|
|
16
|
+
* Does NOT write to disk directly; the orchestrator handles that.
|
|
17
|
+
*
|
|
18
|
+
* Retry strategy:
|
|
19
|
+
* 1. Rate-limit (429) errors with LONG wait (>3s): invokes onRateLimit callback
|
|
20
|
+
* (if available) to let the user choose: wait, switch model, skip, or abort.
|
|
21
|
+
* 2. Rate-limit errors with SHORT wait (<=3s): auto-retry with smart delay.
|
|
22
|
+
* 3. Other transient errors (timeouts, network): auto-retry with backoff.
|
|
23
|
+
* 4. Empty parse results (format issue): retry once with stricter prompt.
|
|
24
|
+
*/
|
|
25
|
+
export declare class WriterAgent extends Agent {
|
|
26
|
+
readonly name = "Writer";
|
|
27
|
+
readonly description = "Generates code changes based on the plan and context";
|
|
28
|
+
execute(context: AgentContext, callLLM: LLMCallFn): Promise<AgentResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Perform a single write attempt.
|
|
31
|
+
* Optionally uses a stricter retry prompt.
|
|
32
|
+
*/
|
|
33
|
+
private attemptWrite;
|
|
34
|
+
/**
|
|
35
|
+
* Build the prompt for the writer agent from the shared context.
|
|
36
|
+
* Limits the number of files sent to avoid token budget issues.
|
|
37
|
+
* When isRetry is true, uses a more explicit prompt.
|
|
38
|
+
*/
|
|
39
|
+
private buildPrompt;
|
|
40
|
+
/**
|
|
41
|
+
* Parse the LLM response to extract file changes.
|
|
42
|
+
*/
|
|
43
|
+
private parseFileChanges;
|
|
44
|
+
/**
|
|
45
|
+
* Select files within the given character budget.
|
|
46
|
+
* Prioritizes smaller files first so the LLM sees as much complete context as possible.
|
|
47
|
+
*/
|
|
48
|
+
private selectFilesWithinBudget;
|
|
49
|
+
private addFileChange;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/agents/agents/writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AA8G1G;;;;;;;;;;;GAWG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,0DAA0D;IAExE,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAwH9E;;;OAGG;YACW,YAAY;IAiE1B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,aAAa;CA0BtB"}
|