combineApiRequests.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { ClineMessage } from "./ExtensionMessage"
  2. /**
  3. * Combines API request start and finish messages in an array of ClineMessages.
  4. *
  5. * This function looks for pairs of 'api_req_started' and 'api_req_finished' messages.
  6. * When it finds a pair, it combines them into a single 'api_req_combined' message.
  7. * The JSON data in the text fields of both messages are merged.
  8. *
  9. * @param messages - An array of ClineMessage objects to process.
  10. * @returns A new array of ClineMessage objects with API requests combined.
  11. *
  12. * @example
  13. * const messages = [
  14. * { type: "say", say: "api_req_started", text: '{"request":"GET /api/data"}', ts: 1000 },
  15. * { type: "say", say: "api_req_finished", text: '{"cost":0.005}', ts: 1001 }
  16. * ];
  17. * const result = combineApiRequests(messages);
  18. * // Result: [{ type: "say", say: "api_req_started", text: '{"request":"GET /api/data","cost":0.005}', ts: 1000 }]
  19. */
  20. export function combineApiRequests(messages: ClineMessage[]): ClineMessage[] {
  21. const combinedApiRequests: ClineMessage[] = []
  22. for (let i = 0; i < messages.length; i++) {
  23. if (messages[i].type === "say" && messages[i].say === "api_req_started") {
  24. let startedRequest = JSON.parse(messages[i].text || "{}")
  25. let j = i + 1
  26. while (j < messages.length) {
  27. if (messages[j].type === "say" && messages[j].say === "api_req_finished") {
  28. let finishedRequest = JSON.parse(messages[j].text || "{}")
  29. let combinedRequest = { ...startedRequest, ...finishedRequest }
  30. combinedApiRequests.push({
  31. ...messages[i],
  32. text: JSON.stringify(combinedRequest),
  33. })
  34. i = j // Skip to the api_req_finished message
  35. break
  36. }
  37. j++
  38. }
  39. if (j === messages.length) {
  40. // If no matching api_req_finished found, keep the original api_req_started
  41. combinedApiRequests.push(messages[i])
  42. }
  43. }
  44. }
  45. // Replace original api_req_started and remove api_req_finished
  46. return messages
  47. .filter((msg) => !(msg.type === "say" && msg.say === "api_req_finished"))
  48. .map((msg) => {
  49. if (msg.type === "say" && msg.say === "api_req_started") {
  50. const combinedRequest = combinedApiRequests.find((req) => req.ts === msg.ts)
  51. return combinedRequest || msg
  52. }
  53. return msg
  54. })
  55. }