diff --git a/src/durable/chat-engine.ts b/src/durable/chat-engine.ts index 07b536f..a8f9ab7 100644 --- a/src/durable/chat-engine.ts +++ b/src/durable/chat-engine.ts @@ -145,13 +145,7 @@ export function handleChatTurn(input: RunChatTurnInput): ChatTurnResult { ? await hooks.transformFinalText(rawFinal) : rawFinal - try { - await hooks.persistAssistantMessage({ identity, finalText }) - } catch (err) { - log('[chat-engine] persistAssistantMessage threw', { - error: err instanceof Error ? err.message : String(err), - }) - } + await hooks.persistAssistantMessage({ identity, finalText }) if (hooks.onTurnComplete) { try { await hooks.onTurnComplete({ identity, finalText }) diff --git a/src/durable/tests/chat-engine.test.ts b/src/durable/tests/chat-engine.test.ts index 7d90b6c..6b59a89 100644 --- a/src/durable/tests/chat-engine.test.ts +++ b/src/durable/tests/chat-engine.test.ts @@ -134,7 +134,7 @@ describe('handleChatTurn', () => { expect(persisted).toBe('SSN [REDACTED]') }) - it('a throwing persist hook is swallowed — the turn still completes', async () => { + it('a throwing persist hook fails the turn before completion', async () => { const { body } = handleChatTurn({ identity: IDENTITY, log: () => undefined, @@ -146,7 +146,10 @@ describe('handleChatTurn', () => { }, }) const events = await drain(body) - expect(events.at(-1)?.type).toBe('session.run.completed') + expect(events.find((e) => e.type === 'session.run.completed')).toBeUndefined() + const err = events.find((e) => e.type === 'error') + expect(err?.data?.message).toBe('db down') + expect(events.at(-1)?.type).toBe('session.run.failed') }) it('traceFlush is handed to waitUntil so the worker isolate survives the POST', async () => { @@ -173,7 +176,7 @@ describe('handleChatTurn', () => { expect(flushAwaited).toBe(true) }) - it('swallowed hook errors are logged to console.error by default', async () => { + it('persist hook errors are logged as turn failures by default', async () => { const spy = vi.spyOn(console, 'error').mockImplementation(() => undefined) try { const { body } = handleChatTurn({ @@ -188,7 +191,7 @@ describe('handleChatTurn', () => { await drain(body) expect(spy).toHaveBeenCalled() const messages = spy.mock.calls.map((c) => c[0]) - expect(messages.some((m) => String(m).includes('persistAssistantMessage'))).toBe(true) + expect(messages.some((m) => String(m).includes('turn failed'))).toBe(true) } finally { spy.mockRestore() }