Files
tkmind_go/ui/desktop/src/utils/toolCallChaining.ts
T

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;
}