@kkweon/agent-orchestrator-mcp 1.4.0 → 1.4.1

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
@@ -8,10 +8,114 @@ Designed for [OpenClaw](https://github.com/openclaw/openclaw) and Gemini CLI env
8
8
 
9
9
  - **Tmux-based Isolation**: Each sub-agent runs in its own dedicated tmux pane.
10
10
  - **Session Isolation**: Complete separation of workspaces and event logs per execution session.
11
- - **Bi-directional Communication**: Master agent can send tasks; Sub-agents emit events (logs, results).
11
+ - **Actor Model Communication**: Decentralized, asynchronous messaging using per-agent and master inboxes.
12
12
  - **Auto-Inception**: Sub-agents are automatically prompted with their role and protocol upon startup.
13
13
  - **Native Gemini CLI**: Sub-agents run actual `gemini` CLI instances with configurable models.
14
14
 
15
+ ## Architecture
16
+
17
+ ### Sessions
18
+
19
+ Each time a user runs `gemini`, a new **session** is created with a unique ID. Sessions are fully isolated — agents in Session A cannot see or send messages to agents in Session B. A user can run as many sessions as they like in parallel.
20
+
21
+ ```mermaid
22
+ graph TD
23
+ User["User"]
24
+
25
+ subgraph SessionA["Session A (.agents/sessions/uuid-a/)"]
26
+ MA["Master Agent<br/>(Gemini CLI)"]
27
+ MA --> SA1["Sub-Agent 1"]
28
+ MA --> SA2["Sub-Agent 2"]
29
+ MA --> SAN["Sub-Agent N"]
30
+ end
31
+
32
+ subgraph SessionB["Session B (.agents/sessions/uuid-b/)"]
33
+ MB["Master Agent<br/>(Gemini CLI)"]
34
+ MB --> SB1["Sub-Agent 1"]
35
+ MB --> SB2["Sub-Agent 2"]
36
+ end
37
+
38
+ User -->|"runs"| MA
39
+ User -->|"runs separately"| MB
40
+
41
+ SessionA -. "fully isolated" .- SessionB
42
+ ```
43
+
44
+ ### Inside a Session
45
+
46
+ Within a session the master agent spawns sub-agents into tmux panes. All communication is routed through append-only JSONL mailbox files. Every component — the master, each sub-agent, and the MCP server itself — can read and write without holding any in-process state.
47
+
48
+ ```mermaid
49
+ graph TD
50
+ Master["Master Agent<br/>(Gemini CLI + MCP)"]
51
+
52
+ subgraph Tmux["tmux session: openclaw-agents"]
53
+ P1["Pane — Sub-Agent 1<br/>(Gemini CLI)"]
54
+ P2["Pane — Sub-Agent 2<br/>(Gemini CLI)"]
55
+ PN["Pane — Sub-Agent N<br/>(Gemini CLI)"]
56
+ end
57
+
58
+ subgraph FS[".agents/sessions/&lt;session_id&gt;/"]
59
+ MI["master_inbox.jsonl<br/>(messages for Master)"]
60
+ D1["agents/agent-1/<br/>inbox.jsonl"]
61
+ D2["agents/agent-2/<br/>inbox.jsonl"]
62
+ DN["agents/agent-N/<br/>inbox.jsonl"]
63
+ end
64
+
65
+ Master -->|"agent_create → spawns"| P1
66
+ Master -->|"agent_create → spawns"| P2
67
+ Master -->|"agent_create → spawns"| PN
68
+
69
+ Master -->|"send_message"| D1
70
+ Master -->|"send_message"| D2
71
+
72
+ P1 <-->|"wait_for_command"| D1
73
+ P2 <-->|"wait_for_command"| D2
74
+ PN <-->|"wait_for_command"| DN
75
+
76
+ P1 -->|"send_message(target=master)"| MI
77
+ P2 -->|"send_message(target=master)"| MI
78
+ PN -->|"send_message(target=master)"| MI
79
+
80
+ Master -->|"read_inbox"| MI
81
+ ```
82
+
83
+ ### Communication Patterns
84
+
85
+ All communication is file-based and append-only. There are four routing modes, shown in order below.
86
+
87
+ ```mermaid
88
+ sequenceDiagram
89
+ participant Master
90
+ participant MI as master_inbox.jsonl
91
+ participant Inbox1 as agent-1/inbox.jsonl
92
+ participant Agent1 as Sub-Agent 1
93
+ participant Inbox2 as agent-2/inbox.jsonl
94
+ participant Agent2 as Sub-Agent 2
95
+
96
+ Note over Master,Agent2: 1 — Master sends a task to an agent
97
+ Master->>Inbox1: send_message(payload, target="agent-1")
98
+ Agent1->>Inbox1: wait_for_command (polls every 500 ms)
99
+ Inbox1-->>Agent1: task + next_cursor
100
+
101
+ Note over Master,Agent2: 2 — Agent reports result to master
102
+ Agent1->>Agent1: execute task
103
+ Agent1->>MI: send_message(result, target="master")
104
+ Master->>MI: read_inbox(cursor)
105
+ MI-->>Master: messages
106
+
107
+ Note over Master,Agent2: 3 — Agent sends a targeted peer message
108
+ Agent1->>Inbox2: send_message(data, target="agent-2")
109
+ Agent2->>Inbox2: wait_for_command (polls)
110
+ Inbox2-->>Agent2: event from Agent 1
111
+
112
+ Note over Master,Agent2: 4 — Agent broadcasts to all peers
113
+ Agent2->>Inbox1: send_message(data, target="all")
114
+ Agent2->>MI: send_message(data, target="all")
115
+ Agent1->>Inbox1: wait_for_command (polls)
116
+ Inbox1-->>Agent1: broadcast event
117
+ ```
118
+
15
119
  ## Prerequisites
16
120
 
17
121
  Before running this server, ensure you have the following installed on your system:
@@ -63,7 +167,8 @@ Use these tools to manage your workforce.
63
167
  |-----------|-------------|------------|
64
168
  | **`agent_create`** | Spawns a new sub-agent in a split tmux pane. It automatically injects the runner loop and inception prompt. | `name` (string): Human-readable name<br>`role` (string): Specific role (e.g., "coder", "reviewer")<br>`model` (string, optional): Specific Gemini model to use |
65
169
  | **`agent_list`** | Lists all active agents in the current session. | *(None)* |
66
- | **`task_enqueue`** | Sends a task payload to a specific agent's inbox. | `agent_id` (string): Target agent's UUID<br>`task` (object): Arbitrary JSON payload (instructions) |
170
+ | **`send_message`** | Sends a message to one or more agents. Use target="all" to broadcast. | `agent_id` (string): Sender's agent ID (use 'master' if orchestrator is sending)<br>`message` (object): Arbitrary JSON payload<br>`target` (string/array): 'all', 'master', or agent UUID(s) |
171
+ | **`read_inbox`** | Non-blocking read of messages from an inbox. Use agent_id='master' for orchestrator. | `agent_id` (string): Target inbox ('master' or agent UUID)<br>`cursor` (number, optional): Line index to resume from |
67
172
  | **`agent_delete`** | Terminates a sub-agent and kills its tmux pane. | `agent_id` (string): Target agent's UUID |
68
173
 
69
174
  ### Internal Protocol Tools (For Sub-Agents)
@@ -71,7 +176,7 @@ Use these tools to manage your workforce.
71
176
  *These tools are used automatically by the sub-agents to communicate with the orchestrator. You rarely need to call them manually.*
72
177
 
73
178
  - **`wait_for_command`**: Long-polling endpoint for sub-agents to fetch new tasks from their `inbox`.
74
- - **`emit_event`**: Endpoint for sub-agents to report logs, progress, and results (`task_completed`) to the `outbox` and session broadcast.
179
+ - **`send_message`**: Endpoint for sub-agents to report logs, progress, and results (with `target="master"`) or communicate with peers.
75
180
 
76
181
  ## Development
77
182
 
@@ -88,4 +193,4 @@ npm test
88
193
 
89
194
  ## License
90
195
 
91
- MIT
196
+ MIT
@@ -1,11 +1,14 @@
1
+ /**
2
+ * Shell-quote a string for safe interpolation into shell command strings.
3
+ * Wraps in single quotes and escapes any embedded single quotes.
4
+ */
5
+ function shellQuote(s) {
6
+ return `'${s.replace(/'/g, "'\\''")}'`;
7
+ }
1
8
  import * as tmux from "./tmux.js";
2
9
  import { randomUUID } from "crypto";
3
10
  import fs from "fs/promises";
4
11
  import path from "path";
5
- import { fileURLToPath } from "url";
6
- // Get directory of current module
7
- const __filename = fileURLToPath(import.meta.url);
8
- const __dirname = path.dirname(__filename);
9
12
  // Helper to get workspace root
10
13
  const AGENTS_DIR = ".agents";
11
14
  const DEFAULT_POLL_TIMEOUT_MS = parseInt(process.env.AGENT_POLL_TIMEOUT_MS || "1800000", 10) || 1800000;
@@ -23,18 +26,18 @@ export class AgentManager {
23
26
  getAgentDir(agentId) {
24
27
  return path.join(this.getSessionDir(), "agents", agentId);
25
28
  }
29
+ getMasterInboxPath() {
30
+ return path.join(this.getSessionDir(), "master_inbox.jsonl");
31
+ }
26
32
  async ensureSessionDir() {
27
33
  await fs.mkdir(path.join(this.getSessionDir(), "agents"), { recursive: true });
28
34
  }
35
+ async ensureMasterInboxDir() {
36
+ await fs.mkdir(this.getSessionDir(), { recursive: true });
37
+ }
29
38
  async createAgent(params) {
30
- await this.ensureSessionDir();
31
39
  const id = randomUUID();
32
40
  const agentDir = this.getAgentDir(id);
33
- await fs.mkdir(agentDir, { recursive: true });
34
- await fs.mkdir(path.join(agentDir, "artifacts"), { recursive: true });
35
- // Initialize files
36
- await fs.writeFile(path.join(agentDir, "inbox.jsonl"), "");
37
- await fs.writeFile(path.join(agentDir, "outbox.jsonl"), "");
38
41
  let context = await tmux.getCurrentTmuxContext();
39
42
  if (!context) {
40
43
  // Not inside tmux? Check if our dedicated session exists.
@@ -59,15 +62,16 @@ export class AgentManager {
59
62
  role: params.role,
60
63
  tmuxPaneId: `${pane.sessionId}:${pane.windowId}:${pane.paneId}`,
61
64
  status: "created",
62
- queue: [],
63
- lastEventSeq: 0,
64
65
  createdAt: Date.now(),
65
66
  metadata: {},
66
67
  };
67
- // Re-ensure the agent directory exists before writing meta.json.
68
- // The tmux session/pane creation above can take >200ms, during which CI
69
- // cleanup from other test suites may have removed the directory tree.
68
+ // Create the agent directory tree and initialize files.
69
+ // Done after tmux pane creation to avoid race conditions in CI where
70
+ // concurrent test cleanups might delete directories during the tmux spawn delay.
71
+ await this.ensureSessionDir();
70
72
  await fs.mkdir(agentDir, { recursive: true });
73
+ await fs.mkdir(path.join(agentDir, "artifacts"), { recursive: true });
74
+ await fs.writeFile(path.join(agentDir, "inbox.jsonl"), "");
71
75
  await fs.writeFile(path.join(agentDir, "meta.json"), JSON.stringify(agent, null, 2));
72
76
  // 1. Prepare Environment
73
77
  // We pass AGENT_ID and AGENT_SESSION_ID inline with the command execution
@@ -78,7 +82,7 @@ export class AgentManager {
78
82
  const executable = params.executablePath || "gemini";
79
83
  // Construct args
80
84
  let args = params.args || [];
81
- const argsStr = args.join(" ");
85
+ const argsStr = args.map(shellQuote).join(" ");
82
86
  let cmd = "";
83
87
  if (params.executablePath) {
84
88
  // If overriding executable (e.g. for testing), do not append model/args/prompt
@@ -95,12 +99,17 @@ Your goal is to autonomously process tasks from the orchestrator.
95
99
  PROTOCOL:
96
100
  1. Initialize a variable 'current_cursor' to 0.
97
101
  2. Loop indefinitely. CRITICAL: Never exit the loop. Never stop polling.
98
- 3. Inside the loop, call the tool 'wait_for_command' with agent_id="${id}", cursor=current_cursor, and timeout_ms=${DEFAULT_POLL_TIMEOUT_MS}.
99
- 4. If 'wait_for_command' returns a task or command:
102
+ 3. Inside the loop, call the tool 'wait_for_command' with agent_id="${id}", cursor=current_cursor, timeout_ms=${DEFAULT_POLL_TIMEOUT_MS}.
103
+ NOTE: 'agent_id' here is always YOUR agent ID ("${id}"). Do not change it.
104
+ 4. If 'wait_for_command' returns a command (status="command"):
100
105
  a. Update your 'current_cursor' to the 'next_cursor' value returned.
101
- b. Execute the task using your capabilities.
102
- c. After execution, call the tool 'emit_event' with agent_id="${id}" and type="task_completed" (include the result). Optionally set target="master" to reply only to the orchestrator, target=<agent_id> to address a specific peer, or omit target to broadcast to all.
103
- 5. If it times out or fails, just retry the loop with the same 'current_cursor'. CRITICAL: Always keep looping — never terminate.
106
+ b. Execute the task described in the command using your capabilities.
107
+ c. After execution, call the tool 'send_message' with:
108
+ agent_id="${id}" (always your own ID this identifies the sender)
109
+ message={ type: "task_completed", result: <your result> }
110
+ target="master"
111
+ to report back to the orchestrator.
112
+ 5. If it times out (status="timeout"), retry the loop with the same 'current_cursor'. CRITICAL: Always keep looping — never terminate.
104
113
 
105
114
  Start your loop now.
106
115
  `.trim();
@@ -108,10 +117,23 @@ Start your loop now.
108
117
  const inceptionPath = path.join(agentDir, "inception.txt");
109
118
  await fs.writeFile(inceptionPath, inceptionPrompt);
110
119
  // Pass prompt as an argument using cat
111
- cmd = `${executable} -m ${model} ${argsStr} "$(cat '${inceptionPath}')"`;
120
+ const safeInceptionPath = inceptionPath.replace(/'/g, "'\\''");
121
+ cmd = `${shellQuote(executable)} -m ${shellQuote(model)} ${argsStr} "$(cat '${safeInceptionPath}')"`;
122
+ }
123
+ // Build optional env prefix from params.env (values are shell-quoted; keys must be valid identifiers)
124
+ const VALID_ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;
125
+ if (params.env) {
126
+ for (const key of Object.keys(params.env)) {
127
+ if (!VALID_ENV_KEY.test(key)) {
128
+ throw new Error(`Invalid env key "${key}": must match [A-Za-z_][A-Za-z0-9_]*`);
129
+ }
130
+ }
112
131
  }
132
+ const envPrefix = params.env
133
+ ? Object.entries(params.env).map(([k, v]) => `${k}=${shellQuote(v)}`).join(" ") + " "
134
+ : "";
113
135
  // We assume 'gemini' is in the PATH.
114
- const fullCmd = `AGENT_ID=${id} AGENT_SESSION_ID=${this.sessionId} ${cmd}`;
136
+ const fullCmd = `${envPrefix}AGENT_ID=${id} AGENT_SESSION_ID=${this.sessionId} ${cmd}`;
115
137
  await tmux.sendKeys(pane.paneId, fullCmd);
116
138
  return agent;
117
139
  }
@@ -151,113 +173,111 @@ Start your loop now.
151
173
  await tmux.killPane(paneId);
152
174
  }
153
175
  catch (e) {
154
- console.warn(`Could not delete agent ${id} cleanly (meta.json missing or corrupted).`);
176
+ console.warn(`Could not kill tmux pane for agent ${id} (meta.json missing or corrupted).`);
155
177
  }
178
+ // Always clean up the agent directory so the agent does not re-appear in listAgents()
179
+ await fs.rm(agentDir, { recursive: true, force: true });
156
180
  }
157
- async enqueueTask(agentId, taskPayload) {
158
- const agentDir = this.getAgentDir(agentId);
159
- const taskId = randomUUID();
160
- const taskEvent = {
161
- type: "task",
162
- taskId,
163
- payload: taskPayload,
164
- timestamp: Date.now()
181
+ async sendMessage(fromId, message, target) {
182
+ const entry = {
183
+ ...message,
184
+ from: fromId,
185
+ timestamp: Date.now(),
165
186
  };
166
- try {
167
- await fs.access(agentDir);
168
- }
169
- catch {
170
- throw new Error(`Agent ${agentId} not found in session ${this.sessionId}`);
187
+ const line = JSON.stringify(entry) + "\n";
188
+ if (target === "master") {
189
+ await this.ensureMasterInboxDir();
190
+ await fs.appendFile(this.getMasterInboxPath(), line);
191
+ return;
171
192
  }
172
- await fs.appendFile(path.join(agentDir, "inbox.jsonl"), JSON.stringify(taskEvent) + "\n");
173
- return taskId;
174
- }
175
- async waitForCommand(agentId, cursor = 0, timeoutMs = DEFAULT_POLL_TIMEOUT_MS) {
176
- const agentDir = this.getAgentDir(agentId);
177
- const inboxPath = path.join(agentDir, "inbox.jsonl");
178
- const startTime = Date.now();
179
- while (Date.now() - startTime < timeoutMs) {
180
- try {
181
- const content = await fs.readFile(inboxPath, "utf-8");
182
- const lines = content.split("\n").filter(line => line.trim() !== "");
183
- if (lines.length > cursor) {
184
- const line = lines[cursor];
185
- const command = JSON.parse(line);
186
- return {
187
- status: "command",
188
- command,
189
- next_cursor: cursor + 1
190
- };
191
- }
192
- }
193
- catch (e) {
194
- // file might not exist yet
193
+ if (target === "all") {
194
+ // Fan out to master inbox (unless sender is master) and all other agents' inboxes
195
+ if (fromId !== "master") {
196
+ await this.ensureMasterInboxDir();
197
+ await fs.appendFile(this.getMasterInboxPath(), line);
195
198
  }
196
- await new Promise(r => setTimeout(r, 500));
199
+ const agents = await this.listAgents();
200
+ await Promise.all(agents
201
+ .filter(agent => agent.id !== fromId) // do not deliver to the sender's own inbox
202
+ .map(agent => fs.appendFile(path.join(this.getAgentDir(agent.id), "inbox.jsonl"), line).catch((e) => {
203
+ console.error(`Failed to deliver message to agent ${agent.id} inbox:`, e);
204
+ })));
205
+ return;
197
206
  }
198
- return { status: "timeout", next_cursor: cursor };
207
+ // target is a specific agent ID or array of agent IDs
208
+ const targetIds = Array.isArray(target) ? target : [target];
209
+ await Promise.all(targetIds.map(tid => fs.appendFile(path.join(this.getAgentDir(tid), "inbox.jsonl"), line).catch((e) => {
210
+ console.error(`Failed to deliver message to agent ${tid} inbox:`, e);
211
+ })));
199
212
  }
200
- async readEvents(agentId, cursor = 0, limit) {
201
- const filePath = agentId
202
- ? path.join(this.getAgentDir(agentId), "outbox.jsonl")
203
- : path.join(this.getSessionDir(), "broadcast.jsonl");
213
+ async readInbox(agentId, cursor = 0, limit) {
214
+ const filePath = agentId === "master"
215
+ ? this.getMasterInboxPath()
216
+ : path.join(this.getAgentDir(agentId), "inbox.jsonl");
204
217
  let content;
205
218
  try {
206
219
  content = await fs.readFile(filePath, "utf-8");
207
220
  }
208
- catch {
209
- return { events: [], next_cursor: cursor };
221
+ catch (e) {
222
+ const code = e.code;
223
+ if (code !== "ENOENT") {
224
+ console.error(`readInbox: unexpected error reading ${filePath}:`, e);
225
+ }
226
+ return { messages: [], next_cursor: cursor };
210
227
  }
211
228
  const lines = content.split("\n").filter(line => line.trim() !== "");
212
229
  if (cursor >= lines.length) {
213
- return { events: [], next_cursor: cursor };
230
+ return { messages: [], next_cursor: cursor };
214
231
  }
215
232
  const slice = limit !== undefined ? lines.slice(cursor, cursor + limit) : lines.slice(cursor);
216
- const events = slice.map(line => JSON.parse(line));
217
- return { events, next_cursor: cursor + events.length };
233
+ const messages = [];
234
+ for (const rawLine of slice) {
235
+ try {
236
+ messages.push(JSON.parse(rawLine));
237
+ }
238
+ catch {
239
+ console.error("readInbox: skipping malformed JSONL line:", rawLine);
240
+ }
241
+ }
242
+ // next_cursor counts raw lines consumed (including any malformed ones that were skipped)
243
+ return { messages, next_cursor: cursor + slice.length };
218
244
  }
219
- async emitEvent(agentId, event, target) {
245
+ async waitForCommand(agentId, cursor = 0, timeoutMs = DEFAULT_POLL_TIMEOUT_MS) {
220
246
  const agentDir = this.getAgentDir(agentId);
221
- const outboxPath = path.join(agentDir, "outbox.jsonl");
222
- const broadcastPath = path.join(this.getSessionDir(), "broadcast.jsonl");
223
- const entry = {
224
- ...event,
225
- agentId,
226
- timestamp: Date.now(),
227
- ...(target !== undefined ? { target } : {})
228
- };
229
- const line = JSON.stringify(entry) + "\n";
230
- // Always write to sender's outbox and session broadcast
231
- await fs.appendFile(outboxPath, line);
232
- await fs.appendFile(broadcastPath, line);
233
- // Routing: master-only → no peer inbox writes
234
- if (target === "master") {
235
- return;
236
- }
237
- try {
238
- // Targeted delivery to specific agent(s)
239
- if (target !== undefined && target !== "all") {
240
- const targetIds = Array.isArray(target) ? target : [target];
241
- for (const tid of targetIds) {
242
- if (tid !== agentId) {
243
- const targetInboxPath = path.join(this.getAgentDir(tid), "inbox.jsonl");
244
- await fs.appendFile(targetInboxPath, line).catch(() => { });
247
+ const inboxPath = path.join(agentDir, "inbox.jsonl");
248
+ const startTime = Date.now();
249
+ while (Date.now() - startTime < timeoutMs) {
250
+ try {
251
+ const content = await fs.readFile(inboxPath, "utf-8");
252
+ const lines = content.split("\n").filter(line => line.trim() !== "");
253
+ if (lines.length > cursor) {
254
+ const rawLine = lines[cursor];
255
+ try {
256
+ const command = JSON.parse(rawLine);
257
+ return {
258
+ status: "command",
259
+ command,
260
+ next_cursor: cursor + 1
261
+ };
262
+ }
263
+ catch {
264
+ // Malformed JSON at this cursor position — skip it and advance
265
+ console.error(`waitForCommand: skipping malformed JSONL line at cursor ${cursor}:`, rawLine);
266
+ cursor += 1;
267
+ continue; // re-check immediately without sleeping
245
268
  }
246
269
  }
247
- return;
248
270
  }
249
- // Broadcast (target === "all" or omitted) — fan out to all other agents
250
- const agents = await this.listAgents();
251
- for (const agent of agents) {
252
- if (agent.id !== agentId) {
253
- const targetInboxPath = path.join(this.getAgentDir(agent.id), "inbox.jsonl");
254
- await fs.appendFile(targetInboxPath, line).catch(() => { });
271
+ catch (e) {
272
+ const code = e.code;
273
+ if (code !== "ENOENT") {
274
+ console.error("waitForCommand: unexpected read error:", e);
255
275
  }
276
+ // file might not exist yet — keep polling
256
277
  }
278
+ await new Promise(r => setTimeout(r, 500));
257
279
  }
258
- catch (e) {
259
- console.error("Failed to deliver event to peer agents:", e);
260
- }
280
+ return { status: "timeout", next_cursor: cursor };
261
281
  }
262
282
  }
263
283
  //# sourceMappingURL=agent-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../src/agent-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../src/agent-manager.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,14 +9,24 @@ const server = new Server({
9
9
  }, {
10
10
  capabilities: {
11
11
  tools: {},
12
- resources: {},
13
12
  },
14
13
  });
14
+ /**
15
+ * Validates that an agent_id is either the special value "master" or a well-formed UUID.
16
+ * Throws if the value does not match, preventing path traversal via directory names.
17
+ */
18
+ function validateAgentId(id) {
19
+ if (id === "master")
20
+ return;
21
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)) {
22
+ throw new Error(`Invalid agent_id: "${id}"`);
23
+ }
24
+ }
15
25
  const agentManager = new AgentManager();
16
26
  const TOOLS = [
17
27
  {
18
28
  name: "agent_create",
19
- description: "Create a new agent in a new tmux pane. After creating agents and enqueuing tasks, use read_events to monitor results.",
29
+ description: "Create a new agent in a new tmux pane. After creating agents and sending messages, use read_inbox to monitor results.",
20
30
  inputSchema: {
21
31
  type: "object",
22
32
  properties: {
@@ -49,32 +59,37 @@ const TOOLS = [
49
59
  },
50
60
  },
51
61
  {
52
- name: "task_enqueue",
53
- description: "Enqueue a task for an agent. After enqueuing, use read_events to poll for task_completed events.",
62
+ name: "send_message",
63
+ description: "Send a message to one or more agents (or master). After sending a task to an agent, you MUST actively poll for their response by calling read_inbox(agent_id='master') repeatedly until they reply.",
54
64
  inputSchema: {
55
65
  type: "object",
56
66
  properties: {
57
- agent_id: { type: "string" },
58
- task: { type: "object" },
67
+ agent_id: { type: "string", description: "Sender's agent ID (use 'master' if orchestrator is sending)" },
68
+ message: { type: "object", description: "Message payload to send" },
69
+ target: {
70
+ oneOf: [{ type: "string" }, { type: "array", items: { type: "string" } }],
71
+ description: "Routing: 'master' to send to orchestrator, 'all' to broadcast, an agent_id or [agent_ids] for targeted delivery."
72
+ },
59
73
  },
60
- required: ["agent_id", "task"],
74
+ required: ["agent_id", "message", "target"],
61
75
  },
62
76
  },
63
77
  {
64
- name: "read_events",
65
- description: "Read sub-agent events from broadcast log or a specific agent's outbox. Non-blocking; use cursor to paginate. Omit agent_id to read the global broadcast log.",
78
+ name: "read_inbox",
79
+ description: "Read messages from an inbox. Use agent_id='master' to read the orchestrator's inbox. IMPORTANT: This is non-blocking. If waiting for an agent's response, you MUST call this tool repeatedly in a loop (using the returned next_cursor) until the expected message arrives.",
66
80
  inputSchema: {
67
81
  type: "object",
68
82
  properties: {
69
- agent_id: { type: "string", description: "Specific agent's outbox; omit for global broadcast" },
83
+ agent_id: { type: "string", description: "Agent ID to read inbox for, or 'master' for the orchestrator inbox" },
70
84
  cursor: { type: "number", description: "Line index to resume from (default 0)" },
71
- limit: { type: "number", description: "Maximum number of events to return" },
85
+ limit: { type: "number", description: "Maximum number of messages to return" },
72
86
  },
87
+ required: ["agent_id"],
73
88
  },
74
89
  },
75
90
  {
76
91
  name: "wait_for_command",
77
- description: "Internal: Agent polls for new commands",
92
+ description: "Internal: Agent polls for new commands from its inbox",
78
93
  inputSchema: {
79
94
  type: "object",
80
95
  properties: {
@@ -82,25 +97,9 @@ const TOOLS = [
82
97
  timeout_ms: { type: "number" },
83
98
  cursor: { type: "number" },
84
99
  },
85
- required: ["agent_id", "timeout_ms"],
100
+ required: ["agent_id", "timeout_ms", "cursor"],
86
101
  },
87
102
  },
88
- {
89
- name: "emit_event",
90
- description: "Internal: Agent emits an event (result/log)",
91
- inputSchema: {
92
- type: "object",
93
- properties: {
94
- agent_id: { type: "string" },
95
- event: { type: "object" },
96
- target: {
97
- oneOf: [{ type: "string" }, { type: "array", items: { type: "string" } }],
98
- description: "Routing: omit or \"all\" for broadcast, \"master\" for master only, agent_id or [agent_ids] for targeted."
99
- },
100
- },
101
- required: ["agent_id", "event"],
102
- },
103
- }
104
103
  ];
105
104
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
106
105
  tools: TOOLS,
@@ -123,39 +122,42 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
123
122
  }
124
123
  if (name === "agent_delete") {
125
124
  const { agent_id } = args;
125
+ validateAgentId(agent_id);
126
126
  await agentManager.deleteAgent(agent_id);
127
127
  return {
128
128
  content: [{ type: "text", text: `Agent ${agent_id} deleted` }],
129
129
  };
130
130
  }
131
- if (name === "task_enqueue") {
132
- const { agent_id, task } = args;
133
- const taskId = await agentManager.enqueueTask(agent_id, task);
131
+ if (name === "send_message") {
132
+ const { agent_id, message, target } = args;
133
+ validateAgentId(agent_id);
134
+ if (Array.isArray(target)) {
135
+ target.forEach(t => validateAgentId(t));
136
+ }
137
+ else if (typeof target === "string" && target !== "all") {
138
+ validateAgentId(target);
139
+ }
140
+ await agentManager.sendMessage(agent_id, message, target);
134
141
  return {
135
- content: [{ type: "text", text: JSON.stringify({ task_id: taskId }) }],
142
+ content: [{ type: "text", text: "ok" }],
136
143
  };
137
144
  }
138
- if (name === "read_events") {
145
+ if (name === "read_inbox") {
139
146
  const { agent_id, cursor, limit } = args;
140
- const result = await agentManager.readEvents(agent_id, cursor ?? 0, limit);
147
+ validateAgentId(agent_id);
148
+ const result = await agentManager.readInbox(agent_id, cursor ?? 0, limit);
141
149
  return {
142
150
  content: [{ type: "text", text: JSON.stringify(result) }],
143
151
  };
144
152
  }
145
153
  if (name === "wait_for_command") {
146
154
  const { agent_id, timeout_ms, cursor } = args;
147
- const result = await agentManager.waitForCommand(agent_id, cursor || 0, timeout_ms);
155
+ validateAgentId(agent_id);
156
+ const result = await agentManager.waitForCommand(agent_id, cursor ?? 0, timeout_ms);
148
157
  return {
149
158
  content: [{ type: "text", text: JSON.stringify(result) }],
150
159
  };
151
160
  }
152
- if (name === "emit_event") {
153
- const { agent_id, event, target } = args;
154
- await agentManager.emitEvent(agent_id, event, target);
155
- return {
156
- content: [{ type: "text", text: "ok" }],
157
- };
158
- }
159
161
  throw new Error(`Tool not found: ${name}`);
160
162
  }
161
163
  catch (error) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/tmux.js CHANGED
@@ -2,6 +2,13 @@
2
2
  import { exec } from "child_process";
3
3
  import { promisify } from "util";
4
4
  const execAsync = promisify(exec);
5
+ /**
6
+ * Shell-quote a string for safe interpolation into tmux -t target arguments.
7
+ * Wraps in single quotes and escapes any embedded single quotes.
8
+ */
9
+ function tq(s) {
10
+ return `'${s.replace(/'/g, "'\\''")}'`;
11
+ }
5
12
  export async function getCurrentTmuxContext() {
6
13
  try {
7
14
  const { stdout } = await execAsync("tmux display-message -p '#{session_id}:#{window_id}:#{pane_id}'");
@@ -12,21 +19,12 @@ export async function getCurrentTmuxContext() {
12
19
  return null; // Not inside tmux
13
20
  }
14
21
  }
15
- export async function hasSession(sessionName) {
16
- try {
17
- await execAsync(`tmux has-session -t ${sessionName}`);
18
- return true;
19
- }
20
- catch (e) {
21
- return false;
22
- }
23
- }
24
22
  export async function createTmuxSession(sessionName) {
25
23
  // Use -d to create detached session.
26
24
  // IMPORTANT: Set a large size explicitly to avoid "no space for new pane" errors in CI environments.
27
25
  // 80x24 is too small for splitting. Use 800x600.
28
26
  try {
29
- await execAsync(`tmux new-session -d -s ${sessionName} -x 800 -y 600`);
27
+ await execAsync(`tmux new-session -d -s ${tq(sessionName)} -x 800 -y 600`);
30
28
  // Give the server a moment to initialize in CI
31
29
  await new Promise(r => setTimeout(r, 200));
32
30
  }
@@ -41,7 +39,7 @@ export async function createTmuxSession(sessionName) {
41
39
  let lastError;
42
40
  for (let i = 0; i < 3; i++) {
43
41
  try {
44
- const { stdout } = await execAsync(`tmux display-message -t ${sessionName} -p '#{session_id}:#{window_id}:#{pane_id}'`);
42
+ const { stdout } = await execAsync(`tmux display-message -t ${tq(sessionName)} -p '#{session_id}:#{window_id}:#{pane_id}'`);
45
43
  const [sessionId, windowId, paneId] = stdout.trim().split(":");
46
44
  return { sessionId, windowId, paneId };
47
45
  }
@@ -58,7 +56,7 @@ export async function createTmuxSession(sessionName) {
58
56
  }
59
57
  export async function getSessionContext(sessionName) {
60
58
  try {
61
- const { stdout } = await execAsync(`tmux display-message -t ${sessionName} -p '#{session_id}:#{window_id}:#{pane_id}'`);
59
+ const { stdout } = await execAsync(`tmux display-message -t ${tq(sessionName)} -p '#{session_id}:#{window_id}:#{pane_id}'`);
62
60
  const [sessionId, windowId, paneId] = stdout.trim().split(":");
63
61
  return { sessionId, windowId, paneId };
64
62
  }
@@ -68,11 +66,11 @@ export async function getSessionContext(sessionName) {
68
66
  }
69
67
  export async function splitPane(targetPaneId, direction = "horizontal", cwd) {
70
68
  const flag = direction === "horizontal" ? "-h" : "-v";
71
- const cwdCmd = cwd ? `-c ${cwd}` : "";
69
+ const cwdCmd = cwd ? `-c '${cwd.replace(/'/g, "'\\''")}'` : "";
72
70
  // Check available size before splitting (debugging)
73
71
  // const size = await execAsync(`tmux display-message -p -t ${targetPaneId} '#{pane_width}x#{pane_height}'`);
74
72
  // console.error(`Splitting pane ${targetPaneId} (Size: ${size.stdout.trim()})`);
75
- const { stdout } = await execAsync(`tmux split-window -d ${flag} -t ${targetPaneId} ${cwdCmd} -P -F '#{session_id}:#{window_id}:#{pane_id}'`);
73
+ const { stdout } = await execAsync(`tmux split-window -d ${flag} -t ${tq(targetPaneId)} ${cwdCmd} -P -F '#{session_id}:#{window_id}:#{pane_id}'`);
76
74
  const [sessionId, windowId, paneId] = stdout.trim().split(":");
77
75
  return { sessionId, windowId, paneId };
78
76
  }
@@ -80,21 +78,23 @@ export async function sendKeys(paneId, keys) {
80
78
  // Use single quotes to prevent the host shell from expanding variables (like $ or *)
81
79
  // We must escape existing single quotes in the command.
82
80
  const safeKeys = keys.replace(/'/g, "'\\''");
81
+ // paneId originates from tmux's own #{pane_id} output which is always "%\d+" format,
82
+ // so it is guaranteed safe for direct interpolation without additional quoting.
83
83
  // Add a small delay to ensure the shell prompt is ready.
84
84
  // This can help in environments where shell startup is slow.
85
- await execAsync(`tmux send-keys -t ${paneId} '${safeKeys}' Enter`);
85
+ await execAsync(`tmux send-keys -t ${tq(paneId)} '${safeKeys}' Enter`);
86
86
  await new Promise(r => setTimeout(r, 100)); // 100ms delay
87
87
  }
88
88
  export async function capturePane(paneId, lines = 100) {
89
- const { stdout } = await execAsync(`tmux capture-pane -p -t ${paneId} -S -${lines}`);
89
+ const { stdout } = await execAsync(`tmux capture-pane -p -t ${tq(paneId)} -S -${lines}`);
90
90
  return stdout;
91
91
  }
92
92
  export async function killPane(paneId) {
93
- await execAsync(`tmux kill-pane -t ${paneId}`);
93
+ await execAsync(`tmux kill-pane -t ${tq(paneId)}`);
94
94
  }
95
95
  export async function killSession(sessionName) {
96
96
  try {
97
- await execAsync(`tmux kill-session -t ${sessionName}`);
97
+ await execAsync(`tmux kill-session -t ${tq(sessionName)}`);
98
98
  }
99
99
  catch (e) {
100
100
  // ignore if session doesn't exist
package/dist/tmux.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kkweon/agent-orchestrator-mcp",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "Agent Orchestrator MCP Server for tmux-based sub-agents",
5
5
  "repository": {
6
6
  "type": "git",