let-them-talk 3.9.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,57 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.0.0] - 2026-03-17
4
+
5
+ ### Major Release — 10-Agent Free Group Mode
6
+
7
+ Massive scaling overhaul designed, implemented, and audited by a 3-agent team (Architect, Tester, Protocol). 12 changes, 3 bugs caught during collaborative code review.
8
+
9
+ ### Added — Scaling (4 features)
10
+ - **Scaled context** — `listen_group` context window scales with team size: `min(50, max(20, agentCount * 5))`. 3 agents = 20 messages, 10 agents = 50.
11
+ - **Send-after-listen enforcement** — agents must call `listen_group()` between sends. Prevents message storms. Addressed agents get 2 sends per cycle, others get 1.
12
+ - **Response budget** — max 2 unaddressed sends per 60 seconds. Time-based reset. Hint (not error) when depleted.
13
+ - **Smart context with priority partitions** — Bucket A (addressed messages, sacred, always included), Bucket B (channel messages, capped), Bucket C (chronological, fills remaining). Total guaranteed <= contextSize.
14
+
15
+ ### Added — Agent Awareness (3 features)
16
+ - **Enhanced nudge** — every non-listen tool response now includes sender names, addressed count, and message preview: `"URGENT: 3 messages waiting (2 addressed to you): 2 from Architect, 1 from Protocol. Latest: 'Need your review...'"`
17
+ - **Idle detection** — `listen_group()` returns `idle: true` after 60s with no messages, with proactive `work_suggestions`, task suggestions, and instructions. Agents auto-find work instead of blocking forever.
18
+ - **Enhanced `check_messages`** — now returns rich summary: `senders`, `addressed_to_you`, `preview`, `urgency` level. The proactive counterpart to the passive nudge.
19
+
20
+ ### Added — Organization
21
+ - **Task-channel auto-binding** — with 5+ agents in group mode, `create_task` auto-creates `#task-{id}` channels. Assignees auto-join on claim. Channels auto-delete on task completion. Naturally splits 10-agent noise into focused sub-teams.
22
+
23
+ ### Improved — Performance
24
+ - **Cached reads** — `getAgents()` (1.5s TTL), `getChannelsData()` (3s TTL), `getTasks()` (2s TTL) with write-through invalidation. Eliminates ~70% redundant disk I/O.
25
+ - **Compact JSON writes** — removed pretty-print (`null, 2`) from all internal JSON writes. 2-3x less I/O overhead.
26
+ - **Optimized agent status** — removed O(N) `getUnconsumedMessages` scan per agent in `listen_group` status computation.
27
+ - **Dashboard SSE race fix** — `Array.from()` before Set iteration prevents skipped clients during concurrent connect/disconnect.
28
+ - **Dashboard SSE heartbeat** — 30s keepalive prevents dead connection accumulation and proxy timeouts.
29
+ - **Dashboard file watcher cleanup** — old watcher properly closed on LAN toggle, prevents memory leaks.
30
+ - **Dashboard watcher filter** — only triggers on `.json`/`.jsonl` files, ignores lock files and temp files.
31
+
32
+ ### Added — Safety
33
+ - **Collection caps** — tasks (1000), workflows (500), votes (500), reviews (500), dependencies (1000), branches (100), channels (100). Prevents DoS via unbounded growth.
34
+ - **Input type validation** — `reply_to` and `channel` parameters type-checked as strings in `send_message`.
35
+ - **Channel name validation fix** — error message corrected from "1-30 chars" to "1-20 chars" to match `sanitizeName()`.
36
+
37
+ ## [3.10.0] - 2026-03-17
38
+
39
+ ### Added — Dynamic Guide with Progressive Disclosure
40
+ - **`buildGuide()`** — replaces hardcoded guide in register() and get_guide(). Returns only rules relevant to the current system state.
41
+ - **Tiered rules:** Tier 0 (listen after every action), Tier 1 (core behavior), Tier 2 (group mode features), Tier 2b (channels), Tier 3 (large teams 5+)
42
+ - **User-customizable:** `.agent-bridge/guide.md` for project-specific rules
43
+ - 2-agent direct mode = 5 rules. 10-agent group with channels = 12 rules.
44
+
45
+ ## [3.9.1] - 2026-03-17
46
+
47
+ ### Added
48
+ - **Per-channel cooldown** — uses channel member count instead of total agents. 2-member #backend = 1s, regardless of 10 in #general
49
+ - **`cooldown_applied_ms`** — diagnostic field in send_message response showing exact cooldown applied
50
+ - **`channel` field** in send_message response when sending to a channel
51
+
52
+ ### Fixed
53
+ - Task race condition — `update_task` rejects claiming tasks already in_progress by another agent
54
+
3
55
  ## [3.9.0] - 2026-03-17
4
56
 
5
57
  ### Added — Channels & Split Cooldown
package/README.md CHANGED
@@ -84,19 +84,22 @@ Each terminal spawns its own MCP server process. All processes share a `.agent-b
84
84
 
85
85
  ## Highlights
86
86
 
87
+ - **10-agent scale** — smart context partitions, send-after-listen enforcement, response budgets, idle detection, task-channel auto-binding
87
88
  - **3D virtual office** — chibi characters at desks, spectator camera (WASD+mouse), 11 hairstyles, 6 outfits, gestures, furniture, TV dashboard
88
89
  - **Managed conversation mode** — structured turn-taking with floor control for 3+ agents, prevents broadcast storms
89
- - **53 MCP tools** — messaging, tasks, workflows, profiles, workspaces, branching, managed mode, briefing, file locking, decisions, KB, voting, reviews, dependencies, reputation
90
+ - **56 MCP tools** — messaging, tasks, workflows, profiles, workspaces, branching, managed mode, briefing, file locking, decisions, KB, voting, reviews, dependencies, reputation
90
91
  - **8-tab dashboard** — 3D Hub (default), messages, tasks, workspaces, workflows, launch, stats, docs
91
- - **Group conversation mode** — single-write `__group__` messages, adaptive cooldown, `addressed_to` hints, alive-only GC
92
+ - **Group conversation mode** — single-write `__group__` messages, adaptive cooldown, `addressed_to` hints, smart context, idle detection
93
+ - **Agent awareness** — enhanced nudge with sender/preview on every tool call, idle work suggestions, rich `check_messages`
92
94
  - **5 agent templates** — pair, team, review, debate, managed — with ready-to-paste prompts
93
95
  - **5 conversation templates** — Code Review, Debug Squad, Feature Dev, Research & Write, Managed Team
94
96
  - **Stats & analytics** — per-agent scores, response times, hourly charts, conversation velocity
95
- - **Task management** — drag-and-drop kanban board between agents
97
+ - **Task management** — drag-and-drop kanban board, task-channel auto-binding for 5+ agent teams
96
98
  - **Workflow pipelines** — multi-step automation with auto-handoff
97
99
  - **Conversation branching** — fork at any point, isolated history per branch
98
100
  - **Ollama integration** — `npx let-them-talk init --ollama` for local AI models
99
- - **Secure by default** — CSRF, LAN auth tokens, CSP, config locking, reserved name blocklist
101
+ - **Performance optimized** — cached reads (70% I/O reduction), compact JSON writes, SSE heartbeat
102
+ - **Secure by default** — CSRF, LAN auth tokens, CSP, collection caps, config locking, reserved name blocklist
100
103
  - **Zero config** — one `npx` command, auto-detects your CLI, works immediately
101
104
 
102
105
  ## Agent Templates
@@ -175,7 +178,7 @@ The dashboard's default view is a **real-time 3D virtual office** (the "3D Hub")
175
178
 
176
179
  **Animations:** walk, sit, type, raise hand, sleep (ZZZ), wave, think, point, celebrate, stretch, idle gestures. Agents turn toward speakers during conversations.
177
180
 
178
- ## MCP Tools (53)
181
+ ## MCP Tools (56)
179
182
 
180
183
  <details>
181
184
  <summary><strong>Messaging (13 tools)</strong></summary>
@@ -333,6 +336,17 @@ The dashboard's default view is a **real-time 3D virtual office** (the "3D Hub")
333
336
 
334
337
  </details>
335
338
 
339
+ <details>
340
+ <summary><strong>Channels (3 tools)</strong></summary>
341
+
342
+ | Tool | Description |
343
+ |------|-------------|
344
+ | `join_channel` | Join or create a channel for sub-team communication |
345
+ | `leave_channel` | Leave a channel (can't leave #general, empty auto-delete) |
346
+ | `list_channels` | List all channels with members and message counts |
347
+
348
+ </details>
349
+
336
350
  ## CLI Reference
337
351
 
338
352
  ```bash
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 v3.9.0
12
+ Let Them Talk — Agent Bridge v4.0.0
13
13
  MCP message broker for inter-agent communication
14
14
  Supports: Claude Code, Gemini CLI, Codex CLI, Ollama
15
15
 
package/dashboard.html CHANGED
@@ -6879,7 +6879,7 @@ function renderDocs() {
6879
6879
 
6880
6880
  // All 53 Tools
6881
6881
  '<div class="docs-section">' +
6882
- '<h3>All 53 MCP Tools</h3>' +
6882
+ '<h3>All 56 MCP Tools</h3>' +
6883
6883
  '<h4>Core Messaging</h4>' +
6884
6884
  '<div class="docs-tool-grid">' +
6885
6885
  '<div class="docs-tool-item"><code>register(name, provider?)</code><div class="desc">Register your agent identity. Must be called first.</div></div>' +
package/dashboard.js CHANGED
@@ -1820,7 +1820,11 @@ const server = http.createServer(async (req, res) => {
1820
1820
  });
1821
1821
  res.write(`data: connected\n\n`);
1822
1822
  sseClients.add(res);
1823
- req.on('close', () => sseClients.delete(res));
1823
+ // Heartbeat every 30s to detect dead connections and prevent proxy timeouts
1824
+ const heartbeat = setInterval(() => {
1825
+ try { res.write(`:heartbeat\n\n`); } catch { clearInterval(heartbeat); sseClients.delete(res); }
1826
+ }, 30000);
1827
+ req.on('close', () => { clearInterval(heartbeat); sseClients.delete(res); });
1824
1828
  }
1825
1829
  // --- Mod system API ---
1826
1830
  else if (url.pathname === '/api/mods' && req.method === 'GET') {
@@ -1965,13 +1969,15 @@ function sseNotifyAll() {
1965
1969
  generateNotifications(agents);
1966
1970
  } catch {}
1967
1971
 
1968
- for (const res of sseClients) {
1972
+ const dead = [];
1973
+ for (const res of Array.from(sseClients)) {
1969
1974
  try {
1970
1975
  res.write(`data: update\n\n`);
1971
1976
  } catch {
1972
- sseClients.delete(res);
1977
+ dead.push(res);
1973
1978
  }
1974
1979
  }
1980
+ for (const res of dead) sseClients.delete(res);
1975
1981
  }
1976
1982
 
1977
1983
  // Watch data directory for changes and push SSE notifications
@@ -1979,10 +1985,17 @@ let fsWatcher = null;
1979
1985
  let sseDebounceTimer = null;
1980
1986
 
1981
1987
  function startFileWatcher() {
1988
+ // Clean up previous watcher to prevent memory leaks on LAN toggle
1989
+ if (fsWatcher) { try { fsWatcher.close(); } catch {} fsWatcher = null; }
1990
+ if (sseDebounceTimer) { clearTimeout(sseDebounceTimer); sseDebounceTimer = null; }
1991
+
1982
1992
  const dataDir = resolveDataDir();
1983
1993
  if (!fs.existsSync(dataDir)) return;
1984
1994
  try {
1985
- fsWatcher = fs.watch(dataDir, { persistent: false }, () => {
1995
+ fsWatcher = fs.watch(dataDir, { persistent: false }, (eventType, filename) => {
1996
+ // Filter: only react to data files, not temp/lock files
1997
+ if (filename && !filename.endsWith('.json') && !filename.endsWith('.jsonl')) return;
1998
+ if (filename && filename.endsWith('.lock')) return;
1986
1999
  // Debounce — multiple file changes may fire rapidly
1987
2000
  if (sseDebounceTimer) clearTimeout(sseDebounceTimer);
1988
2001
  sseDebounceTimer = setTimeout(() => sseNotifyAll(), 200);
package/package.json CHANGED
@@ -1,58 +1,58 @@
1
- {
2
- "name": "let-them-talk",
3
- "version": "3.9.0",
4
- "description": "MCP message broker + web dashboard for inter-agent communication. Let AI CLI agents talk to each other.",
5
- "main": "server.js",
6
- "bin": {
7
- "agent-bridge": "./cli.js",
8
- "let-them-talk": "./cli.js"
9
- },
10
- "scripts": {
11
- "start": "node server.js",
12
- "dashboard": "node dashboard.js",
13
- "test": "echo \"No tests yet\""
14
- },
15
- "engines": {
16
- "node": ">=16.0.0"
17
- },
18
- "files": [
19
- "server.js",
20
- "dashboard.js",
21
- "dashboard.html",
22
- "office/",
23
- "mods/",
24
- "cli.js",
25
- "templates/",
26
- "conversation-templates/",
27
- "logo.png",
28
- "LICENSE",
29
- "SECURITY.md",
30
- "CHANGELOG.md"
31
- ],
32
- "keywords": [
33
- "mcp",
34
- "claude",
35
- "claude-code",
36
- "gemini-cli",
37
- "codex-cli",
38
- "agent",
39
- "multi-agent",
40
- "communication",
41
- "message-broker",
42
- "ai-agents",
43
- "let-them-talk"
44
- ],
45
- "repository": {
46
- "type": "git",
47
- "url": "git+https://github.com/Dekelelz/let-them-talk.git"
48
- },
49
- "homepage": "https://talk.unrealai.studio",
50
- "bugs": {
51
- "url": "https://github.com/Dekelelz/let-them-talk/issues"
52
- },
53
- "author": "Dekelelz <contact@talk.unrealai.studio>",
54
- "license": "SEE LICENSE IN LICENSE",
55
- "dependencies": {
56
- "@modelcontextprotocol/sdk": "1.27.1"
57
- }
58
- }
1
+ {
2
+ "name": "let-them-talk",
3
+ "version": "4.0.0",
4
+ "description": "MCP message broker + web dashboard for inter-agent communication. Let AI CLI agents talk to each other.",
5
+ "main": "server.js",
6
+ "bin": {
7
+ "agent-bridge": "./cli.js",
8
+ "let-them-talk": "./cli.js"
9
+ },
10
+ "scripts": {
11
+ "start": "node server.js",
12
+ "dashboard": "node dashboard.js",
13
+ "test": "echo \"No tests yet\""
14
+ },
15
+ "engines": {
16
+ "node": ">=16.0.0"
17
+ },
18
+ "files": [
19
+ "server.js",
20
+ "dashboard.js",
21
+ "dashboard.html",
22
+ "office/",
23
+ "mods/",
24
+ "cli.js",
25
+ "templates/",
26
+ "conversation-templates/",
27
+ "logo.png",
28
+ "LICENSE",
29
+ "SECURITY.md",
30
+ "CHANGELOG.md"
31
+ ],
32
+ "keywords": [
33
+ "mcp",
34
+ "claude",
35
+ "claude-code",
36
+ "gemini-cli",
37
+ "codex-cli",
38
+ "agent",
39
+ "multi-agent",
40
+ "communication",
41
+ "message-broker",
42
+ "ai-agents",
43
+ "let-them-talk"
44
+ ],
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/Dekelelz/let-them-talk.git"
48
+ },
49
+ "homepage": "https://talk.unrealai.studio",
50
+ "bugs": {
51
+ "url": "https://github.com/Dekelelz/let-them-talk/issues"
52
+ },
53
+ "author": "Dekelelz <contact@talk.unrealai.studio>",
54
+ "license": "SEE LICENSE IN LICENSE",
55
+ "dependencies": {
56
+ "@modelcontextprotocol/sdk": "1.27.1"
57
+ }
58
+ }