@inkeep/agents-manage-ui 0.31.2 → 0.31.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/.next/standalone/agents-manage-ui/.next/BUILD_ID +1 -1
  2. package/.next/standalone/agents-manage-ui/.next/app-build-manifest.json +386 -386
  3. package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +8 -8
  4. package/.next/standalone/agents-manage-ui/.next/build-manifest.json +5 -5
  5. package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/agents-manage-ui/.next/react-loadable-manifest.json +5 -5
  7. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js +2 -2
  8. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js.nft.json +1 -1
  9. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page.js +1 -1
  11. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page.js.nft.json +1 -1
  12. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page.js +2 -2
  14. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page.js.nft.json +1 -1
  15. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page.js +2 -2
  17. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page.js.nft.json +1 -1
  18. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
  20. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js.nft.json +1 -1
  21. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js +2 -2
  23. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js.nft.json +1 -1
  24. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js +2 -2
  26. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js.nft.json +1 -1
  27. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js +2 -2
  29. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js.nft.json +1 -1
  30. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js +2 -2
  32. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js.nft.json +1 -1
  33. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js +2 -2
  35. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js.nft.json +1 -1
  36. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js +2 -2
  38. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js.nft.json +1 -1
  39. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +2 -2
  41. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js.nft.json +1 -1
  42. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
  44. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js.nft.json +1 -1
  45. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +2 -2
  47. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js.nft.json +1 -1
  48. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
  50. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
  51. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +2 -2
  53. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js.nft.json +1 -1
  54. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
  56. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js.nft.json +1 -1
  57. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page.js +2 -2
  59. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page.js.nft.json +1 -1
  60. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/page.js +2 -2
  62. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/page.js.nft.json +1 -1
  63. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/new/page.js +1 -1
  65. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/new/page.js.nft.json +1 -1
  66. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/new/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/page.js +2 -2
  68. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/page.js.nft.json +1 -1
  69. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
  71. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
  72. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
  73. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
  74. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js.nft.json +1 -1
  75. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +2 -2
  77. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
  78. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
  79. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +2 -2
  80. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js.nft.json +1 -1
  81. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
  82. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
  83. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js.nft.json +1 -1
  84. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  85. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +2 -2
  86. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js.nft.json +1 -1
  87. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  88. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +2 -2
  89. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
  90. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
  91. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +2 -2
  92. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js.nft.json +1 -1
  93. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
  94. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +3 -3
  95. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
  96. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +1 -1
  98. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js.nft.json +1 -1
  99. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
  100. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +2 -2
  101. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js.nft.json +1 -1
  102. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  103. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
  104. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
  105. package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-render/route.js +5 -5
  106. package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-render/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route.js +2 -2
  108. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route.js.nft.json +1 -1
  109. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route.js +1 -1
  111. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route.js.nft.json +1 -1
  112. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
  114. package/.next/standalone/agents-manage-ui/.next/server/app/page.js.nft.json +1 -1
  115. package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  116. package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +8 -8
  117. package/.next/standalone/agents-manage-ui/.next/server/chunks/1154.js +3 -0
  118. package/.next/standalone/agents-manage-ui/.next/server/chunks/1256.js +21 -0
  119. package/.next/standalone/agents-manage-ui/.next/server/chunks/2323.js +2 -2
  120. package/.next/standalone/agents-manage-ui/.next/server/chunks/{7222.js → 3010.js} +2 -2
  121. package/.next/standalone/agents-manage-ui/.next/server/chunks/3200.js +1 -1
  122. package/.next/standalone/agents-manage-ui/.next/server/chunks/341.js +5 -5
  123. package/.next/standalone/agents-manage-ui/.next/server/chunks/{8850.js → 3828.js} +2 -2
  124. package/.next/standalone/agents-manage-ui/.next/server/chunks/4429.js +1 -1
  125. package/.next/standalone/agents-manage-ui/.next/server/chunks/4881.js +1 -0
  126. package/.next/standalone/agents-manage-ui/.next/server/chunks/5316.js +3 -3
  127. package/.next/standalone/agents-manage-ui/.next/server/chunks/565.js +1 -0
  128. package/.next/standalone/agents-manage-ui/.next/server/chunks/7172.js +59 -0
  129. package/.next/standalone/agents-manage-ui/.next/server/chunks/762.js +1 -0
  130. package/.next/standalone/agents-manage-ui/.next/server/chunks/7867.js +3 -0
  131. package/.next/standalone/agents-manage-ui/.next/server/chunks/817.js +7 -0
  132. package/.next/standalone/agents-manage-ui/.next/server/chunks/8320.js +1 -1
  133. package/.next/standalone/agents-manage-ui/.next/server/chunks/8359.js +2 -2
  134. package/.next/standalone/agents-manage-ui/.next/server/chunks/8717.js +7 -0
  135. package/.next/standalone/agents-manage-ui/.next/server/chunks/910.js +1 -0
  136. package/.next/standalone/agents-manage-ui/.next/server/chunks/9215.js +2 -0
  137. package/.next/standalone/agents-manage-ui/.next/server/chunks/9542.js +1 -1
  138. package/.next/standalone/agents-manage-ui/.next/server/chunks/9920.js +1 -1
  139. package/.next/standalone/agents-manage-ui/.next/server/middleware-build-manifest.js +1 -1
  140. package/.next/standalone/agents-manage-ui/.next/server/middleware-manifest.json +5 -5
  141. package/.next/standalone/agents-manage-ui/.next/server/middleware-react-loadable-manifest.js +1 -1
  142. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  143. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  144. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  145. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  146. package/.next/standalone/agents-manage-ui/.next/static/chunks/{15856-1c0d565481823c90.js → 15856-09dd885eb1330cba.js} +1 -1
  147. package/.next/standalone/agents-manage-ui/.next/static/chunks/17430-81adddca8d7ea403.js +1 -0
  148. package/.next/standalone/agents-manage-ui/.next/static/chunks/{20230-9e682a378cded58b.js → 20230-e6df79ff74df3be2.js} +1 -1
  149. package/.next/standalone/agents-manage-ui/.next/static/chunks/22205-1bace94483c408ae.js +1 -0
  150. package/.next/standalone/agents-manage-ui/.next/static/chunks/26959-ac6be17f7b14778b.js +4 -0
  151. package/.next/standalone/agents-manage-ui/.next/static/chunks/26ce58ee-98907bc43d1a4249.js +1 -0
  152. package/.next/standalone/agents-manage-ui/.next/static/chunks/37058-88c6556ebedb9d47.js +1 -0
  153. package/.next/standalone/agents-manage-ui/.next/static/chunks/38474-4ab4ddfcf860813d.js +1 -0
  154. package/.next/standalone/agents-manage-ui/.next/static/chunks/39256-7a33a7cfbdecf52b.js +1 -0
  155. package/.next/standalone/agents-manage-ui/.next/static/chunks/{69922-80ec4a62004d58c4.js → 42966-c45601890893f4fe.js} +1 -1
  156. package/.next/standalone/agents-manage-ui/.next/static/chunks/47380-98ba7170ef8d47cd.js +2 -0
  157. package/.next/standalone/agents-manage-ui/.next/static/chunks/50118.0a75e445f38b54be.js +1 -0
  158. package/.next/standalone/agents-manage-ui/.next/static/chunks/51397-ed3623cc53c3cd80.js +1 -0
  159. package/.next/standalone/agents-manage-ui/.next/static/chunks/54339.3d0067056dcd81a1.js +21 -0
  160. package/.next/standalone/agents-manage-ui/.next/static/chunks/{55157-6a21951f274247bf.js → 55157-25e4c0b9f9d95f2c.js} +1 -1
  161. package/.next/standalone/agents-manage-ui/.next/static/chunks/56117-a96a6a5a77f14ba0.js +1 -0
  162. package/.next/standalone/agents-manage-ui/.next/static/chunks/59486-8769b1f3731e60a2.js +1 -0
  163. package/.next/standalone/agents-manage-ui/.next/static/chunks/{68002-f59809251cf09505.js → 68002-b76852b22fc5fee4.js} +1 -1
  164. package/.next/standalone/agents-manage-ui/.next/static/chunks/69468-01069f0d07a3d296.js +1 -0
  165. package/.next/standalone/agents-manage-ui/.next/static/chunks/71839-e9ba4ed0b3ce7668.js +1 -0
  166. package/.next/standalone/agents-manage-ui/.next/static/chunks/{44564-9e20d0aa6462332e.js → 75824-37e301e785290f2b.js} +3 -3
  167. package/.next/standalone/agents-manage-ui/.next/static/chunks/7965-be321dadb7ef1e3d.js +1 -0
  168. package/.next/standalone/agents-manage-ui/.next/static/chunks/{81385-a18027979245b8ba.js → 81385-bf660a5d2d61583a.js} +1 -1
  169. package/.next/standalone/agents-manage-ui/.next/static/chunks/82582-f12a9691334251ce.js +1 -0
  170. package/.next/standalone/agents-manage-ui/.next/static/chunks/85210-7e4bb57822963370.js +1 -0
  171. package/.next/standalone/agents-manage-ui/.next/static/chunks/91340-6a4c648f7a6b13e5.js +1 -0
  172. package/.next/standalone/agents-manage-ui/.next/static/chunks/9766-12c570d61ec6ab54.js +1 -0
  173. package/.next/standalone/agents-manage-ui/.next/static/chunks/98749-e87db9b701dfca1b.js +1 -0
  174. package/.next/standalone/agents-manage-ui/.next/static/chunks/99724-b87437be879a6140.js +1 -0
  175. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/{layout-e66f642723ccd93b.js → layout-31bb2858b2f8811e.js} +1 -1
  176. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/loading-944993d8fc3247d7.js +1 -0
  177. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/{page-8e34e2422ddc45de.js → page-3d0c92c01eb13e24.js} +1 -1
  178. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/loading-42ca76a38db680de.js +1 -0
  179. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/loading-944993d8fc3247d7.js +1 -0
  180. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-d714a4fd03dc2306.js +1 -0
  181. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/{page-1207500809383f17.js → page-e8da5303d0df1f6d.js} +1 -1
  182. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-cf48ef911f40e1b0.js +1 -0
  183. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-2d39e5bec5da14d1.js +1 -0
  184. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/loading-42ca76a38db680de.js +1 -0
  185. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-fcb1a45f6cf225b4.js +1 -0
  186. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/page-cd3eec2d38bfaec1.js +1 -0
  187. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page-e34ef47a0a056252.js +1 -0
  188. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/loading-42ca76a38db680de.js +1 -0
  189. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/page-82bc98ae0bea5273.js +1 -0
  190. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/{page-aa211e5da28faa82.js → page-9071c8ddc4ff3843.js} +1 -1
  191. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-df7b2ca0e2b96bcf.js +1 -0
  192. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-152052de97b91e11.js +1 -0
  193. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/page-d8315dd1c127c20b.js +1 -0
  194. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-1bbcd9cde29e316e.js +1 -0
  195. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/page-862b1820966e3977.js +1 -0
  196. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-5e90a9b8050e3b71.js → page-52f8080522e65045.js} +1 -1
  197. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/{page-50d74ddef6e99686.js → page-e207f1a9d366dec2.js} +1 -1
  198. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/{page-8739eba7fb6b7c3f.js → page-c15ae98c8da775e7.js} +1 -1
  199. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/new/{page-335a289b10ad7d8f.js → page-efadffe3f843917d.js} +1 -1
  200. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/{page-9214d7125c43bd52.js → page-d41caff7520558f0.js} +1 -1
  201. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/layout-4af5b70dd3a69eb5.js +1 -0
  202. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page-d0889bb0ecbba52a.js +1 -0
  203. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-f43afc20c7b679cc.js +1 -0
  204. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/layout-944993d8fc3247d7.js +1 -0
  205. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-a91a42b87b2e71b7.js → page-76e93febd8faae06.js} +1 -1
  206. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/{page-e74d50c7cdc49b6f.js → page-d5141432493a5eaa.js} +1 -1
  207. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/page-fc7bc85c3a758e9a.js +1 -0
  208. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/ai-calls/{page-b012ba4c8a9cf2a0.js → page-ff6bb6ad21bedf2e.js} +1 -1
  209. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/{page-fe4008846a914db1.js → page-915bc11a351377b6.js} +1 -1
  210. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-df885415e1c2fe8a.js +1 -0
  211. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/{error-a1359463041b7cb1.js → error-621f86deca7b05c4.js} +1 -1
  212. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/loading-42ca76a38db680de.js +1 -0
  213. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-c6e860aa7b2d726b.js +1 -0
  214. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/{layout-f47682f88d3d813a.js → layout-33cfcac33a61ad21.js} +1 -1
  215. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/not-found-8accd4bc464e6ed0.js +1 -0
  216. package/.next/standalone/agents-manage-ui/.next/static/chunks/{d834c995-2978306478aa994f.js → d834c995-85cbaf1e7f74897d.js} +1 -1
  217. package/.next/standalone/agents-manage-ui/.next/static/chunks/{webpack-2b77e2d9a4d43411.js → webpack-314a6b9a2162cc11.js} +1 -1
  218. package/.next/standalone/agents-manage-ui/package.json +1 -1
  219. package/.next/standalone/package.json +1 -1
  220. package/.next/standalone/packages/agents-core/package.json +1 -1
  221. package/package.json +4 -4
  222. package/src/app/layout.tsx +4 -6
  223. package/src/components/agent/agent.tsx +13 -187
  224. package/src/components/agent/configuration/node-types.tsx +7 -9
  225. package/src/components/agent/nodes/function-tool-node.tsx +4 -3
  226. package/src/components/agent/nodes/mcp-node.tsx +6 -4
  227. package/src/components/agent/nodes/sub-agent-node.tsx +6 -5
  228. package/src/components/editors/monaco-editor.tsx +2 -1
  229. package/src/components/traces/conversation-stats/conversation-stats-card.tsx +3 -1
  230. package/src/components/traces/traces-overview.tsx +3 -34
  231. package/src/components/ui/chart.tsx +4 -6
  232. package/src/components/ui/sidebar.tsx +11 -17
  233. package/src/components/ui/sonner.tsx +5 -7
  234. package/src/env.d.ts +6 -0
  235. package/src/features/agent/state/use-agent-store.ts +186 -1
  236. package/src/hooks/use-traces.ts +18 -26
  237. package/src/lib/api/signoz-stats.ts +964 -322
  238. package/.next/standalone/agents-manage-ui/.next/server/chunks/1019.js +0 -3
  239. package/.next/standalone/agents-manage-ui/.next/server/chunks/1798.js +0 -1
  240. package/.next/standalone/agents-manage-ui/.next/server/chunks/1870.js +0 -3
  241. package/.next/standalone/agents-manage-ui/.next/server/chunks/3252.js +0 -21
  242. package/.next/standalone/agents-manage-ui/.next/server/chunks/4035.js +0 -59
  243. package/.next/standalone/agents-manage-ui/.next/server/chunks/4266.js +0 -2
  244. package/.next/standalone/agents-manage-ui/.next/server/chunks/4565.js +0 -1
  245. package/.next/standalone/agents-manage-ui/.next/server/chunks/471.js +0 -1
  246. package/.next/standalone/agents-manage-ui/.next/server/chunks/6224.js +0 -7
  247. package/.next/standalone/agents-manage-ui/.next/server/chunks/6846.js +0 -7
  248. package/.next/standalone/agents-manage-ui/.next/server/chunks/7694.js +0 -1
  249. package/.next/standalone/agents-manage-ui/.next/static/chunks/13800-8b62227acaf1d8c4.js +0 -1
  250. package/.next/standalone/agents-manage-ui/.next/static/chunks/22771-0e9d7cc312e01de9.js +0 -4
  251. package/.next/standalone/agents-manage-ui/.next/static/chunks/24998-8267de4fee32fdd3.js +0 -1
  252. package/.next/standalone/agents-manage-ui/.next/static/chunks/25725-72039fec01d6a8aa.js +0 -1
  253. package/.next/standalone/agents-manage-ui/.next/static/chunks/30425-adb15751f909fe05.js +0 -1
  254. package/.next/standalone/agents-manage-ui/.next/static/chunks/32117-450ada46f337d096.js +0 -1
  255. package/.next/standalone/agents-manage-ui/.next/static/chunks/35593-85ae13afe175b818.js +0 -1
  256. package/.next/standalone/agents-manage-ui/.next/static/chunks/39256-9260daa4d57967e7.js +0 -1
  257. package/.next/standalone/agents-manage-ui/.next/static/chunks/44088-c77162e570c1bc89.js +0 -1
  258. package/.next/standalone/agents-manage-ui/.next/static/chunks/50118.1c7ac0c134716b42.js +0 -1
  259. package/.next/standalone/agents-manage-ui/.next/static/chunks/56018-2017cc6699042351.js +0 -1
  260. package/.next/standalone/agents-manage-ui/.next/static/chunks/63312-6aa0e1c17fdce4a3.js +0 -1
  261. package/.next/standalone/agents-manage-ui/.next/static/chunks/67757-e4140627ca46b971.js +0 -1
  262. package/.next/standalone/agents-manage-ui/.next/static/chunks/69468-be0bcbda8df26c04.js +0 -1
  263. package/.next/standalone/agents-manage-ui/.next/static/chunks/70976-b6f9e676fdc032c2.js +0 -1
  264. package/.next/standalone/agents-manage-ui/.next/static/chunks/7965-1067e6233a8baca9.js +0 -1
  265. package/.next/standalone/agents-manage-ui/.next/static/chunks/8158-232ccf269e449fc2.js +0 -2
  266. package/.next/standalone/agents-manage-ui/.next/static/chunks/82070-883a6227427cebc4.js +0 -1
  267. package/.next/standalone/agents-manage-ui/.next/static/chunks/84786.7c6cb8be9d017cdb.js +0 -21
  268. package/.next/standalone/agents-manage-ui/.next/static/chunks/85210-3a01809007cd1e92.js +0 -1
  269. package/.next/standalone/agents-manage-ui/.next/static/chunks/85243-7293f2c466618147.js +0 -1
  270. package/.next/standalone/agents-manage-ui/.next/static/chunks/a55e24b0-7c9cde0bd0185f82.js +0 -1
  271. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/loading-866cda7d98d58bd6.js +0 -1
  272. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/loading-a594729be8c73cf0.js +0 -1
  273. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/loading-866cda7d98d58bd6.js +0 -1
  274. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-9f9ddb7a4badaad2.js +0 -1
  275. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-6f78a6fd92e5ff63.js +0 -1
  276. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-2d3bdbfb4622fa25.js +0 -1
  277. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/loading-a594729be8c73cf0.js +0 -1
  278. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-09e32f2611ffb43b.js +0 -1
  279. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/page-56a7be558e0bc582.js +0 -1
  280. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page-27c32c2f4bd220f7.js +0 -1
  281. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/loading-a594729be8c73cf0.js +0 -1
  282. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/page-202aa02477e1b210.js +0 -1
  283. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-9aa9f07f327449c1.js +0 -1
  284. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-561921847476336c.js +0 -1
  285. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/page-63d5f110cc49f556.js +0 -1
  286. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-170b732b2b4c7b9c.js +0 -1
  287. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/page-466d42d67267fd0e.js +0 -1
  288. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/layout-4841785b7824ff30.js +0 -1
  289. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page-0ca9585ad8d581b6.js +0 -1
  290. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-55f04b965b81e425.js +0 -1
  291. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/layout-866cda7d98d58bd6.js +0 -1
  292. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/page-fc360d9f82c0829b.js +0 -1
  293. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-813233c0e219a7a5.js +0 -1
  294. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/loading-a594729be8c73cf0.js +0 -1
  295. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-5d8060965caa4500.js +0 -1
  296. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/not-found-5db02119edd84936.js +0 -1
  297. /package/.next/standalone/agents-manage-ui/.next/static/{rB-LPdexR5uTFEscf1yA2 → i6GLHI_W62QkxURNDKYIc}/_buildManifest.js +0 -0
  298. /package/.next/standalone/agents-manage-ui/.next/static/{rB-LPdexR5uTFEscf1yA2 → i6GLHI_W62QkxURNDKYIc}/_ssgManifest.js +0 -0
@@ -6,6 +6,7 @@ import {
6
6
  AI_OPERATIONS,
7
7
  AI_TOOL_TYPES,
8
8
  DATA_SOURCES,
9
+ DATA_TYPES,
9
10
  OPERATORS,
10
11
  ORDER_DIRECTIONS,
11
12
  PANEL_TYPES,
@@ -87,6 +88,8 @@ const FilterValueSchema = z.union([z.string(), z.number(), z.boolean()]);
87
88
 
88
89
  type FilterValue = z.infer<typeof FilterValueSchema>;
89
90
 
91
+ type DataType = (typeof DATA_TYPES)[keyof typeof DATA_TYPES];
92
+
90
93
  const asTypedFilterValue = (v: string): FilterValue => {
91
94
  try {
92
95
  // Handle boolean values
@@ -163,146 +166,266 @@ class SigNozStatsAPI {
163
166
  async getConversationStats(
164
167
  startTime: number,
165
168
  endTime: number,
166
- filters?: SpanFilterOptions,
167
- projectId?: string,
168
- pagination?: { page: number; limit: number },
169
- searchQuery?: string,
170
- agentId?: string
171
- ): Promise<ConversationStats[] | PaginatedConversationStats> {
169
+ filters: SpanFilterOptions | undefined,
170
+ projectId: string | undefined,
171
+ pagination: { page: number; limit: number },
172
+ searchQuery: string | undefined,
173
+ agentId: string | undefined
174
+ ): Promise<PaginatedConversationStats> {
172
175
  try {
173
- const payload = this.buildCombinedPayload(startTime, endTime, filters, projectId, agentId);
174
- const resp = await this.makeRequest(payload);
176
+ return await this.getConversationStatsPaginated(
177
+ startTime,
178
+ endTime,
179
+ filters,
180
+ projectId,
181
+ pagination,
182
+ searchQuery,
183
+ agentId
184
+ );
185
+ } catch (e) {
186
+ console.error('getConversationStats error:', e);
187
+ return {
188
+ data: [],
189
+ pagination: {
190
+ page: pagination.page,
191
+ limit: pagination.limit,
192
+ total: 0,
193
+ totalPages: 0,
194
+ hasNextPage: false,
195
+ hasPreviousPage: false,
196
+ },
197
+ };
198
+ }
199
+ }
175
200
 
176
- const toolsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TOOLS);
177
- const transfersSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TRANSFERS);
178
- const delegationsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.DELEGATIONS);
179
- const aiCallsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.AI_CALLS);
180
- const lastActivitySeries = this.extractSeries(resp, QUERY_EXPRESSIONS.LAST_ACTIVITY);
181
- const metadataSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.CONVERSATION_METADATA);
182
- const spansWithErrorsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.SPANS_WITH_ERRORS);
183
- const userMessagesSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.USER_MESSAGES);
184
-
185
- // metadata map
186
- const metaByConv = new Map<
187
- string,
188
- { tenantId: string; agentId: string; agentName: string }
189
- >();
190
- for (const s of metadataSeries) {
191
- const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
192
- if (!id) continue;
193
- metaByConv.set(id, {
194
- tenantId: s.labels?.[SPAN_KEYS.TENANT_ID] ?? UNKNOWN_VALUE,
195
- agentId: s.labels?.[SPAN_KEYS.AGENT_ID] ?? UNKNOWN_VALUE,
196
- agentName: s.labels?.[SPAN_KEYS.AGENT_NAME] ?? UNKNOWN_VALUE,
197
- });
201
+ private async getConversationStatsPaginated(
202
+ startTime: number,
203
+ endTime: number,
204
+ filters: SpanFilterOptions | undefined,
205
+ projectId: string | undefined,
206
+ pagination: { page: number; limit: number },
207
+ searchQuery: string | undefined,
208
+ agentId: string | undefined
209
+ ): Promise<PaginatedConversationStats> {
210
+ // Step 1: Get total count and paginated conversation IDs sorted by last activity
211
+ const { conversationIds, total } = await this.getPaginatedConversationIds(
212
+ startTime,
213
+ endTime,
214
+ filters,
215
+ projectId,
216
+ pagination,
217
+ searchQuery,
218
+ agentId
219
+ );
220
+
221
+ if (conversationIds.length === 0) {
222
+ return {
223
+ data: [],
224
+ pagination: {
225
+ page: pagination.page,
226
+ limit: pagination.limit,
227
+ total,
228
+ totalPages: Math.ceil(total / pagination.limit),
229
+ hasNextPage: pagination.page < Math.ceil(total / pagination.limit),
230
+ hasPreviousPage: pagination.page > 1,
231
+ },
232
+ };
233
+ }
234
+
235
+ // Step 2: Fetch detailed stats only for the paginated conversation IDs
236
+ const payload = this.buildCombinedPayload(
237
+ startTime,
238
+ endTime,
239
+ filters,
240
+ projectId,
241
+ agentId,
242
+ conversationIds
243
+ );
244
+ const resp = await this.makeRequest(payload);
245
+
246
+ const toolsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TOOLS);
247
+ const transfersSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TRANSFERS);
248
+ const delegationsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.DELEGATIONS);
249
+ const aiCallsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.AI_CALLS);
250
+ const lastActivitySeries = this.extractSeries(resp, QUERY_EXPRESSIONS.LAST_ACTIVITY);
251
+ const metadataSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.CONVERSATION_METADATA);
252
+ const spansWithErrorsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.SPANS_WITH_ERRORS);
253
+ const userMessagesSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.USER_MESSAGES);
254
+
255
+ // metadata map
256
+ const metaByConv = new Map<string, { tenantId: string; agentId: string; agentName: string }>();
257
+ for (const s of metadataSeries) {
258
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
259
+ if (!id) continue;
260
+ metaByConv.set(id, {
261
+ tenantId: s.labels?.[SPAN_KEYS.TENANT_ID] ?? UNKNOWN_VALUE,
262
+ agentId: s.labels?.[SPAN_KEYS.AGENT_ID] ?? UNKNOWN_VALUE,
263
+ agentName: s.labels?.[SPAN_KEYS.AGENT_NAME] ?? UNKNOWN_VALUE,
264
+ });
265
+ }
266
+
267
+ // first seen map
268
+ const firstSeen = new Map<string, number>();
269
+ for (const s of lastActivitySeries) {
270
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
271
+ if (!id) continue;
272
+ firstSeen.set(id, numberFromSeries(s));
273
+ }
274
+
275
+ // first user message per conversation
276
+ const firstMsgByConv = new Map<string, { content: string; timestamp: number }>();
277
+ const msgsByConv = new Map<string, Array<{ t: number; c: string }>>();
278
+ for (const s of userMessagesSeries) {
279
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
280
+ const content = s.labels?.[SPAN_KEYS.MESSAGE_CONTENT];
281
+ const t = numberFromSeries(s);
282
+ if (!id || !content) continue;
283
+ (msgsByConv.get(id) ?? msgsByConv.set(id, []).get(id))?.push({
284
+ t,
285
+ c: content,
286
+ });
287
+ }
288
+ for (const [id, arr] of msgsByConv) {
289
+ arr.sort((a, b) => a.t - b.t);
290
+ const first = arr[0];
291
+ if (first) {
292
+ const content = first.c.length > 100 ? `${first.c.slice(0, 100)}...` : first.c;
293
+ firstMsgByConv.set(id, { content, timestamp: nsToMs(first.t) });
198
294
  }
295
+ }
296
+
297
+ // build stats
298
+ const stats = this.toConversationStats(
299
+ toolsSeries,
300
+ transfersSeries,
301
+ delegationsSeries,
302
+ aiCallsSeries,
303
+ metaByConv,
304
+ spansWithErrorsSeries,
305
+ firstMsgByConv
306
+ );
307
+
308
+ // Filter to only include the paginated conversation IDs (in the correct order)
309
+ const statsMap = new Map(stats.map((s) => [s.conversationId, s]));
310
+ const orderedStats = conversationIds
311
+ .map((id) => statsMap.get(id))
312
+ .filter((s): s is ConversationStats => s !== undefined);
313
+
314
+ // Sort by first activity to maintain order
315
+ orderedStats.sort((a, b) =>
316
+ byFirstActivity(firstSeen.get(a.conversationId), firstSeen.get(b.conversationId))
317
+ );
318
+
319
+ return {
320
+ data: orderedStats,
321
+ pagination: {
322
+ page: pagination.page,
323
+ limit: pagination.limit,
324
+ total,
325
+ totalPages: Math.ceil(total / pagination.limit),
326
+ hasNextPage: pagination.page < Math.ceil(total / pagination.limit),
327
+ hasPreviousPage: pagination.page > 1,
328
+ },
329
+ };
330
+ }
331
+
332
+ private async getPaginatedConversationIds(
333
+ startTime: number,
334
+ endTime: number,
335
+ filters: SpanFilterOptions | undefined,
336
+ projectId: string | undefined,
337
+ pagination: { page: number; limit: number },
338
+ searchQuery: string | undefined,
339
+ agentId: string | undefined
340
+ ): Promise<{ conversationIds: string[]; total: number }> {
341
+ // Consolidated query: fetch all required data in a single request
342
+ const consolidatedPayload = this.buildFilteredConversationIdsPayload(
343
+ startTime,
344
+ endTime,
345
+ filters,
346
+ projectId,
347
+ agentId,
348
+ !!searchQuery?.trim()
349
+ );
350
+
351
+ const consolidatedResp = await this.makeRequest(consolidatedPayload);
199
352
 
200
- // first seen map
201
- const firstSeen = new Map<string, number>();
202
- for (const s of lastActivitySeries) {
353
+ // Extract activity data (always needed for sorting)
354
+ const activitySeries = this.extractSeries(consolidatedResp, QUERY_EXPRESSIONS.LAST_ACTIVITY);
355
+ const activityMap = new Map<string, number>();
356
+ for (const s of activitySeries) {
357
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
358
+ if (!id) continue;
359
+ activityMap.set(id, numberFromSeries(s));
360
+ }
361
+
362
+ // Start with all conversation IDs from activity data
363
+ let conversationIds = Array.from(activityMap.keys());
364
+
365
+ // Apply span filters if needed
366
+ if (filters?.spanName || filters?.attributes?.length) {
367
+ const filteredSeries = this.extractSeries(
368
+ consolidatedResp,
369
+ QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS
370
+ );
371
+ const filteredIds = new Set(
372
+ filteredSeries.map((s) => s.labels?.[SPAN_KEYS.CONVERSATION_ID]).filter(Boolean) as string[]
373
+ );
374
+ conversationIds = conversationIds.filter((id) => filteredIds.has(id));
375
+ }
376
+
377
+ // Apply search filtering if needed
378
+ if (searchQuery?.trim()) {
379
+ const metadataSeries = this.extractSeries(
380
+ consolidatedResp,
381
+ QUERY_EXPRESSIONS.CONVERSATION_METADATA
382
+ );
383
+ const metadataMap = new Map<string, { agentId: string; conversationId: string }>();
384
+ for (const s of metadataSeries) {
203
385
  const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
386
+ const agentIdValue = s.labels?.[SPAN_KEYS.AGENT_ID];
204
387
  if (!id) continue;
205
- firstSeen.set(id, numberFromSeries(s));
388
+ metadataMap.set(id, { agentId: agentIdValue ?? '', conversationId: id });
206
389
  }
207
390
 
208
- // first user message per conversation (min timestamp already grouped)
209
- const firstMsgByConv = new Map<string, { content: string; timestamp: number }>();
210
- const msgsByConv = new Map<string, Array<{ t: number; c: string }>>();
391
+ const userMessagesSeries = this.extractSeries(
392
+ consolidatedResp,
393
+ QUERY_EXPRESSIONS.USER_MESSAGES
394
+ );
395
+ const firstMessagesMap = new Map<string, string>();
211
396
  for (const s of userMessagesSeries) {
212
397
  const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
213
398
  const content = s.labels?.[SPAN_KEYS.MESSAGE_CONTENT];
214
- const t = numberFromSeries(s);
215
399
  if (!id || !content) continue;
216
- (msgsByConv.get(id) ?? msgsByConv.set(id, []).get(id))?.push({
217
- t,
218
- c: content,
219
- });
220
- }
221
- for (const [id, arr] of msgsByConv) {
222
- arr.sort((a, b) => a.t - b.t);
223
- const first = arr[0];
224
- if (first) {
225
- const content = first.c.length > 100 ? `${first.c.slice(0, 100)}...` : first.c;
226
- firstMsgByConv.set(id, { content, timestamp: nsToMs(first.t) });
400
+ if (!firstMessagesMap.has(id)) {
401
+ firstMessagesMap.set(id, content);
227
402
  }
228
403
  }
229
404
 
230
- // build stats
231
- let stats = this.toConversationStats(
232
- toolsSeries,
233
- transfersSeries,
234
- delegationsSeries,
235
- aiCallsSeries,
236
- metaByConv,
237
- spansWithErrorsSeries,
238
- firstMsgByConv
239
- );
240
-
241
- // optional secondary filter pass via span filters
242
- if (filters?.spanName || filters?.attributes?.length) {
243
- stats = await this.applySpanFilters(stats, startTime, endTime, filters, projectId);
244
- }
245
-
246
- // search filter
247
- if (searchQuery?.trim()) {
248
- const q = searchQuery.toLowerCase().trim();
249
- stats = stats.filter(
250
- (s) =>
251
- s.firstUserMessage?.toLowerCase().includes(q) ||
252
- s.conversationId.toLowerCase().includes(q) ||
253
- s.agentId.toLowerCase().includes(q)
405
+ const q = searchQuery.toLowerCase().trim();
406
+ conversationIds = conversationIds.filter((id) => {
407
+ const meta = metadataMap.get(id);
408
+ const firstMsg = firstMessagesMap.get(id);
409
+ return (
410
+ firstMsg?.toLowerCase().includes(q) ||
411
+ id.toLowerCase().includes(q) ||
412
+ meta?.agentId.toLowerCase().includes(q)
254
413
  );
255
- }
256
-
257
- // sort by first activity
258
- stats.sort((a, b) =>
259
- byFirstActivity(firstSeen.get(a.conversationId), firstSeen.get(b.conversationId))
260
- );
261
-
262
- if (!pagination) return stats;
414
+ });
415
+ }
263
416
 
264
- const { page, limit } = pagination;
265
- const total = stats.length;
266
- const totalPages = Math.ceil(total / limit);
267
- const start = (page - 1) * limit;
268
- const data = stats.slice(start, start + limit);
417
+ // Sort by last activity (descending - most recent first)
418
+ conversationIds.sort((a, b) => {
419
+ const aTime = activityMap.get(a) ?? 0;
420
+ const bTime = activityMap.get(b) ?? 0;
421
+ return bTime - aTime; // Descending order
422
+ });
269
423
 
270
- return {
271
- data,
272
- pagination: {
273
- page,
274
- limit,
275
- total,
276
- totalPages,
277
- hasNextPage: page < totalPages,
278
- hasPreviousPage: page > 1,
279
- },
280
- };
281
- } catch (e) {
282
- console.error('getConversationStats error:', e);
283
- return [];
284
- }
285
- }
424
+ const total = conversationIds.length;
425
+ const start = (pagination.page - 1) * pagination.limit;
426
+ const paginatedIds = conversationIds.slice(start, start + pagination.limit);
286
427
 
287
- async getAICallsByAgent(startTime: number, endTime: number, projectId?: string) {
288
- try {
289
- const resp = await this.makeRequest(
290
- this.buildCombinedPayload(startTime, endTime, undefined, projectId)
291
- );
292
- const series = this.extractSeries(resp, QUERY_EXPRESSIONS.AI_CALLS);
293
- const totals = new Map<string, number>();
294
- for (const s of series) {
295
- const agentId = s.labels?.[SPAN_KEYS.AGENT_ID] || UNKNOWN_VALUE;
296
- const count = countFromSeries(s);
297
- if (count) totals.set(agentId, (totals.get(agentId) || 0) + count);
298
- }
299
- return [...totals]
300
- .map(([agentId, totalCalls]) => ({ agentId, totalCalls }))
301
- .sort((a, b) => b.totalCalls - a.totalCalls);
302
- } catch (e) {
303
- console.error('getAICallsByAgent error:', e);
304
- return [];
305
- }
428
+ return { conversationIds: paginatedIds, total };
306
429
  }
307
430
 
308
431
  async getAICallsBySubAgent(
@@ -469,51 +592,57 @@ class SigNozStatsAPI {
469
592
  agentId?: string
470
593
  ) {
471
594
  try {
472
- const resp = await this.makeRequest(
473
- this.buildCombinedPayload(startTime, endTime, filters, projectId, agentId)
474
- );
475
-
476
- const toolsSeries = this.extractSeries(resp, 'tools');
477
- const transfersSeries = this.extractSeries(resp, 'transfers');
478
- const delegationsSeries = this.extractSeries(resp, 'delegations');
479
- const aiCallsSeries = this.extractSeries(resp, 'aiCalls');
480
- const metadataSeries = this.extractSeries(resp, 'conversationMetadata');
481
- const spansWithErrorsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.SPANS_WITH_ERRORS);
482
-
483
- const metaByConv = new Map<
484
- string,
485
- { tenantId: string; agentId: string; agentName: string }
486
- >();
487
- for (const s of metadataSeries) {
488
- const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
489
- if (!id) continue;
490
- metaByConv.set(id, {
491
- tenantId: s.labels?.[SPAN_KEYS.TENANT_ID] ?? UNKNOWN_VALUE,
492
- agentId: s.labels?.[SPAN_KEYS.AGENT_ID] ?? UNKNOWN_VALUE,
493
- agentName: s.labels?.[SPAN_KEYS.AGENT_NAME] ?? UNKNOWN_VALUE,
494
- });
595
+ // If span filters are applied, first get the conversation IDs that match those filters
596
+ let filteredConversationIds: string[] | undefined;
597
+ if (filters?.spanName || filters?.attributes?.length) {
598
+ const filteredPayload = this.buildFilteredConversationsPayload(
599
+ startTime,
600
+ endTime,
601
+ filters,
602
+ projectId
603
+ );
604
+ const filteredResp = await this.makeRequest(filteredPayload);
605
+ const filteredSeries = this.extractSeries(filteredResp, 'filteredConversations');
606
+ filteredConversationIds = filteredSeries
607
+ .map((s) => s.labels?.[SPAN_KEYS.CONVERSATION_ID])
608
+ .filter(Boolean) as string[];
609
+
610
+ if (filteredConversationIds.length === 0) {
611
+ // No conversations match the filters, return zeros
612
+ return {
613
+ totalToolCalls: 0,
614
+ totalTransfers: 0,
615
+ totalDelegations: 0,
616
+ totalConversations: 0,
617
+ totalAICalls: 0,
618
+ };
619
+ }
495
620
  }
496
621
 
497
- let stats = this.toConversationStats(
498
- toolsSeries,
499
- transfersSeries,
500
- delegationsSeries,
501
- aiCallsSeries,
502
- metaByConv,
503
- spansWithErrorsSeries,
504
- new Map<string, { content: string; timestamp: number }>()
622
+ const payload = this.buildAggregateBadgesPayload(
623
+ startTime,
624
+ endTime,
625
+ projectId,
626
+ agentId,
627
+ filteredConversationIds
505
628
  );
506
629
 
507
- if (filters?.spanName || filters?.attributes?.length) {
508
- stats = await this.applySpanFilters(stats, startTime, endTime, filters, projectId);
509
- }
630
+ const resp = await this.makeRequest(payload);
631
+
632
+ const toolCallsSeries = this.extractSeries(resp, 'totalToolCalls');
633
+ const transfersSeries = this.extractSeries(resp, 'totalTransfers');
634
+ const delegationsSeries = this.extractSeries(resp, 'totalDelegations');
635
+ const aiCallsSeries = this.extractSeries(resp, 'totalAICalls');
636
+ const conversationsSeries = this.extractSeries(resp, 'totalConversations');
510
637
 
511
638
  return {
512
- totalToolCalls: stats.reduce((s, r) => s + r.totalToolCalls, 0),
513
- totalTransfers: stats.reduce((s, r) => s + r.totalTransfers, 0),
514
- totalDelegations: stats.reduce((s, r) => s + r.totalDelegations, 0),
515
- totalConversations: stats.length,
516
- totalAICalls: stats.reduce((s, r) => s + r.totalAICalls, 0),
639
+ totalToolCalls: countFromSeries(toolCallsSeries[0] || { values: [{ value: '0' }] }),
640
+ totalTransfers: countFromSeries(transfersSeries[0] || { values: [{ value: '0' }] }),
641
+ totalDelegations: countFromSeries(delegationsSeries[0] || { values: [{ value: '0' }] }),
642
+ totalConversations: filteredConversationIds
643
+ ? filteredConversationIds.length
644
+ : countFromSeries(conversationsSeries[0] || { values: [{ value: '0' }] }),
645
+ totalAICalls: countFromSeries(aiCallsSeries[0] || { values: [{ value: '0' }] }),
517
646
  };
518
647
  } catch (e) {
519
648
  console.error('getAggregateStats error:', e);
@@ -775,28 +904,6 @@ class SigNozStatsAPI {
775
904
  return out;
776
905
  }
777
906
 
778
- private async applySpanFilters(
779
- stats: ConversationStats[],
780
- startTime: number,
781
- endTime: number,
782
- filters: SpanFilterOptions,
783
- projectId?: string
784
- ) {
785
- try {
786
- const resp = await this.makeRequest(
787
- this.buildFilteredConversationsPayload(startTime, endTime, filters, projectId)
788
- );
789
- const series = this.extractSeries(resp, 'filteredConversations');
790
- const allowed = new Set<string>(
791
- series.map((s) => s.labels?.[SPAN_KEYS.CONVERSATION_ID]).filter(Boolean) as string[]
792
- );
793
- return stats.filter((s) => allowed.has(s.conversationId));
794
- } catch (e) {
795
- console.error('applySpanFilters error:', e);
796
- return stats;
797
- }
798
- }
799
-
800
907
  // ---------- Payload builders (unchanged behavior, less repetition)
801
908
 
802
909
  private buildAgentModelBreakdownPayload(start: number, end: number, projectId?: string) {
@@ -1138,94 +1245,382 @@ class SigNozStatsAPI {
1138
1245
  };
1139
1246
  }
1140
1247
 
1141
- private buildFilteredConversationsPayload(
1248
+ private buildFilteredConversationIdsPayload(
1142
1249
  start: number,
1143
1250
  end: number,
1144
- filters: SpanFilterOptions,
1145
- projectId?: string
1251
+ filters: SpanFilterOptions | undefined,
1252
+ projectId: string | undefined,
1253
+ agentId: string | undefined,
1254
+ includeSearchData: boolean
1146
1255
  ) {
1147
- const items: any[] = [
1148
- {
1149
- key: {
1150
- key: SPAN_KEYS.CONVERSATION_ID,
1151
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1256
+ const buildBaseFilters = (): any[] => {
1257
+ const items: any[] = [
1258
+ {
1259
+ key: {
1260
+ key: SPAN_KEYS.CONVERSATION_ID,
1261
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1262
+ },
1263
+ op: OPERATORS.EXISTS,
1264
+ value: '',
1152
1265
  },
1153
- op: OPERATORS.EXISTS,
1154
- value: '',
1155
- },
1156
- ];
1157
-
1158
- if (filters.spanName) {
1159
- items.push({
1160
- key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1161
- op: OPERATORS.EQUALS,
1162
- value: filters.spanName,
1163
- });
1164
- }
1165
-
1166
- // Attribute filters — pass typed booleans/numbers where possible
1167
- for (const attr of filters.attributes ?? []) {
1168
- const op = attr.operator ?? OPERATORS.EQUALS;
1169
- let value: any = asTypedFilterValue(attr.value);
1170
- let dataType: 'string' | 'int64' | 'float64' | 'bool' = 'string';
1171
- if (typeof value === 'boolean') dataType = 'bool';
1172
- else if (typeof value === 'number') dataType = Number.isInteger(value) ? 'int64' : 'float64';
1266
+ ];
1173
1267
 
1174
- // exists/nexists ignore value
1175
- if (op === OPERATORS.EXISTS || op === OPERATORS.NOT_EXISTS) {
1268
+ if (agentId && agentId !== 'all') {
1176
1269
  items.push({
1177
- key: { key: attr.key, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1178
- op,
1179
- value: '',
1270
+ key: {
1271
+ key: SPAN_KEYS.AGENT_ID,
1272
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1273
+ },
1274
+ op: OPERATORS.EQUALS,
1275
+ value: agentId,
1180
1276
  });
1181
- continue;
1182
- }
1183
-
1184
- // LIKE operators add wildcards if absent
1185
- if (
1186
- (op === OPERATORS.LIKE || op === OPERATORS.NOT_LIKE) &&
1187
- typeof value === 'string' &&
1188
- !value.includes('%')
1189
- ) {
1190
- value = `%${value}%`;
1191
1277
  }
1192
1278
 
1193
- // For numeric equality, keep exact-match pair (>= & <=) for robustness
1194
- if ((dataType === 'int64' || dataType === 'float64') && op === OPERATORS.EQUALS) {
1195
- const config =
1196
- dataType === 'int64' ? QUERY_FIELD_CONFIGS.INT64_TAG : QUERY_FIELD_CONFIGS.FLOAT64_TAG;
1279
+ if (projectId) {
1197
1280
  items.push({
1198
- key: { key: attr.key, ...config },
1199
- op: OPERATORS.GREATER_THAN_OR_EQUAL,
1200
- value,
1281
+ key: {
1282
+ key: SPAN_KEYS.PROJECT_ID,
1283
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1284
+ },
1285
+ op: OPERATORS.EQUALS,
1286
+ value: projectId,
1201
1287
  });
1202
- items.push({
1203
- key: { key: attr.key, ...config },
1204
- op: OPERATORS.LESS_THAN_OR_EQUAL,
1205
- value,
1288
+ }
1289
+
1290
+ return items;
1291
+ };
1292
+
1293
+ const builderQueries: Record<string, any> = {
1294
+ // Always include activity query for sorting
1295
+ lastActivity: {
1296
+ dataSource: DATA_SOURCES.TRACES,
1297
+ queryName: QUERY_EXPRESSIONS.LAST_ACTIVITY,
1298
+ aggregateOperator: AGGREGATE_OPERATORS.MIN,
1299
+ aggregateAttribute: {
1300
+ key: SPAN_KEYS.TIMESTAMP,
1301
+ ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
1302
+ },
1303
+ filters: { op: OPERATORS.AND, items: buildBaseFilters() },
1304
+ groupBy: [
1305
+ {
1306
+ key: SPAN_KEYS.CONVERSATION_ID,
1307
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1308
+ },
1309
+ ],
1310
+ expression: QUERY_EXPRESSIONS.LAST_ACTIVITY,
1311
+ reduceTo: REDUCE_OPERATIONS.MIN,
1312
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1313
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1314
+ offset: QUERY_DEFAULTS.OFFSET,
1315
+ disabled: QUERY_DEFAULTS.DISABLED,
1316
+ having: QUERY_DEFAULTS.HAVING,
1317
+ legend: QUERY_DEFAULTS.LEGEND,
1318
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1319
+ },
1320
+ };
1321
+
1322
+ // Add filtered conversations query if filters are provided
1323
+ if (filters?.spanName || filters?.attributes?.length) {
1324
+ const filterItems: any[] = [
1325
+ {
1326
+ key: {
1327
+ key: SPAN_KEYS.CONVERSATION_ID,
1328
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1329
+ },
1330
+ op: OPERATORS.EXISTS,
1331
+ value: '',
1332
+ },
1333
+ ];
1334
+
1335
+ if (filters.spanName) {
1336
+ filterItems.push({
1337
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1338
+ op: OPERATORS.EQUALS,
1339
+ value: filters.spanName,
1206
1340
  });
1207
- } else {
1208
- const config =
1209
- dataType === 'string'
1210
- ? QUERY_FIELD_CONFIGS.STRING_TAG
1211
- : dataType === 'int64'
1212
- ? QUERY_FIELD_CONFIGS.INT64_TAG
1213
- : dataType === 'float64'
1214
- ? QUERY_FIELD_CONFIGS.FLOAT64_TAG
1215
- : QUERY_FIELD_CONFIGS.BOOL_TAG;
1216
- items.push({ key: { key: attr.key, ...config }, op, value });
1217
1341
  }
1218
- }
1219
1342
 
1220
- if (projectId) {
1221
- items.push({
1222
- key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1223
- op: OPERATORS.EQUALS,
1224
- value: projectId,
1225
- });
1226
- }
1343
+ // Attribute filters
1344
+ for (const attr of filters.attributes ?? []) {
1345
+ const op = attr.operator ?? OPERATORS.EQUALS;
1346
+ let value: any = asTypedFilterValue(attr.value);
1347
+ let dataType: DataType = DATA_TYPES.STRING;
1348
+ if (typeof value === 'boolean') dataType = DATA_TYPES.BOOL;
1349
+ else if (typeof value === 'number')
1350
+ dataType = Number.isInteger(value) ? DATA_TYPES.INT64 : DATA_TYPES.FLOAT64;
1351
+
1352
+ if (op === OPERATORS.EXISTS || op === OPERATORS.NOT_EXISTS) {
1353
+ filterItems.push({
1354
+ key: { key: attr.key, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1355
+ op,
1356
+ value: '',
1357
+ });
1358
+ continue;
1359
+ }
1227
1360
 
1228
- return {
1361
+ if (
1362
+ (op === OPERATORS.LIKE || op === OPERATORS.NOT_LIKE) &&
1363
+ typeof value === 'string' &&
1364
+ !value.includes('%')
1365
+ ) {
1366
+ value = `%${value}%`;
1367
+ }
1368
+
1369
+ if (
1370
+ (dataType === DATA_TYPES.INT64 || dataType === DATA_TYPES.FLOAT64) &&
1371
+ op === OPERATORS.EQUALS
1372
+ ) {
1373
+ const config =
1374
+ dataType === DATA_TYPES.INT64
1375
+ ? QUERY_FIELD_CONFIGS.INT64_TAG
1376
+ : QUERY_FIELD_CONFIGS.FLOAT64_TAG;
1377
+ filterItems.push({
1378
+ key: { key: attr.key, ...config },
1379
+ op: OPERATORS.GREATER_THAN_OR_EQUAL,
1380
+ value,
1381
+ });
1382
+ filterItems.push({
1383
+ key: { key: attr.key, ...config },
1384
+ op: OPERATORS.LESS_THAN_OR_EQUAL,
1385
+ value,
1386
+ });
1387
+ } else {
1388
+ const config =
1389
+ dataType === DATA_TYPES.STRING
1390
+ ? QUERY_FIELD_CONFIGS.STRING_TAG
1391
+ : dataType === DATA_TYPES.INT64
1392
+ ? QUERY_FIELD_CONFIGS.INT64_TAG
1393
+ : dataType === DATA_TYPES.FLOAT64
1394
+ ? QUERY_FIELD_CONFIGS.FLOAT64_TAG
1395
+ : QUERY_FIELD_CONFIGS.BOOL_TAG;
1396
+ filterItems.push({ key: { key: attr.key, ...config }, op, value });
1397
+ }
1398
+ }
1399
+
1400
+ if (projectId) {
1401
+ filterItems.push({
1402
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1403
+ op: OPERATORS.EQUALS,
1404
+ value: projectId,
1405
+ });
1406
+ }
1407
+
1408
+ builderQueries.filteredConversations = {
1409
+ dataSource: DATA_SOURCES.TRACES,
1410
+ queryName: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS,
1411
+ aggregateOperator: AGGREGATE_OPERATORS.COUNT,
1412
+ aggregateAttribute: {
1413
+ key: SPAN_KEYS.SPAN_ID,
1414
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1415
+ },
1416
+ filters: { op: OPERATORS.AND, items: filterItems },
1417
+ groupBy: [
1418
+ {
1419
+ key: SPAN_KEYS.CONVERSATION_ID,
1420
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1421
+ },
1422
+ ],
1423
+ expression: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS,
1424
+ reduceTo: REDUCE_OPERATIONS.SUM,
1425
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1426
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1427
+ offset: QUERY_DEFAULTS.OFFSET,
1428
+ disabled: QUERY_DEFAULTS.DISABLED,
1429
+ having: QUERY_DEFAULTS.HAVING,
1430
+ legend: QUERY_DEFAULTS.LEGEND,
1431
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1432
+ };
1433
+ }
1434
+
1435
+ // Add metadata and user messages queries if search is needed
1436
+ if (includeSearchData) {
1437
+ const metadataFilters = buildBaseFilters();
1438
+ metadataFilters.push(
1439
+ {
1440
+ key: { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1441
+ op: OPERATORS.EXISTS,
1442
+ value: '',
1443
+ },
1444
+ {
1445
+ key: { key: SPAN_KEYS.AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1446
+ op: OPERATORS.EXISTS,
1447
+ value: '',
1448
+ }
1449
+ );
1450
+
1451
+ builderQueries.conversationMetadata = {
1452
+ dataSource: DATA_SOURCES.TRACES,
1453
+ queryName: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
1454
+ aggregateOperator: AGGREGATE_OPERATORS.COUNT,
1455
+ aggregateAttribute: {
1456
+ key: SPAN_KEYS.SPAN_ID,
1457
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1458
+ },
1459
+ filters: { op: OPERATORS.AND, items: metadataFilters },
1460
+ groupBy: [
1461
+ {
1462
+ key: SPAN_KEYS.CONVERSATION_ID,
1463
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1464
+ },
1465
+ { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1466
+ { key: SPAN_KEYS.AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1467
+ { key: SPAN_KEYS.AGENT_NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1468
+ ],
1469
+ expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
1470
+ reduceTo: REDUCE_OPERATIONS.SUM,
1471
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1472
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1473
+ offset: QUERY_DEFAULTS.OFFSET,
1474
+ disabled: QUERY_DEFAULTS.DISABLED,
1475
+ having: QUERY_DEFAULTS.HAVING,
1476
+ legend: QUERY_DEFAULTS.LEGEND,
1477
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1478
+ };
1479
+
1480
+ const userMessagesFilters = buildBaseFilters();
1481
+ userMessagesFilters.push({
1482
+ key: {
1483
+ key: SPAN_KEYS.MESSAGE_CONTENT,
1484
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1485
+ },
1486
+ op: OPERATORS.EXISTS,
1487
+ value: '',
1488
+ });
1489
+
1490
+ builderQueries.userMessages = {
1491
+ dataSource: DATA_SOURCES.TRACES,
1492
+ queryName: QUERY_EXPRESSIONS.USER_MESSAGES,
1493
+ aggregateOperator: AGGREGATE_OPERATORS.MIN,
1494
+ aggregateAttribute: {
1495
+ key: SPAN_KEYS.TIMESTAMP,
1496
+ ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
1497
+ },
1498
+ filters: { op: OPERATORS.AND, items: userMessagesFilters },
1499
+ groupBy: [
1500
+ {
1501
+ key: SPAN_KEYS.CONVERSATION_ID,
1502
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1503
+ },
1504
+ {
1505
+ key: SPAN_KEYS.MESSAGE_CONTENT,
1506
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1507
+ },
1508
+ ],
1509
+ expression: QUERY_EXPRESSIONS.USER_MESSAGES,
1510
+ reduceTo: REDUCE_OPERATIONS.MIN,
1511
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1512
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.ASC }],
1513
+ offset: QUERY_DEFAULTS.OFFSET,
1514
+ disabled: QUERY_DEFAULTS.DISABLED,
1515
+ having: QUERY_DEFAULTS.HAVING,
1516
+ legend: QUERY_DEFAULTS.LEGEND,
1517
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1518
+ };
1519
+ }
1520
+
1521
+ return {
1522
+ start,
1523
+ end,
1524
+ step: QUERY_DEFAULTS.STEP,
1525
+ variables: {},
1526
+ compositeQuery: {
1527
+ queryType: QUERY_TYPES.BUILDER,
1528
+ panelType: PANEL_TYPES.TABLE,
1529
+ builderQueries,
1530
+ },
1531
+ dataSource: DATA_SOURCES.TRACES,
1532
+ projectId,
1533
+ };
1534
+ }
1535
+
1536
+ private buildFilteredConversationsPayload(
1537
+ start: number,
1538
+ end: number,
1539
+ filters: SpanFilterOptions,
1540
+ projectId?: string
1541
+ ) {
1542
+ const items: any[] = [
1543
+ {
1544
+ key: {
1545
+ key: SPAN_KEYS.CONVERSATION_ID,
1546
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1547
+ },
1548
+ op: OPERATORS.EXISTS,
1549
+ value: '',
1550
+ },
1551
+ ];
1552
+
1553
+ if (filters.spanName) {
1554
+ items.push({
1555
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1556
+ op: OPERATORS.EQUALS,
1557
+ value: filters.spanName,
1558
+ });
1559
+ }
1560
+
1561
+ // Attribute filters — pass typed booleans/numbers where possible
1562
+ for (const attr of filters.attributes ?? []) {
1563
+ const op = attr.operator ?? OPERATORS.EQUALS;
1564
+ let value: any = asTypedFilterValue(attr.value);
1565
+ let dataType: 'string' | 'int64' | 'float64' | 'bool' = 'string';
1566
+ if (typeof value === 'boolean') dataType = 'bool';
1567
+ else if (typeof value === 'number') dataType = Number.isInteger(value) ? 'int64' : 'float64';
1568
+
1569
+ // exists/nexists ignore value
1570
+ if (op === OPERATORS.EXISTS || op === OPERATORS.NOT_EXISTS) {
1571
+ items.push({
1572
+ key: { key: attr.key, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1573
+ op,
1574
+ value: '',
1575
+ });
1576
+ continue;
1577
+ }
1578
+
1579
+ // LIKE operators add wildcards if absent
1580
+ if (
1581
+ (op === OPERATORS.LIKE || op === OPERATORS.NOT_LIKE) &&
1582
+ typeof value === 'string' &&
1583
+ !value.includes('%')
1584
+ ) {
1585
+ value = `%${value}%`;
1586
+ }
1587
+
1588
+ // For numeric equality, keep exact-match pair (>= & <=) for robustness
1589
+ if ((dataType === 'int64' || dataType === 'float64') && op === OPERATORS.EQUALS) {
1590
+ const config =
1591
+ dataType === 'int64' ? QUERY_FIELD_CONFIGS.INT64_TAG : QUERY_FIELD_CONFIGS.FLOAT64_TAG;
1592
+ items.push({
1593
+ key: { key: attr.key, ...config },
1594
+ op: OPERATORS.GREATER_THAN_OR_EQUAL,
1595
+ value,
1596
+ });
1597
+ items.push({
1598
+ key: { key: attr.key, ...config },
1599
+ op: OPERATORS.LESS_THAN_OR_EQUAL,
1600
+ value,
1601
+ });
1602
+ } else {
1603
+ const config =
1604
+ dataType === 'string'
1605
+ ? QUERY_FIELD_CONFIGS.STRING_TAG
1606
+ : dataType === 'int64'
1607
+ ? QUERY_FIELD_CONFIGS.INT64_TAG
1608
+ : dataType === 'float64'
1609
+ ? QUERY_FIELD_CONFIGS.FLOAT64_TAG
1610
+ : QUERY_FIELD_CONFIGS.BOOL_TAG;
1611
+ items.push({ key: { key: attr.key, ...config }, op, value });
1612
+ }
1613
+ }
1614
+
1615
+ if (projectId) {
1616
+ items.push({
1617
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1618
+ op: OPERATORS.EQUALS,
1619
+ value: projectId,
1620
+ });
1621
+ }
1622
+
1623
+ return {
1229
1624
  start,
1230
1625
  end,
1231
1626
  step: QUERY_DEFAULTS.STEP,
@@ -1266,12 +1661,297 @@ class SigNozStatsAPI {
1266
1661
  };
1267
1662
  }
1268
1663
 
1664
+ private buildAggregateBadgesPayload(
1665
+ start: number,
1666
+ end: number,
1667
+ projectId?: string,
1668
+ agentId?: string,
1669
+ conversationIds?: string[]
1670
+ ) {
1671
+ const buildBaseFilters = (): any[] => {
1672
+ const items: any[] = [];
1673
+
1674
+ if (projectId) {
1675
+ items.push({
1676
+ key: {
1677
+ key: SPAN_KEYS.PROJECT_ID,
1678
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1679
+ },
1680
+ op: OPERATORS.EQUALS,
1681
+ value: projectId,
1682
+ });
1683
+ }
1684
+
1685
+ if (agentId) {
1686
+ items.push({
1687
+ key: {
1688
+ key: SPAN_KEYS.AGENT_ID,
1689
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1690
+ },
1691
+ op: OPERATORS.EQUALS,
1692
+ value: agentId,
1693
+ });
1694
+ }
1695
+ return items;
1696
+ };
1697
+
1698
+ const buildConversationIdFilter = (): any[] => {
1699
+ if (conversationIds && conversationIds.length > 0) {
1700
+ return [
1701
+ {
1702
+ key: {
1703
+ key: SPAN_KEYS.CONVERSATION_ID,
1704
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1705
+ },
1706
+ op: OPERATORS.IN,
1707
+ value: conversationIds,
1708
+ },
1709
+ ];
1710
+ }
1711
+ return [
1712
+ {
1713
+ key: {
1714
+ key: SPAN_KEYS.CONVERSATION_ID,
1715
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1716
+ },
1717
+ op: OPERATORS.EXISTS,
1718
+ value: '',
1719
+ },
1720
+ ];
1721
+ };
1722
+
1723
+ const baseFilters = buildBaseFilters();
1724
+ const conversationIdFilters = buildConversationIdFilter();
1725
+
1726
+ return {
1727
+ start,
1728
+ end,
1729
+ step: QUERY_DEFAULTS.STEP,
1730
+ variables: {},
1731
+ compositeQuery: {
1732
+ queryType: QUERY_TYPES.BUILDER,
1733
+ panelType: PANEL_TYPES.TABLE,
1734
+ builderQueries: {
1735
+ totalToolCalls: {
1736
+ dataSource: DATA_SOURCES.TRACES,
1737
+ queryName: 'totalToolCalls',
1738
+ aggregateOperator: AGGREGATE_OPERATORS.COUNT,
1739
+ aggregateAttribute: {
1740
+ key: SPAN_KEYS.SPAN_ID,
1741
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1742
+ },
1743
+ filters: {
1744
+ op: OPERATORS.AND,
1745
+ items: [
1746
+ ...baseFilters,
1747
+ {
1748
+ key: {
1749
+ key: SPAN_KEYS.NAME,
1750
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1751
+ },
1752
+ op: OPERATORS.EQUALS,
1753
+ value: SPAN_NAMES.AI_TOOL_CALL,
1754
+ },
1755
+ ...conversationIdFilters,
1756
+ {
1757
+ key: {
1758
+ key: SPAN_KEYS.AI_TOOL_TYPE,
1759
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1760
+ },
1761
+ op: OPERATORS.EQUALS,
1762
+ value: AI_TOOL_TYPES.MCP,
1763
+ },
1764
+ ],
1765
+ },
1766
+ groupBy: QUERY_DEFAULTS.EMPTY_GROUP_BY,
1767
+ expression: 'totalToolCalls',
1768
+ reduceTo: REDUCE_OPERATIONS.SUM,
1769
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1770
+ orderBy: [],
1771
+ offset: QUERY_DEFAULTS.OFFSET,
1772
+ disabled: QUERY_DEFAULTS.DISABLED,
1773
+ having: QUERY_DEFAULTS.HAVING,
1774
+ legend: QUERY_DEFAULTS.LEGEND,
1775
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1776
+ },
1777
+
1778
+ totalTransfers: {
1779
+ dataSource: DATA_SOURCES.TRACES,
1780
+ queryName: 'totalTransfers',
1781
+ aggregateOperator: AGGREGATE_OPERATORS.COUNT,
1782
+ aggregateAttribute: {
1783
+ key: SPAN_KEYS.SPAN_ID,
1784
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1785
+ },
1786
+ filters: {
1787
+ op: OPERATORS.AND,
1788
+ items: [
1789
+ ...baseFilters,
1790
+ {
1791
+ key: {
1792
+ key: SPAN_KEYS.NAME,
1793
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1794
+ },
1795
+ op: OPERATORS.EQUALS,
1796
+ value: SPAN_NAMES.AI_TOOL_CALL,
1797
+ },
1798
+ {
1799
+ key: {
1800
+ key: SPAN_KEYS.AI_TOOL_TYPE,
1801
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1802
+ },
1803
+ op: OPERATORS.EQUALS,
1804
+ value: AI_TOOL_TYPES.TRANSFER,
1805
+ },
1806
+ ...conversationIdFilters,
1807
+ ],
1808
+ },
1809
+ groupBy: QUERY_DEFAULTS.EMPTY_GROUP_BY,
1810
+ expression: 'totalTransfers',
1811
+ reduceTo: REDUCE_OPERATIONS.SUM,
1812
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1813
+ orderBy: [],
1814
+ offset: QUERY_DEFAULTS.OFFSET,
1815
+ disabled: QUERY_DEFAULTS.DISABLED,
1816
+ having: QUERY_DEFAULTS.HAVING,
1817
+ legend: QUERY_DEFAULTS.LEGEND,
1818
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1819
+ },
1820
+
1821
+ totalDelegations: {
1822
+ dataSource: DATA_SOURCES.TRACES,
1823
+ queryName: 'totalDelegations',
1824
+ aggregateOperator: AGGREGATE_OPERATORS.COUNT,
1825
+ aggregateAttribute: {
1826
+ key: SPAN_KEYS.SPAN_ID,
1827
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1828
+ },
1829
+ filters: {
1830
+ op: OPERATORS.AND,
1831
+ items: [
1832
+ ...baseFilters,
1833
+ {
1834
+ key: {
1835
+ key: SPAN_KEYS.NAME,
1836
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1837
+ },
1838
+ op: OPERATORS.EQUALS,
1839
+ value: SPAN_NAMES.AI_TOOL_CALL,
1840
+ },
1841
+ {
1842
+ key: {
1843
+ key: SPAN_KEYS.AI_TOOL_TYPE,
1844
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1845
+ },
1846
+ op: OPERATORS.EQUALS,
1847
+ value: AI_TOOL_TYPES.DELEGATION,
1848
+ },
1849
+ ...conversationIdFilters,
1850
+ ],
1851
+ },
1852
+ groupBy: QUERY_DEFAULTS.EMPTY_GROUP_BY,
1853
+ expression: 'totalDelegations',
1854
+ reduceTo: REDUCE_OPERATIONS.SUM,
1855
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1856
+ orderBy: [],
1857
+ offset: QUERY_DEFAULTS.OFFSET,
1858
+ disabled: QUERY_DEFAULTS.DISABLED,
1859
+ having: QUERY_DEFAULTS.HAVING,
1860
+ legend: QUERY_DEFAULTS.LEGEND,
1861
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1862
+ },
1863
+
1864
+ totalAICalls: {
1865
+ dataSource: DATA_SOURCES.TRACES,
1866
+ queryName: 'totalAICalls',
1867
+ aggregateOperator: AGGREGATE_OPERATORS.COUNT,
1868
+ aggregateAttribute: {
1869
+ key: SPAN_KEYS.SPAN_ID,
1870
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1871
+ },
1872
+ filters: {
1873
+ op: OPERATORS.AND,
1874
+ items: [
1875
+ ...baseFilters,
1876
+ {
1877
+ key: {
1878
+ key: SPAN_KEYS.AI_OPERATION_ID,
1879
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1880
+ },
1881
+ op: OPERATORS.EQUALS,
1882
+ value: AI_OPERATIONS.GENERATE_TEXT,
1883
+ },
1884
+ ...conversationIdFilters,
1885
+ ],
1886
+ },
1887
+ groupBy: QUERY_DEFAULTS.EMPTY_GROUP_BY,
1888
+ expression: 'totalAICalls',
1889
+ reduceTo: REDUCE_OPERATIONS.SUM,
1890
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1891
+ orderBy: [],
1892
+ offset: QUERY_DEFAULTS.OFFSET,
1893
+ disabled: QUERY_DEFAULTS.DISABLED,
1894
+ having: QUERY_DEFAULTS.HAVING,
1895
+ legend: QUERY_DEFAULTS.LEGEND,
1896
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1897
+ },
1898
+
1899
+ totalConversations: {
1900
+ dataSource: DATA_SOURCES.TRACES,
1901
+ queryName: 'totalConversations',
1902
+ aggregateOperator: AGGREGATE_OPERATORS.COUNT_DISTINCT,
1903
+ aggregateAttribute: {
1904
+ key: SPAN_KEYS.CONVERSATION_ID,
1905
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1906
+ },
1907
+ filters: {
1908
+ op: OPERATORS.AND,
1909
+ items: [
1910
+ ...baseFilters,
1911
+ ...conversationIdFilters,
1912
+ {
1913
+ key: {
1914
+ key: SPAN_KEYS.TENANT_ID,
1915
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1916
+ },
1917
+ op: OPERATORS.EXISTS,
1918
+ value: '',
1919
+ },
1920
+ {
1921
+ key: {
1922
+ key: SPAN_KEYS.AGENT_ID,
1923
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1924
+ },
1925
+ op: OPERATORS.EXISTS,
1926
+ value: '',
1927
+ },
1928
+ ],
1929
+ },
1930
+ groupBy: QUERY_DEFAULTS.EMPTY_GROUP_BY,
1931
+ expression: 'totalConversations',
1932
+ reduceTo: REDUCE_OPERATIONS.SUM,
1933
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1934
+ orderBy: [],
1935
+ offset: QUERY_DEFAULTS.OFFSET,
1936
+ disabled: QUERY_DEFAULTS.DISABLED,
1937
+ having: QUERY_DEFAULTS.HAVING,
1938
+ legend: QUERY_DEFAULTS.LEGEND,
1939
+ limit: QUERY_DEFAULTS.LIMIT_UNLIMITED,
1940
+ },
1941
+ },
1942
+ },
1943
+ dataSource: DATA_SOURCES.TRACES,
1944
+ projectId,
1945
+ };
1946
+ }
1947
+
1269
1948
  private buildCombinedPayload(
1270
1949
  start: number,
1271
1950
  end: number,
1272
1951
  _filters?: SpanFilterOptions,
1273
1952
  projectId?: string,
1274
- agentId?: string
1953
+ agentId?: string,
1954
+ conversationIds?: string[]
1275
1955
  ) {
1276
1956
  const withProjectAndAgent = (items: any[]) => {
1277
1957
  let filtered = items;
@@ -1301,6 +1981,33 @@ class SigNozStatsAPI {
1301
1981
  },
1302
1982
  ];
1303
1983
  }
1984
+ // Add conversation ID filters if provided (for pagination optimization)
1985
+ if (conversationIds && conversationIds.length > 0) {
1986
+ filtered = [
1987
+ ...filtered,
1988
+ {
1989
+ key: {
1990
+ key: SPAN_KEYS.CONVERSATION_ID,
1991
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
1992
+ },
1993
+ op: OPERATORS.IN,
1994
+ value: conversationIds,
1995
+ },
1996
+ ];
1997
+ } else {
1998
+ // Only add EXISTS check if no specific IDs provided
1999
+ filtered = [
2000
+ ...filtered,
2001
+ {
2002
+ key: {
2003
+ key: SPAN_KEYS.CONVERSATION_ID,
2004
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
2005
+ },
2006
+ op: OPERATORS.EXISTS,
2007
+ value: '',
2008
+ },
2009
+ ];
2010
+ }
1304
2011
  return filtered;
1305
2012
  };
1306
2013
 
@@ -1332,14 +2039,6 @@ class SigNozStatsAPI {
1332
2039
  op: OPERATORS.EQUALS,
1333
2040
  value: SPAN_NAMES.AI_TOOL_CALL,
1334
2041
  },
1335
- {
1336
- key: {
1337
- key: SPAN_KEYS.CONVERSATION_ID,
1338
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1339
- },
1340
- op: OPERATORS.EXISTS,
1341
- value: '',
1342
- },
1343
2042
  {
1344
2043
  key: {
1345
2044
  key: SPAN_KEYS.AI_TOOL_TYPE,
@@ -1398,14 +2097,6 @@ class SigNozStatsAPI {
1398
2097
  op: OPERATORS.EQUALS,
1399
2098
  value: AI_TOOL_TYPES.TRANSFER,
1400
2099
  },
1401
- {
1402
- key: {
1403
- key: SPAN_KEYS.CONVERSATION_ID,
1404
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1405
- },
1406
- op: OPERATORS.EXISTS,
1407
- value: '',
1408
- },
1409
2100
  ]),
1410
2101
  },
1411
2102
  groupBy: [
@@ -1460,14 +2151,6 @@ class SigNozStatsAPI {
1460
2151
  op: OPERATORS.EQUALS,
1461
2152
  value: AI_TOOL_TYPES.DELEGATION,
1462
2153
  },
1463
- {
1464
- key: {
1465
- key: SPAN_KEYS.CONVERSATION_ID,
1466
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1467
- },
1468
- op: OPERATORS.EXISTS,
1469
- value: '',
1470
- },
1471
2154
  ]),
1472
2155
  },
1473
2156
  groupBy: [
@@ -1506,14 +2189,6 @@ class SigNozStatsAPI {
1506
2189
  filters: {
1507
2190
  op: OPERATORS.AND,
1508
2191
  items: withProjectAndAgent([
1509
- {
1510
- key: {
1511
- key: SPAN_KEYS.CONVERSATION_ID,
1512
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1513
- },
1514
- op: OPERATORS.EXISTS,
1515
- value: '',
1516
- },
1517
2192
  {
1518
2193
  key: {
1519
2194
  key: SPAN_KEYS.TENANT_ID,
@@ -1571,14 +2246,6 @@ class SigNozStatsAPI {
1571
2246
  op: OPERATORS.EQUALS,
1572
2247
  value: AI_OPERATIONS.GENERATE_TEXT,
1573
2248
  },
1574
- {
1575
- key: {
1576
- key: SPAN_KEYS.CONVERSATION_ID,
1577
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1578
- },
1579
- op: OPERATORS.EXISTS,
1580
- value: '',
1581
- },
1582
2249
  ]),
1583
2250
  },
1584
2251
  groupBy: [
@@ -1613,16 +2280,7 @@ class SigNozStatsAPI {
1613
2280
  },
1614
2281
  filters: {
1615
2282
  op: OPERATORS.AND,
1616
- items: withProjectAndAgent([
1617
- {
1618
- key: {
1619
- key: SPAN_KEYS.CONVERSATION_ID,
1620
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1621
- },
1622
- op: OPERATORS.EXISTS,
1623
- value: '',
1624
- },
1625
- ]),
2283
+ items: withProjectAndAgent([]),
1626
2284
  },
1627
2285
  groupBy: [
1628
2286
  {
@@ -1660,14 +2318,6 @@ class SigNozStatsAPI {
1660
2318
  op: OPERATORS.EQUALS,
1661
2319
  value: true,
1662
2320
  },
1663
- {
1664
- key: {
1665
- key: SPAN_KEYS.CONVERSATION_ID,
1666
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1667
- },
1668
- op: OPERATORS.EXISTS,
1669
- value: '',
1670
- },
1671
2321
  ]),
1672
2322
  },
1673
2323
  groupBy: [
@@ -1710,14 +2360,6 @@ class SigNozStatsAPI {
1710
2360
  op: OPERATORS.EXISTS,
1711
2361
  value: '',
1712
2362
  },
1713
- {
1714
- key: {
1715
- key: SPAN_KEYS.CONVERSATION_ID,
1716
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
1717
- },
1718
- op: OPERATORS.EXISTS,
1719
- value: '',
1720
- },
1721
2363
  ]),
1722
2364
  },
1723
2365
  groupBy: [