let-them-talk 3.3.3 → 3.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/CHANGELOG.md +68 -0
- package/LICENSE +1 -1
- package/README.md +17 -9
- package/cli.js +103 -2
- package/dashboard.html +693 -125
- package/dashboard.js +373 -7
- package/package.json +2 -1
- package/server.js +80 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,73 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.4.1] - 2026-03-15
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **File-level mutex** — in-memory promise queue per file for serializing edit/delete operations
|
|
7
|
+
- **Agent permissions enforcement** — `canSendTo()` checks in `send_message` and `broadcast`, `can_read` filtering in `get_history` and message delivery
|
|
8
|
+
- **Read receipts** — auto-recorded when agents consume messages, visible as agent-initial dots under messages in dashboard
|
|
9
|
+
|
|
10
|
+
### Security
|
|
11
|
+
- HTTP 500 responses now return generic error instead of raw `err.message` (prevents filesystem path leaks)
|
|
12
|
+
- `/api/discover` changed from GET to POST (now under CSRF protection)
|
|
13
|
+
- `workspace_read`/`workspace_list` validate agent name parameter with regex
|
|
14
|
+
- `get_history` filters results by agent's `can_read` permissions
|
|
15
|
+
- `read_receipts.json` and `permissions.json` added to both MCP and dashboard reset cleanup
|
|
16
|
+
- Dashboard workspace API regex aligned with server (`[a-zA-Z0-9_-]`)
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- `toolWaitForReply` missing `markAsRead` calls (read receipts not recorded)
|
|
20
|
+
- `toolBroadcast` bypassing permission checks entirely
|
|
21
|
+
- `toolReset` not cleaning up `permissions.json` and `read_receipts.json`
|
|
22
|
+
|
|
23
|
+
## [3.4.0] - 2026-03-15
|
|
24
|
+
|
|
25
|
+
### Added — Dashboard Features
|
|
26
|
+
- **Stats Tab** — per-agent message counts, avg response time, peak hours, 24-hour activity chart, conversation velocity. Keyboard shortcut `6`.
|
|
27
|
+
- **Compact View** — toggle button in search bar. Hides avatars, inlines timestamps, reduces padding. Persists to localStorage.
|
|
28
|
+
- **Message Edit** — edit any message via hover action. Full edit history tracked, "edited" badge displayed.
|
|
29
|
+
- **Message Delete** — delete dashboard/system messages with confirmation dialog.
|
|
30
|
+
- **Copy Message** — clipboard button on message hover to copy raw content.
|
|
31
|
+
- **JSON Export** — new export format alongside HTML and Markdown.
|
|
32
|
+
- **Kanban Drag-and-Drop** — drag task cards between columns (pending/in_progress/done/blocked).
|
|
33
|
+
- **SSE Auto-Reconnect** — exponential backoff (1s→30s), yellow "Reconnecting..." indicator, polling fallback.
|
|
34
|
+
- **Conversation Templates** — 4 built-in multi-agent workflow templates (Code Review Pipeline, Debug Squad, Feature Development, Research & Write) in the Launch tab with copyable agent prompts.
|
|
35
|
+
|
|
36
|
+
### Added — API Endpoints
|
|
37
|
+
- `PUT /api/message` — edit a message (with edit history)
|
|
38
|
+
- `DELETE /api/message` — delete a message (dashboard/system only)
|
|
39
|
+
- `GET /api/conversation-templates` — list conversation templates
|
|
40
|
+
- `POST /api/conversation-templates/launch` — get template agent prompts
|
|
41
|
+
- `GET /api/stats` — analytics data (per-agent stats, velocity, hourly distribution)
|
|
42
|
+
- `GET/POST /api/permissions` — agent permission management
|
|
43
|
+
|
|
44
|
+
### Added — CLI Commands
|
|
45
|
+
- `npx let-them-talk msg <agent> <text>` — send a message from CLI
|
|
46
|
+
- `npx let-them-talk status` — show active agents and message counts
|
|
47
|
+
|
|
48
|
+
### Changed — Premium UI Redesign
|
|
49
|
+
- Deeper dark palette with blue undertones (#080b12 background)
|
|
50
|
+
- Inter font from Google Fonts with anti-aliased rendering
|
|
51
|
+
- Glassmorphism header with backdrop-filter blur
|
|
52
|
+
- Gradient accent system (blue→purple) on buttons, active tabs, send button
|
|
53
|
+
- Refined shadow system (sm/md/lg) with colored glows
|
|
54
|
+
- Focus rings on all inputs
|
|
55
|
+
- Smoother transitions (0.2-0.25s) with lift effects on hover
|
|
56
|
+
- Glass effects on modals and popups
|
|
57
|
+
- Inset shadows on code blocks
|
|
58
|
+
- Thinner scrollbars with transparent tracks
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
- Task notes crash when `notes` array undefined
|
|
62
|
+
- Message edit always rewrites messages.jsonl regardless of match
|
|
63
|
+
- Permissions API accepted arbitrary fields (now whitelisted)
|
|
64
|
+
- Task status accepted any string (now validated against whitelist)
|
|
65
|
+
- Reset button ignored active project in multi-project mode
|
|
66
|
+
- Edit modal missing error handler on network failure
|
|
67
|
+
- CLI msg command accepted invalid agent names
|
|
68
|
+
- Copy-to-clipboard double-escaped HTML entities in template prompts
|
|
69
|
+
- Duplicate deleteMessage function shadowing
|
|
70
|
+
|
|
3
71
|
## [3.3.2] - 2026-03-14
|
|
4
72
|
|
|
5
73
|
### Changed
|
package/LICENSE
CHANGED
|
@@ -6,7 +6,7 @@ License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
|
|
|
6
6
|
Parameters
|
|
7
7
|
|
|
8
8
|
Licensor: Dekelelz
|
|
9
|
-
Licensed Work: Let Them Talk v3.
|
|
9
|
+
Licensed Work: Let Them Talk v3.4.1
|
|
10
10
|
The Licensed Work is (c) 2024-2026 Dekelelz.
|
|
11
11
|
Additional Use Grant: You may make use of the Licensed Work, provided that
|
|
12
12
|
you may not use the Licensed Work for a Commercial
|
package/README.md
CHANGED
|
@@ -85,13 +85,17 @@ Each terminal spawns its own MCP server process. All processes share a `.agent-b
|
|
|
85
85
|
## Highlights
|
|
86
86
|
|
|
87
87
|
- **27 MCP tools** — messaging, tasks, workflows, profiles, workspaces, branching, plugins
|
|
88
|
-
- **
|
|
89
|
-
- **
|
|
90
|
-
- **
|
|
88
|
+
- **Premium dashboard** — glassmorphism UI, Inter font, gradient accents, SSE real-time (~200ms)
|
|
89
|
+
- **Stats & analytics** — per-agent message counts, response times, hourly activity charts, velocity
|
|
90
|
+
- **Conversation templates** — 4 built-in multi-agent workflows (Code Review, Debug Squad, Feature Dev, Research & Write)
|
|
91
|
+
- **Message management** — edit, delete, copy messages with full edit history
|
|
92
|
+
- **Task management** — drag-and-drop kanban board between agents
|
|
91
93
|
- **Workflow pipelines** — multi-step automation with auto-handoff
|
|
92
94
|
- **Agent profiles** — display names, SVG avatars, roles, bios
|
|
93
95
|
- **Conversation branching** — fork at any point, isolated history per branch
|
|
94
|
-
- **
|
|
96
|
+
- **Compact view** — dense message toggle for power users, persists to localStorage
|
|
97
|
+
- **Multi-format export** — HTML, Markdown, and JSON export
|
|
98
|
+
- **CLI tools** — send messages and check status directly from the command line
|
|
95
99
|
- **Plugin system** — extend with custom tools, 30s sandboxed execution
|
|
96
100
|
- **Zero config** — one `npx` command, auto-detects your CLI, works immediately
|
|
97
101
|
|
|
@@ -118,22 +122,26 @@ npx let-them-talk templates # List all available templates
|
|
|
118
122
|
|
|
119
123
|
Launch with `npx let-them-talk dashboard` — opens at `http://localhost:3000`.
|
|
120
124
|
|
|
121
|
-
**
|
|
125
|
+
**6 main tabs:**
|
|
122
126
|
|
|
123
|
-
- **Messages** — live feed with full markdown, message grouping, search, bookmarks, pins, emoji reactions, conversation replay
|
|
124
|
-
- **Tasks** — kanban board (pending / in progress / done / blocked)
|
|
127
|
+
- **Messages** — live feed with full markdown, message grouping, search, bookmarks, pins, emoji reactions, conversation replay, compact view
|
|
128
|
+
- **Tasks** — drag-and-drop kanban board (pending / in progress / done / blocked)
|
|
125
129
|
- **Workspaces** — per-agent key-value storage browser
|
|
126
130
|
- **Workflows** — horizontal pipeline visualization, advance or skip steps
|
|
131
|
+
- **Launch** — spawn new agents with templates, 4 built-in conversation templates with copyable prompts
|
|
132
|
+
- **Stats** — per-agent message counts, avg response times, hourly activity charts, conversation velocity
|
|
127
133
|
|
|
128
134
|
**Plus:**
|
|
129
135
|
|
|
130
136
|
- Agent monitoring with active / sleeping / dead / listening status
|
|
131
137
|
- Profile popups with avatars and role badges
|
|
132
|
-
-
|
|
138
|
+
- Message edit, delete, and copy actions on hover
|
|
139
|
+
- SSE auto-reconnect with exponential backoff and visual indicator
|
|
133
140
|
- Message injection and broadcast from browser
|
|
134
141
|
- Conversation branching with branch tabs
|
|
135
|
-
- Export as shareable HTML or
|
|
142
|
+
- Export as shareable HTML, Markdown, or JSON
|
|
136
143
|
- Multi-project support with auto-discover
|
|
144
|
+
- Premium glassmorphism UI with gradient accents
|
|
137
145
|
- Dark / light theme toggle
|
|
138
146
|
- Mobile responsive with hamburger sidebar
|
|
139
147
|
- Browser notifications and sound alerts
|
package/cli.js
CHANGED
|
@@ -8,7 +8,7 @@ const command = process.argv[2];
|
|
|
8
8
|
|
|
9
9
|
function printUsage() {
|
|
10
10
|
console.log(`
|
|
11
|
-
Let Them Talk — Agent Bridge v3.
|
|
11
|
+
Let Them Talk — Agent Bridge v3.4.1
|
|
12
12
|
MCP message broker for inter-agent communication
|
|
13
13
|
Supports: Claude Code, Gemini CLI, Codex CLI
|
|
14
14
|
|
|
@@ -28,7 +28,9 @@ function printUsage() {
|
|
|
28
28
|
npx let-them-talk plugin remove <n> Remove a plugin by name
|
|
29
29
|
npx let-them-talk plugin enable <n> Enable a plugin
|
|
30
30
|
npx let-them-talk plugin disable <n> Disable a plugin
|
|
31
|
-
npx let-them-talk
|
|
31
|
+
npx let-them-talk msg <agent> <text> Send a message to an agent
|
|
32
|
+
npx let-them-talk status Show active agents and message count
|
|
33
|
+
npx let-them-talk help Show this help message
|
|
32
34
|
`);
|
|
33
35
|
}
|
|
34
36
|
|
|
@@ -416,6 +418,97 @@ function dashboard() {
|
|
|
416
418
|
require('./dashboard.js');
|
|
417
419
|
}
|
|
418
420
|
|
|
421
|
+
function resolveDataDirCli() {
|
|
422
|
+
return process.env.AGENT_BRIDGE_DATA_DIR || path.join(process.cwd(), '.agent-bridge');
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
function readJsonl(filePath) {
|
|
426
|
+
if (!fs.existsSync(filePath)) return [];
|
|
427
|
+
return fs.readFileSync(filePath, 'utf8')
|
|
428
|
+
.split('\n')
|
|
429
|
+
.filter(l => l.trim())
|
|
430
|
+
.map(l => { try { return JSON.parse(l); } catch { return null; } })
|
|
431
|
+
.filter(Boolean);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
function readJson(filePath) {
|
|
435
|
+
if (!fs.existsSync(filePath)) return {};
|
|
436
|
+
try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); } catch { return {}; }
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
function isPidAlive(pid) {
|
|
440
|
+
if (!pid) return false;
|
|
441
|
+
try { process.kill(pid, 0); return true; } catch { return false; }
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function cliMsg() {
|
|
445
|
+
const recipient = process.argv[3];
|
|
446
|
+
const textParts = process.argv.slice(4);
|
|
447
|
+
if (!recipient || !textParts.length) {
|
|
448
|
+
console.error(' Usage: npx let-them-talk msg <agent> <text>');
|
|
449
|
+
process.exit(1);
|
|
450
|
+
}
|
|
451
|
+
if (!/^[a-zA-Z0-9_-]{1,20}$/.test(recipient)) {
|
|
452
|
+
console.error(' Agent name must be 1-20 alphanumeric characters (with _ or -).');
|
|
453
|
+
process.exit(1);
|
|
454
|
+
}
|
|
455
|
+
const text = textParts.join(' ');
|
|
456
|
+
const dir = resolveDataDirCli();
|
|
457
|
+
if (!fs.existsSync(dir)) {
|
|
458
|
+
console.error(' No .agent-bridge/ directory found. Run "npx let-them-talk init" first.');
|
|
459
|
+
process.exit(1);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const msgId = 'm' + Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
|
|
463
|
+
const msg = {
|
|
464
|
+
id: msgId,
|
|
465
|
+
from: 'CLI',
|
|
466
|
+
to: recipient,
|
|
467
|
+
content: text,
|
|
468
|
+
timestamp: new Date().toISOString(),
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
const messagesFile = path.join(dir, 'messages.jsonl');
|
|
472
|
+
const historyFile = path.join(dir, 'history.jsonl');
|
|
473
|
+
fs.appendFileSync(messagesFile, JSON.stringify(msg) + '\n');
|
|
474
|
+
fs.appendFileSync(historyFile, JSON.stringify(msg) + '\n');
|
|
475
|
+
|
|
476
|
+
console.log(' Message sent to ' + recipient + ': ' + text);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
function cliStatus() {
|
|
480
|
+
const dir = resolveDataDirCli();
|
|
481
|
+
if (!fs.existsSync(dir)) {
|
|
482
|
+
console.error(' No .agent-bridge/ directory found. Run "npx let-them-talk init" first.');
|
|
483
|
+
process.exit(1);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
const agents = readJson(path.join(dir, 'agents.json'));
|
|
487
|
+
const history = readJsonl(path.join(dir, 'history.jsonl'));
|
|
488
|
+
|
|
489
|
+
console.log('');
|
|
490
|
+
console.log(' Agent Bridge Status');
|
|
491
|
+
console.log(' ===================');
|
|
492
|
+
console.log(' Messages: ' + history.length);
|
|
493
|
+
console.log('');
|
|
494
|
+
|
|
495
|
+
const names = Object.keys(agents);
|
|
496
|
+
if (!names.length) {
|
|
497
|
+
console.log(' No agents registered.');
|
|
498
|
+
} else {
|
|
499
|
+
console.log(' Agents:');
|
|
500
|
+
for (const name of names) {
|
|
501
|
+
const info = agents[name];
|
|
502
|
+
const alive = isPidAlive(info.pid);
|
|
503
|
+
const status = alive ? '\x1b[32monline\x1b[0m' : '\x1b[31moffline\x1b[0m';
|
|
504
|
+
const lastActivity = info.last_activity || info.timestamp || '';
|
|
505
|
+
const msgCount = history.filter(m => m.from === name).length;
|
|
506
|
+
console.log(' ' + name.padEnd(16) + ' ' + status + ' msgs: ' + msgCount + ' last: ' + (lastActivity ? new Date(lastActivity).toLocaleTimeString() : '-'));
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
console.log('');
|
|
510
|
+
}
|
|
511
|
+
|
|
419
512
|
switch (command) {
|
|
420
513
|
case 'init':
|
|
421
514
|
init();
|
|
@@ -429,6 +522,14 @@ switch (command) {
|
|
|
429
522
|
case 'reset':
|
|
430
523
|
reset();
|
|
431
524
|
break;
|
|
525
|
+
case 'msg':
|
|
526
|
+
case 'message':
|
|
527
|
+
case 'send':
|
|
528
|
+
cliMsg();
|
|
529
|
+
break;
|
|
530
|
+
case 'status':
|
|
531
|
+
cliStatus();
|
|
532
|
+
break;
|
|
432
533
|
case 'plugin':
|
|
433
534
|
case 'plugins':
|
|
434
535
|
pluginCmd();
|