Compare commits

...

3 Commits

Author SHA1 Message Date
Gabi Simons 95818027b3 fix: handle duplicate message ID in session DB insert
Use INSERT OR IGNORE and escalate trigger 0→1 when the row already
exists. Prevents approval replays from failing when the message was
already accumulated by a duplicate platform event.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 13:55:13 +00:00
Gabi Simons 9a71fe1d7e style: fix prettier formatting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 13:41:23 +00:00
Gabi Simons 4fb22be8da fix: handle duplicate message ID in session DB insert
Use INSERT OR IGNORE and escalate trigger 0→1 when the row already
exists. Prevents approval replays from failing when the message was
already accumulated by a duplicate platform event.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 13:35:32 +00:00
+17 -7
View File
@@ -8,6 +8,7 @@
import Database from 'better-sqlite3';
import { INBOUND_SCHEMA, OUTBOUND_SCHEMA } from './schema.js';
import { log } from '../log.js';
/** Apply the inbound or outbound schema to a DB file. Idempotent. */
export function ensureSchema(dbPath: string, schema: 'inbound' | 'outbound'): void {
@@ -102,14 +103,23 @@ export function insertMessage(
trigger?: 0 | 1;
},
): void {
db.prepare(
`INSERT INTO messages_in (id, seq, kind, timestamp, status, platform_id, channel_type, thread_id, content, process_after, recurrence, series_id, trigger)
const trigger = message.trigger ?? 1;
const result = db
.prepare(
`INSERT OR IGNORE INTO messages_in (id, seq, kind, timestamp, status, platform_id, channel_type, thread_id, content, process_after, recurrence, series_id, trigger)
VALUES (@id, @seq, @kind, @timestamp, 'pending', @platformId, @channelType, @threadId, @content, @processAfter, @recurrence, @id, @trigger)`,
).run({
...message,
trigger: message.trigger ?? 1,
seq: nextEvenSeq(db),
});
)
.run({
...message,
trigger,
seq: nextEvenSeq(db),
});
if (result.changes === 0) {
log.warn('Duplicate message ID ignored', { id: message.id });
if (trigger === 1) {
db.prepare(`UPDATE messages_in SET trigger = 1 WHERE id = ? AND trigger = 0`).run(message.id);
}
}
}
export function countDueMessages(db: Database.Database): number {