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 +52 -0
- package/README.md +19 -5
- package/cli.js +1 -1
- package/dashboard.html +1 -1
- package/dashboard.js +17 -4
- package/package.json +58 -58
- package/server.js +4256 -4002
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
|
-
- **
|
|
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,
|
|
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
|
|
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
|
-
- **
|
|
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 (
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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": "
|
|
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
|
+
}
|