let-them-talk 5.4.2 → 5.5.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.
Files changed (38) hide show
  1. package/README.md +3 -2
  2. package/USAGE.md +1 -1
  3. package/cli.js +1193 -1264
  4. package/conversation-templates/autonomous-feature.json +4 -4
  5. package/conversation-templates/code-review.json +3 -3
  6. package/conversation-templates/debug-squad.json +3 -3
  7. package/conversation-templates/feature-build.json +3 -3
  8. package/conversation-templates/research-write.json +3 -3
  9. package/dashboard.html +329 -177
  10. package/dashboard.js +3459 -3476
  11. package/package.json +114 -113
  12. package/scripts/check-dashboard-control-plane.js +7 -63
  13. package/server.js +33 -333
  14. package/templates/debate.json +2 -2
  15. package/templates/managed.json +4 -4
  16. package/templates/pair.json +2 -2
  17. package/templates/review.json +2 -2
  18. package/templates/team.json +3 -3
  19. package/vendor/highlight-github-dark.min.css +10 -0
  20. package/vendor/highlight.min.js +1232 -0
  21. package/vendor/katex-fonts/KaTeX_AMS-Regular.woff2 +0 -0
  22. package/vendor/katex-fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  23. package/vendor/katex-fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  24. package/vendor/katex-fonts/KaTeX_Main-Bold.woff2 +0 -0
  25. package/vendor/katex-fonts/KaTeX_Main-Italic.woff2 +0 -0
  26. package/vendor/katex-fonts/KaTeX_Main-Regular.woff2 +0 -0
  27. package/vendor/katex-fonts/KaTeX_Math-Italic.woff2 +0 -0
  28. package/vendor/katex-fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  29. package/vendor/katex-fonts/KaTeX_Script-Regular.woff2 +0 -0
  30. package/vendor/katex-fonts/KaTeX_Size1-Regular.woff2 +0 -0
  31. package/vendor/katex-fonts/KaTeX_Size2-Regular.woff2 +0 -0
  32. package/vendor/katex-fonts/KaTeX_Size3-Regular.woff2 +0 -0
  33. package/vendor/katex-fonts/KaTeX_Size4-Regular.woff2 +0 -0
  34. package/vendor/katex-fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  35. package/vendor/katex.min.css +1 -0
  36. package/vendor/katex.min.js +1 -0
  37. package/vendor/marked.min.js +6 -0
  38. package/vendor/mermaid.min.js +2314 -0
package/package.json CHANGED
@@ -1,113 +1,114 @@
1
- {
2
- "name": "let-them-talk",
3
- "version": "5.4.2",
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
- "export:markdown-workspace": "node scripts/export-markdown-workspace.js",
14
- "sync:packaged-docs": "node scripts/sync-packaged-docs.js",
15
- "prepack": "npm run sync:packaged-docs",
16
- "test": "npm run verify",
17
- "verify": "npm run verify:contracts && npm run verify:replay && npm run verify:invariants",
18
- "verify:docs-onboarding": "node scripts/check-docs-onboarding.js",
19
- "verify:contracts": "npm run verify:contracts:runtime && npm run verify:contracts:schema && npm run verify:contracts:branches && npm run verify:contracts:markdown-workspace",
20
- "verify:contracts:runtime": "node scripts/check-runtime-contract.js",
21
- "verify:contracts:schema": "node scripts/check-event-schema.js",
22
- "verify:contracts:branches": "node scripts/check-branch-semantics.js",
23
- "verify:contracts:markdown-workspace": "node scripts/check-markdown-workspace.js",
24
- "verify:replay": "npm run verify:replay:positive && npm run verify:replay:negative",
25
- "verify:replay:positive": "npm run verify:replay:healthy && npm run verify:replay:clean",
26
- "verify:replay:healthy": "node scripts/check-message-replay.js --scenario healthy",
27
- "verify:replay:clean": "node scripts/check-message-replay.js --scenario clean",
28
- "verify:replay:negative": "node scripts/run-verification-suite.js replay-negative",
29
- "verify:invariants": "npm run verify:invariants:authority && npm run verify:invariants:dashboard-control-plane && npm run verify:invariants:performance-indexing && npm run verify:invariants:capabilities && npm run verify:invariants:api-agent-parity && npm run verify:invariants:dashboard-semantic-gap && npm run verify:invariants:migration-hardening && npm run verify:invariants:branches && npm run verify:invariants:sessions && npm run verify:invariants:evidence && npm run verify:invariants:context && npm run verify:invariants:autonomy-v2 && npm run verify:invariants:autonomy-v2-watchdog && npm run verify:invariants:autonomy-v2-execution && npm run verify:invariants:agent-contracts && npm run verify:invariants:managed-team-integration && npm run verify:invariants:lifecycle-hooks && npm run verify:invariants:markdown-workspace-export && npm run verify:invariants:markdown-workspace-safety",
30
- "verify:invariants:authority": "node scripts/check-invariants.js --suite authority",
31
- "verify:invariants:dashboard-control-plane": "node scripts/check-dashboard-control-plane.js",
32
- "verify:invariants:performance-indexing": "node scripts/check-performance-indexing.js",
33
- "verify:invariants:capabilities": "node scripts/check-provider-capabilities.js",
34
- "verify:invariants:api-agent-parity": "node scripts/check-api-agent-parity.js",
35
- "verify:invariants:dashboard-semantic-gap": "node scripts/run-verification-suite.js dashboard-semantic-gap",
36
- "verify:invariants:migration-hardening": "node scripts/check-migration-hardening.js",
37
- "verify:invariants:branches": "node scripts/check-branch-isolation.js && node scripts/check-branch-fork-snapshot.js",
38
- "verify:invariants:branch-fork": "node scripts/check-branch-fork-snapshot.js",
39
- "verify:invariants:sessions": "node scripts/check-session-lifecycle.js",
40
- "verify:invariants:evidence": "node scripts/check-evidence-completion.js",
41
- "verify:invariants:context": "node scripts/check-session-aware-context.js",
42
- "verify:invariants:autonomy-v2": "node scripts/check-autonomy-v2-decision.js",
43
- "verify:invariants:autonomy-v2-watchdog": "node scripts/check-autonomy-v2-watchdog.js",
44
- "verify:invariants:autonomy-v2-execution": "node scripts/check-autonomy-v2-execution.js",
45
- "verify:invariants:agent-contracts": "node scripts/check-agent-contract-advisory.js",
46
- "verify:invariants:managed-team-integration": "node scripts/check-managed-team-integration.js",
47
- "verify:invariants:lifecycle-hooks": "node scripts/check-lifecycle-hooks.js",
48
- "verify:invariants:markdown-workspace-export": "node scripts/check-markdown-workspace-export.js",
49
- "verify:invariants:markdown-workspace-safety": "node scripts/check-markdown-workspace-safety.js",
50
- "verify:smoke": "node scripts/run-verification-suite.js smoke"
51
- },
52
- "engines": {
53
- "node": ">=18.0.0"
54
- },
55
- "files": [
56
- "data-dir.js",
57
- "server.js",
58
- "dashboard.js",
59
- "dashboard.html",
60
- "api-agents.js",
61
- "runtime-descriptor.js",
62
- "agent-contracts.js",
63
- "managed-team-integration.js",
64
- "autonomy/",
65
- "events/",
66
- "state/",
67
- "providers/",
68
- "office/",
69
- "mods/",
70
- "scripts/",
71
- "docs/",
72
- "USAGE.md",
73
- "cli.js",
74
- "templates/",
75
- "conversation-templates/",
76
- "logo.png",
77
- "LICENSE",
78
- "SECURITY.md",
79
- "CHANGELOG.md"
80
- ],
81
- "keywords": [
82
- "mcp",
83
- "claude",
84
- "claude-code",
85
- "gemini-cli",
86
- "codex-cli",
87
- "agent",
88
- "multi-agent",
89
- "communication",
90
- "message-broker",
91
- "ai-agents",
92
- "let-them-talk"
93
- ],
94
- "repository": {
95
- "type": "git",
96
- "url": "git+https://github.com/Dekelelz/let-them-talk.git"
97
- },
98
- "homepage": "https://talk.unrealai.studio",
99
- "bugs": {
100
- "url": "https://github.com/Dekelelz/let-them-talk/issues"
101
- },
102
- "author": "Dekelelz <contact@talk.unrealai.studio>",
103
- "license": "SEE LICENSE IN LICENSE",
104
- "dependencies": {
105
- "@modelcontextprotocol/sdk": "^1.29.0",
106
- "three": "0.175.0"
107
- },
108
- "overrides": {
109
- "hono": "^4.12.14",
110
- "path-to-regexp": "^8.4.2",
111
- "@hono/node-server": "^1.19.14"
112
- }
113
- }
1
+ {
2
+ "name": "let-them-talk",
3
+ "version": "5.5.2",
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
+ "export:markdown-workspace": "node scripts/export-markdown-workspace.js",
14
+ "sync:packaged-docs": "node scripts/sync-packaged-docs.js",
15
+ "prepack": "npm run sync:packaged-docs",
16
+ "test": "npm run verify",
17
+ "verify": "npm run verify:contracts && npm run verify:replay && npm run verify:invariants",
18
+ "verify:docs-onboarding": "node scripts/check-docs-onboarding.js",
19
+ "verify:contracts": "npm run verify:contracts:runtime && npm run verify:contracts:schema && npm run verify:contracts:branches && npm run verify:contracts:markdown-workspace",
20
+ "verify:contracts:runtime": "node scripts/check-runtime-contract.js",
21
+ "verify:contracts:schema": "node scripts/check-event-schema.js",
22
+ "verify:contracts:branches": "node scripts/check-branch-semantics.js",
23
+ "verify:contracts:markdown-workspace": "node scripts/check-markdown-workspace.js",
24
+ "verify:replay": "npm run verify:replay:positive && npm run verify:replay:negative",
25
+ "verify:replay:positive": "npm run verify:replay:healthy && npm run verify:replay:clean",
26
+ "verify:replay:healthy": "node scripts/check-message-replay.js --scenario healthy",
27
+ "verify:replay:clean": "node scripts/check-message-replay.js --scenario clean",
28
+ "verify:replay:negative": "node scripts/run-verification-suite.js replay-negative",
29
+ "verify:invariants": "npm run verify:invariants:authority && npm run verify:invariants:dashboard-control-plane && npm run verify:invariants:performance-indexing && npm run verify:invariants:capabilities && npm run verify:invariants:api-agent-parity && npm run verify:invariants:dashboard-semantic-gap && npm run verify:invariants:migration-hardening && npm run verify:invariants:branches && npm run verify:invariants:sessions && npm run verify:invariants:evidence && npm run verify:invariants:context && npm run verify:invariants:autonomy-v2 && npm run verify:invariants:autonomy-v2-watchdog && npm run verify:invariants:autonomy-v2-execution && npm run verify:invariants:agent-contracts && npm run verify:invariants:managed-team-integration && npm run verify:invariants:lifecycle-hooks && npm run verify:invariants:markdown-workspace-export && npm run verify:invariants:markdown-workspace-safety",
30
+ "verify:invariants:authority": "node scripts/check-invariants.js --suite authority",
31
+ "verify:invariants:dashboard-control-plane": "node scripts/check-dashboard-control-plane.js",
32
+ "verify:invariants:performance-indexing": "node scripts/check-performance-indexing.js",
33
+ "verify:invariants:capabilities": "node scripts/check-provider-capabilities.js",
34
+ "verify:invariants:api-agent-parity": "node scripts/check-api-agent-parity.js",
35
+ "verify:invariants:dashboard-semantic-gap": "node scripts/run-verification-suite.js dashboard-semantic-gap",
36
+ "verify:invariants:migration-hardening": "node scripts/check-migration-hardening.js",
37
+ "verify:invariants:branches": "node scripts/check-branch-isolation.js && node scripts/check-branch-fork-snapshot.js",
38
+ "verify:invariants:branch-fork": "node scripts/check-branch-fork-snapshot.js",
39
+ "verify:invariants:sessions": "node scripts/check-session-lifecycle.js",
40
+ "verify:invariants:evidence": "node scripts/check-evidence-completion.js",
41
+ "verify:invariants:context": "node scripts/check-session-aware-context.js",
42
+ "verify:invariants:autonomy-v2": "node scripts/check-autonomy-v2-decision.js",
43
+ "verify:invariants:autonomy-v2-watchdog": "node scripts/check-autonomy-v2-watchdog.js",
44
+ "verify:invariants:autonomy-v2-execution": "node scripts/check-autonomy-v2-execution.js",
45
+ "verify:invariants:agent-contracts": "node scripts/check-agent-contract-advisory.js",
46
+ "verify:invariants:managed-team-integration": "node scripts/check-managed-team-integration.js",
47
+ "verify:invariants:lifecycle-hooks": "node scripts/check-lifecycle-hooks.js",
48
+ "verify:invariants:markdown-workspace-export": "node scripts/check-markdown-workspace-export.js",
49
+ "verify:invariants:markdown-workspace-safety": "node scripts/check-markdown-workspace-safety.js",
50
+ "verify:smoke": "node scripts/run-verification-suite.js smoke"
51
+ },
52
+ "engines": {
53
+ "node": ">=18.0.0"
54
+ },
55
+ "files": [
56
+ "data-dir.js",
57
+ "server.js",
58
+ "dashboard.js",
59
+ "dashboard.html",
60
+ "api-agents.js",
61
+ "runtime-descriptor.js",
62
+ "agent-contracts.js",
63
+ "managed-team-integration.js",
64
+ "autonomy/",
65
+ "events/",
66
+ "state/",
67
+ "providers/",
68
+ "office/",
69
+ "mods/",
70
+ "scripts/",
71
+ "docs/",
72
+ "vendor/",
73
+ "USAGE.md",
74
+ "cli.js",
75
+ "templates/",
76
+ "conversation-templates/",
77
+ "logo.png",
78
+ "LICENSE",
79
+ "SECURITY.md",
80
+ "CHANGELOG.md"
81
+ ],
82
+ "keywords": [
83
+ "mcp",
84
+ "claude",
85
+ "claude-code",
86
+ "gemini-cli",
87
+ "codex-cli",
88
+ "agent",
89
+ "multi-agent",
90
+ "communication",
91
+ "message-broker",
92
+ "ai-agents",
93
+ "let-them-talk"
94
+ ],
95
+ "repository": {
96
+ "type": "git",
97
+ "url": "git+https://github.com/Dekelelz/let-them-talk.git"
98
+ },
99
+ "homepage": "https://talk.unrealai.studio",
100
+ "bugs": {
101
+ "url": "https://github.com/Dekelelz/let-them-talk/issues"
102
+ },
103
+ "author": "Dekelelz <contact@talk.unrealai.studio>",
104
+ "license": "SEE LICENSE IN LICENSE",
105
+ "dependencies": {
106
+ "@modelcontextprotocol/sdk": "^1.29.0",
107
+ "three": "0.175.0"
108
+ },
109
+ "overrides": {
110
+ "hono": "^4.12.14",
111
+ "path-to-regexp": "^8.4.2",
112
+ "@hono/node-server": "^1.19.14"
113
+ }
114
+ }
@@ -716,69 +716,13 @@ async function assertBranchScopedDashboardReads(baseUrl, fixture, problems) {
716
716
  assert(!exportReplayResponse.raw.includes(fixture.mainChannelMessage.content), 'Replay export must exclude main-branch channel content when exporting a feature branch.', problems);
717
717
  }
718
718
 
719
- async function assertAssistantInjectRouting(baseUrl, dataDir, eventLog, problems) {
719
+ function captureMessageBaseline(dataDir, eventLog) {
720
720
  const messagesFile = path.join(dataDir, 'messages.jsonl');
721
721
  const historyFile = path.join(dataDir, 'history.jsonl');
722
- const assistantMessagesFile = path.join(dataDir, 'assistant-messages.jsonl');
723
-
724
- const beforeMessages = readJsonl(messagesFile);
725
- const beforeHistory = readJsonl(historyFile);
726
- const beforeAssistantMessages = readJsonl(assistantMessagesFile);
727
- const beforeMessageEvents = readMessageEvents(eventLog);
728
-
729
- const defaultResponse = await requestJson(baseUrl, '/api/inject', {
730
- method: 'POST',
731
- body: {
732
- to: 'Assistant',
733
- content: 'Assistant default canonical route validation',
734
- },
735
- });
736
- assert(defaultResponse.status === 200, `POST /api/inject to Assistant without opt-in should return 200, got ${defaultResponse.status}.`, problems);
737
- assert(defaultResponse.body && defaultResponse.body.success === true, 'POST /api/inject to Assistant without opt-in should succeed.', problems);
738
-
739
- const afterDefaultMessages = readJsonl(messagesFile);
740
- const afterDefaultHistory = readJsonl(historyFile);
741
- const afterDefaultAssistantMessages = readJsonl(assistantMessagesFile);
742
- const afterDefaultMessageEvents = readMessageEvents(eventLog);
743
- const defaultMessageId = defaultResponse.body && defaultResponse.body.messageId;
744
- const defaultCanonicalMessage = afterDefaultMessages.find((message) => message.id === defaultMessageId);
745
-
746
- assert(afterDefaultMessages.length === beforeMessages.length + 1, 'Assistant default inject should append to the canonical messages projection.', problems);
747
- assert(afterDefaultHistory.length === beforeHistory.length + 1, 'Assistant default inject should append to the canonical history projection.', problems);
748
- assert(afterDefaultAssistantMessages.length === beforeAssistantMessages.length, 'Assistant default inject must not write to assistant-messages.jsonl without explicit opt-in.', problems);
749
- assert(defaultCanonicalMessage && defaultCanonicalMessage.to === 'Assistant', 'Assistant default inject should keep the Assistant target in canonical projections.', problems);
750
- assert(afterDefaultMessageEvents.length === beforeMessageEvents.length + 1, 'Assistant default inject should append one canonical message event.', problems);
751
- assert(afterDefaultMessageEvents.some((event) => event.type === 'message.sent' && event.payload && event.payload.message && event.payload.message.id === defaultMessageId), 'Assistant default inject should be recorded in the canonical message event log.', problems);
752
-
753
- const privateResponse = await requestJson(baseUrl, '/api/inject', {
754
- method: 'POST',
755
- body: {
756
- to: 'Assistant',
757
- content: 'Assistant private opt-in validation',
758
- assistant_private: true,
759
- },
760
- });
761
- assert(privateResponse.status === 200, `POST /api/inject to Assistant with assistant_private=true should return 200, got ${privateResponse.status}.`, problems);
762
- assert(privateResponse.body && privateResponse.body.success === true, 'POST /api/inject to Assistant with assistant_private=true should succeed.', problems);
763
-
764
- const afterPrivateMessages = readJsonl(messagesFile);
765
- const afterPrivateHistory = readJsonl(historyFile);
766
- const afterPrivateAssistantMessages = readJsonl(assistantMessagesFile);
767
- const afterPrivateMessageEvents = readMessageEvents(eventLog);
768
- const privateMessageId = privateResponse.body && privateResponse.body.messageId;
769
- const privateAssistantMessage = afterPrivateAssistantMessages.find((message) => message.id === privateMessageId);
770
-
771
- assert(afterPrivateMessages.length === afterDefaultMessages.length, 'Assistant private opt-in inject must not append to canonical messages.jsonl.', problems);
772
- assert(afterPrivateHistory.length === afterDefaultHistory.length, 'Assistant private opt-in inject must not append to canonical history.jsonl.', problems);
773
- assert(afterPrivateAssistantMessages.length === afterDefaultAssistantMessages.length + 1, 'Assistant private opt-in inject should append exactly one private assistant message.', problems);
774
- assert(privateAssistantMessage && privateAssistantMessage.to === 'Assistant', 'Assistant private opt-in inject should persist the Assistant-targeted private message.', problems);
775
- assert(afterPrivateMessageEvents.length === afterDefaultMessageEvents.length, 'Assistant private opt-in inject must not append canonical message events.', problems);
776
- assert(!afterPrivateMessageEvents.some((event) => event.payload && event.payload.message && event.payload.message.id === privateMessageId), 'Assistant private opt-in inject must stay out of the canonical branch event log.', problems);
777
-
778
722
  return {
779
- mainMessageCount: afterPrivateMessages.length,
780
- mainHistoryCount: afterPrivateHistory.length,
781
- messageEventCount: afterPrivateMessageEvents.length,
723
+ mainMessageCount: readJsonl(messagesFile).length,
724
+ mainHistoryCount: readJsonl(historyFile).length,
725
+ messageEventCount: readMessageEvents(eventLog).length,
782
726
  };
783
727
  }
784
728
 
@@ -884,7 +828,7 @@ async function runHealthyScenario() {
884
828
  assertDashboardScopedMessageTaskUi(problems);
885
829
  await assertBranchScopedDashboardReads(baseUrl, branchFixture, problems);
886
830
  await assertBranchAwareRespawnPrompt(baseUrl, branchFixture, respawnFixture, problems);
887
- const assistantBaseline = await assertAssistantInjectRouting(baseUrl, dataDir, eventLog, problems);
831
+ const messageBaseline = captureMessageBaseline(dataDir, eventLog);
888
832
  await assertDashboardRuleRoutes(baseUrl, canonicalState, eventLog, problems);
889
833
 
890
834
  const messagesFile = path.join(dataDir, 'messages.jsonl');
@@ -1041,8 +985,8 @@ async function runHealthyScenario() {
1041
985
  const reassignMessages = finalHistory.filter((message) => typeof message.content === 'string' && message.content.startsWith('[REASSIGNED]'));
1042
986
  const stopMessages = finalHistory.filter((message) => typeof message.content === 'string' && message.content.startsWith('[PLAN STOPPED]'));
1043
987
 
1044
- assert(finalMessages.length === assistantBaseline.mainMessageCount + 7, `Plan control routes should leave ${assistantBaseline.mainMessageCount + 7} live main-branch messages, found ${finalMessages.length}.`, problems);
1045
- assert(finalHistory.length === assistantBaseline.mainHistoryCount + 7, `Plan control routes should leave ${assistantBaseline.mainHistoryCount + 7} canonical main-branch history rows after deleting the injected dashboard message, found ${finalHistory.length}.`, problems);
988
+ assert(finalMessages.length === messageBaseline.mainMessageCount + 7, `Plan control routes should leave ${messageBaseline.mainMessageCount + 7} live main-branch messages, found ${finalMessages.length}.`, problems);
989
+ assert(finalHistory.length === messageBaseline.mainHistoryCount + 7, `Plan control routes should leave ${messageBaseline.mainHistoryCount + 7} canonical main-branch history rows after deleting the injected dashboard message, found ${finalHistory.length}.`, problems);
1046
990
  assert(pauseMessages.length === 2, 'Pause route should broadcast one message per registered agent.', problems);
1047
991
  assert(resumeMessages.length === 2, 'Resume route should broadcast one message per registered agent.', problems);
1048
992
  assert(reassignMessages.length === 1 && reassignMessages[0].to === 'beta', 'Reassign route should inject one direct message to the new assignee.', problems);