76 lines
2.1 KiB
TypeScript
76 lines
2.1 KiB
TypeScript
import { getToolRequests, getTextContent, getToolResponses } from '../types/message';
|
|
import { Message } from '../api';
|
|
|
|
export function identifyConsecutiveToolCalls(messages: Message[]): number[][] {
|
|
const chains: number[][] = [];
|
|
let currentChain: number[] = [];
|
|
|
|
for (let i = 0; i < messages.length; i++) {
|
|
const message = messages[i];
|
|
const toolRequests = getToolRequests(message);
|
|
const toolResponses = getToolResponses(message);
|
|
const textContent = getTextContent(message);
|
|
const hasText = textContent.trim().length > 0;
|
|
|
|
if (toolResponses.length > 0 && toolRequests.length === 0) {
|
|
continue;
|
|
}
|
|
|
|
if (toolRequests.length > 0) {
|
|
if (hasText) {
|
|
if (currentChain.length > 0) {
|
|
if (currentChain.length > 1) {
|
|
chains.push([...currentChain]);
|
|
}
|
|
}
|
|
currentChain = [i];
|
|
} else {
|
|
currentChain.push(i);
|
|
}
|
|
} else if (hasText) {
|
|
if (currentChain.length > 1) {
|
|
chains.push([...currentChain]);
|
|
}
|
|
currentChain = [];
|
|
} else {
|
|
if (currentChain.length > 1) {
|
|
chains.push([...currentChain]);
|
|
}
|
|
currentChain = [];
|
|
}
|
|
}
|
|
|
|
if (currentChain.length > 1) {
|
|
chains.push(currentChain);
|
|
}
|
|
|
|
return chains;
|
|
}
|
|
|
|
export function shouldHideMessage(messageIndex: number, chains: number[][]): boolean {
|
|
for (const chain of chains) {
|
|
if (chain.includes(messageIndex)) {
|
|
return chain[0] !== messageIndex;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
export function shouldHideTimestamp(messageIndex: number, chains: number[][]): boolean {
|
|
for (const chain of chains) {
|
|
if (chain.includes(messageIndex)) {
|
|
// Hide timestamp for all but the last message in the chain
|
|
return chain[chain.length - 1] !== messageIndex;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
export function isInChain(messageIndex: number, chains: number[][]): boolean {
|
|
return chains.some((chain) => chain.includes(messageIndex));
|
|
}
|
|
|
|
export function getChainForMessage(messageIndex: number, chains: number[][]): number[] | null {
|
|
return chains.find((chain) => chain.includes(messageIndex)) || null;
|
|
}
|