@conduit-harness/conduit-runner-aider 0.0.2-rc2

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.
@@ -0,0 +1,14 @@
1
+ import type { AgentResult, AgentRunner, RunAttempt, ServiceConfig } from "@conduit-harness/conduit";
2
+ export default class AiderRunner implements AgentRunner {
3
+ private readonly command;
4
+ private readonly model;
5
+ private readonly ollamaEndpoint;
6
+ private readonly apiKey;
7
+ private readonly extraArgs;
8
+ private readonly turnTimeoutMs;
9
+ private readonly stallTimeoutMs;
10
+ constructor(config: ServiceConfig);
11
+ private preflight;
12
+ run(attempt: RunAttempt, prompt: string): Promise<AgentResult>;
13
+ private buildCommand;
14
+ }
package/dist/index.js ADDED
@@ -0,0 +1,93 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import { writeFile, unlink } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ function str(v, fallback) { return typeof v === "string" && v.length > 0 ? v : fallback; }
5
+ function maybeStr(v) { return typeof v === "string" && v.length > 0 ? v : undefined; }
6
+ function num(v, fallback) { const n = typeof v === "string" ? Number.parseInt(v, 10) : typeof v === "number" ? v : NaN; return Number.isFinite(n) ? n : fallback; }
7
+ export default class AiderRunner {
8
+ command;
9
+ model;
10
+ ollamaEndpoint;
11
+ apiKey;
12
+ extraArgs;
13
+ turnTimeoutMs;
14
+ stallTimeoutMs;
15
+ constructor(config) {
16
+ const raw = config.agent.raw;
17
+ // Aider treats stdin lines as separate chat turns, so we hand it the prompt
18
+ // via --message-file <tempfile> instead — appended automatically by the runner.
19
+ this.command = str(raw.command, "aider --yes-always --no-pretty --no-stream --no-show-model-warnings --no-detect-urls --no-check-update");
20
+ this.model = str(raw.model, "ollama_chat/qwen2.5-coder:14b");
21
+ this.ollamaEndpoint = str(raw.ollama_endpoint, "http://localhost:11434");
22
+ this.apiKey = maybeStr(raw.api_key);
23
+ this.extraArgs = str(raw.extra_args, "");
24
+ this.turnTimeoutMs = num(raw.turn_timeout_ms, 3600000);
25
+ this.stallTimeoutMs = num(raw.stall_timeout_ms, 300000);
26
+ this.preflight();
27
+ }
28
+ preflight() {
29
+ const bin = this.command.trim().split(/\s+/)[0];
30
+ if (!bin)
31
+ return;
32
+ const result = spawnSync(bin, ["--version"], { stdio: "ignore" });
33
+ const notFound = result.error !== undefined && result.error.code === "ENOENT";
34
+ if (notFound) {
35
+ throw new Error(`aider runner: '${bin}' was not found on PATH.\n\n` +
36
+ `Install aider:\n` +
37
+ ` macOS / Linux: curl -LsSf https://aider.chat/install.sh | sh\n` +
38
+ ` Windows: powershell -ExecutionPolicy ByPass -c "irm https://aider.chat/install.ps1 | iex"\n` +
39
+ `\nOther install methods: https://aider.chat/docs/install.html`);
40
+ }
41
+ }
42
+ async run(attempt, prompt) {
43
+ const promptFile = join(attempt.workspacePath, ".conduit-aider-prompt.md");
44
+ await writeFile(promptFile, prompt, "utf8");
45
+ const fullCommand = this.buildCommand(promptFile);
46
+ const env = { ...process.env, OLLAMA_API_BASE: this.ollamaEndpoint };
47
+ if (this.apiKey)
48
+ env.OPENAI_API_KEY = this.apiKey;
49
+ const result = await new Promise((resolve) => {
50
+ const child = spawn("bash", ["-lc", fullCommand], { cwd: attempt.workspacePath, env, stdio: ["ignore", "pipe", "pipe"] });
51
+ let output = "";
52
+ let settled = false;
53
+ let stallTimer;
54
+ const finish = (r) => { if (settled)
55
+ return; settled = true; clearTimeout(turnTimer); if (stallTimer)
56
+ clearTimeout(stallTimer); resolve(r); };
57
+ const bumpStall = () => { if (this.stallTimeoutMs <= 0)
58
+ return; if (stallTimer)
59
+ clearTimeout(stallTimer); stallTimer = setTimeout(() => { child.kill("SIGTERM"); finish({ status: "timed_out", output, error: "aider_stall_timeout" }); }, this.stallTimeoutMs); };
60
+ const turnTimer = setTimeout(() => { child.kill("SIGTERM"); finish({ status: "timed_out", output, error: "aider_turn_timeout" }); }, this.turnTimeoutMs);
61
+ child.stdout.on("data", d => { output += d.toString(); bumpStall(); });
62
+ child.stderr.on("data", d => { output += d.toString(); bumpStall(); });
63
+ child.on("error", err => finish({ status: "failed", output, error: err.message }));
64
+ child.on("close", code => {
65
+ const r = { status: code === 0 ? "succeeded" : "failed", output };
66
+ if (code !== null)
67
+ r.exitCode = code;
68
+ if (code !== 0)
69
+ r.error = `aider_exit_${code}`;
70
+ finish(r);
71
+ });
72
+ bumpStall();
73
+ });
74
+ await unlink(promptFile).catch(() => { });
75
+ return result;
76
+ }
77
+ buildCommand(promptFile) {
78
+ const parts = [this.command];
79
+ if (!/--model(\s|=)/.test(this.command))
80
+ parts.push(`--model ${shellQuote(this.model)}`);
81
+ if (!/--message-file(\s|=)/.test(this.command))
82
+ parts.push(`--message-file ${shellQuote(promptFile)}`);
83
+ if (this.extraArgs.length > 0)
84
+ parts.push(this.extraArgs);
85
+ return parts.join(" ");
86
+ }
87
+ }
88
+ function shellQuote(value) {
89
+ if (/^[A-Za-z0-9_./:@-]+$/.test(value))
90
+ return value;
91
+ return `'${value.replace(/'/g, "'\\''")}'`;
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@conduit-harness/conduit-runner-aider",
3
+ "version": "0.0.2-rc2",
4
+ "description": "Conduit agent runner plugin for Aider (open-source agentic CLI, works with Ollama)",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": { "import": "./dist/index.js", "types": "./dist/index.d.ts" }
8
+ },
9
+ "files": ["dist"],
10
+ "scripts": {
11
+ "build": "tsc -p tsconfig.json",
12
+ "typecheck": "tsc -p tsconfig.json --noEmit"
13
+ },
14
+ "publishConfig": { "access": "public" },
15
+ "repository": { "type": "git", "url": "git+https://github.com/conduit-harness/conduit.git" },
16
+ "engines": { "node": ">=24.0.0" },
17
+ "peerDependencies": { "@conduit-harness/conduit": ">=0.0.2-rc2" },
18
+ "devDependencies": {
19
+ "@conduit-harness/conduit": "workspace:*",
20
+ "@types/node": "latest",
21
+ "typescript": "latest"
22
+ }
23
+ }