@kkweon/agent-orchestrator-mcp 1.4.0 → 1.4.2
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 +122 -5
- package/dist/agent-manager.js +126 -106
- package/dist/agent-manager.js.map +1 -1
- package/dist/index.js +45 -43
- package/dist/index.js.map +1 -1
- package/dist/tmux.js +18 -18
- package/dist/tmux.js.map +1 -1
- package/package.json +3 -2
- package/policies/agent-orchestrator.toml +35 -0
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
|
-
- **
|
|
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/<session_id>/"]
|
|
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:
|
|
@@ -30,7 +134,19 @@ The easiest way to use this orchestrator is to install it directly to your Gemin
|
|
|
30
134
|
gemini extension install --auto-update https://github.com/kkweon/agent-orchestrator-mcp
|
|
31
135
|
```
|
|
32
136
|
|
|
33
|
-
### 2.
|
|
137
|
+
### 2. Policy Configuration (Recommended)
|
|
138
|
+
|
|
139
|
+
To allow the master agent to manage sub-agents without constant confirmation prompts, you should install the security policy.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
mkdir -p ~/.gemini/policies
|
|
143
|
+
# If you cloned the repo:
|
|
144
|
+
cp policies/agent-orchestrator.toml ~/.gemini/policies/
|
|
145
|
+
# Or download directly:
|
|
146
|
+
curl -sSL https://raw.githubusercontent.com/kkweon/agent-orchestrator-mcp/main/policies/agent-orchestrator.toml -o ~/.gemini/policies/agent-orchestrator.toml
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 3. Standalone Execution (via npx)
|
|
34
150
|
|
|
35
151
|
You can also run the MCP server directly using `npx`, which is useful for testing or manual configuration:
|
|
36
152
|
|
|
@@ -63,7 +179,8 @@ Use these tools to manage your workforce.
|
|
|
63
179
|
|-----------|-------------|------------|
|
|
64
180
|
| **`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
181
|
| **`agent_list`** | Lists all active agents in the current session. | *(None)* |
|
|
66
|
-
| **`
|
|
182
|
+
| **`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) |
|
|
183
|
+
| **`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
184
|
| **`agent_delete`** | Terminates a sub-agent and kills its tmux pane. | `agent_id` (string): Target agent's UUID |
|
|
68
185
|
|
|
69
186
|
### Internal Protocol Tools (For Sub-Agents)
|
|
@@ -71,7 +188,7 @@ Use these tools to manage your workforce.
|
|
|
71
188
|
*These tools are used automatically by the sub-agents to communicate with the orchestrator. You rarely need to call them manually.*
|
|
72
189
|
|
|
73
190
|
- **`wait_for_command`**: Long-polling endpoint for sub-agents to fetch new tasks from their `inbox`.
|
|
74
|
-
- **`
|
|
191
|
+
- **`send_message`**: Endpoint for sub-agents to report logs, progress, and results (with `target="master"`) or communicate with peers.
|
|
75
192
|
|
|
76
193
|
## Development
|
|
77
194
|
|
|
@@ -88,4 +205,4 @@ npm test
|
|
|
88
205
|
|
|
89
206
|
## License
|
|
90
207
|
|
|
91
|
-
MIT
|
|
208
|
+
MIT
|
package/dist/agent-manager.js
CHANGED
|
@@ -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
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
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,
|
|
99
|
-
|
|
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 '
|
|
103
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
201
|
-
const filePath = agentId
|
|
202
|
-
?
|
|
203
|
-
: path.join(this.
|
|
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
|
-
|
|
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 {
|
|
230
|
+
return { messages: [], next_cursor: cursor };
|
|
214
231
|
}
|
|
215
232
|
const slice = limit !== undefined ? lines.slice(cursor, cursor + limit) : lines.slice(cursor);
|
|
216
|
-
const
|
|
217
|
-
|
|
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
|
|
245
|
+
async waitForCommand(agentId, cursor = 0, timeoutMs = DEFAULT_POLL_TIMEOUT_MS) {
|
|
220
246
|
const agentDir = this.getAgentDir(agentId);
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
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":"AAMA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,kCAAkC;AAClC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,+BAA+B;AAC/B,MAAM,UAAU,GAAG,SAAS,CAAC;AAE7B,MAAM,uBAAuB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;AAExG,MAAM,OAAO,YAAY;IACf,aAAa,CAAS;IACvB,SAAS,CAAS,CAAC,6BAA6B;IAEvD,YAAY,gBAAwB,OAAO,CAAC,GAAG,EAAE;QAC/C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,oEAAoE;QACpE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,UAAU,EAAE,CAAC;IAChE,CAAC;IAEO,aAAa;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/E,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,mBAAmB;QACnB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;QAE5D,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,0DAA0D;YAC1D,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;gBACjE,IAAI,QAAQ,EAAE,CAAC;oBACX,OAAO,GAAG,QAAQ,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACJ,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;gBAC9D,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;gBAC9D,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAE5E,MAAM,KAAK,GAAU;YACnB,EAAE;YACF,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;YAC/D,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,iEAAiE;QACjE,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAErF,yBAAyB;QACzB,0EAA0E;QAC1E,mFAAmF;QAEnF,iCAAiC;QACjC,2CAA2C;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,wBAAwB,CAAC;QACnF,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAC;QAErD,iBAAiB;QACjB,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,GAAG,GAAG,EAAE,CAAC;QAEb,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,+EAA+E;YAC/E,iCAAiC;YACjC,GAAG,GAAG,UAAU,CAAC;QACrB,CAAC;aAAM,CAAC;YACJ,8BAA8B;YAC9B,mDAAmD;YACnD,MAAM,eAAe,GAAG;2CACW,EAAE,eAAe,MAAM,CAAC,IAAI;;;;;;sEAMD,EAAE,4CAA4C,uBAAuB;;;;mEAIxE,EAAE;;;;CAIpE,CAAC,IAAI,EAAE,CAAC;YAED,oEAAoE;YACpE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YAEnD,uCAAuC;YACvC,GAAG,GAAG,GAAG,UAAU,OAAO,KAAK,IAAI,OAAO,YAAY,aAAa,KAAK,CAAC;QAC7E,CAAC;QAED,qCAAqC;QACrC,MAAM,OAAO,GAAG,YAAY,EAAE,qBAAqB,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;QAC3E,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,MAAM,GAAY,EAAE,CAAC;YAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;gBACxD,IAAI,CAAC;oBACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC9D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,kEAAkE;oBAClE,OAAO,CAAC,IAAI,CAAC,4BAA4B,GAAG,kCAAkC,CAAC,CAAC;gBACpF,CAAC;YACL,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,4CAA4C,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,WAAoC;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG;YACd,IAAI,EAAE,MAAM;YACZ,MAAM;YACN,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,yBAAyB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1F,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,SAAiB,CAAC,EAAE,YAAoB,uBAAuB;QACnG,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAErE,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;oBACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjC,OAAO;wBACH,MAAM,EAAE,SAAS;wBACjB,OAAO;wBACP,WAAW,EAAE,MAAM,GAAG,CAAC;qBAC1B,CAAC;gBACN,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,2BAA2B;YAC/B,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAAgB,EAChB,SAAiB,CAAC,EAClB,KAAc;QAEd,MAAM,QAAQ,GAAG,OAAO;YACtB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;YACtD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAEvD,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAErE,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC,CAAC;QAE9E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,KAA8B,EAAE,MAA0B;QACzF,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAEzE,MAAM,KAAK,GAAG;YACV,GAAG,KAAK;YACR,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAC1C,wDAAwD;QACxD,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAEzC,8CAA8C;QAC9C,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,yCAAyC;YACzC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC5D,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC1B,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;wBAClB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;wBACxE,MAAM,EAAE,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAC/D,CAAC;gBACL,CAAC;gBACD,OAAO;YACX,CAAC;YAED,wEAAwE;YACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;oBACvB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;oBAC7E,MAAM,EAAE,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF"}
|
|
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
|
|
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: "
|
|
53
|
-
description: "
|
|
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
|
-
|
|
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", "
|
|
74
|
+
required: ["agent_id", "message", "target"],
|
|
61
75
|
},
|
|
62
76
|
},
|
|
63
77
|
{
|
|
64
|
-
name: "
|
|
65
|
-
description: "Read
|
|
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: "
|
|
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
|
|
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 === "
|
|
132
|
-
const { agent_id,
|
|
133
|
-
|
|
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:
|
|
142
|
+
content: [{ type: "text", text: "ok" }],
|
|
136
143
|
};
|
|
137
144
|
}
|
|
138
|
-
if (name === "
|
|
145
|
+
if (name === "read_inbox") {
|
|
139
146
|
const { agent_id, cursor, limit } = args;
|
|
140
|
-
|
|
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
|
-
|
|
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":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;
|
|
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":"AAAA,cAAc;AACd,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;
|
|
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.
|
|
3
|
+
"version": "1.4.2",
|
|
4
4
|
"description": "Agent Orchestrator MCP Server for tmux-based sub-agents",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
"files": [
|
|
15
15
|
"dist",
|
|
16
16
|
"gemini-extension.json",
|
|
17
|
-
"README.md"
|
|
17
|
+
"README.md",
|
|
18
|
+
"policies"
|
|
18
19
|
],
|
|
19
20
|
"publishConfig": {
|
|
20
21
|
"access": "public",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
[[rule]]
|
|
2
|
+
mcpName = "tmux-agent-orchestrator"
|
|
3
|
+
toolName = "agent_create"
|
|
4
|
+
decision = "allow"
|
|
5
|
+
priority = 200
|
|
6
|
+
|
|
7
|
+
[[rule]]
|
|
8
|
+
mcpName = "tmux-agent-orchestrator"
|
|
9
|
+
toolName = "send_message"
|
|
10
|
+
decision = "allow"
|
|
11
|
+
priority = 200
|
|
12
|
+
|
|
13
|
+
[[rule]]
|
|
14
|
+
mcpName = "tmux-agent-orchestrator"
|
|
15
|
+
toolName = "wait_for_command"
|
|
16
|
+
decision = "allow"
|
|
17
|
+
priority = 200
|
|
18
|
+
|
|
19
|
+
[[rule]]
|
|
20
|
+
mcpName = "tmux-agent-orchestrator"
|
|
21
|
+
toolName = "read_inbox"
|
|
22
|
+
decision = "allow"
|
|
23
|
+
priority = 200
|
|
24
|
+
|
|
25
|
+
[[rule]]
|
|
26
|
+
mcpName = "tmux-agent-orchestrator"
|
|
27
|
+
toolName = "agent_list"
|
|
28
|
+
decision = "allow"
|
|
29
|
+
priority = 200
|
|
30
|
+
|
|
31
|
+
[[rule]]
|
|
32
|
+
mcpName = "tmux-agent-orchestrator"
|
|
33
|
+
toolName = "agent_delete"
|
|
34
|
+
decision = "allow"
|
|
35
|
+
priority = 200
|