contextos-mcp 0.4.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 +260 -0
- package/bin/mcp.mjs +61 -0
- package/bin/swarm.mjs +45 -0
- package/dist/agents/aider.d.ts +12 -0
- package/dist/agents/aider.js +192 -0
- package/dist/agents/aider.js.map +1 -0
- package/dist/agents/claude-code.d.ts +9 -0
- package/dist/agents/claude-code.js +236 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/codex.d.ts +14 -0
- package/dist/agents/codex.js +203 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/direct-llm.d.ts +22 -0
- package/dist/agents/direct-llm.js +254 -0
- package/dist/agents/direct-llm.js.map +1 -0
- package/dist/agents/mock.d.ts +10 -0
- package/dist/agents/mock.js +170 -0
- package/dist/agents/mock.js.map +1 -0
- package/dist/agents/opencode.d.ts +23 -0
- package/dist/agents/opencode.js +631 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/provider.d.ts +11 -0
- package/dist/agents/provider.js +31 -0
- package/dist/agents/provider.js.map +1 -0
- package/dist/compression/compressor.d.ts +28 -0
- package/dist/compression/compressor.js +268 -0
- package/dist/compression/compressor.js.map +1 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.js +172 -0
- package/dist/config.js.map +1 -0
- package/dist/contextos/loader.d.ts +46 -0
- package/dist/contextos/loader.js +120 -0
- package/dist/contextos/loader.js.map +1 -0
- package/dist/contextos/selector.d.ts +46 -0
- package/dist/contextos/selector.js +80 -0
- package/dist/contextos/selector.js.map +1 -0
- package/dist/core/action-dispatcher.d.ts +15 -0
- package/dist/core/action-dispatcher.js +28 -0
- package/dist/core/action-dispatcher.js.map +1 -0
- package/dist/core/action-schema.d.ts +72 -0
- package/dist/core/action-schema.js +86 -0
- package/dist/core/action-schema.js.map +1 -0
- package/dist/core/repl-interface.d.ts +48 -0
- package/dist/core/repl-interface.js +5 -0
- package/dist/core/repl-interface.js.map +1 -0
- package/dist/core/repl.d.ts +59 -0
- package/dist/core/repl.js +353 -0
- package/dist/core/repl.js.map +1 -0
- package/dist/core/rlm.d.ts +65 -0
- package/dist/core/rlm.js +564 -0
- package/dist/core/rlm.js.map +1 -0
- package/dist/core/runtime.py +470 -0
- package/dist/core/types.d.ts +265 -0
- package/dist/core/types.js +19 -0
- package/dist/core/types.js.map +1 -0
- package/dist/env.d.ts +10 -0
- package/dist/env.js +75 -0
- package/dist/env.js.map +1 -0
- package/dist/hooks/runner.d.ts +43 -0
- package/dist/hooks/runner.js +173 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/labs/cli.d.ts +15 -0
- package/dist/labs/cli.js +295 -0
- package/dist/labs/cli.js.map +1 -0
- package/dist/labs/episodic-memory.d.ts +132 -0
- package/dist/labs/episodic-memory.js +391 -0
- package/dist/labs/episodic-memory.js.map +1 -0
- package/dist/labs/interactive-swarm.d.ts +20 -0
- package/dist/labs/interactive-swarm.js +1173 -0
- package/dist/labs/interactive-swarm.js.map +1 -0
- package/dist/labs/interactive.d.ts +10 -0
- package/dist/labs/interactive.js +2099 -0
- package/dist/labs/interactive.js.map +1 -0
- package/dist/labs/ts-analyzer.d.ts +74 -0
- package/dist/labs/ts-analyzer.js +379 -0
- package/dist/labs/ts-analyzer.js.map +1 -0
- package/dist/labs/viewer.d.ts +12 -0
- package/dist/labs/viewer.js +1284 -0
- package/dist/labs/viewer.js.map +1 -0
- package/dist/main.d.ts +15 -0
- package/dist/main.js +247 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.js +192775 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +117 -0
- package/dist/mcp/session.js +450 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/state.d.ts +42 -0
- package/dist/mcp/state.js +537 -0
- package/dist/mcp/state.js.map +1 -0
- package/dist/mcp/tools/contextos.d.ts +17 -0
- package/dist/mcp/tools/contextos.js +583 -0
- package/dist/mcp/tools/contextos.js.map +1 -0
- package/dist/mcp/tools.d.ts +15 -0
- package/dist/mcp/tools.js +393 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/orchestration/reviewer-gate.d.ts +43 -0
- package/dist/orchestration/reviewer-gate.js +280 -0
- package/dist/orchestration/reviewer-gate.js.map +1 -0
- package/dist/orchestration/reviewer-prompt.d.ts +18 -0
- package/dist/orchestration/reviewer-prompt.js +67 -0
- package/dist/orchestration/reviewer-prompt.js.map +1 -0
- package/dist/orchestration/verification-runner.d.ts +53 -0
- package/dist/orchestration/verification-runner.js +352 -0
- package/dist/orchestration/verification-runner.js.map +1 -0
- package/dist/plugins/adapter.d.ts +11 -0
- package/dist/plugins/adapter.js +11 -0
- package/dist/plugins/adapter.js.map +1 -0
- package/dist/plugins/core/archive.d.ts +9 -0
- package/dist/plugins/core/archive.js +128 -0
- package/dist/plugins/core/archive.js.map +1 -0
- package/dist/plugins/core/digest.d.ts +11 -0
- package/dist/plugins/core/digest.js +70 -0
- package/dist/plugins/core/digest.js.map +1 -0
- package/dist/plugins/core/grants.d.ts +22 -0
- package/dist/plugins/core/grants.js +90 -0
- package/dist/plugins/core/grants.js.map +1 -0
- package/dist/plugins/core/index.d.ts +10 -0
- package/dist/plugins/core/index.js +11 -0
- package/dist/plugins/core/index.js.map +1 -0
- package/dist/plugins/core/pinning.d.ts +15 -0
- package/dist/plugins/core/pinning.js +86 -0
- package/dist/plugins/core/pinning.js.map +1 -0
- package/dist/plugins/core/types.d.ts +105 -0
- package/dist/plugins/core/types.js +22 -0
- package/dist/plugins/core/types.js.map +1 -0
- package/dist/plugins/core/updater.d.ts +16 -0
- package/dist/plugins/core/updater.js +64 -0
- package/dist/plugins/core/updater.js.map +1 -0
- package/dist/plugins/loader.d.ts +65 -0
- package/dist/plugins/loader.js +110 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/prompts/orchestrator.d.ts +6 -0
- package/dist/prompts/orchestrator.js +114 -0
- package/dist/prompts/orchestrator.js.map +1 -0
- package/dist/routing/model-resolver.d.ts +27 -0
- package/dist/routing/model-resolver.js +265 -0
- package/dist/routing/model-resolver.js.map +1 -0
- package/dist/routing/model-router.d.ts +130 -0
- package/dist/routing/model-router.js +515 -0
- package/dist/routing/model-router.js.map +1 -0
- package/dist/runtime/attestations.cjs +260 -0
- package/dist/runtime/reviewer-pipeline.cjs +319 -0
- package/dist/runtime/sandbox.cjs +468 -0
- package/dist/runtime/state-machine.cjs +885 -0
- package/dist/runtime/thread-store.cjs +175 -0
- package/dist/runtime/transactional-git.cjs +315 -0
- package/dist/runtime/verification-pipeline.cjs +435 -0
- package/dist/sandbox/execution.d.ts +165 -0
- package/dist/sandbox/execution.js +497 -0
- package/dist/sandbox/execution.js.map +1 -0
- package/dist/security/file-policy.d.ts +22 -0
- package/dist/security/file-policy.js +53 -0
- package/dist/security/file-policy.js.map +1 -0
- package/dist/security/repository-boundary.d.ts +21 -0
- package/dist/security/repository-boundary.js +119 -0
- package/dist/security/repository-boundary.js.map +1 -0
- package/dist/security/secret-filter.d.ts +36 -0
- package/dist/security/secret-filter.js +149 -0
- package/dist/security/secret-filter.js.map +1 -0
- package/dist/swarm.d.ts +14 -0
- package/dist/swarm.js +624 -0
- package/dist/swarm.js.map +1 -0
- package/dist/threads/cache.d.ts +64 -0
- package/dist/threads/cache.js +241 -0
- package/dist/threads/cache.js.map +1 -0
- package/dist/threads/manager.d.ts +94 -0
- package/dist/threads/manager.js +914 -0
- package/dist/threads/manager.js.map +1 -0
- package/dist/ui/banner.d.ts +14 -0
- package/dist/ui/banner.js +42 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/dashboard.d.ts +33 -0
- package/dist/ui/dashboard.js +135 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/ui/index.d.ts +11 -0
- package/dist/ui/index.js +12 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/log.d.ts +39 -0
- package/dist/ui/log.js +126 -0
- package/dist/ui/log.js.map +1 -0
- package/dist/ui/onboarding.d.ts +14 -0
- package/dist/ui/onboarding.js +755 -0
- package/dist/ui/onboarding.js.map +1 -0
- package/dist/ui/run-log.d.ts +50 -0
- package/dist/ui/run-log.js +60 -0
- package/dist/ui/run-log.js.map +1 -0
- package/dist/ui/spinner.d.ts +41 -0
- package/dist/ui/spinner.js +172 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/streaming-feed.d.ts +72 -0
- package/dist/ui/streaming-feed.js +386 -0
- package/dist/ui/streaming-feed.js.map +1 -0
- package/dist/ui/summary.d.ts +18 -0
- package/dist/ui/summary.js +113 -0
- package/dist/ui/summary.js.map +1 -0
- package/dist/ui/text-input.d.ts +19 -0
- package/dist/ui/text-input.js +266 -0
- package/dist/ui/text-input.js.map +1 -0
- package/dist/ui/theme.d.ts +63 -0
- package/dist/ui/theme.js +97 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/command-exists.d.ts +11 -0
- package/dist/utils/command-exists.js +41 -0
- package/dist/utils/command-exists.js.map +1 -0
- package/dist/utils/process-security.d.ts +19 -0
- package/dist/utils/process-security.js +90 -0
- package/dist/utils/process-security.js.map +1 -0
- package/dist/utils/rolling-buffer.d.ts +16 -0
- package/dist/utils/rolling-buffer.js +30 -0
- package/dist/utils/rolling-buffer.js.map +1 -0
- package/dist/utils/safe-spawn.d.ts +13 -0
- package/dist/utils/safe-spawn.js +49 -0
- package/dist/utils/safe-spawn.js.map +1 -0
- package/dist/worktree/manager.d.ts +69 -0
- package/dist/worktree/manager.js +593 -0
- package/dist/worktree/manager.js.map +1 -0
- package/dist/worktree/merge.d.ts +58 -0
- package/dist/worktree/merge.js +389 -0
- package/dist/worktree/merge.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code agent backend.
|
|
3
|
+
*
|
|
4
|
+
* Runs tasks via `claude -p --output-format json "prompt"` subprocess.
|
|
5
|
+
* Parses structured JSON output for results, cost, and file changes.
|
|
6
|
+
*/
|
|
7
|
+
import * as os from "node:os";
|
|
8
|
+
import { commandExists } from "../utils/command-exists.js";
|
|
9
|
+
import { RollingBuffer } from "../utils/rolling-buffer.js";
|
|
10
|
+
import { safeSpawn } from "../utils/safe-spawn.js";
|
|
11
|
+
import { registerAgent } from "./provider.js";
|
|
12
|
+
/** Extract JSON result from output (may contain non-JSON lines from debug/stderr bleed). */
|
|
13
|
+
function extractJson(raw) {
|
|
14
|
+
// Try direct parse first
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(raw);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
/* mixed output */
|
|
20
|
+
}
|
|
21
|
+
// Try last line (claude outputs JSON as final line)
|
|
22
|
+
const lines = raw.trim().split("\n");
|
|
23
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
24
|
+
const line = lines[i].trim();
|
|
25
|
+
if (line.startsWith("{")) {
|
|
26
|
+
try {
|
|
27
|
+
const parsed = JSON.parse(line);
|
|
28
|
+
if (parsed.type === "result")
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
catch { }
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Fallback: find first { to last }
|
|
35
|
+
const firstBrace = raw.indexOf("{");
|
|
36
|
+
const lastBrace = raw.lastIndexOf("}");
|
|
37
|
+
if (firstBrace !== -1 && lastBrace > firstBrace) {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(raw.slice(firstBrace, lastBrace + 1));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* give up */
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/** Whitelist of env vars safe to pass to agent subprocess. */
|
|
48
|
+
function buildAgentEnv() {
|
|
49
|
+
const homeDir = os.homedir();
|
|
50
|
+
return {
|
|
51
|
+
PATH: process.env.PATH,
|
|
52
|
+
HOME: homeDir,
|
|
53
|
+
USERPROFILE: homeDir,
|
|
54
|
+
SHELL: process.env.SHELL,
|
|
55
|
+
TERM: process.env.TERM,
|
|
56
|
+
LANG: process.env.LANG,
|
|
57
|
+
// Claude Code uses ANTHROPIC_API_KEY
|
|
58
|
+
ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
|
|
59
|
+
// Git config
|
|
60
|
+
GIT_AUTHOR_NAME: process.env.GIT_AUTHOR_NAME,
|
|
61
|
+
GIT_AUTHOR_EMAIL: process.env.GIT_AUTHOR_EMAIL,
|
|
62
|
+
GIT_COMMITTER_NAME: process.env.GIT_COMMITTER_NAME,
|
|
63
|
+
GIT_COMMITTER_EMAIL: process.env.GIT_COMMITTER_EMAIL,
|
|
64
|
+
// XDG dirs (claude may use for config)
|
|
65
|
+
XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME,
|
|
66
|
+
XDG_DATA_HOME: process.env.XDG_DATA_HOME,
|
|
67
|
+
// Windows
|
|
68
|
+
...(process.env.SystemRoot ? { SystemRoot: process.env.SystemRoot } : {}),
|
|
69
|
+
...(process.env.SYSTEMROOT ? { SYSTEMROOT: process.env.SYSTEMROOT } : {}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** Map provider/model format to claude model flag. */
|
|
73
|
+
function resolveModel(model) {
|
|
74
|
+
// Strip provider prefix if present (e.g., "anthropic/claude-sonnet-4-6" → "claude-sonnet-4-6")
|
|
75
|
+
const modelName = model.includes("/") ? model.split("/").pop() : model;
|
|
76
|
+
// Claude Code accepts short aliases
|
|
77
|
+
const aliases = {
|
|
78
|
+
"claude-sonnet-4-6": "sonnet",
|
|
79
|
+
"claude-opus-4-6": "opus",
|
|
80
|
+
"claude-haiku-4-5": "haiku",
|
|
81
|
+
};
|
|
82
|
+
return aliases[modelName] || modelName;
|
|
83
|
+
}
|
|
84
|
+
const claudeCodeProvider = {
|
|
85
|
+
name: "claude-code",
|
|
86
|
+
async isAvailable() {
|
|
87
|
+
return commandExists("claude");
|
|
88
|
+
},
|
|
89
|
+
async run(options) {
|
|
90
|
+
const { task, workDir, model, files, signal } = options;
|
|
91
|
+
const startTime = Date.now();
|
|
92
|
+
// SECURITY NOTICE & TRUST BOUNDARY:
|
|
93
|
+
// --dangerously-skip-permissions is REQUIRED for non-interactive/headless Claude Code execution.
|
|
94
|
+
// Trust model & isolation boundaries:
|
|
95
|
+
// 1. Git Worktree Isolation: Agent runs in a dedicated git worktree branch, preventing concurrent
|
|
96
|
+
// edits or corruption in the user's primary working directory.
|
|
97
|
+
// 2. Pre-Commit Filtering: Changed files are filtered before commit (isBlockedPath, isPathAllowed).
|
|
98
|
+
// 3. Environment Sanitization: Child process environment is stripped of sensitive tokens via buildAgentEnv.
|
|
99
|
+
// 4. OS Sandbox Notice: The child process runs with host OS user privileges and is NOT sandboxed
|
|
100
|
+
// at the kernel/syscall level. For untrusted code execution or multi-tenant hosting, ContextOS
|
|
101
|
+
// must be wrapped in an OS-level container (Docker, Podman) or OS sandbox (e.g. bubblewrap).
|
|
102
|
+
const args = ["-p", "--output-format", "json", "--dangerously-skip-permissions", "--no-session-persistence"];
|
|
103
|
+
if (model) {
|
|
104
|
+
args.push("--model", resolveModel(model));
|
|
105
|
+
}
|
|
106
|
+
// Build the prompt — include file hints if provided
|
|
107
|
+
let prompt = task;
|
|
108
|
+
if (files && files.length > 0) {
|
|
109
|
+
prompt += `\n\nRelevant files to focus on:\n${files.map((f) => `- ${f}`).join("\n")}`;
|
|
110
|
+
}
|
|
111
|
+
args.push(prompt);
|
|
112
|
+
let proc;
|
|
113
|
+
try {
|
|
114
|
+
proc = await safeSpawn("claude", args, {
|
|
115
|
+
cwd: workDir,
|
|
116
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
117
|
+
env: buildAgentEnv(),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
output: "",
|
|
124
|
+
filesChanged: [],
|
|
125
|
+
diff: "",
|
|
126
|
+
error: `Failed to spawn claude: ${err instanceof Error ? err.message : String(err)}`,
|
|
127
|
+
durationMs: 0,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
const stdoutBuf = new RollingBuffer(2 * 1024 * 1024); // 2MB
|
|
132
|
+
const stderrBuf = new RollingBuffer(512 * 1024); // 512KB
|
|
133
|
+
let resolved = false;
|
|
134
|
+
const doResolve = (result) => {
|
|
135
|
+
if (resolved)
|
|
136
|
+
return;
|
|
137
|
+
resolved = true;
|
|
138
|
+
resolve(result);
|
|
139
|
+
};
|
|
140
|
+
proc.stdout?.on("data", (chunk) => {
|
|
141
|
+
const text = chunk.toString();
|
|
142
|
+
stdoutBuf.append(text);
|
|
143
|
+
options.onOutput?.(text);
|
|
144
|
+
});
|
|
145
|
+
proc.stderr?.on("data", (chunk) => {
|
|
146
|
+
stderrBuf.append(chunk.toString());
|
|
147
|
+
});
|
|
148
|
+
if (signal) {
|
|
149
|
+
const onAbort = () => {
|
|
150
|
+
proc.kill("SIGTERM");
|
|
151
|
+
const killTimer = setTimeout(() => {
|
|
152
|
+
try {
|
|
153
|
+
if (proc.exitCode === null)
|
|
154
|
+
proc.kill("SIGKILL");
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
/* already dead */
|
|
158
|
+
}
|
|
159
|
+
}, 3000);
|
|
160
|
+
proc.on("exit", () => clearTimeout(killTimer));
|
|
161
|
+
};
|
|
162
|
+
if (signal.aborted) {
|
|
163
|
+
onAbort();
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
167
|
+
proc.on("exit", () => signal.removeEventListener("abort", onAbort));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
proc.on("close", (code) => {
|
|
171
|
+
const stdout = stdoutBuf.toString();
|
|
172
|
+
const stderr = stderrBuf.toString();
|
|
173
|
+
const durationMs = Date.now() - startTime;
|
|
174
|
+
const parsed = extractJson(stdout);
|
|
175
|
+
if (parsed) {
|
|
176
|
+
// Extract token usage from Claude Code's structured output
|
|
177
|
+
let usage;
|
|
178
|
+
if (parsed.usage) {
|
|
179
|
+
const inputTokens = parsed.usage.input_tokens ?? 0;
|
|
180
|
+
const outputTokens = parsed.usage.output_tokens ?? 0;
|
|
181
|
+
if (inputTokens > 0 || outputTokens > 0) {
|
|
182
|
+
usage = {
|
|
183
|
+
inputTokens,
|
|
184
|
+
outputTokens,
|
|
185
|
+
totalTokens: inputTokens + outputTokens,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (parsed.is_error) {
|
|
190
|
+
doResolve({
|
|
191
|
+
success: false,
|
|
192
|
+
output: parsed.result || stderr,
|
|
193
|
+
filesChanged: [],
|
|
194
|
+
diff: "",
|
|
195
|
+
durationMs: parsed.duration_ms || durationMs,
|
|
196
|
+
error: parsed.result || `Claude Code error: ${parsed.subtype}`,
|
|
197
|
+
usage,
|
|
198
|
+
});
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
doResolve({
|
|
202
|
+
success: true,
|
|
203
|
+
output: parsed.result || "",
|
|
204
|
+
filesChanged: [], // Diff is captured separately by worktree manager
|
|
205
|
+
diff: "",
|
|
206
|
+
durationMs: parsed.duration_ms || durationMs,
|
|
207
|
+
usage,
|
|
208
|
+
});
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
// Fallback: no JSON parsed — use raw output
|
|
212
|
+
doResolve({
|
|
213
|
+
success: code === 0,
|
|
214
|
+
output: stdout || stderr,
|
|
215
|
+
filesChanged: [],
|
|
216
|
+
diff: "",
|
|
217
|
+
durationMs,
|
|
218
|
+
error: code !== 0 ? `claude exited with code ${code}${stderr ? `: ${stderr.slice(0, 500)}` : ""}` : undefined,
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
proc.on("error", (err) => {
|
|
222
|
+
doResolve({
|
|
223
|
+
success: false,
|
|
224
|
+
output: "",
|
|
225
|
+
filesChanged: [],
|
|
226
|
+
diff: "",
|
|
227
|
+
durationMs: Date.now() - startTime,
|
|
228
|
+
error: `Failed to spawn claude: ${err.message}`,
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
registerAgent(claudeCodeProvider);
|
|
235
|
+
export default claudeCodeProvider;
|
|
236
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI agent backend (OpenAI).
|
|
3
|
+
*
|
|
4
|
+
* Runs tasks via `codex exec --json --full-auto "prompt"` subprocess.
|
|
5
|
+
* Codex CLI is OpenAI's open-source coding agent.
|
|
6
|
+
*
|
|
7
|
+
* Output format: JSONL events streamed to stdout, with event types:
|
|
8
|
+
* - thread.started, turn.started, turn.completed, turn.failed
|
|
9
|
+
* - item.started, item.updated, item.completed
|
|
10
|
+
* Item types: assistant_message, command_execution, file_change, etc.
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentProvider } from "../core/types.js";
|
|
13
|
+
declare const codexProvider: AgentProvider;
|
|
14
|
+
export default codexProvider;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI agent backend (OpenAI).
|
|
3
|
+
*
|
|
4
|
+
* Runs tasks via `codex exec --json --full-auto "prompt"` subprocess.
|
|
5
|
+
* Codex CLI is OpenAI's open-source coding agent.
|
|
6
|
+
*
|
|
7
|
+
* Output format: JSONL events streamed to stdout, with event types:
|
|
8
|
+
* - thread.started, turn.started, turn.completed, turn.failed
|
|
9
|
+
* - item.started, item.updated, item.completed
|
|
10
|
+
* Item types: assistant_message, command_execution, file_change, etc.
|
|
11
|
+
*/
|
|
12
|
+
import * as os from "node:os";
|
|
13
|
+
import { commandExists } from "../utils/command-exists.js";
|
|
14
|
+
import { RollingBuffer } from "../utils/rolling-buffer.js";
|
|
15
|
+
import { safeSpawn } from "../utils/safe-spawn.js";
|
|
16
|
+
import { registerAgent } from "./provider.js";
|
|
17
|
+
/** Whitelist of env vars safe to pass to agent subprocess. */
|
|
18
|
+
function buildAgentEnv() {
|
|
19
|
+
const homeDir = os.homedir();
|
|
20
|
+
return {
|
|
21
|
+
PATH: process.env.PATH,
|
|
22
|
+
HOME: homeDir,
|
|
23
|
+
USERPROFILE: homeDir,
|
|
24
|
+
SHELL: process.env.SHELL,
|
|
25
|
+
TERM: process.env.TERM,
|
|
26
|
+
LANG: process.env.LANG,
|
|
27
|
+
// Codex uses CODEX_API_KEY or OPENAI_API_KEY
|
|
28
|
+
CODEX_API_KEY: process.env.CODEX_API_KEY || process.env.OPENAI_API_KEY,
|
|
29
|
+
OPENAI_API_KEY: process.env.OPENAI_API_KEY,
|
|
30
|
+
OPENAI_BASE_URL: process.env.OPENAI_BASE_URL,
|
|
31
|
+
// Codex config home
|
|
32
|
+
CODEX_HOME: process.env.CODEX_HOME,
|
|
33
|
+
// Git config
|
|
34
|
+
GIT_AUTHOR_NAME: process.env.GIT_AUTHOR_NAME,
|
|
35
|
+
GIT_AUTHOR_EMAIL: process.env.GIT_AUTHOR_EMAIL,
|
|
36
|
+
GIT_COMMITTER_NAME: process.env.GIT_COMMITTER_NAME,
|
|
37
|
+
GIT_COMMITTER_EMAIL: process.env.GIT_COMMITTER_EMAIL,
|
|
38
|
+
// Windows
|
|
39
|
+
...(process.env.SystemRoot ? { SystemRoot: process.env.SystemRoot } : {}),
|
|
40
|
+
...(process.env.SYSTEMROOT ? { SYSTEMROOT: process.env.SYSTEMROOT } : {}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Map provider/model format to codex model flag. */
|
|
44
|
+
function resolveModel(model) {
|
|
45
|
+
// Strip provider prefix (e.g., "openai/o3" → "o3")
|
|
46
|
+
return model.includes("/") ? model.split("/").pop() : model;
|
|
47
|
+
}
|
|
48
|
+
/** Parse JSONL output to extract result, file changes, and token usage. */
|
|
49
|
+
function parseCodexJsonl(stdout) {
|
|
50
|
+
const lines = stdout.trim().split("\n").filter(Boolean);
|
|
51
|
+
let output = "";
|
|
52
|
+
const filesChanged = [];
|
|
53
|
+
let success = true;
|
|
54
|
+
let error;
|
|
55
|
+
let totalInput = 0;
|
|
56
|
+
let totalOutput = 0;
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
try {
|
|
59
|
+
const event = JSON.parse(line);
|
|
60
|
+
if (event.type === "turn.failed") {
|
|
61
|
+
success = false;
|
|
62
|
+
error = event.error || "Turn failed";
|
|
63
|
+
}
|
|
64
|
+
if (event.type === "item.completed") {
|
|
65
|
+
if (event.item_type === "assistant_message") {
|
|
66
|
+
// Capture assistant messages
|
|
67
|
+
const content = event.message?.content || event.content || "";
|
|
68
|
+
if (content)
|
|
69
|
+
output += (output ? "\n" : "") + content;
|
|
70
|
+
}
|
|
71
|
+
if (event.item_type === "file_change" && event.file_path) {
|
|
72
|
+
filesChanged.push(event.file_path);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Accumulate token usage from events
|
|
76
|
+
if (event.usage) {
|
|
77
|
+
totalInput += event.usage.input_tokens ?? 0;
|
|
78
|
+
totalOutput += event.usage.output_tokens ?? 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Non-JSON line — ignore
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
let usage;
|
|
86
|
+
if (totalInput > 0 || totalOutput > 0) {
|
|
87
|
+
usage = {
|
|
88
|
+
inputTokens: totalInput,
|
|
89
|
+
outputTokens: totalOutput,
|
|
90
|
+
totalTokens: totalInput + totalOutput,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return { output, filesChanged: [...new Set(filesChanged)], success, error, usage };
|
|
94
|
+
}
|
|
95
|
+
const codexProvider = {
|
|
96
|
+
name: "codex",
|
|
97
|
+
async isAvailable() {
|
|
98
|
+
return commandExists("codex");
|
|
99
|
+
},
|
|
100
|
+
async run(options) {
|
|
101
|
+
const { task, workDir, model, files, signal } = options;
|
|
102
|
+
const startTime = Date.now();
|
|
103
|
+
const args = ["exec", "--json", "--full-auto", "--ephemeral", "--skip-git-repo-check", "--cd", workDir];
|
|
104
|
+
if (model) {
|
|
105
|
+
args.push("--model", resolveModel(model));
|
|
106
|
+
}
|
|
107
|
+
// Build the prompt — include file hints if provided
|
|
108
|
+
let prompt = task;
|
|
109
|
+
if (files && files.length > 0) {
|
|
110
|
+
prompt += `\n\nRelevant files to focus on:\n${files.map((f) => `- ${f}`).join("\n")}`;
|
|
111
|
+
}
|
|
112
|
+
args.push(prompt);
|
|
113
|
+
let proc;
|
|
114
|
+
try {
|
|
115
|
+
proc = await safeSpawn("codex", args, {
|
|
116
|
+
cwd: workDir,
|
|
117
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
118
|
+
env: buildAgentEnv(),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
output: "",
|
|
125
|
+
filesChanged: [],
|
|
126
|
+
diff: "",
|
|
127
|
+
error: `Failed to spawn codex: ${err instanceof Error ? err.message : String(err)}`,
|
|
128
|
+
durationMs: 0,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return new Promise((resolve) => {
|
|
132
|
+
const stdoutBuf = new RollingBuffer(2 * 1024 * 1024); // 2MB
|
|
133
|
+
const stderrBuf = new RollingBuffer(512 * 1024); // 512KB
|
|
134
|
+
let resolved = false;
|
|
135
|
+
const doResolve = (result) => {
|
|
136
|
+
if (resolved)
|
|
137
|
+
return;
|
|
138
|
+
resolved = true;
|
|
139
|
+
resolve(result);
|
|
140
|
+
};
|
|
141
|
+
proc.stdout?.on("data", (chunk) => {
|
|
142
|
+
const text = chunk.toString();
|
|
143
|
+
stdoutBuf.append(text);
|
|
144
|
+
options.onOutput?.(text);
|
|
145
|
+
});
|
|
146
|
+
proc.stderr?.on("data", (chunk) => {
|
|
147
|
+
stderrBuf.append(chunk.toString());
|
|
148
|
+
});
|
|
149
|
+
if (signal) {
|
|
150
|
+
const onAbort = () => {
|
|
151
|
+
proc.kill("SIGTERM");
|
|
152
|
+
const killTimer = setTimeout(() => {
|
|
153
|
+
try {
|
|
154
|
+
if (proc.exitCode === null)
|
|
155
|
+
proc.kill("SIGKILL");
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
/* already dead */
|
|
159
|
+
}
|
|
160
|
+
}, 3000);
|
|
161
|
+
proc.on("exit", () => clearTimeout(killTimer));
|
|
162
|
+
};
|
|
163
|
+
if (signal.aborted) {
|
|
164
|
+
onAbort();
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
168
|
+
proc.on("exit", () => signal.removeEventListener("abort", onAbort));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
proc.on("close", (code) => {
|
|
172
|
+
const stdout = stdoutBuf.toString();
|
|
173
|
+
const stderr = stderrBuf.toString();
|
|
174
|
+
const durationMs = Date.now() - startTime;
|
|
175
|
+
// Parse JSONL events
|
|
176
|
+
const parsed = parseCodexJsonl(stdout);
|
|
177
|
+
doResolve({
|
|
178
|
+
success: code === 0 && parsed.success,
|
|
179
|
+
output: parsed.output || stdout || stderr,
|
|
180
|
+
filesChanged: parsed.filesChanged,
|
|
181
|
+
diff: "", // Diff is captured separately by worktree manager
|
|
182
|
+
durationMs,
|
|
183
|
+
error: parsed.error ||
|
|
184
|
+
(code !== 0 ? `codex exited with code ${code}${stderr ? `: ${stderr.slice(0, 500)}` : ""}` : undefined),
|
|
185
|
+
usage: parsed.usage,
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
proc.on("error", (err) => {
|
|
189
|
+
doResolve({
|
|
190
|
+
success: false,
|
|
191
|
+
output: "",
|
|
192
|
+
filesChanged: [],
|
|
193
|
+
diff: "",
|
|
194
|
+
durationMs: Date.now() - startTime,
|
|
195
|
+
error: `Failed to spawn codex: ${err.message}`,
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
registerAgent(codexProvider);
|
|
202
|
+
export default codexProvider;
|
|
203
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,8DAA8D;AAC9D,SAAS,aAAa;IACrB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,OAAO;QACN,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QACtB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,OAAO;QACpB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK;QACxB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QACtB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QACtB,6CAA6C;QAC7C,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QACtE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QAC1C,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QAC5C,oBAAoB;QACpB,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAClC,aAAa;QACb,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QAC5C,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC9C,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAClD,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;QACpD,UAAU;QACV,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,SAAS,YAAY,CAAC,KAAa;IAClC,mDAAmD;IACnD,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9D,CAAC;AAYD,2EAA2E;AAC3E,SAAS,eAAe,CAAC,MAAc;IAOtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,KAAyB,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACJ,MAAM,KAAK,GAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE/C,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAClC,OAAO,GAAG,KAAK,CAAC;gBAChB,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,aAAa,CAAC;YACtC,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACrC,IAAI,KAAK,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;oBAC7C,6BAA6B;oBAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;oBAC9D,IAAI,OAAO;wBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;gBACvD,CAAC;gBACD,IAAI,KAAK,CAAC,SAAS,KAAK,aAAa,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBAC1D,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACpC,CAAC;YACF,CAAC;YAED,qCAAqC;YACrC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjB,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;gBAC5C,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;YAC/C,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,yBAAyB;QAC1B,CAAC;IACF,CAAC;IAED,IAAI,KAAwD,CAAC;IAC7D,IAAI,UAAU,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,GAAG;YACP,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,WAAW;YACzB,WAAW,EAAE,UAAU,GAAG,WAAW;SACrC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,aAAa,GAAkB;IACpC,IAAI,EAAE,OAAO;IAEb,KAAK,CAAC,WAAW;QAChB,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAwB;QACjC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAExG,IAAI,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,oDAAoD;QACpD,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,oCAAoC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACJ,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;gBACrC,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,GAAG,EAAE,aAAa,EAAE;aACpB,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBACnF,UAAU,EAAE,CAAC;aACb,CAAC;QACH,CAAC;QAED,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;YAC3C,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM;YAC5D,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ;YACzD,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,MAAM,SAAS,GAAG,CAAC,MAAmB,EAAE,EAAE;gBACzC,IAAI,QAAQ;oBAAE,OAAO;gBACrB,QAAQ,GAAG,IAAI,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC,CAAC;YAEF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC9B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvB,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACzC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,GAAG,EAAE;oBACpB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACrB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;wBACjC,IAAI,CAAC;4BACJ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;gCAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAClD,CAAC;wBAAC,MAAM,CAAC;4BACR,kBAAkB;wBACnB,CAAC;oBACF,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;gBAChD,CAAC,CAAC;gBACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1D,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBACrE,CAAC;YACF,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAE1C,qBAAqB;gBACrB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;gBAEvC,SAAS,CAAC;oBACT,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO;oBACrC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,IAAI,MAAM;oBACzC,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,IAAI,EAAE,EAAE,EAAE,kDAAkD;oBAC5D,UAAU;oBACV,KAAK,EACJ,MAAM,CAAC,KAAK;wBACZ,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,0BAA0B,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBACxG,KAAK,EAAE,MAAM,CAAC,KAAK;iBACnB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,SAAS,CAAC;oBACT,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,EAAE;oBACV,YAAY,EAAE,EAAE;oBAChB,IAAI,EAAE,EAAE;oBACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAClC,KAAK,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE;iBAC9C,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;CACD,CAAC;AAEF,aAAa,CAAC,aAAa,CAAC,CAAC;AAC7B,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextOS Direct LLM agent backend.
|
|
3
|
+
*
|
|
4
|
+
* Enhanced version of the original direct-llm provider.
|
|
5
|
+
* Key improvements:
|
|
6
|
+
* 1. Accepts a ContextOS system prompt (project rules/standards)
|
|
7
|
+
* 2. Parses code blocks from LLM responses and writes them to the worktree
|
|
8
|
+
* 3. Builds a coding-oriented prompt that instructs the LLM to produce file edits
|
|
9
|
+
* 4. Reports files changed based on parsed code blocks
|
|
10
|
+
*
|
|
11
|
+
* Uses @mariozechner/pi-ai for unified access to OpenAI, Anthropic, and Gemini.
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentProvider, AgentRunOptions } from "../core/types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Extended run options that include ContextOS system prompt.
|
|
16
|
+
*/
|
|
17
|
+
export interface ContextosAgentRunOptions extends AgentRunOptions {
|
|
18
|
+
/** ContextOS system prompt assembled from .agents/ rules and skills. */
|
|
19
|
+
contextosPrompt?: string;
|
|
20
|
+
}
|
|
21
|
+
declare const contextosDirectLlm: AgentProvider;
|
|
22
|
+
export default contextosDirectLlm;
|