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,254 @@
|
|
|
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 { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
14
|
+
import * as path from "node:path";
|
|
15
|
+
import { isPathAllowed } from "../security/file-policy.js";
|
|
16
|
+
import { containsSecrets, isBlockedPath, redactSecrets } from "../security/secret-filter.js";
|
|
17
|
+
import { registerAgent } from "./provider.js";
|
|
18
|
+
/**
|
|
19
|
+
* Parse code blocks from LLM output that include file paths.
|
|
20
|
+
*
|
|
21
|
+
* Supports formats:
|
|
22
|
+
* ```language:path/to/file.ts
|
|
23
|
+
* ```language filepath="path/to/file.ts"
|
|
24
|
+
* <!-- FILE: path/to/file.ts -->
|
|
25
|
+
* // FILE: path/to/file.ts
|
|
26
|
+
*/
|
|
27
|
+
function parseCodeBlocks(output) {
|
|
28
|
+
const blocks = [];
|
|
29
|
+
const codeBlockRegex = /```(\w+)?(?::([^\n]+)|[^\S\n]+filepath="([^"]+)")?\n([\s\S]*?)```/g;
|
|
30
|
+
let match;
|
|
31
|
+
while ((match = codeBlockRegex.exec(output)) !== null) {
|
|
32
|
+
const language = match[1] || "";
|
|
33
|
+
const filePath = match[2] || match[3] || "";
|
|
34
|
+
const content = match[4] || "";
|
|
35
|
+
if (filePath && content.trim()) {
|
|
36
|
+
blocks.push({
|
|
37
|
+
filePath: filePath.trim(),
|
|
38
|
+
content: content,
|
|
39
|
+
language,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Also try FILE: comment pattern
|
|
44
|
+
const fileCommentRegex = /(?:<!--\s*FILE:\s*(.+?)\s*-->|\/\/\s*FILE:\s*(.+))\n```\w*\n([\s\S]*?)```/g;
|
|
45
|
+
while ((match = fileCommentRegex.exec(output)) !== null) {
|
|
46
|
+
const filePath = (match[1] || match[2] || "").trim();
|
|
47
|
+
const content = match[3] || "";
|
|
48
|
+
if (filePath && content.trim()) {
|
|
49
|
+
// Avoid duplicates
|
|
50
|
+
if (!blocks.some((b) => b.filePath === filePath)) {
|
|
51
|
+
blocks.push({ filePath, content, language: "" });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return blocks;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Write parsed code blocks to the worktree directory.
|
|
59
|
+
* Creates directories as needed. Returns list of written file paths.
|
|
60
|
+
*/
|
|
61
|
+
function writeCodeBlocks(workDir, blocks) {
|
|
62
|
+
const written = [];
|
|
63
|
+
for (const block of blocks) {
|
|
64
|
+
// Security: prevent path traversal and blocked/forbidden paths
|
|
65
|
+
const normalized = path.normalize(block.filePath);
|
|
66
|
+
if (normalized.startsWith("..") || path.isAbsolute(normalized)) {
|
|
67
|
+
process.stderr.write(`[contextos-agent] Skipping unsafe path (traversal): ${block.filePath}\n`);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (isBlockedPath(normalized) || !isPathAllowed(normalized, workDir)) {
|
|
71
|
+
process.stderr.write(`[contextos-agent] Skipping forbidden/policy-blocked path: ${block.filePath}\n`);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const fullPath = path.join(workDir, normalized);
|
|
75
|
+
// Ensure parent directory exists
|
|
76
|
+
const dir = path.dirname(fullPath);
|
|
77
|
+
if (!existsSync(dir)) {
|
|
78
|
+
mkdirSync(dir, { recursive: true });
|
|
79
|
+
}
|
|
80
|
+
writeFileSync(fullPath, block.content, "utf-8");
|
|
81
|
+
written.push(normalized);
|
|
82
|
+
process.stderr.write(`[contextos-agent] Wrote: ${normalized}\n`);
|
|
83
|
+
}
|
|
84
|
+
return written;
|
|
85
|
+
}
|
|
86
|
+
// ── Prompt Builder ─────────────────────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Build a coding-oriented prompt that tells the LLM to produce file edits
|
|
89
|
+
* in a parseable format.
|
|
90
|
+
*/
|
|
91
|
+
function buildCodingPrompt(task, workDir, files, contextosPrompt) {
|
|
92
|
+
const sections = [];
|
|
93
|
+
// ContextOS project standards (if provided)
|
|
94
|
+
if (contextosPrompt) {
|
|
95
|
+
sections.push(contextosPrompt);
|
|
96
|
+
}
|
|
97
|
+
// Coding instructions
|
|
98
|
+
sections.push(`
|
|
99
|
+
## Your Task
|
|
100
|
+
|
|
101
|
+
You are a coding agent. Your job is to implement the following task by writing code.
|
|
102
|
+
|
|
103
|
+
**Task**: ${task}
|
|
104
|
+
|
|
105
|
+
## Output Format
|
|
106
|
+
|
|
107
|
+
For EVERY file you create or modify, output it in this exact format:
|
|
108
|
+
|
|
109
|
+
\`\`\`language:path/to/file.ts
|
|
110
|
+
// file contents here
|
|
111
|
+
\`\`\`
|
|
112
|
+
|
|
113
|
+
The path must be relative to the project root. Include the COMPLETE file contents.
|
|
114
|
+
Do NOT use placeholders like "// ... rest of the code". Write the full file.
|
|
115
|
+
|
|
116
|
+
## Important Rules
|
|
117
|
+
- Write production-quality code
|
|
118
|
+
- Include proper error handling
|
|
119
|
+
- Follow existing code style and patterns in the project
|
|
120
|
+
- Do not modify files that are not related to the task
|
|
121
|
+
`);
|
|
122
|
+
// Include existing file contents for context
|
|
123
|
+
if (files && files.length > 0) {
|
|
124
|
+
sections.push("\n## Existing Files (for context)\n");
|
|
125
|
+
for (const file of files.slice(0, 10)) {
|
|
126
|
+
// Cap at 10 files
|
|
127
|
+
if (!isPathAllowed(file, workDir) || isBlockedPath(file)) {
|
|
128
|
+
process.stderr.write(`[direct-llm] Skipping blocked or out-of-boundary file: ${file}\n`);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const fullPath = path.resolve(workDir, file);
|
|
132
|
+
if (existsSync(fullPath)) {
|
|
133
|
+
try {
|
|
134
|
+
const rawContent = readFileSync(fullPath, "utf-8");
|
|
135
|
+
if (containsSecrets(rawContent)) {
|
|
136
|
+
process.stderr.write(`[direct-llm] Redacting detected secrets in: ${file}\n`);
|
|
137
|
+
}
|
|
138
|
+
const content = redactSecrets(rawContent);
|
|
139
|
+
// Cap per-file content at 3000 chars
|
|
140
|
+
const truncated = content.length > 3000 ? `${content.slice(0, 3000)}\n// ... [truncated]` : content;
|
|
141
|
+
sections.push(`### ${file}\n\`\`\`\n${truncated}\n\`\`\`\n`);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Skip unreadable files
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return sections.join("\n");
|
|
150
|
+
}
|
|
151
|
+
const contextosDirectLlm = {
|
|
152
|
+
name: "direct-llm",
|
|
153
|
+
async isAvailable() {
|
|
154
|
+
return !!(process.env.ANTHROPIC_API_KEY ||
|
|
155
|
+
process.env.OPENAI_API_KEY ||
|
|
156
|
+
process.env.GEMINI_API_KEY ||
|
|
157
|
+
process.env.OPENROUTER_API_KEY);
|
|
158
|
+
},
|
|
159
|
+
async run(options) {
|
|
160
|
+
const startTime = Date.now();
|
|
161
|
+
const extOptions = options;
|
|
162
|
+
try {
|
|
163
|
+
const { completeSimple, getModels, getProviders } = await import("@mariozechner/pi-ai");
|
|
164
|
+
const modelId = options.model || process.env.CONTEXTOS_DEFAULT_MODEL || process.env.RLM_MODEL || "claude-sonnet-4-6";
|
|
165
|
+
// Find model
|
|
166
|
+
let model;
|
|
167
|
+
for (const provider of getProviders()) {
|
|
168
|
+
for (const m of getModels(provider)) {
|
|
169
|
+
if (m.id === modelId) {
|
|
170
|
+
model = m;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (model)
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
if (!model) {
|
|
178
|
+
return {
|
|
179
|
+
success: false,
|
|
180
|
+
output: "",
|
|
181
|
+
filesChanged: [],
|
|
182
|
+
diff: "",
|
|
183
|
+
durationMs: Date.now() - startTime,
|
|
184
|
+
error: `Model "${modelId}" not found. Available models depend on your API keys (OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY).`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
// Build the coding prompt with ContextOS rules
|
|
188
|
+
const codingPrompt = buildCodingPrompt(options.task, options.workDir, options.files, extOptions.contextosPrompt);
|
|
189
|
+
// Abort-aware LLM call — race against cancellation signal to stop
|
|
190
|
+
// spending money on abandoned requests (P1.9 fix)
|
|
191
|
+
const llmPromise = completeSimple(model, {
|
|
192
|
+
systemPrompt: "You are an expert coding agent. You write complete, production-ready code. Follow all project standards provided to you.",
|
|
193
|
+
messages: [
|
|
194
|
+
{
|
|
195
|
+
role: "user",
|
|
196
|
+
content: codingPrompt,
|
|
197
|
+
timestamp: Date.now(),
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
});
|
|
201
|
+
let response;
|
|
202
|
+
const { signal } = options;
|
|
203
|
+
if (signal) {
|
|
204
|
+
const abortPromise = new Promise((_, reject) => {
|
|
205
|
+
if (signal.aborted) {
|
|
206
|
+
reject(new DOMException("LLM request aborted", "AbortError"));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
signal.addEventListener("abort", () => {
|
|
210
|
+
reject(new DOMException("LLM request aborted", "AbortError"));
|
|
211
|
+
}, { once: true });
|
|
212
|
+
});
|
|
213
|
+
response = await Promise.race([llmPromise, abortPromise]);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
response = await llmPromise;
|
|
217
|
+
}
|
|
218
|
+
const output = response.content
|
|
219
|
+
.filter((b) => b.type === "text")
|
|
220
|
+
.map((b) => b.text)
|
|
221
|
+
.join("\n");
|
|
222
|
+
// Parse code blocks and write to worktree
|
|
223
|
+
const codeBlocks = parseCodeBlocks(output);
|
|
224
|
+
let filesChanged = [];
|
|
225
|
+
if (codeBlocks.length > 0 && options.workDir) {
|
|
226
|
+
filesChanged = writeCodeBlocks(options.workDir, codeBlocks);
|
|
227
|
+
process.stderr.write(`[contextos-agent] Parsed ${codeBlocks.length} code blocks, wrote ${filesChanged.length} files\n`);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
process.stderr.write(`[contextos-agent] No code blocks found in LLM response (${output.length} chars)\n`);
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
success: true,
|
|
234
|
+
output,
|
|
235
|
+
filesChanged,
|
|
236
|
+
diff: "", // Will be captured by WorktreeManager.getDiff()
|
|
237
|
+
durationMs: Date.now() - startTime,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
return {
|
|
242
|
+
success: false,
|
|
243
|
+
output: "",
|
|
244
|
+
filesChanged: [],
|
|
245
|
+
diff: "",
|
|
246
|
+
durationMs: Date.now() - startTime,
|
|
247
|
+
error: err instanceof Error ? err.message : String(err),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
registerAgent(contextosDirectLlm);
|
|
253
|
+
export default contextosDirectLlm;
|
|
254
|
+
//# sourceMappingURL=direct-llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-llm.js","sourceRoot":"","sources":["../../src/agents/direct-llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock agent backend — for integration testing without real API keys.
|
|
3
|
+
*
|
|
4
|
+
* Simulates a coding agent by writing actual files in the work directory.
|
|
5
|
+
* Registered as "mock" and "mock-reviewer" in the agent registry.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentProvider } from "../core/types.js";
|
|
8
|
+
declare const mockProvider: AgentProvider;
|
|
9
|
+
export declare const mockReviewerProvider: AgentProvider;
|
|
10
|
+
export default mockProvider;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock agent backend — for integration testing without real API keys.
|
|
3
|
+
*
|
|
4
|
+
* Simulates a coding agent by writing actual files in the work directory.
|
|
5
|
+
* Registered as "mock" and "mock-reviewer" in the agent registry.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "node:fs";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import { registerAgent } from "./provider.js";
|
|
10
|
+
const mockProvider = {
|
|
11
|
+
name: "mock",
|
|
12
|
+
async isAvailable() {
|
|
13
|
+
return true;
|
|
14
|
+
},
|
|
15
|
+
async run(options) {
|
|
16
|
+
const { task, workDir, signal } = options;
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
// Check for abort
|
|
19
|
+
if (signal?.aborted) {
|
|
20
|
+
return {
|
|
21
|
+
success: false,
|
|
22
|
+
output: "Aborted",
|
|
23
|
+
filesChanged: [],
|
|
24
|
+
diff: "",
|
|
25
|
+
durationMs: Date.now() - startTime,
|
|
26
|
+
error: "Aborted before start",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Simulate work delay (20ms)
|
|
30
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
31
|
+
// Check for forced failure mode
|
|
32
|
+
if (task.includes("__FAIL__")) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
output: "Simulated failure",
|
|
36
|
+
filesChanged: [],
|
|
37
|
+
diff: "",
|
|
38
|
+
durationMs: Date.now() - startTime,
|
|
39
|
+
error: "Mock agent forced failure",
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Handle review evaluation tasks cleanly if invoked as reviewer
|
|
43
|
+
if (task.includes("Independent Code Reviewer") || task.includes("specCompliance") || task.includes("codeQuality")) {
|
|
44
|
+
if (task.includes("__MALFORMED__")) {
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
output: "Unparseable non-json response",
|
|
48
|
+
filesChanged: [],
|
|
49
|
+
diff: "",
|
|
50
|
+
durationMs: Date.now() - startTime,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const specCompliance = task.includes("__FAIL_SPEC__") ? "FAIL" : "PASS";
|
|
54
|
+
const codeQuality = task.includes("__FAIL_QUALITY__") ? "FAIL" : "PASS";
|
|
55
|
+
return {
|
|
56
|
+
success: true,
|
|
57
|
+
output: JSON.stringify({
|
|
58
|
+
specCompliance,
|
|
59
|
+
codeQuality,
|
|
60
|
+
summary: `Review completed: spec=${specCompliance}, quality=${codeQuality}`,
|
|
61
|
+
}),
|
|
62
|
+
filesChanged: [],
|
|
63
|
+
diff: "",
|
|
64
|
+
durationMs: Date.now() - startTime,
|
|
65
|
+
usage: { inputTokens: 500, outputTokens: 200, totalTokens: 700 },
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// Write actual files in the work directory to simulate agent edits
|
|
69
|
+
const filesChanged = [];
|
|
70
|
+
// Create or modify a file based on the task
|
|
71
|
+
const targetFile = path.join(workDir, "hello.ts");
|
|
72
|
+
const content = `// Generated by mock agent\n// Task: ${task}\nexport function hello(): string {\n\treturn "Hello from swarm thread!";\n}\n`;
|
|
73
|
+
fs.writeFileSync(targetFile, content, "utf-8");
|
|
74
|
+
filesChanged.push("hello.ts");
|
|
75
|
+
// If task mentions "multi", create additional files
|
|
76
|
+
if (task.toLowerCase().includes("multi")) {
|
|
77
|
+
const extraFile = path.join(workDir, "utils.ts");
|
|
78
|
+
fs.writeFileSync(extraFile, '// Utility module\nexport const VERSION = "1.0.0";\n', "utf-8");
|
|
79
|
+
filesChanged.push("utils.ts");
|
|
80
|
+
}
|
|
81
|
+
const output = [
|
|
82
|
+
"Applied edit to hello.ts",
|
|
83
|
+
`Created ${filesChanged.length} file(s)`,
|
|
84
|
+
"Result: Successfully completed task",
|
|
85
|
+
].join("\n");
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
output,
|
|
89
|
+
filesChanged,
|
|
90
|
+
diff: "", // Diff is captured by worktree manager
|
|
91
|
+
durationMs: Date.now() - startTime,
|
|
92
|
+
// Simulate token usage for testing budget tracking
|
|
93
|
+
usage: {
|
|
94
|
+
inputTokens: 1500,
|
|
95
|
+
outputTokens: 800,
|
|
96
|
+
totalTokens: 2300,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
export const mockReviewerProvider = {
|
|
102
|
+
name: "mock-reviewer",
|
|
103
|
+
async isAvailable() {
|
|
104
|
+
return true;
|
|
105
|
+
},
|
|
106
|
+
async run(options) {
|
|
107
|
+
const { task, signal } = options;
|
|
108
|
+
const startTime = Date.now();
|
|
109
|
+
if (signal?.aborted) {
|
|
110
|
+
return {
|
|
111
|
+
success: false,
|
|
112
|
+
output: "Aborted",
|
|
113
|
+
filesChanged: [],
|
|
114
|
+
diff: "",
|
|
115
|
+
durationMs: Date.now() - startTime,
|
|
116
|
+
error: "Aborted before start",
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (task.includes("__TIMEOUT__")) {
|
|
120
|
+
await new Promise((resolve) => setTimeout(resolve, 35000));
|
|
121
|
+
}
|
|
122
|
+
if (task.includes("__MALFORMED__")) {
|
|
123
|
+
return {
|
|
124
|
+
success: true,
|
|
125
|
+
output: "This is completely unparseable non-JSON text from the reviewer.",
|
|
126
|
+
filesChanged: [],
|
|
127
|
+
diff: "",
|
|
128
|
+
durationMs: Date.now() - startTime,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (task.includes("__ERROR__") || task.includes("__FAIL__")) {
|
|
132
|
+
return {
|
|
133
|
+
success: false,
|
|
134
|
+
output: "",
|
|
135
|
+
filesChanged: [],
|
|
136
|
+
diff: "",
|
|
137
|
+
durationMs: Date.now() - startTime,
|
|
138
|
+
error: "Independent reviewer model execution failed",
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const specCompliance = task.includes("__FAIL_SPEC__") ? "FAIL" : "PASS";
|
|
142
|
+
const codeQuality = task.includes("__FAIL_QUALITY__") ? "FAIL" : "PASS";
|
|
143
|
+
return {
|
|
144
|
+
success: true,
|
|
145
|
+
output: JSON.stringify({
|
|
146
|
+
specCompliance,
|
|
147
|
+
codeQuality,
|
|
148
|
+
summary: specCompliance === "PASS" && codeQuality === "PASS"
|
|
149
|
+
? "Independent code review passed"
|
|
150
|
+
: `Independent code review verdict: spec=${specCompliance}, quality=${codeQuality}`,
|
|
151
|
+
}),
|
|
152
|
+
filesChanged: [],
|
|
153
|
+
diff: "",
|
|
154
|
+
durationMs: Date.now() - startTime,
|
|
155
|
+
usage: {
|
|
156
|
+
inputTokens: 600,
|
|
157
|
+
outputTokens: 250,
|
|
158
|
+
totalTokens: 850,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
registerAgent(mockProvider);
|
|
164
|
+
registerAgent(mockReviewerProvider);
|
|
165
|
+
registerAgent({
|
|
166
|
+
...mockReviewerProvider,
|
|
167
|
+
name: "reviewer-independent",
|
|
168
|
+
});
|
|
169
|
+
export default mockProvider;
|
|
170
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/agents/mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode agent backend.
|
|
3
|
+
*
|
|
4
|
+
* Three execution modes (in priority order):
|
|
5
|
+
* 1. Server mode: Connects to a managed `opencode serve` instance via HTTP API.
|
|
6
|
+
* Avoids cold-start overhead. Server is shared across threads.
|
|
7
|
+
* 2. Attach mode: Uses `opencode run --attach <url>` to connect to a running server.
|
|
8
|
+
* Falls back here if direct HTTP API call fails.
|
|
9
|
+
* 3. Subprocess mode: Cold-starts `opencode run --format json` per invocation.
|
|
10
|
+
* Always-available fallback.
|
|
11
|
+
*
|
|
12
|
+
* The server pool manages lifecycle of `opencode serve` processes, starting them
|
|
13
|
+
* lazily and shutting them down when the session ends.
|
|
14
|
+
*/
|
|
15
|
+
import type { AgentProvider } from "../core/types.js";
|
|
16
|
+
/** Enable server mode for the OpenCode agent. Call before spawning threads. */
|
|
17
|
+
export declare function enableServerMode(): void;
|
|
18
|
+
/** Disable server mode and shut down all managed servers. */
|
|
19
|
+
export declare function disableServerMode(): Promise<void>;
|
|
20
|
+
/** Get the number of active server instances. */
|
|
21
|
+
export declare function getActiveServerCount(): number;
|
|
22
|
+
declare const openCodeProvider: AgentProvider;
|
|
23
|
+
export default openCodeProvider;
|