diff --git a/src/lib/__tests__/systemEvent.test.ts b/src/lib/__tests__/systemEvent.test.ts index 3636de3..ab68fd6 100644 --- a/src/lib/__tests__/systemEvent.test.ts +++ b/src/lib/__tests__/systemEvent.test.ts @@ -57,6 +57,18 @@ describe('isSystemEvent', () => { expect(isSystemEvent(' [EVENT] test')).toBe(true); expect(isSystemEvent('\n[cron:x] task')).toBe(true); }); + + it('detects [System Message] markers (subagent completion notifications)', () => { + expect(isSystemEvent('[System Message] Subagent spark completed: task done')).toBe(true); + expect(isSystemEvent('[system message] something happened')).toBe(true); + expect(isSystemEvent('[SYSTEM MESSAGE] All caps')).toBe(true); + expect(isSystemEvent(' [System Message] with leading whitespace')).toBe(true); + expect(isSystemEvent('\t[System Message] tab-prefixed')).toBe(true); + }); + + it('does not falsely detect [System Message] mid-sentence', () => { + expect(isSystemEvent('Hello [System Message] this is not a system event')).toBe(false); + }); }); describe('stripWebhookScaffolding', () => { diff --git a/src/lib/systemEvent.ts b/src/lib/systemEvent.ts index 3604568..af1d3de 100644 --- a/src/lib/systemEvent.ts +++ b/src/lib/systemEvent.ts @@ -20,6 +20,18 @@ const SYSTEM_PATTERNS: RegExp[] = [ // System event envelope: [source:xxx] /^\[source:\s*\w+\]/i, + + // OpenClaw subagent completion notifications + /^\[System Message\]/i, + + // Queued announce messages (batched system messages) + /^\[Queued announce messages/i, + + // Gateway system notifications (e.g. "System: [2026-02-18 ...] WhatsApp gateway connected.") + /^System:\s*\[\d{4}-\d{2}-\d{2}/, + + // Pre-compaction memory flush prompts + /^Pre-compaction memory flush/i, ]; export function isSystemEvent(text: string): boolean {