fix(query): dedupe expanded search tail

Avoid appending search hits that were already included as context when max message expansion limits only expand the first hits.
This commit is contained in:
digua committed 2026-07-04 15:12:50 +08:00
1 parent 801e7fc66a
commit 6e5a0fa893
2 files changed
+25 -1

No files matched your search

@@ -2,6 +2,7 @@ import { describe, it } from 'node:test'
import assert from 'node:assert/strict'
import {
appendUniqueTailMessages,
assertContextAnchorsPresent,
capExpandedSearchMessages,
parseContextIds,
@@ -27,6 +28,24 @@ describe('capExpandedSearchMessages', () => {
})
})
describe('appendUniqueTailMessages', () => {
it('does not append tail hits already included by expanded context', () => {
const expanded: MessageLike[] = [
{ id: 10, senderName: 'Alice', content: 'alpha hit', timestamp: 1710000000 },
{ id: 11, senderName: 'Bob', content: 'beta hit as context', timestamp: 1710000001 },
]
const tail: MessageLike[] = [
{ id: 11, senderName: 'Bob', content: 'beta hit as context', timestamp: 1710000001 },
{ id: 12, senderName: 'Carol', content: 'tail hit', timestamp: 1710000002 },
]
assert.deepEqual(
appendUniqueTailMessages(expanded, tail).map((message) => message.id),
[10, 11, 12]
)
})
})
describe('parseContextIds', () => {
it('rejects blank id tokens instead of converting them to 0', () => {
assert.throws(() => parseContextIds('1021,'), /Invalid --id value/)
+6 -1
View File
@@ -64,6 +64,11 @@ export function capExpandedSearchMessages(
return capped.sort((a, b) => messages.indexOf(a) - messages.indexOf(b))
}
export function appendUniqueTailMessages(expanded: MessageLike[], tail: MessageLike[]): MessageLike[] {
const expandedIds = new Set(expanded.map((message) => message.id))
return [...expanded, ...tail.filter((message) => !expandedIds.has(message.id))]
}
export function parseContextIds(value: string): number[] {
const tokens = value.split(',').map((token) => token.trim())
const ids = tokens.map((token) => (token.length > 0 ? Number(token) : Number.NaN))
@@ -281,7 +286,7 @@ export function registerMessageCommands(program: Command): void {
)
const keptHits = new Set(expandableHits.map((m) => m.id))
const tail = hits.filter((m) => !keptHits.has(m.id))
pipelineMessages = [...expanded, ...tail]
pipelineMessages = appendUniqueTailMessages(expanded, tail)
if (pipelineMessages.length > maxMessages) {
pipelineMessages = capExpandedSearchMessages(pipelineMessages, hitIds, maxMessages)
warnings.push(`response capped at ${maxMessages} messages`)