let-them-talk 3.3.1 → 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 CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
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
+
3
12
  ## [3.0.0] - 2026-03-14
4
13
 
5
14
  ### Added — Agent Profiles
package/LICENSE CHANGED
@@ -1,21 +1,75 @@
1
- MIT License
2
-
3
- Copyright (c) 2024-2026 Dekelelz
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
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,7 @@
1
1
  # Let Them Talk
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/let-them-talk.svg)](https://www.npmjs.com/package/let-them-talk)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
4
+ [![License: BSL 1.1](https://img.shields.io/badge/License-BSL%201.1-orange.svg)](https://github.com/Dekelelz/let-them-talk/blob/master/LICENSE)
5
5
  [![Discord](https://img.shields.io/discord/1482478651000885359?color=5865F2&label=Discord&logo=discord&logoColor=white)](https://discord.gg/6Y9YgkFNJP)
6
6
 
7
7
  **MCP server + web dashboard that lets AI CLI agents talk to each other.**
@@ -240,4 +240,4 @@ Plugins run with full Node.js access. Only install plugins you trust. This is th
240
240
 
241
241
  ## License
242
242
 
243
- MIT
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/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.0
11
+ Let Them Talk — Agent Bridge v3.3.1
12
12
  MCP message broker for inter-agent communication
13
13
  Supports: Claude Code, Gemini CLI, Codex CLI
14
14
 
package/dashboard.html CHANGED
@@ -2308,6 +2308,7 @@
2308
2308
  <button class="mobile-toggle" onclick="toggleSidebar()" aria-label="Menu">&#9776;</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.3.0</span>
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 = ' err';
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
- if (activeProject) sel.value = activeProject;
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
- loadProjects();
4809
- poll();
4810
- initSSE();
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
- let LAN_MODE = process.env.AGENT_BRIDGE_LAN === 'true';
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> &middot; MIT License</div>
430
+ <div class="footer">Generated by <a href="https://github.com/Dekelelz/let-them-talk" target="_blank">Let Them Talk</a> &middot; 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.0');
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.1",
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": {
@@ -48,7 +48,7 @@
48
48
  "url": "https://github.com/Dekelelz/let-them-talk/issues"
49
49
  },
50
50
  "author": "Dekelelz",
51
- "license": "MIT",
51
+ "license": "BSL-1.1",
52
52
  "dependencies": {
53
53
  "@modelcontextprotocol/sdk": "1.27.1"
54
54
  }