MCPcopy Create free account
hub / github.com/ChatLab/ChatLab / getHistoryForAgent

Method getHistoryForAgent

packages/node-runtime/src/ai/chats.ts:878–934  ·  view source on GitHub ↗
(
    aiChatId: string,
    maxMessages?: number,
    leafMessageId?: string | null
  )

Source from the content-addressed store, hash-verified

876 // ==================== Agent 专用 ====================
877
878 getHistoryForAgent(
879 aiChatId: string,
880 maxMessages?: number,
881 leafMessageId?: string | null
882 ): Array<{ role: 'user' | 'assistant' | 'summary'; content: string; contentBlocks?: ContentBlock[] }> {
883 const messages = this.getActivePathRows(aiChatId, leafMessageId).map((row) => this.parseMessageRow(row))
884 const validMessages = messages.filter(
885 (m) =>
886 (m.role === 'user' || m.role === 'assistant' || m.role === 'summary') &&
887 (m.content?.trim() || (m.role === 'assistant' && m.contentBlocks?.some((b) => b.type === 'tool')))
888 )
889
890 let summaryMsg: AIMessage | undefined
891 for (let i = validMessages.length - 1; i >= 0; i--) {
892 if (validMessages[i].role === 'summary') {
893 summaryMsg = validMessages[i]
894 break
895 }
896 }
897
898 let result: Array<{ role: 'user' | 'assistant' | 'summary'; content: string; contentBlocks?: ContentBlock[] }>
899
900 if (summaryMsg) {
901 const metaBlock = summaryMsg.contentBlocks?.find(
902 (b): b is Extract<ContentBlock, { type: 'summary_meta' }> => b.type === 'summary_meta'
903 )
904 const bufferBoundary = metaBlock?.bufferBoundaryTimestamp
905
906 if (!metaBlock) {
907 this.logger.warn('AIChats', 'summary message missing summary_meta; agent context will be summary-only', {
908 aiChatId,
909 messageId: summaryMsg.id,
910 })
911 }
912
913 const contextMessages = bufferBoundary
914 ? validMessages.filter((m) => m.role !== 'summary' && m.timestamp >= bufferBoundary)
915 : []
916
917 result = [
918 { role: 'summary' as const, content: summaryMsg.content },
919 ...contextMessages.map((m) => ({ role: m.role, content: m.content, contentBlocks: m.contentBlocks })),
920 ]
921 } else {
922 result = validMessages.map((m) => ({ role: m.role, content: m.content, contentBlocks: m.contentBlocks }))
923 }
924
925 if (maxMessages && result.length > maxMessages) {
926 if (result.length > 0 && result[0].role === 'summary') {
927 const rest = result.slice(1)
928 const truncated = rest.slice(-(maxMessages - 1))
929 return [result[0], ...truncated]
930 }
931 return result.slice(-maxMessages)
932 }
933 return result
934 }
935

Callers 4

registerAiChatRoutesFunction · 0.80
chats.test.tsFile · 0.80
getHistoryForAgentFunction · 0.80
runServerAgentFunction · 0.80

Calls 3

getActivePathRowsMethod · 0.95
parseMessageRowMethod · 0.95
warnMethod · 0.65

Tested by

no test coverage detected