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.
- package/README.md +3 -2
- package/USAGE.md +1 -1
- package/cli.js +1193 -1264
- package/conversation-templates/autonomous-feature.json +4 -4
- package/conversation-templates/code-review.json +3 -3
- package/conversation-templates/debug-squad.json +3 -3
- package/conversation-templates/feature-build.json +3 -3
- package/conversation-templates/research-write.json +3 -3
- package/dashboard.html +329 -177
- package/dashboard.js +3459 -3476
- package/package.json +114 -113
- package/scripts/check-dashboard-control-plane.js +7 -63
- package/server.js +33 -333
- package/templates/debate.json +2 -2
- package/templates/managed.json +4 -4
- package/templates/pair.json +2 -2
- package/templates/review.json +2 -2
- package/templates/team.json +3 -3
- package/vendor/highlight-github-dark.min.css +10 -0
- package/vendor/highlight.min.js +1232 -0
- package/vendor/katex-fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/vendor/katex-fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/vendor/katex.min.css +1 -0
- package/vendor/katex.min.js +1 -0
- package/vendor/marked.min.js +6 -0
- 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
|
-
"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
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"
|
|
84
|
-
"claude
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
"
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
"
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"
|
|
104
|
-
"
|
|
105
|
-
|
|
106
|
-
"
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
"
|
|
111
|
-
"
|
|
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
|
-
|
|
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:
|
|
780
|
-
mainHistoryCount:
|
|
781
|
-
messageEventCount:
|
|
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
|
|
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 ===
|
|
1045
|
-
assert(finalHistory.length ===
|
|
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);
|