55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import { expect, test } from 'bun:test'
|
|
|
|
import { createUserMessage } from './messages.ts'
|
|
import { applyToolResultReplacementsToMessages } from './toolResultStorage.ts'
|
|
|
|
test('applyToolResultReplacementsToMessages replaces matching tool results and preserves unrelated messages', () => {
|
|
const unrelated = createUserMessage({ content: 'keep me' })
|
|
const oversizedResult = createUserMessage({
|
|
content: [
|
|
{
|
|
type: 'tool_result',
|
|
tool_use_id: 'tool-1',
|
|
content: 'very large tool output',
|
|
is_error: false,
|
|
},
|
|
],
|
|
})
|
|
const messages = [unrelated, oversizedResult]
|
|
const replacement =
|
|
'<persisted-output>\nOutput too large. Preview\n</persisted-output>'
|
|
|
|
const next = applyToolResultReplacementsToMessages(
|
|
messages,
|
|
new Map([['tool-1', replacement]]),
|
|
)
|
|
|
|
expect(next).not.toBe(messages)
|
|
expect(next[0]).toBe(unrelated)
|
|
expect(next[1]).not.toBe(oversizedResult)
|
|
expect((next[1]!.message.content as Array<{ content: string }>)[0]!.content).toBe(
|
|
replacement,
|
|
)
|
|
})
|
|
|
|
test('applyToolResultReplacementsToMessages is idempotent when messages are already hydrated', () => {
|
|
const hydrated = createUserMessage({
|
|
content: [
|
|
{
|
|
type: 'tool_result',
|
|
tool_use_id: 'tool-1',
|
|
content: '<persisted-output>\nPreview\n</persisted-output>',
|
|
is_error: false,
|
|
},
|
|
],
|
|
})
|
|
const messages = [hydrated]
|
|
|
|
const next = applyToolResultReplacementsToMessages(
|
|
messages,
|
|
new Map([['tool-1', '<persisted-output>\nPreview\n</persisted-output>']]),
|
|
)
|
|
|
|
expect(next).toBe(messages)
|
|
})
|