let-them-talk 3.3.0 → 3.3.2
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 +131 -0
- package/LICENSE +75 -21
- package/README.md +3 -2
- package/SECURITY.md +58 -0
- package/cli.js +1 -1
- package/dashboard.html +29 -7
- package/dashboard.js +9 -3
- package/package.json +5 -3
- package/server.js +1 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [3.3.1] - 2026-03-14
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- License changed from MIT to Business Source License 1.1 (BSL)
|
|
7
|
+
- Added SECURITY.md with vulnerability disclosure policy
|
|
8
|
+
- Added CHANGELOG.md to published npm package
|
|
9
|
+
- Added .npmignore for cleaner package distribution
|
|
10
|
+
- Version synced across all files (server, CLI, dashboard)
|
|
11
|
+
|
|
12
|
+
## [3.0.0] - 2026-03-14
|
|
13
|
+
|
|
14
|
+
### Added — Agent Profiles
|
|
15
|
+
- New tool: `update_profile` (display_name, avatar, bio, role)
|
|
16
|
+
- 12 built-in SVG robot avatar icons with hash-based defaults
|
|
17
|
+
- Profiles auto-created on register, persist across restarts
|
|
18
|
+
- Profile data shown in dashboard (avatars, role badges, profile popup)
|
|
19
|
+
|
|
20
|
+
### Added — Agent Workspaces
|
|
21
|
+
- 3 new tools: `workspace_write`, `workspace_read`, `workspace_list`
|
|
22
|
+
- Per-agent key-value storage (50 keys max, 100KB per value)
|
|
23
|
+
- Agents can read anyone's workspace, write only their own
|
|
24
|
+
- Dashboard "Workspaces" tab with collapsible accordion UI
|
|
25
|
+
|
|
26
|
+
### Added — Workflow Automation
|
|
27
|
+
- 3 new tools: `create_workflow`, `advance_workflow`, `workflow_status`
|
|
28
|
+
- Multi-step pipelines with auto-handoff to step assignees
|
|
29
|
+
- Dashboard "Workflows" tab with horizontal pipeline visualization
|
|
30
|
+
- Dashboard can advance/skip workflow steps
|
|
31
|
+
|
|
32
|
+
### Added — Conversation Branching
|
|
33
|
+
- 3 new tools: `fork_conversation`, `switch_branch`, `list_branches`
|
|
34
|
+
- Fork at any message point with isolated branch history
|
|
35
|
+
- All message tools branch-aware (backward compatible — main branch uses existing files)
|
|
36
|
+
- Branch tabs in dashboard
|
|
37
|
+
|
|
38
|
+
### Added — Plugin System
|
|
39
|
+
- Dynamic tool loading from `plugins/*.js` files
|
|
40
|
+
- Sandboxed execution with 30s timeout
|
|
41
|
+
- CLI: `npx let-them-talk plugin add/list/remove/enable/disable`
|
|
42
|
+
- Dashboard plugin cards with enable/disable toggles
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
- MCP tools: 17 → 27 + dynamic plugins
|
|
46
|
+
- Dashboard tabs: 2 → 4 (Messages, Tasks, Workspaces, Workflows)
|
|
47
|
+
- Branch-aware history API (`?branch=` query param)
|
|
48
|
+
- Version bump across all files (server, dashboard, CLI, package.json)
|
|
49
|
+
|
|
50
|
+
## [2.5.0] - 2026-03-14
|
|
51
|
+
|
|
52
|
+
### Added
|
|
53
|
+
- Task management system: `create_task`, `update_task`, `list_tasks` tools
|
|
54
|
+
- Kanban board in dashboard (Messages/Tasks toggle)
|
|
55
|
+
- Agent stats panel (sent/received/avg response time per agent)
|
|
56
|
+
- Shareable HTML export (/api/export endpoint)
|
|
57
|
+
- Export dropdown (HTML + Markdown formats)
|
|
58
|
+
- Conversation bookmarks (star messages, localStorage)
|
|
59
|
+
- Sound notification toggle (Web Audio API)
|
|
60
|
+
- Typing indicator for processing agents
|
|
61
|
+
- Connection quality display (SSE latency)
|
|
62
|
+
- Date separators between message groups
|
|
63
|
+
- Message grouping for consecutive same-sender messages
|
|
64
|
+
- Project auto-discover (scan nearby folders)
|
|
65
|
+
- Copy-to-clipboard prompts in onboarding
|
|
66
|
+
- Dynamic tab title with message count
|
|
67
|
+
- Dashboard footer with version
|
|
68
|
+
|
|
69
|
+
### Security
|
|
70
|
+
- Path traversal fix in `share_file` (restricted to project dir)
|
|
71
|
+
- Path traversal fix in `?project=` param (validate against registered projects)
|
|
72
|
+
- 1MB message size limit on send/broadcast/handoff
|
|
73
|
+
- 1MB request body limit on dashboard POST endpoints
|
|
74
|
+
- XSS fix in HTML export (escape agent names)
|
|
75
|
+
- CORS restricted to localhost only (was wildcard)
|
|
76
|
+
- Dashboard binds to 127.0.0.1 only (was 0.0.0.0)
|
|
77
|
+
- Registration guard on `reset` tool
|
|
78
|
+
- Removed absolute file paths from share_file responses
|
|
79
|
+
|
|
80
|
+
## [2.3.0] - 2026-03-14
|
|
81
|
+
|
|
82
|
+
### Added
|
|
83
|
+
- `handoff` tool for structured work delegation
|
|
84
|
+
- `share_file` tool for sending file contents between agents
|
|
85
|
+
- `broadcast` tool for messaging all agents at once
|
|
86
|
+
- `get_summary` tool for conversation recaps
|
|
87
|
+
- Server-Sent Events for real-time dashboard updates
|
|
88
|
+
- `fs.watch()` on data directory with debounced SSE push
|
|
89
|
+
- Graceful SSE fallback to polling
|
|
90
|
+
- Handoff message rendering (purple banner)
|
|
91
|
+
- File share message rendering (file icon + size)
|
|
92
|
+
|
|
93
|
+
## [2.1.0] - 2026-03-14
|
|
94
|
+
|
|
95
|
+
### Added
|
|
96
|
+
- Multi-agent support (any name, not just A/B)
|
|
97
|
+
- `list_agents` tool with alive/dead status
|
|
98
|
+
- `listen` tool (blocks indefinitely, never times out)
|
|
99
|
+
- Conversation threading (`reply_to` + auto `thread_id`)
|
|
100
|
+
- Message acknowledgments (`ack_message` tool)
|
|
101
|
+
- Heartbeat system (10s interval, `last_activity` tracking)
|
|
102
|
+
- Agent status: active/sleeping/dead with idle time
|
|
103
|
+
- Listening status tracking (`listening_since`)
|
|
104
|
+
- Auto-compact messages.jsonl when >500 lines
|
|
105
|
+
- Auto-archive conversations before reset
|
|
106
|
+
- Context hints when conversation exceeds 50 messages
|
|
107
|
+
- Dead recipient warnings in `send_message`
|
|
108
|
+
- Message sequence numbers for ordering
|
|
109
|
+
- `pending_count` and `agents_online` in delivery responses
|
|
110
|
+
- 4 agent templates: pair, team, review, debate
|
|
111
|
+
- CLI: `npx let-them-talk templates` command
|
|
112
|
+
- CLI: `--template` flag for guided setup
|
|
113
|
+
- Multi-CLI support: Claude Code, Gemini CLI, Codex CLI
|
|
114
|
+
- `AGENT_BRIDGE_DATA_DIR` env var in MCP config
|
|
115
|
+
|
|
116
|
+
### Fixed
|
|
117
|
+
- Heartbeat timer `.unref()` to prevent zombie processes
|
|
118
|
+
- Process exit cleanup (deregister agent on exit)
|
|
119
|
+
- Re-registration cleanup (old name removed)
|
|
120
|
+
- Stale byte offset recovery on file truncation
|
|
121
|
+
|
|
122
|
+
## [2.0.0] - 2026-03-14
|
|
123
|
+
|
|
124
|
+
### Added
|
|
125
|
+
- Initial release
|
|
126
|
+
- MCP server with stdio transport
|
|
127
|
+
- 6 tools: register, send_message, wait_for_reply, check_messages, get_history, reset
|
|
128
|
+
- Web dashboard with real-time monitoring
|
|
129
|
+
- Message injection from dashboard
|
|
130
|
+
- Dark theme UI with markdown rendering
|
|
131
|
+
- `.mcp.json` project-level configuration
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,75 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
Business Source License 1.1
|
|
2
|
+
|
|
3
|
+
License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
|
|
4
|
+
"Business Source License" is a trademark of MariaDB Corporation Ab.
|
|
5
|
+
|
|
6
|
+
Parameters
|
|
7
|
+
|
|
8
|
+
Licensor: Dekelelz
|
|
9
|
+
Licensed Work: Let Them Talk v3.3.1
|
|
10
|
+
The Licensed Work is (c) 2024-2026 Dekelelz.
|
|
11
|
+
Additional Use Grant: You may make use of the Licensed Work, provided that
|
|
12
|
+
you may not use the Licensed Work for a Commercial
|
|
13
|
+
Hosted Service. A "Commercial Hosted Service" is a
|
|
14
|
+
service offered to third parties on a hosted or
|
|
15
|
+
managed basis that provides substantially the same
|
|
16
|
+
functionality as the Licensed Work, or any modified
|
|
17
|
+
version thereof, as a commercial offering.
|
|
18
|
+
|
|
19
|
+
For clarity, the following uses are always permitted:
|
|
20
|
+
- Self-hosting for personal or internal business use
|
|
21
|
+
- Using as a development tool in any project
|
|
22
|
+
- Integrating into non-competing products
|
|
23
|
+
- Academic and research use
|
|
24
|
+
- Non-commercial use of any kind
|
|
25
|
+
|
|
26
|
+
Change Date: 2028-03-14
|
|
27
|
+
Change License: Apache License, Version 2.0
|
|
28
|
+
|
|
29
|
+
For information about alternative licensing arrangements for the Licensed Work,
|
|
30
|
+
please contact: dekelelz@gmail.com
|
|
31
|
+
|
|
32
|
+
Notice
|
|
33
|
+
|
|
34
|
+
Business Source License 1.1
|
|
35
|
+
|
|
36
|
+
Terms
|
|
37
|
+
|
|
38
|
+
The Licensor hereby grants you the right to copy, modify, create derivative
|
|
39
|
+
works, redistribute, and make non-production use of the Licensed Work. The
|
|
40
|
+
Licensor may make an Additional Use Grant, above, permitting limited production
|
|
41
|
+
use.
|
|
42
|
+
|
|
43
|
+
Effective on the Change Date, or the fourth anniversary of the first publicly
|
|
44
|
+
available distribution of a specific version of the Licensed Work under this
|
|
45
|
+
License, whichever comes first, the Licensor hereby grants you rights under the
|
|
46
|
+
terms of the Change License, and the rights granted in the paragraph above
|
|
47
|
+
terminate.
|
|
48
|
+
|
|
49
|
+
If your use of the Licensed Work does not comply with the requirements currently
|
|
50
|
+
in effect as described in this License, you must purchase a commercial license
|
|
51
|
+
from the Licensor, its affiliated entities, or authorized resellers, or you must
|
|
52
|
+
refrain from using the Licensed Work.
|
|
53
|
+
|
|
54
|
+
All copies of the original and modified Licensed Work, and derivative works of
|
|
55
|
+
the Licensed Work, are subject to this License. This License applies separately
|
|
56
|
+
for each version of the Licensed Work and the Change Date may vary for each
|
|
57
|
+
version of the Licensed Work released by Licensor.
|
|
58
|
+
|
|
59
|
+
You must conspicuously display this License on each original or modified copy of
|
|
60
|
+
the Licensed Work. If you receive the Licensed Work in original or modified form
|
|
61
|
+
from a third party, the terms and conditions set forth in this License apply to
|
|
62
|
+
your use of that work.
|
|
63
|
+
|
|
64
|
+
Any use of the Licensed Work in violation of this License will automatically
|
|
65
|
+
terminate your rights under this License for the current and all other versions
|
|
66
|
+
of the Licensed Work.
|
|
67
|
+
|
|
68
|
+
This License does not grant you any right in any trademark or logo of Licensor
|
|
69
|
+
or its affiliates (provided that you may use a trademark or logo of Licensor as
|
|
70
|
+
expressly required by this License).
|
|
71
|
+
|
|
72
|
+
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN
|
|
73
|
+
"AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS
|
|
74
|
+
OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY,
|
|
75
|
+
FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE.
|
package/README.md
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Let Them Talk
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/let-them-talk)
|
|
4
|
-
[](https://github.com/Dekelelz/let-them-talk/blob/master/LICENSE)
|
|
5
|
+
[](https://discord.gg/6Y9YgkFNJP)
|
|
5
6
|
|
|
6
7
|
**MCP server + web dashboard that lets AI CLI agents talk to each other.**
|
|
7
8
|
|
|
@@ -239,4 +240,4 @@ Plugins run with full Node.js access. Only install plugins you trust. This is th
|
|
|
239
240
|
|
|
240
241
|
## License
|
|
241
242
|
|
|
242
|
-
|
|
243
|
+
[Business Source License 1.1](LICENSE) — Free to use, self-host, and modify. Cannot be offered as a competing commercial hosted service. Converts to Apache 2.0 on March 14, 2028.
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
| Version | Supported |
|
|
6
|
+
| ------- | ------------------ |
|
|
7
|
+
| 3.x.x | Yes |
|
|
8
|
+
| 2.x.x | No |
|
|
9
|
+
| < 2.0 | No |
|
|
10
|
+
|
|
11
|
+
## Reporting a Vulnerability
|
|
12
|
+
|
|
13
|
+
If you discover a security vulnerability in Let Them Talk, please report it responsibly.
|
|
14
|
+
|
|
15
|
+
**Do NOT open a public GitHub issue for security vulnerabilities.**
|
|
16
|
+
|
|
17
|
+
Instead, please email **security@dos-technology.com** or use [GitHub's private vulnerability reporting](https://github.com/Dekelelz/let-them-talk/security/advisories/new).
|
|
18
|
+
|
|
19
|
+
### What to include
|
|
20
|
+
|
|
21
|
+
- Description of the vulnerability
|
|
22
|
+
- Steps to reproduce
|
|
23
|
+
- Potential impact
|
|
24
|
+
- Suggested fix (if any)
|
|
25
|
+
|
|
26
|
+
### Response timeline
|
|
27
|
+
|
|
28
|
+
- **Acknowledgment**: Within 48 hours
|
|
29
|
+
- **Initial assessment**: Within 1 week
|
|
30
|
+
- **Fix release**: As soon as possible, typically within 2 weeks
|
|
31
|
+
|
|
32
|
+
## Security Model
|
|
33
|
+
|
|
34
|
+
Let Them Talk is a **local message broker** — it passes text messages between CLI terminals via shared files on your local machine.
|
|
35
|
+
|
|
36
|
+
### What it does NOT do
|
|
37
|
+
|
|
38
|
+
- Does not give agents filesystem access (they already have it via their CLI)
|
|
39
|
+
- Does not expose anything to the internet (dashboard binds to `127.0.0.1` only)
|
|
40
|
+
- Does not store or transmit API keys
|
|
41
|
+
- Does not run any cloud services
|
|
42
|
+
- Does not execute remote code
|
|
43
|
+
|
|
44
|
+
### Built-in protections
|
|
45
|
+
|
|
46
|
+
- **CORS restriction** — dashboard only accepts requests from localhost
|
|
47
|
+
- **XSS prevention** — all user inputs are escaped before rendering
|
|
48
|
+
- **Path traversal protection** — agents cannot read files outside the project directory
|
|
49
|
+
- **Symlink protection** — follows symlinks and validates the real path
|
|
50
|
+
- **Origin enforcement** — POST/DELETE requests require valid localhost origin
|
|
51
|
+
- **SSE connection limits** — prevents connection exhaustion
|
|
52
|
+
- **Input validation** — agent names, branch names, and file paths are validated
|
|
53
|
+
- **Message size limits** — 1MB max per message
|
|
54
|
+
- **Plugin sandboxing** — plugins run with a 30-second timeout
|
|
55
|
+
|
|
56
|
+
### LAN mode
|
|
57
|
+
|
|
58
|
+
When using `--lan` mode, the dashboard is exposed to your local network only. It is never accessible from the internet.
|
package/cli.js
CHANGED
package/dashboard.html
CHANGED
|
@@ -2308,6 +2308,7 @@
|
|
|
2308
2308
|
<button class="mobile-toggle" onclick="toggleSidebar()" aria-label="Menu">☰</button>
|
|
2309
2309
|
<img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><rect rx='20' width='100' height='100' fill='%230d1117'/><path d='M20 30 Q20 20 30 20 H70 Q80 20 80 30 V55 Q80 65 70 65 H55 L40 80 V65 H30 Q20 65 20 55Z' fill='%2358a6ff'/><circle cx='38' cy='42' r='5' fill='%230d1117'/><circle cx='55' cy='42' r='5' fill='%230d1117'/></svg>" alt="" style="height:28px;margin-right:4px;vertical-align:middle">
|
|
2310
2310
|
<div class="logo">Let Them Talk</div>
|
|
2311
|
+
<span id="mobile-project-name" style="display:none;font-size:11px;color:var(--orange);font-weight:600;background:var(--orange-dim);padding:2px 8px;border-radius:10px"></span>
|
|
2311
2312
|
<div class="header-stats">
|
|
2312
2313
|
<div class="h-stat"><span class="h-stat-val" id="stat-messages">0</span> msgs</div>
|
|
2313
2314
|
<div class="h-stat"><span class="h-stat-val" id="stat-agents">0</span> agents</div>
|
|
@@ -2471,7 +2472,7 @@
|
|
|
2471
2472
|
</div>
|
|
2472
2473
|
</div>
|
|
2473
2474
|
<div class="app-footer">
|
|
2474
|
-
<span>Let Them Talk v3.
|
|
2475
|
+
<span>Let Them Talk v3.3.1</span>
|
|
2475
2476
|
</div>
|
|
2476
2477
|
<div class="profile-popup" id="profile-popup" onclick="event.stopPropagation()">
|
|
2477
2478
|
<div class="profile-popup-header">
|
|
@@ -4095,6 +4096,7 @@ function poll() {
|
|
|
4095
4096
|
fetch('/api/agents' + pq).then(function(r) { return r.json(); }),
|
|
4096
4097
|
fetch('/api/status' + pq).then(function(r) { return r.json(); }),
|
|
4097
4098
|
]).then(function(results) {
|
|
4099
|
+
console.log('[LTT] poll ok — history:' + results[0].length + ' agents:' + Object.keys(results[1]).length + ' project:' + (activeProject || 'default'));
|
|
4098
4100
|
updateConnectionInfo(Date.now() - pollStart);
|
|
4099
4101
|
var prevHistLen = cachedHistory.length;
|
|
4100
4102
|
cachedHistory = results[0];
|
|
@@ -4140,7 +4142,7 @@ function poll() {
|
|
|
4140
4142
|
if (activeView === 'workflows') fetchWorkflows();
|
|
4141
4143
|
}).catch(function(e) {
|
|
4142
4144
|
console.error('Poll failed:', e);
|
|
4143
|
-
document.getElementById('conn-detail').textContent = '
|
|
4145
|
+
document.getElementById('conn-detail').textContent = ' ERR: ' + e.message;
|
|
4144
4146
|
});
|
|
4145
4147
|
}
|
|
4146
4148
|
|
|
@@ -4158,7 +4160,8 @@ function doReset() {
|
|
|
4158
4160
|
// ==================== PROJECT MANAGEMENT ====================
|
|
4159
4161
|
|
|
4160
4162
|
function loadProjects() {
|
|
4161
|
-
fetch('/api/projects').then(function(r) { return r.json(); }).then(function(projects) {
|
|
4163
|
+
return fetch('/api/projects').then(function(r) { return r.json(); }).then(function(projects) {
|
|
4164
|
+
console.log('[LTT] loadProjects:', projects.length, 'projects, activeProject:', activeProject);
|
|
4162
4165
|
var sel = document.getElementById('project-select');
|
|
4163
4166
|
// Keep the first option (Default)
|
|
4164
4167
|
while (sel.options.length > 1) sel.remove(1);
|
|
@@ -4168,7 +4171,24 @@ function loadProjects() {
|
|
|
4168
4171
|
opt.textContent = projects[i].name;
|
|
4169
4172
|
sel.appendChild(opt);
|
|
4170
4173
|
}
|
|
4171
|
-
|
|
4174
|
+
|
|
4175
|
+
// Auto-select: if only one project and nothing selected, use it
|
|
4176
|
+
if (!activeProject && projects.length === 1) {
|
|
4177
|
+
activeProject = projects[0].path;
|
|
4178
|
+
}
|
|
4179
|
+
|
|
4180
|
+
if (activeProject) {
|
|
4181
|
+
sel.value = activeProject;
|
|
4182
|
+
document.getElementById('remove-project-btn').style.display = '';
|
|
4183
|
+
// Update header project indicator for mobile
|
|
4184
|
+
var indicator = document.getElementById('mobile-project-name');
|
|
4185
|
+
if (indicator) {
|
|
4186
|
+
var proj = projects.find(function(p) { return p.path === activeProject; });
|
|
4187
|
+
indicator.textContent = proj ? proj.name : '';
|
|
4188
|
+
indicator.style.display = proj ? '' : 'none';
|
|
4189
|
+
}
|
|
4190
|
+
poll(); // re-poll with correct project
|
|
4191
|
+
}
|
|
4172
4192
|
|
|
4173
4193
|
// Show/hide remove button
|
|
4174
4194
|
document.getElementById('remove-project-btn').style.display = activeProject ? '' : 'none';
|
|
@@ -4805,9 +4825,11 @@ function initSSE() {
|
|
|
4805
4825
|
}
|
|
4806
4826
|
})();
|
|
4807
4827
|
|
|
4808
|
-
|
|
4809
|
-
|
|
4810
|
-
|
|
4828
|
+
// Load projects first, then poll (so auto-select works before first data fetch)
|
|
4829
|
+
loadProjects().then(function() {
|
|
4830
|
+
poll();
|
|
4831
|
+
initSSE();
|
|
4832
|
+
});
|
|
4811
4833
|
// Safety-net poll at 10s (SSE handles real-time, this catches any missed updates)
|
|
4812
4834
|
setInterval(poll, 10000);
|
|
4813
4835
|
</script>
|
package/dashboard.js
CHANGED
|
@@ -6,7 +6,12 @@ const os = require('os');
|
|
|
6
6
|
const { spawn } = require('child_process');
|
|
7
7
|
|
|
8
8
|
const PORT = parseInt(process.env.AGENT_BRIDGE_PORT || '3000', 10);
|
|
9
|
-
|
|
9
|
+
const LAN_STATE_FILE = path.join(__dirname, '.lan-mode');
|
|
10
|
+
let LAN_MODE = process.env.AGENT_BRIDGE_LAN === 'true' || (fs.existsSync(LAN_STATE_FILE) && fs.readFileSync(LAN_STATE_FILE, 'utf8').trim() === 'true');
|
|
11
|
+
|
|
12
|
+
function persistLanMode() {
|
|
13
|
+
try { fs.writeFileSync(LAN_STATE_FILE, LAN_MODE ? 'true' : 'false'); } catch {}
|
|
14
|
+
}
|
|
10
15
|
|
|
11
16
|
function getLanIP() {
|
|
12
17
|
const interfaces = os.networkInterfaces();
|
|
@@ -422,7 +427,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;backgrou
|
|
|
422
427
|
<div class="agent-chips" id="agent-chips"></div>
|
|
423
428
|
</div>
|
|
424
429
|
<div class="messages" id="messages"></div>
|
|
425
|
-
<div class="footer">Generated by <a href="https://github.com/Dekelelz/let-them-talk" target="_blank">Let Them Talk</a> ·
|
|
430
|
+
<div class="footer">Generated by <a href="https://github.com/Dekelelz/let-them-talk" target="_blank">Let Them Talk</a> · BSL 1.1</div>
|
|
426
431
|
<script>
|
|
427
432
|
var COLORS=['#58a6ff','#3fb950','#d29922','#f85149','#bc8cff','#f778ba','#79c0ff','#7ee787','#e3b341','#ffa198'];
|
|
428
433
|
var colorMap={},ci=0;
|
|
@@ -945,6 +950,7 @@ const server = http.createServer(async (req, res) => {
|
|
|
945
950
|
const newMode = !LAN_MODE;
|
|
946
951
|
const lanIP = getLanIP();
|
|
947
952
|
LAN_MODE = newMode;
|
|
953
|
+
persistLanMode();
|
|
948
954
|
// Send response first
|
|
949
955
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
950
956
|
res.end(JSON.stringify({ lan_mode: newMode, lan_ip: lanIP, port: PORT }));
|
|
@@ -1062,7 +1068,7 @@ server.listen(PORT, LAN_MODE ? '0.0.0.0' : '127.0.0.1', () => {
|
|
|
1062
1068
|
const dataDir = resolveDataDir();
|
|
1063
1069
|
const lanIP = getLanIP();
|
|
1064
1070
|
console.log('');
|
|
1065
|
-
console.log(' Let Them Talk - Agent Bridge Dashboard v3.
|
|
1071
|
+
console.log(' Let Them Talk - Agent Bridge Dashboard v3.3.1');
|
|
1066
1072
|
console.log(' ============================================');
|
|
1067
1073
|
console.log(' Dashboard: http://localhost:' + PORT);
|
|
1068
1074
|
if (LAN_MODE && lanIP) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "let-them-talk",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.2",
|
|
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": {
|
|
@@ -22,7 +22,9 @@
|
|
|
22
22
|
"cli.js",
|
|
23
23
|
"templates/",
|
|
24
24
|
"logo.png",
|
|
25
|
-
"LICENSE"
|
|
25
|
+
"LICENSE",
|
|
26
|
+
"SECURITY.md",
|
|
27
|
+
"CHANGELOG.md"
|
|
26
28
|
],
|
|
27
29
|
"keywords": [
|
|
28
30
|
"mcp",
|
|
@@ -46,7 +48,7 @@
|
|
|
46
48
|
"url": "https://github.com/Dekelelz/let-them-talk/issues"
|
|
47
49
|
},
|
|
48
50
|
"author": "Dekelelz",
|
|
49
|
-
"license": "
|
|
51
|
+
"license": "BSL-1.1",
|
|
50
52
|
"dependencies": {
|
|
51
53
|
"@modelcontextprotocol/sdk": "1.27.1"
|
|
52
54
|
}
|
package/server.js
CHANGED
|
@@ -2021,7 +2021,7 @@ async function main() {
|
|
|
2021
2021
|
loadPlugins();
|
|
2022
2022
|
const transport = new StdioServerTransport();
|
|
2023
2023
|
await server.connect(transport);
|
|
2024
|
-
console.error('Agent Bridge MCP server v3.
|
|
2024
|
+
console.error('Agent Bridge MCP server v3.3.1 running (' + (27 + loadedPlugins.length) + ' tools)');
|
|
2025
2025
|
}
|
|
2026
2026
|
|
|
2027
2027
|
main().catch(console.error);
|