let-them-talk 5.2.5 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/cli.js +1 -1
  2. package/package.json +1 -1
  3. package/server.js +17 -15
package/cli.js CHANGED
@@ -9,7 +9,7 @@ const command = process.argv[2];
9
9
 
10
10
  function printUsage() {
11
11
  console.log(`
12
- Let Them Talk — Agent Bridge v5.2.5
12
+ Let Them Talk — Agent Bridge v5.3.0
13
13
  MCP message broker for inter-agent communication
14
14
  Supports: Claude Code, Gemini CLI, Codex CLI, Ollama
15
15
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "let-them-talk",
3
- "version": "5.2.5",
3
+ "version": "5.3.0",
4
4
  "description": "MCP message broker + web dashboard for inter-agent communication. Let AI CLI agents talk to each other.",
5
5
  "main": "server.js",
6
6
  "bin": {
package/server.js CHANGED
@@ -1082,15 +1082,17 @@ function buildGuide(level = 'standard') {
1082
1082
  const managed = getManagedConfig();
1083
1083
  const isManager = managed.manager === registeredName;
1084
1084
  if (isManager) {
1085
- rules.push('YOU ARE THE MANAGER. You control the conversation. Use yield_floor(agent) to let agents speak. Use set_phase() to change team phase (discussion/planning/execution/review).');
1086
- rules.push('YOUR MANAGER LOOP: 1) Plan the work and assign tasks. 2) Use yield_floor() to give each agent their turn to speak. 3) Call listen() to wait for agent responses. 4) Review responses and decide next steps. 5) Use create_task() and create_workflow() to structure work.');
1087
- rules.push('Use send_message() to give instructions. Use broadcast() for team announcements. Agents cannot speak unless you give them the floor.');
1088
- rules.push('STRICT RULE: After EVERY action, call listen() to wait for responses. NEVER use sleep(). NEVER use check_messages() in a loop. NEVER stop managing. Your loop is: act → listen() act → listen(). This loop NEVER ends.');
1085
+ rules.push('YOU ARE THE MANAGER. You control the conversation flow, assign work, and track progress.');
1086
+ rules.push('TASK MANAGEMENT: Use create_task(title, description, assignee) to assign work to agents. Use create_workflow(name, steps) to create multi-step plans. These show up in the Tasks and Plan tabs of the dashboard.');
1087
+ rules.push('YOUR MANAGER LOOP: 1) Plan the work — create tasks and workflows for the team. 2) Use yield_floor(agent) to give each agent their turn to speak. 3) Call listen() to wait for responses. 4) When agents report completion, use update_task(id, status="done") to mark tasks done and advance_workflow() to move the plan forward. 5) Assign next tasks and repeat.');
1088
+ rules.push('PHASES: Use set_phase("discussion") for brainstorming, set_phase("planning") to assign tasks, set_phase("execution") for agents to work, set_phase("review") to collect results.');
1089
+ rules.push('Use send_message() to give instructions. Use broadcast() for team announcements.');
1090
+ rules.push('STRICT RULE: After EVERY action, call listen() to wait for responses. NEVER use sleep(). Your loop is: act → listen() → act → listen(). This loop NEVER ends.');
1089
1091
  } else {
1090
- rules.push('YOU ARE IN MANAGED MODE. The manager controls who speaks. Call listen() to wait for your turn. When the manager gives you the floor via yield_floor(), respond with your work.');
1091
- rules.push('YOUR LOOP: 1) Call listen() wait for messages and floor assignments. 2) When you receive a message or get the floor, do the work and respond. 3) Call listen() again immediately. This loop NEVER ends.');
1092
- rules.push('If you have an active task during execution phase, do the work, then report back to the manager via send_message(). Then call listen() again immediately.');
1093
- rules.push('STRICT RULES: NEVER use sleep(). NEVER use check_messages() in a polling loop. NEVER call get_work() in managed mode. NEVER stop listening. Your ONLY loop is: listen() → work → respond → listen(). If listen() times out, call listen() again immediately.');
1092
+ rules.push('YOU ARE IN MANAGED MODE. The manager controls who speaks. Call listen() to wait for your turn.');
1093
+ rules.push('TASK TRACKING: When the manager assigns you a task, call update_task(id, status="in_progress") to claim it. When you finish, call update_task(id, status="done") and report back to the manager. If your task is a workflow step, call advance_workflow() after completing it.');
1094
+ rules.push('YOUR LOOP: 1) Call listen() — wait for messages and floor assignments. 2) When you receive work, update the task to "in_progress", do the work, update to "done", respond to the manager. 3) Call listen() again immediately. This loop NEVER ends.');
1095
+ rules.push('STRICT RULES: NEVER use sleep(). NEVER use check_messages() in a loop. NEVER call get_work() in managed mode. Your ONLY loop is: listen() → work → update task → respond → listen(). If listen() times out, call listen() again immediately.');
1094
1096
  }
1095
1097
  rules.push('Keep messages to 2-3 paragraphs max.');
1096
1098
  rules.push('When you finish work, report what you did and what files you changed.');
@@ -2181,12 +2183,12 @@ async function toolListen(from = null) {
2181
2183
  // Heartbeat every 15s
2182
2184
  const heartbeatTimer = setInterval(() => { touchHeartbeat(registeredName); }, 15000);
2183
2185
 
2184
- // 45s timeout — prevents MCP connection drops
2186
+ // 5 min timeout — MCP has no tool timeout, heartbeat keeps agent alive
2185
2187
  const timer = setTimeout(() => {
2186
2188
  setListening(false);
2187
2189
  touchActivity();
2188
- done({ retry: true, message: 'No direct messages in 45s. Call listen() again to keep waiting.' });
2189
- }, 45000);
2190
+ done({ retry: true, message: 'No direct messages in 5 minutes. Call listen() again to keep waiting.' });
2191
+ }, 300000);
2190
2192
  });
2191
2193
  }
2192
2194
 
@@ -2485,7 +2487,7 @@ async function toolListenGroup() {
2485
2487
 
2486
2488
  // Autonomous mode: cap listen at 30s — agents should use get_work() instead
2487
2489
  const autonomousTimeout = isAutonomousMode() ? 30000 : null;
2488
- const MAX_LISTEN_MS = 45000; // 45sshort enough to prevent MCP connection drops
2490
+ const MAX_LISTEN_MS = 300000; // 5 minutes MCP has no tool timeout, heartbeat keeps agent alive
2489
2491
  const listenStart = Date.now();
2490
2492
 
2491
2493
  // Helper: collect unconsumed messages from all sources (general + channels)
@@ -2497,7 +2499,7 @@ async function toolListenGroup() {
2497
2499
 
2498
2500
  // Read new messages from main file using byte offset (efficient)
2499
2501
  if (fs.existsSync(mainFile)) {
2500
- const { messages: newMsgs, newOffset } = readNewMessages(lastReadOffset, mainFile);
2502
+ const { messages: newMsgs, newOffset } = readNewMessagesFromFile(lastReadOffset, mainFile);
2501
2503
  messages = newMsgs;
2502
2504
  lastReadOffset = newOffset;
2503
2505
  }
@@ -6112,7 +6114,7 @@ function toolToggleRule(ruleId) {
6112
6114
  // --- MCP Server setup ---
6113
6115
 
6114
6116
  const server = new Server(
6115
- { name: 'agent-bridge', version: '5.2.5' },
6117
+ { name: 'agent-bridge', version: '5.3.0' },
6116
6118
  { capabilities: { tools: {} } }
6117
6119
  );
6118
6120
 
@@ -7199,7 +7201,7 @@ async function main() {
7199
7201
  try {
7200
7202
  const transport = new StdioServerTransport();
7201
7203
  await server.connect(transport);
7202
- console.error('Agent Bridge MCP server v5.2.5 running (66 tools)');
7204
+ console.error('Agent Bridge MCP server v5.3.0 running (66 tools)');
7203
7205
  } catch (e) {
7204
7206
  console.error('ERROR: MCP server failed to start: ' + e.message);
7205
7207
  console.error('Fix: Run "npx let-them-talk doctor" to check your setup.');