Skip to content

Commit a70b517

Browse files
authored
Merge pull request #969 from mnfst/fix/duplicate-ghost-messages
fix: eliminate duplicate ghost messages in dashboard
2 parents 0ada88c + 5fbaeed commit a70b517

File tree

12 files changed

+777
-497
lines changed

12 files changed

+777
-497
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
"manifest": patch
3+
---
4+
5+
Fix duplicate/ghost messages in dashboard
6+
7+
- Remove dummy seed data (seed-messages, demo security events, admin user)
8+
- Record all proxy errors (not just 429/403/500+) so 400 errors show as Failed
9+
- Fix ghost duplicate messages: unknown OTLP spans no longer create agent_messages
10+
- Add timestamp-based dedup to prevent OTLP spans from duplicating proxy error records

packages/backend/src/database/seed-messages.spec.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,7 @@ describe('seedAgentMessages', () => {
6666
await seedAgentMessages(mockRepo as never, 'user-1', logger);
6767

6868
expect(logger.log).toHaveBeenCalledTimes(1);
69-
expect(logger.log).toHaveBeenCalledWith(
70-
expect.stringMatching(/^Seeded \d+ agent messages$/),
71-
);
69+
expect(logger.log).toHaveBeenCalledWith(expect.stringMatching(/^Seeded \d+ agent messages$/));
7270
});
7371

7472
it('should generate approximately 695 messages over 7 days', async () => {
@@ -102,12 +100,7 @@ describe('seedAgentMessages', () => {
102100
agentName: 'my-agent',
103101
};
104102

105-
await seedAgentMessages(
106-
mockRepo as never,
107-
'user-2',
108-
logger,
109-
customCtx,
110-
);
103+
await seedAgentMessages(mockRepo as never, 'user-2', logger, customCtx);
111104

112105
const messages = collectInsertedMessages(mockRepo);
113106
expect(messages.length).toBeGreaterThan(0);

packages/backend/src/database/seed-messages.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,21 @@ export async function seedAgentMessages(
1818
messageRepo: Repository<AgentMessage>,
1919
userId: string,
2020
logger: Logger,
21-
ctx: SeedContext = { tenantId: 'seed-tenant-001', agentId: 'seed-agent-001', agentName: 'demo-agent' },
21+
ctx: SeedContext = {
22+
tenantId: 'seed-tenant-001',
23+
agentId: 'seed-agent-001',
24+
agentName: 'demo-agent',
25+
},
2226
): Promise<void> {
2327
const count = await messageRepo.count();
2428
if (count > 0) return;
2529

26-
const models = ['claude-sonnet-4-5-20250929', 'gpt-4o', 'claude-haiku-4-5-20251001', 'gemini-2.5-flash'];
30+
const models = [
31+
'claude-sonnet-4-5-20250929',
32+
'gpt-4o',
33+
'claude-haiku-4-5-20251001',
34+
'gemini-2.5-flash',
35+
];
2736
const now = Date.now();
2837
const messages: Array<Partial<AgentMessage>> = [];
2938
let idx = 0;
@@ -33,9 +42,10 @@ export async function seedAgentMessages(
3342
const hourBase = now - h * 3600000;
3443
// Fewer messages at night (hours 0-7 UTC), more during work hours
3544
const utcHour = new Date(hourBase).getUTCHours();
36-
const msgCount = utcHour >= 8 && utcHour <= 22
37-
? 4 + Math.floor(seededRandom(h) * 5)
38-
: Math.floor(seededRandom(h + 500) * 3);
45+
const msgCount =
46+
utcHour >= 8 && utcHour <= 22
47+
? 4 + Math.floor(seededRandom(h) * 5)
48+
: Math.floor(seededRandom(h + 500) * 3);
3949

4050
for (let m = 0; m < msgCount; m++) {
4151
idx++;

0 commit comments

Comments
 (0)