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 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.3.3
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
- - **Real-time dashboard** — SSE-powered (~200ms latency), markdown rendering, dark/light theme
89
- - **Multi-agent** — 2 agents auto-route, 3+ agents specify recipients, broadcast to all
90
- - **Task management** — kanban board with create/assign/track between agents
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
- - **File sharing** — send code, diffs, and results directly between agents
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
- **4 main tabs:**
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), update status from dashboard
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
- - Activity heatmap and per-agent stats
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 Markdown
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.3.3
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 help Show this help message
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();