@swarmify/agents-mcp 0.2.6 → 0.2.7

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/README.md CHANGED
@@ -1,25 +1,18 @@
1
1
  # @swarmify/agents-mcp
2
2
 
3
- Run Subagents, Swarm or Ralph Wiggums from any MCP client.
4
-
5
- Spawn CLI agents in parallel so your main agent stays focused. Each subagent runs in its own context and can be polled for progress.
3
+ Turn any agent into a tech lead. Spawn sub-agents from Claude, Codex, Gemini, or any MCP client.
6
4
 
7
5
  Homepage: https://swarmify.co
8
6
  NPM: https://www.npmjs.com/package/@swarmify/agents-mcp
9
- VS Code Extension: https://marketplace.visualstudio.com/items?itemName=swarmify.swarm-ext
10
-
11
- ## Why This Exists
7
+ VS Code Extension: [Agents](https://marketplace.visualstudio.com/items?itemName=swarmify.swarm-ext) - full-screen agent terminals in your editor
12
8
 
13
- MCP adoption is accelerating and the ecosystem is organizing around registries, gateways, and enterprise governance. At the same time, teams are pushing toward multi-agent workflows and running into orchestration reliability, tool overload, and security concerns. This server gives you a focused, practical building block for real-world swarm work.
9
+ ## What you get
14
10
 
15
- The API surface is intentionally small, closer to iconic commands like `cd`, `ls`, and `git` than a framework. Fewer knobs means less room for an orchestrator to make mistakes.
11
+ A single agent handles one thing at a time - like a junior developer. Add this MCP server, and your agent becomes a tech lead: it can spawn sub-agents, assign them specific files, give them project context, and synthesize their results.
16
12
 
17
- ## What You Get
18
-
19
- - A dead simple MCP server with `Spawn`, `Status`, `Stop`, and `Tasks` tools
20
- - The `/swarm` command to teach an orchestrator how to distribute work
21
- - Plan vs edit modes that control file access per agent
22
- - Local logs and durable processes that survive IDE restarts
13
+ **4 tools:** `Spawn`, `Status`, `Stop`, `Tasks`
14
+ **3 modes:** `plan` (read-only), `edit` (can write), `ralph` (autonomous)
15
+ **Background processes:** Sub-agents run headless, survive IDE restarts
23
16
 
24
17
  ## Quick Start
25
18
 
@@ -33,87 +26,51 @@ codex mcp add swarm -- npx -y @swarmify/agents-mcp@latest
33
26
  # Gemini CLI
34
27
  gemini mcp add Swarm -- npx -y @swarmify/agents-mcp
35
28
 
36
- # OpenCode (interactive)
29
+ # OpenCode
37
30
  opencode mcp add
38
- # Name: swarmify-agents
39
- # Type: Local
40
- # Command: npx -y @swarmify/agents-mcp
31
+ # Name: Swarm, Command: npx -y @swarmify/agents-mcp
41
32
  ```
42
33
 
43
34
  The server auto-discovers which agent CLIs you have installed.
44
35
 
45
- ## Where It Fits
46
-
47
- - Parallelize tasks across Claude, Codex, Gemini, and Cursor
48
- - Keep long-running loops responsive by offloading work to subagents
49
- - Integrate with MCP registries and gateways without changing your workflow
50
- - Run Ralph Wiggum loops inside spawned Claude Code agents when the plugin is installed
51
-
52
- ## Under the Hood
53
-
54
- Headless CLI agents run as background processes. Output streams to `~/.swarmify/agents/{id}/stdout.log`.
55
-
56
- Plan mode is read-only:
57
-
58
- - Claude: `--permission-mode plan`
59
- - Codex: sandboxed (no `--full-auto`)
60
- - Gemini and Cursor: no auto-approve flags
61
-
62
- Edit mode unlocks writes:
63
-
64
- - Codex: `--full-auto`
65
- - Claude: `acceptEdits`
66
- - Gemini: `--yolo`
67
- - Cursor: `-f`
68
-
69
- Agents are detached from the MCP server process. Close your IDE and reopen it, then reconnect with `Status` and `Tasks`.
70
-
71
- ## Common Questions
36
+ ## What it costs
72
37
 
73
- **"Isn't this overkill for simple tasks?**"Yes. For typo fixes or small changes, one agent is fine. But for implementing a complex feature across 20 files, a single agent drowning in context is slower than a focused swarm working in parallel.
38
+ This server is free and open source.
74
39
 
75
- **"What if agents conflict?**"They don't. The orchestrator (via `/swarm` command) assigns each agent specific files—no overlap. For shared files, it runs agents in sequential waves so there's no collision.
76
-
77
- **"How do I monitor what's happening?**"Use the Swarm `Status` tool to see what each agent is doing: files changed, commands run, last messages. No black box—full visibility into the swarm.
40
+ Each sub-agent uses your own API keys. Spawning 3 Claude agents means 3x your normal Claude API cost. No hidden fees.
78
41
 
79
42
  ## API Reference
80
43
 
81
- ### Tools
82
-
83
- | Tool | Description |
84
- | --- | --- |
85
- | `Spawn` | Start an agent on a task. Returns immediately with agent ID. |
86
- | `Status` | Get agent progress: files changed, commands run, last messages. |
87
- | `Stop` | Stop one agent or all agents in a task. |
88
- | `Tasks` | List all tasks with their agents and activity. |
89
-
90
44
  ### Spawn
91
45
 
92
46
  ```
93
47
  Spawn(task_name, agent_type, prompt, mode?, cwd?, effort?)
94
48
  ```
95
49
 
50
+ Start an agent on a task. Returns immediately with agent ID.
51
+
96
52
  | Parameter | Required | Description |
97
53
  | --- | --- | --- |
98
54
  | `task_name` | Yes | Groups related agents (e.g., "auth-feature") |
99
55
  | `agent_type` | Yes | `claude`, `codex`, `gemini`, or `cursor` |
100
56
  | `prompt` | Yes | The task for the agent |
101
- | `mode` | No | `plan` (read-only, default), `edit` (can write files), or `ralph` (autonomous through RALPH.md) |
102
- | `cwd` | No | Working directory for the agent |
103
- | `effort` | No | `fast`, `default` (implicit), or `detailed` for max-capability models |
57
+ | `mode` | No | `plan` (default), `edit`, or `ralph` |
58
+ | `cwd` | No | Working directory |
59
+ | `effort` | No | `fast`, `default`, or `detailed` |
104
60
 
105
61
  ### Status
106
62
 
107
63
  ```
108
- Status(task_name, filter?)
64
+ Status(task_name, filter?, since?)
109
65
  ```
110
66
 
67
+ Get agent progress: files changed, commands run, last messages.
68
+
111
69
  | Parameter | Required | Description |
112
70
  | --- | --- | --- |
113
71
  | `task_name` | Yes | Task to check |
114
- | `filter` | No | `running` (default), `completed`, `failed`, `stopped`, or `all` |
115
-
116
- Returns files created/modified/read/deleted, bash commands executed, and last messages.
72
+ | `filter` | No | `running` (default), `completed`, `failed`, `stopped`, `all` |
73
+ | `since` | No | ISO timestamp for delta updates |
117
74
 
118
75
  ### Stop
119
76
 
@@ -129,156 +86,98 @@ Stop all agents in a task, or a specific agent by ID.
129
86
  Tasks(limit?)
130
87
  ```
131
88
 
132
- List all tasks sorted by most recent activity. Defaults to 10 tasks when limit is omitted.
133
-
134
- ## Token Optimization
135
-
136
- This server is designed to minimize token usage for the calling agent:
137
-
138
- | Optimization | Benefit |
139
- | --- | --- |
140
- | Status defaults to `filter='running'` | Only shows active agents, not completed history |
141
- | Bash commands truncated to 120 chars | Heredocs collapsed to `cat <<EOF > path` |
142
- | Last 5 messages only | Not full conversation history |
143
- | File operations deduplicated | Sets of created/modified/read/deleted paths |
144
- | Spawn returns immediately | No blocking, poll with Status later |
145
-
146
- ## Supported Agents
147
-
148
- The server auto-discovers installed CLIs at startup:
149
-
150
- | Agent | CLI | Best For |
151
- | --- | --- | --- |
152
- | Claude | `claude` | Best for complex research and open-ended exploration |
153
- | Codex | `codex` | Fast, cheap. Self-contained features |
154
- | Gemini | `gemini` | Complex multi-system features, architectural changes |
155
- | Cursor | `cursor-agent` | Debugging, bug fixes, tracing through codebases |
89
+ List all tasks sorted by most recent activity. Defaults to 10.
156
90
 
157
91
  ## Modes
158
92
 
159
- | Mode | File Access | Auto-loops? | Use Case |
93
+ | Mode | File Access | Auto-loop? | Use Case |
160
94
  | --- | --- | --- | --- |
161
- | `plan` | Read-only | No | Research, exploration, code review |
162
- | `edit` | Read + Write | No | Implementation, refactoring, fixes |
163
- | `ralph` | Full yolo | Yes | Autonomous iteration through RALPH.md tasks |
95
+ | `plan` | Read-only | No | Research, code review |
96
+ | `edit` | Read + Write | No | Implementation, fixes |
97
+ | `ralph` | Full | Yes | Autonomous via RALPH.md |
164
98
 
165
99
  Default is `plan` for safety. Pass `mode='edit'` when agents need to modify files.
166
100
 
167
101
  ### Ralph Mode
168
102
 
169
- Ralph mode spawns ONE agent with full permissions and instructions to autonomously work through all tasks in a `RALPH.md` file.
170
-
171
- **RALPH.md format:**
103
+ Ralph mode spawns one agent with full permissions to autonomously work through tasks in a `RALPH.md` file. The agent reads the file, picks tasks logically, marks them complete, and continues until done.
172
104
 
173
105
  ```markdown
174
106
  ## [ ] Implement user authentication
175
107
 
176
- Add JWT-based auth to the backend API.
108
+ Add JWT-based auth to the backend.
177
109
 
178
110
  ### Updates
179
111
 
180
112
  ---
181
113
 
182
- ## [x] Add rate limiting middleware
114
+ ## [x] Add rate limiting
183
115
 
184
- Protect API endpoints from abuse.
116
+ Protect API endpoints.
185
117
 
186
118
  ### Updates
187
- - Added middleware with sliding window counter
188
- - Completed: All endpoints protected
119
+ - Added sliding window counter
120
+ ```
189
121
 
190
- ---
122
+ ```
123
+ Spawn(mode='ralph', cwd='./my-project', prompt='Build the auth system')
124
+ ```
191
125
 
192
- ## [ ] Write integration tests
126
+ ## What This Server Does NOT Do
193
127
 
194
- Cover auth endpoints.
128
+ | Not This | That's The Orchestrator's Job |
129
+ |----------|-------------------------------|
130
+ | Scheduling | Decides when to spawn which agents |
131
+ | Task assignment | Writes prompts, defines what to do |
132
+ | Conflict resolution | Assigns non-overlapping files to agents |
133
+ | Intelligence | Pure infrastructure - no decision-making |
195
134
 
196
- ### Updates
197
- ```
135
+ The server is a tool. Your orchestrating agent (Claude, etc.) decides how to use it.
198
136
 
199
- **How it works:**
137
+ ## Supported Agents
200
138
 
201
- 1. Create a `RALPH.md` file in your project directory with tasks
202
- 2. Call `Spawn(mode='ralph', cwd='./my-project', prompt='Build the auth system')`
203
- 3. MCP spawns ONE agent with full permissions
204
- 4. Agent reads RALPH.md, understands the system, picks tasks logically
205
- 5. For each task: completes work, marks checkbox `## [x]`, adds update
206
- 6. Continues until all tasks checked (or you stop it with `Stop` tool)
139
+ | Agent | CLI | Best For |
140
+ | --- | --- | --- |
141
+ | Claude | `claude` | Complex research, orchestration |
142
+ | Codex | `codex` | Fast implementation |
143
+ | Gemini | `gemini` | Multi-system changes |
144
+ | Cursor | `cursor-agent` | Debugging, tracing |
145
+ | OpenCode | `opencode` | Provider-agnostic, open source |
207
146
 
208
- **Multiple ralph agents:** You can spawn multiple ralph agents in parallel for different directories or different RALPH.md files. The orchestrator controls this.
147
+ ## Under the Hood
209
148
 
210
- **Safety:**
149
+ Sub-agents run as detached background processes. Output streams to `~/.agents/agents/{id}/stdout.log`.
211
150
 
212
- - Scoped by `cwd` - orchestrator controls blast radius
213
- - RALPH.md must exist before spawn
214
- - Warns if used in home/system directories
215
- - Agent logs stored in `~/.swarmify/agents/{id}/stdout.log` like regular agents
151
+ **Plan mode** is read-only:
152
+ - Claude: `--permission-mode plan`
153
+ - Codex: sandboxed
154
+ - Gemini/Cursor: no auto-approve
216
155
 
217
- ## Effort Levels
156
+ **Edit mode** unlocks writes:
157
+ - Claude: `acceptEdits`
158
+ - Codex: `--full-auto`
159
+ - Gemini: `--yolo`
160
+ - Cursor: `-f`
218
161
 
219
- | Level | Models Used |
220
- | --- | --- |
221
- | `fast` | codex: gpt-5.2-codex, claude: claude-haiku-4-5, gemini: gemini-3-flash, cursor: composer-1 |
222
- | `default` | codex: gpt-5.2-codex, claude: claude-sonnet-4-5, gemini: gemini-3-flash, cursor: composer-1 |
223
- | `detailed` | codex: gpt-5.1-codex-max, claude: claude-opus-4-5, gemini: gemini-3-pro, cursor: composer-1 |
224
-
225
- ## Config
226
-
227
- Config lives at `~/.swarmify/config.json`.
228
-
229
- Example with per-agent swarm selection and effort model overrides:
230
-
231
- ```json
232
- {
233
- "agents": {
234
- "claude": {
235
- "swarm": true,
236
- "effort": {
237
- "models": {
238
- "fast": "claude-haiku-4-5-20251001",
239
- "default": "claude-sonnet-4-5",
240
- "detailed": "claude-opus-4-5"
241
- }
242
- }
243
- },
244
- "codex": { "swarm": true },
245
- "gemini": { "swarm": true },
246
- "cursor": { "swarm": false }
247
- }
248
- }
249
- ```
162
+ ## Configuration
250
163
 
251
- Shorthand for a single effort level override:
252
-
253
- ```json
254
- {
255
- "agents": {
256
- "claude": {
257
- "swarm": true,
258
- "effort": {
259
- "level": "fast",
260
- "model": "claude-haiku-4-5-20251001"
261
- }
262
- }
263
- }
264
- }
265
- ```
164
+ Config lives at `~/.agents/config.json`. See [AGENTS.md](./AGENTS.md) for full config reference.
266
165
 
267
166
  ## Environment Variables
268
167
 
269
168
  | Variable | Description |
270
169
  | --- | --- |
271
- | `AGENTS_MCP_DEFAULT_MODE` | Set default mode (`plan` or `edit`) |
272
- | `AGENTS_MCP_RALPH_FILE` | Task file name for ralph mode (default: `RALPH.md`) |
273
- | `AGENTS_MCP_DISABLE_RALPH` | Set to `true` or `1` to disable ralph mode |
170
+ | `AGENTS_MCP_DEFAULT_MODE` | Default mode (`plan` or `edit`) |
171
+ | `AGENTS_MCP_RALPH_FILE` | Task file name (default: `RALPH.md`) |
172
+ | `AGENTS_MCP_DISABLE_RALPH` | Set `true` to disable ralph mode |
274
173
 
275
- ## Storage
174
+ ## Works great with the extension
276
175
 
277
- Data and config are stored under `~/.swarmify/`. Requires Node.js >= 18.17.
176
+ This MCP server works standalone with any MCP client. For the best experience - full-screen agent terminals, session persistence, fast navigation - install the [Agents extension](https://marketplace.visualstudio.com/items?itemName=swarmify.swarm-ext) for VS Code/Cursor.
278
177
 
279
- ## Changelog
178
+ ## Storage
280
179
 
281
- See `CHANGELOG.txt` for notable updates.
180
+ Data at `~/.agents/`. Requires Node.js >= 18.17.
282
181
 
283
182
  ## License
284
183
 
package/dist/agents.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type ModelOverrides } from './persistence.js';
1
+ import { type AgentConfig } from './persistence.js';
2
2
  import { AgentType } from './parsers.js';
3
3
  /**
4
4
  * Compute the Lowest Common Ancestor (LCA) of multiple file paths.
@@ -16,8 +16,8 @@ export type { AgentType } from './parsers.js';
16
16
  export declare const AGENT_COMMANDS: Record<AgentType, string[]>;
17
17
  export type EffortLevel = 'fast' | 'default' | 'detailed';
18
18
  export type EffortModelMap = Record<EffortLevel, Record<AgentType, string>>;
19
+ export declare function resolveEffortModelMap(baseOrAgentConfigs: EffortModelMap | Record<AgentType, AgentConfig>, overrides?: Partial<Record<AgentType, Partial<Record<EffortLevel, string>>>>): EffortModelMap;
19
20
  export declare const EFFORT_MODEL_MAP: EffortModelMap;
20
- export declare function resolveEffortModelMap(base: EffortModelMap, overrides: ModelOverrides | null | undefined): EffortModelMap;
21
21
  declare const VALID_MODES: readonly ["plan", "edit", "ralph"];
22
22
  type Mode = typeof VALID_MODES[number];
23
23
  export declare function resolveMode(requestedMode: string | null | undefined, defaultMode?: Mode): Mode;
@@ -73,11 +73,13 @@ export declare class AgentManager {
73
73
  private cleanupAgeDays;
74
74
  private defaultMode;
75
75
  private effortModelMap;
76
+ private agentConfigs;
77
+ private constructorAgentConfigs;
76
78
  private constructorAgentsDir;
77
- constructor(maxAgents?: number, maxConcurrent?: number, agentsDir?: string | null, defaultMode?: Mode | null, filterByCwd?: string | null, cleanupAgeDays?: number, modelOverrides?: ModelOverrides | null);
79
+ constructor(maxAgents?: number, maxConcurrent?: number, agentsDir?: string | null, defaultMode?: Mode | null, filterByCwd?: string | null, cleanupAgeDays?: number, agentConfigs?: Record<AgentType, AgentConfig> | null);
78
80
  private initialize;
79
81
  getDefaultMode(): Mode;
80
- setModelOverrides(overrides: ModelOverrides | null | undefined): void;
82
+ setModelOverrides(agentConfigs: Record<AgentType, AgentConfig>): void;
81
83
  private loadExistingAgents;
82
84
  spawn(taskName: string, agentType: AgentType, prompt: string, cwd?: string | null, mode?: Mode | null, effort?: EffortLevel, parentSessionId?: string | null, workspaceDir?: string | null): Promise<AgentProcess>;
83
85
  private buildCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
package/dist/agents.js CHANGED
@@ -55,57 +55,121 @@ export const AGENT_COMMANDS = {
55
55
  cursor: ['cursor-agent', '-p', '--output-format', 'stream-json', '{prompt}'],
56
56
  gemini: ['gemini', '{prompt}', '--output-format', 'stream-json'],
57
57
  claude: ['claude', '-p', '--verbose', '{prompt}', '--output-format', 'stream-json', '--permission-mode', 'plan'],
58
+ trae: ['trae-cli', 'run', '{prompt}'],
59
+ opencode: ['opencode', 'run', '--format', 'json', '{prompt}'],
58
60
  };
59
- // Model mappings by effort level per agent type
60
- // - fast: smallest, cheapest models for quick tasks
61
- // - default: balanced models (implicit when effort is omitted)
62
- // - detailed: max-capability models
63
- export const EFFORT_MODEL_MAP = {
64
- fast: {
65
- codex: 'gpt-5.2-codex',
66
- gemini: 'gemini-3-flash-preview',
67
- claude: 'claude-haiku-4-5-20251001',
68
- cursor: 'composer-1',
69
- },
70
- default: {
71
- codex: 'gpt-5.2-codex',
72
- gemini: 'gemini-3-flash-preview',
73
- claude: 'claude-sonnet-4-5',
74
- cursor: 'composer-1',
75
- },
76
- detailed: {
77
- codex: 'gpt-5.1-codex-max',
78
- gemini: 'gemini-3-pro-preview',
79
- claude: 'claude-opus-4-5',
80
- cursor: 'composer-1',
81
- },
82
- };
83
- export function resolveEffortModelMap(base, overrides) {
84
- const resolved = {
85
- fast: { ...base.fast },
86
- default: { ...base.default },
87
- detailed: { ...base.detailed },
88
- };
89
- if (!overrides)
90
- return resolved;
91
- for (const [agentType, effortOverrides] of Object.entries(overrides)) {
92
- if (!effortOverrides)
93
- continue;
94
- if (!['codex', 'gemini', 'cursor', 'claude'].includes(agentType))
95
- continue;
96
- const typedAgent = agentType;
97
- for (const level of ['fast', 'default', 'detailed']) {
98
- const model = effortOverrides[level];
99
- if (typeof model === 'string') {
100
- const trimmed = model.trim();
101
- if (trimmed) {
102
- resolved[level][typedAgent] = trimmed;
61
+ // Build effort model map from agent configs
62
+ export function resolveEffortModelMap(baseOrAgentConfigs, overrides) {
63
+ // Check if first arg is base EffortModelMap (old API) or agent configs (new API)
64
+ const hasBaseOverrides = arguments.length > 1;
65
+ if (hasBaseOverrides && overrides) {
66
+ // Old API: resolveEffortModelMap(base, overrides)
67
+ const base = baseOrAgentConfigs;
68
+ const resolved = {
69
+ fast: { ...base.fast },
70
+ default: { ...base.default },
71
+ detailed: { ...base.detailed }
72
+ };
73
+ for (const [agentType, effortOverrides] of Object.entries(overrides)) {
74
+ if (!effortOverrides)
75
+ continue;
76
+ const typedAgent = agentType;
77
+ for (const level of ['fast', 'default', 'detailed']) {
78
+ const model = effortOverrides[level];
79
+ if (typeof model === 'string') {
80
+ const trimmed = model.trim();
81
+ if (trimmed) {
82
+ resolved[level][typedAgent] = trimmed;
83
+ }
103
84
  }
104
85
  }
105
86
  }
87
+ return resolved;
88
+ }
89
+ else {
90
+ // New API: resolveEffortModelMap(agentConfigs)
91
+ const agentConfigs = baseOrAgentConfigs;
92
+ const resolved = {
93
+ fast: {},
94
+ default: {},
95
+ detailed: {}
96
+ };
97
+ for (const [agentType, agentConfig] of Object.entries(agentConfigs)) {
98
+ resolved.fast[agentType] = agentConfig.models.fast;
99
+ resolved.default[agentType] = agentConfig.models.default;
100
+ resolved.detailed[agentType] = agentConfig.models.detailed;
101
+ }
102
+ return resolved;
106
103
  }
107
- return resolved;
108
104
  }
105
+ // Load default agent configs from persistence
106
+ function loadDefaultAgentConfigs() {
107
+ // Use hardcoded defaults for backward compatibility with synchronous initialization
108
+ return {
109
+ claude: {
110
+ command: 'claude -p \'{prompt}\' --output-format stream-json --json',
111
+ enabled: true,
112
+ models: {
113
+ fast: 'claude-haiku-4-5-20251001',
114
+ default: 'claude-sonnet-4-5',
115
+ detailed: 'claude-opus-4-5'
116
+ },
117
+ provider: 'anthropic'
118
+ },
119
+ codex: {
120
+ command: 'codex exec --sandbox workspace-write \'{prompt}\' --json',
121
+ enabled: true,
122
+ models: {
123
+ fast: 'gpt-4o-mini',
124
+ default: 'gpt-5.2-codex',
125
+ detailed: 'gpt-5.1-codex-max'
126
+ },
127
+ provider: 'openai'
128
+ },
129
+ gemini: {
130
+ command: 'gemini \'{prompt}\' --output-format stream-json',
131
+ enabled: true,
132
+ models: {
133
+ fast: 'gemini-3-flash-preview',
134
+ default: 'gemini-3-flash-preview',
135
+ detailed: 'gemini-3-pro-preview'
136
+ },
137
+ provider: 'google'
138
+ },
139
+ cursor: {
140
+ command: 'cursor-agent -p --output-format stream-json \'{prompt}\'',
141
+ enabled: false,
142
+ models: {
143
+ fast: 'composer-1',
144
+ default: 'composer-1',
145
+ detailed: 'composer-1'
146
+ },
147
+ provider: 'custom'
148
+ },
149
+ opencode: {
150
+ command: 'opencode run --format json \'{prompt}\'',
151
+ enabled: false,
152
+ models: {
153
+ fast: 'zai-coding-plan/glm-4.7-flash',
154
+ default: 'zai-coding-plan/glm-4.7',
155
+ detailed: 'zai-coding-plan/glm-4.7'
156
+ },
157
+ provider: 'custom'
158
+ },
159
+ trae: {
160
+ command: 'trae-cli run \'{prompt}\'',
161
+ enabled: false,
162
+ models: {
163
+ fast: 'gpt-4o-mini',
164
+ default: 'gpt-4o',
165
+ detailed: 'claude-sonnet-4-20250514'
166
+ },
167
+ provider: 'custom'
168
+ }
169
+ };
170
+ }
171
+ // Default effort model map (for backward compatibility with tests)
172
+ export const EFFORT_MODEL_MAP = resolveEffortModelMap(loadDefaultAgentConfigs());
109
173
  // Suffix appended to all prompts to ensure agents provide a summary
110
174
  const PROMPT_SUFFIX = `
111
175
 
@@ -479,9 +543,11 @@ export class AgentManager {
479
543
  filterByCwd;
480
544
  cleanupAgeDays;
481
545
  defaultMode;
482
- effortModelMap = EFFORT_MODEL_MAP;
546
+ effortModelMap;
547
+ agentConfigs;
548
+ constructorAgentConfigs = null;
483
549
  constructorAgentsDir = null;
484
- constructor(maxAgents = 50, maxConcurrent = 10, agentsDir = null, defaultMode = null, filterByCwd = null, cleanupAgeDays = 7, modelOverrides = null) {
550
+ constructor(maxAgents = 50, maxConcurrent = 10, agentsDir = null, defaultMode = null, filterByCwd = null, cleanupAgeDays = 7, agentConfigs = null) {
485
551
  this.maxAgents = maxAgents;
486
552
  this.maxConcurrent = maxConcurrent;
487
553
  this.constructorAgentsDir = agentsDir;
@@ -492,19 +558,28 @@ export class AgentManager {
492
558
  throw new Error(`Invalid default_mode '${defaultMode}'. Use 'plan' or 'edit'.`);
493
559
  }
494
560
  this.defaultMode = resolvedDefaultMode;
495
- this.effortModelMap = resolveEffortModelMap(EFFORT_MODEL_MAP, modelOverrides);
561
+ this.constructorAgentConfigs = agentConfigs;
496
562
  this.initialize();
497
563
  }
498
564
  async initialize() {
499
565
  this.agentsDir = this.constructorAgentsDir || await getAgentsDir();
500
566
  await fs.mkdir(this.agentsDir, { recursive: true });
567
+ // Set defaults if no config provided
568
+ if (!this.constructorAgentConfigs) {
569
+ this.agentConfigs = loadDefaultAgentConfigs();
570
+ this.effortModelMap = resolveEffortModelMap(this.agentConfigs);
571
+ }
572
+ else {
573
+ this.effortModelMap = resolveEffortModelMap(this.constructorAgentConfigs);
574
+ }
501
575
  await this.loadExistingAgents();
502
576
  }
503
577
  getDefaultMode() {
504
578
  return this.defaultMode;
505
579
  }
506
- setModelOverrides(overrides) {
507
- this.effortModelMap = resolveEffortModelMap(EFFORT_MODEL_MAP, overrides);
580
+ setModelOverrides(agentConfigs) {
581
+ this.agentConfigs = agentConfigs;
582
+ this.effortModelMap = resolveEffortModelMap(agentConfigs);
508
583
  }
509
584
  async loadExistingAgents() {
510
585
  try {
@@ -652,6 +727,15 @@ export class AgentManager {
652
727
  else if (agentType === 'gemini' || agentType === 'claude') {
653
728
  cmd.push('--model', model);
654
729
  }
730
+ else if (agentType === 'opencode') {
731
+ const opencodeAgent = mode === 'edit' || mode === 'ralph' ? 'build' : 'plan';
732
+ // Insert --agent flag after the prompt
733
+ const promptIndex = cmd.indexOf(fullPrompt);
734
+ if (promptIndex !== -1) {
735
+ cmd.splice(promptIndex + 1, 0, '--agent', opencodeAgent);
736
+ }
737
+ cmd.push('--model', model);
738
+ }
655
739
  if (mode === 'ralph') {
656
740
  cmd = this.applyRalphMode(agentType, cmd);
657
741
  }