| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- import { ClineMessage } from "./ExtensionMessage"
- /**
- * Combines API request start and finish messages in an array of ClineMessages.
- *
- * This function looks for pairs of 'api_req_started' and 'api_req_finished' messages.
- * When it finds a pair, it combines them into a single 'api_req_combined' message.
- * The JSON data in the text fields of both messages are merged.
- *
- * @param messages - An array of ClineMessage objects to process.
- * @returns A new array of ClineMessage objects with API requests combined.
- *
- * @example
- * const messages = [
- * { type: "say", say: "api_req_started", text: '{"request":"GET /api/data"}', ts: 1000 },
- * { type: "say", say: "api_req_finished", text: '{"cost":0.005}', ts: 1001 }
- * ];
- * const result = combineApiRequests(messages);
- * // Result: [{ type: "say", say: "api_req_started", text: '{"request":"GET /api/data","cost":0.005}', ts: 1000 }]
- */
- export function combineApiRequests(messages: ClineMessage[]): ClineMessage[] {
- const combinedApiRequests: ClineMessage[] = []
- for (let i = 0; i < messages.length; i++) {
- if (messages[i].type === "say" && messages[i].say === "api_req_started") {
- let startedRequest = JSON.parse(messages[i].text || "{}")
- let j = i + 1
- while (j < messages.length) {
- if (messages[j].type === "say" && messages[j].say === "api_req_finished") {
- let finishedRequest = JSON.parse(messages[j].text || "{}")
- let combinedRequest = { ...startedRequest, ...finishedRequest }
- combinedApiRequests.push({
- ...messages[i],
- text: JSON.stringify(combinedRequest),
- })
- i = j // Skip to the api_req_finished message
- break
- }
- j++
- }
- if (j === messages.length) {
- // If no matching api_req_finished found, keep the original api_req_started
- combinedApiRequests.push(messages[i])
- }
- }
- }
- // Replace original api_req_started and remove api_req_finished
- return messages
- .filter((msg) => !(msg.type === "say" && msg.say === "api_req_finished"))
- .map((msg) => {
- if (msg.type === "say" && msg.say === "api_req_started") {
- const combinedRequest = combinedApiRequests.find((req) => req.ts === msg.ts)
- return combinedRequest || msg
- }
- return msg
- })
- }
|