MCPcopy Index your code
hub / github.com/ChatLab/ChatLab / getSearchMessageContext

Function getSearchMessageContext

packages/core/src/query/message-queries.ts:613–675  ·  view source on GitHub ↗
(
  db: DatabaseAdapter,
  messageIds: number[],
  contextBefore: number = 2,
  contextAfter: number = 2
)

Source from the content-addressed store, hash-verified

611 * Session-aware when message_context table is available, falls back to id-based ordering.
612 */
613export function getSearchMessageContext(
614 db: DatabaseAdapter,
615 messageIds: number[],
616 contextBefore: number = 2,
617 contextAfter: number = 2
618): MappedMessage[] {
619 if (messageIds.length === 0) return []
620
621 const contextIds = new Set<number>()
622
623 const hasSessionData =
624 hasTable(db, 'message_context') &&
625 (db.prepare('SELECT 1 FROM message_context LIMIT 1').get() as Record<string, unknown> | undefined) !== undefined
626
627 for (const messageId of messageIds) {
628 contextIds.add(messageId)
629
630 if (hasSessionData) {
631 const sessionRow = db.prepare('SELECT segment_id FROM message_context WHERE message_id = ?').get(messageId) as
632 | { segment_id: number }
633 | undefined
634
635 if (sessionRow) {
636 if (contextBefore > 0) {
637 const rows = db
638 .prepare(
639 `SELECT mc.message_id as id FROM message_context mc
640 WHERE mc.segment_id = ? AND mc.message_id < ?
641 ORDER BY mc.message_id DESC LIMIT ?`
642 )
643 .all(sessionRow.segment_id, messageId, contextBefore) as { id: number }[]
644 rows.forEach((r) => contextIds.add(r.id))
645 }
646 if (contextAfter > 0) {
647 const rows = db
648 .prepare(
649 `SELECT mc.message_id as id FROM message_context mc
650 WHERE mc.segment_id = ? AND mc.message_id > ?
651 ORDER BY mc.message_id ASC LIMIT ?`
652 )
653 .all(sessionRow.segment_id, messageId, contextAfter) as { id: number }[]
654 rows.forEach((r) => contextIds.add(r.id))
655 }
656 continue
657 }
658 }
659
660 if (contextBefore > 0) {
661 const rows = db
662 .prepare('SELECT id FROM message WHERE id < ? ORDER BY id DESC LIMIT ?')
663 .all(messageId, contextBefore) as { id: number }[]
664 rows.forEach((r) => contextIds.add(r.id))
665 }
666 if (contextAfter > 0) {
667 const rows = db
668 .prepare('SELECT id FROM message WHERE id > ? ORDER BY id ASC LIMIT ?')
669 .all(messageId, contextAfter) as { id: number }[]
670 rows.forEach((r) => contextIds.add(r.id))

Callers

nothing calls this directly

Calls 6

hasTableFunction · 0.90
hydrateMessagesByIdsFunction · 0.85
getMethod · 0.65
prepareMethod · 0.65
allMethod · 0.65
addMethod · 0.45

Tested by

no test coverage detected