@inkeep/agents-manage-ui 0.11.1 → 0.11.3

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 (176) 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 +179 -179
  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 +3 -3
  7. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js +1 -1
  8. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
  10. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js +1 -1
  12. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js.nft.json +1 -1
  13. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js +2 -2
  15. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js.nft.json +1 -1
  16. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js +2 -2
  18. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js +2 -2
  20. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js.nft.json +1 -1
  21. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js +2 -2
  23. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js.nft.json +1 -1
  24. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js +2 -2
  26. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +1 -1
  28. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js.nft.json +1 -1
  29. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
  31. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js.nft.json +1 -1
  32. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +1 -1
  34. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
  36. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
  37. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +2 -2
  39. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js.nft.json +1 -1
  40. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
  42. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js +2 -2
  44. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page.js.nft.json +1 -1
  45. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/[graphId]/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js +2 -2
  47. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page.js.nft.json +1 -1
  48. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/new/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page.js +2 -2
  50. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/graphs/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
  52. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
  53. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
  55. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +1 -1
  57. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
  58. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +2 -2
  60. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
  62. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +2 -2
  64. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  65. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +2 -2
  66. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
  67. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
  68. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +3 -3
  69. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js.nft.json +1 -1
  70. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +2 -2
  72. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
  73. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
  74. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +1 -1
  75. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +1 -1
  77. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  78. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
  79. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
  80. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route.js +2 -2
  81. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
  84. package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  85. package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +8 -8
  86. package/.next/standalone/agents-manage-ui/.next/server/chunks/2309.js +1 -0
  87. package/.next/standalone/agents-manage-ui/.next/server/chunks/2539.js +3 -3
  88. package/.next/standalone/agents-manage-ui/.next/server/chunks/3547.js +1 -1
  89. package/.next/standalone/agents-manage-ui/.next/server/chunks/3859.js +23 -19
  90. package/.next/standalone/agents-manage-ui/.next/server/chunks/3981.js +1 -0
  91. package/.next/standalone/agents-manage-ui/.next/server/chunks/4702.js +1 -0
  92. package/.next/standalone/agents-manage-ui/.next/server/chunks/544.js +1 -0
  93. package/.next/standalone/agents-manage-ui/.next/server/chunks/{6847.js → 5616.js} +1 -1
  94. package/.next/standalone/agents-manage-ui/.next/server/chunks/{5634.js → 7577.js} +2 -2
  95. package/.next/standalone/agents-manage-ui/.next/server/chunks/8449.js +2 -2
  96. package/.next/standalone/agents-manage-ui/.next/server/chunks/{6122.js → 8835.js} +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/middleware-build-manifest.js +1 -1
  98. package/.next/standalone/agents-manage-ui/.next/server/middleware-react-loadable-manifest.js +1 -1
  99. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  100. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  101. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  102. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  103. package/.next/standalone/agents-manage-ui/.next/static/chunks/2063-3f9e00e568b9fbd9.js +1 -0
  104. package/.next/standalone/agents-manage-ui/.next/static/chunks/{3023-7903e7b102b972eb.js → 2706-8d6852e4f38c2068.js} +8 -8
  105. package/.next/standalone/agents-manage-ui/.next/static/chunks/{6550.bb60e05a00a6253b.js → 4169.808bb74a234140c9.js} +1 -1
  106. package/.next/standalone/agents-manage-ui/.next/static/chunks/{4805.2bcf78beb7261189.js → 4805.deb96c6337ad6922.js} +1 -1
  107. package/.next/standalone/agents-manage-ui/.next/static/chunks/{5418-be4d6d44125363e7.js → 6550-51aa7da8be9d90a5.js} +1 -1
  108. package/.next/standalone/agents-manage-ui/.next/static/chunks/7143-b3731044529a566f.js +1 -0
  109. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-074e34f38369470a.js +1 -0
  110. package/.next/standalone/agents-manage-ui/.next/static/chunks/929-cc251a7a8ca04af8.js +1 -0
  111. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-342913575ce3d3d4.js +1 -0
  112. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-fef4d7d7fd7b8092.js +1 -0
  113. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-fef4d7d7fd7b8092.js +1 -0
  114. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/page-017ada6e50411751.js +1 -0
  115. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/{page-9e6887d2897ac9ee.js → page-2d27034d4d63c5b8.js} +1 -1
  116. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/{page-9e6887d2897ac9ee.js → page-2d27034d4d63c5b8.js} +1 -1
  117. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-9cc88cb8c7b1fc20.js +1 -0
  118. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-d8adb95f3270c27c.js +1 -0
  119. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-bfa2ae8536d8bb5f.js +1 -0
  120. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-b89dcddfdd2f1c10.js +1 -0
  121. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-38b9ec61d904adae.js → page-58d11ac42f61ecd4.js} +1 -1
  122. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/[graphId]/{page-2b3647052f03a92a.js → page-c49abd7e45c6621e.js} +1 -1
  123. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/new/{page-5fa87b9255d9faa8.js → page-0343ee5133a2c717.js} +1 -1
  124. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/page-b28487f6ca95d30f.js +1 -0
  125. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-2993859f442af094.js → page-cfad1fad7222b283.js} +1 -1
  126. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-f69b94c3b9043ad4.js → page-76a29c75d1416a1d.js} +1 -1
  127. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/{page-78e244f6ea091f12.js → page-e68478e4a7416619.js} +1 -1
  128. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-b86c05b4baf32cb6.js → page-ab0436aa700f67d5.js} +1 -1
  129. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/ai-calls/page-6eb122638434c9cf.js +1 -0
  130. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page-924004e316c0e468.js +1 -0
  131. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-622e36e5b334e5c9.js +1 -0
  132. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-7e49dc1eb2150661.js +1 -0
  133. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-e0349a2e97646204.js +1 -0
  134. package/.next/standalone/agents-manage-ui/.next/static/chunks/{webpack-b20dc8e12f728891.js → webpack-2e00dfb974dac679.js} +1 -1
  135. package/.next/standalone/agents-manage-ui/.next/static/css/35104f76c2884833.css +1 -0
  136. package/.next/standalone/agents-manage-ui/package.json +1 -1
  137. package/.next/standalone/packages/agents-core/package.json +1 -1
  138. package/package.json +4 -4
  139. package/src/app/api/signoz/conversations/[conversationId]/route.ts +92 -55
  140. package/src/components/graph/nodes/mcp-node.tsx +38 -44
  141. package/src/components/graph/nodes/mcp-placeholder-node.tsx +1 -1
  142. package/src/components/traces/conversation-detail.tsx +90 -75
  143. package/src/components/traces/conversation-stats/conversation-list-item.tsx +3 -3
  144. package/src/components/traces/signoz-link.tsx +2 -2
  145. package/src/components/traces/timeline/render-panel-content.tsx +116 -8
  146. package/src/components/traces/timeline/timeline-item.tsx +36 -2
  147. package/src/components/traces/timeline/timeline-wrapper.tsx +2 -0
  148. package/src/components/traces/timeline/types.ts +11 -10
  149. package/src/constants/signoz.ts +6 -0
  150. package/src/lib/utils/signoz-links.ts +53 -0
  151. package/.next/standalone/agents-manage-ui/.next/server/chunks/1405.js +0 -1
  152. package/.next/standalone/agents-manage-ui/.next/server/chunks/1680.js +0 -1
  153. package/.next/standalone/agents-manage-ui/.next/server/chunks/4735.js +0 -1
  154. package/.next/standalone/agents-manage-ui/.next/server/chunks/7955.js +0 -1
  155. package/.next/standalone/agents-manage-ui/.next/static/chunks/2063-af61e7c864e76f4f.js +0 -1
  156. package/.next/standalone/agents-manage-ui/.next/static/chunks/3520-2e1a81f03d10dde7.js +0 -1
  157. package/.next/standalone/agents-manage-ui/.next/static/chunks/7143-de3bf969c411ad87.js +0 -1
  158. package/.next/standalone/agents-manage-ui/.next/static/chunks/7167-4c04ea99416d3fbe.js +0 -1
  159. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/page-8a95ebae051f85b0.js +0 -1
  160. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-1e72d29f341799b2.js +0 -1
  161. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-1e72d29f341799b2.js +0 -1
  162. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/page-8ee82cf7734a0b47.js +0 -1
  163. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-f8fbf99a80d7c7fe.js +0 -1
  164. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-d8a14a1a1e1a7c53.js +0 -1
  165. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-01f46406fce1b2b9.js +0 -1
  166. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-dc38270e07ab46c3.js +0 -1
  167. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/graphs/page-e1932a1ee52dcfa3.js +0 -1
  168. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/ai-calls/page-77edde19179afc5b.js +0 -1
  169. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page-280212bccc58a9fd.js +0 -1
  170. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-89af26371322f8c0.js +0 -1
  171. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/page-a863c0cf820ba84c.js +0 -1
  172. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-5c6135deb59fcb7b.js +0 -1
  173. package/.next/standalone/agents-manage-ui/.next/static/css/65192dc2a70f093d.css +0 -1
  174. package/src/components/traces/conversation-errors.tsx +0 -320
  175. /package/.next/standalone/agents-manage-ui/.next/static/{A1Gwp87RoCoeHYIQU5Y4L → KoBJ9LsM4YjnplSYXwd-F}/_buildManifest.js +0 -0
  176. /package/.next/standalone/agents-manage-ui/.next/static/{A1Gwp87RoCoeHYIQU5Y4L → KoBJ9LsM4YjnplSYXwd-F}/_ssgManifest.js +0 -0
@@ -356,9 +356,8 @@ function buildConversationListPayload(
356
356
  ]
357
357
  ),
358
358
 
359
- // error categories
360
- contextErrors: listQuery(
361
- QUERY_EXPRESSIONS.CONTEXT_ERRORS,
359
+ agentGenerations: listQuery(
360
+ QUERY_EXPRESSIONS.AGENT_GENERATIONS,
362
361
  [
363
362
  {
364
363
  key: {
@@ -366,15 +365,7 @@ function buildConversationListPayload(
366
365
  ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
367
366
  },
368
367
  op: OPERATORS.EQUALS,
369
- value: SPAN_NAMES.CONTEXT_HANDLE,
370
- },
371
- {
372
- key: {
373
- key: SPAN_KEYS.HAS_ERROR,
374
- ...QUERY_FIELD_CONFIGS.BOOL_TAG_COLUMN,
375
- },
376
- op: OPERATORS.EQUALS,
377
- value: true,
368
+ value: SPAN_NAMES.AGENT_GENERATION,
378
369
  },
379
370
  ],
380
371
  [
@@ -386,6 +377,10 @@ function buildConversationListPayload(
386
377
  key: SPAN_KEYS.TIMESTAMP,
387
378
  ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
388
379
  },
380
+ {
381
+ key: SPAN_KEYS.HAS_ERROR,
382
+ ...QUERY_FIELD_CONFIGS.BOOL_TAG_COLUMN,
383
+ },
389
384
  {
390
385
  key: SPAN_KEYS.STATUS_MESSAGE,
391
386
  ...QUERY_FIELD_CONFIGS.STRING_TAG,
@@ -396,17 +391,11 @@ function buildConversationListPayload(
396
391
  },
397
392
  ]
398
393
  ),
399
- agentGenerationErrors: listQuery(
400
- QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS,
394
+
395
+ // Count spans with errors
396
+ spansWithErrors: listQuery(
397
+ QUERY_EXPRESSIONS.SPANS_WITH_ERRORS,
401
398
  [
402
- {
403
- key: {
404
- key: SPAN_KEYS.NAME,
405
- ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
406
- },
407
- op: OPERATORS.EQUALS,
408
- value: SPAN_NAMES.AGENT_GENERATION,
409
- },
410
399
  {
411
400
  key: {
412
401
  key: SPAN_KEYS.HAS_ERROR,
@@ -422,16 +411,8 @@ function buildConversationListPayload(
422
411
  ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
423
412
  },
424
413
  {
425
- key: SPAN_KEYS.TIMESTAMP,
426
- ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
427
- },
428
- {
429
- key: SPAN_KEYS.STATUS_MESSAGE,
430
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
431
- },
432
- {
433
- key: SPAN_KEYS.OTEL_STATUS_DESCRIPTION,
434
- ...QUERY_FIELD_CONFIGS.STRING_TAG,
414
+ key: SPAN_KEYS.NAME,
415
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
435
416
  },
436
417
  ]
437
418
  ),
@@ -587,6 +568,14 @@ function buildConversationListPayload(
587
568
  key: SPAN_KEYS.AI_RESPONSE_TEXT,
588
569
  ...QUERY_FIELD_CONFIGS.STRING_TAG,
589
570
  },
571
+ {
572
+ key: SPAN_KEYS.AI_RESPONSE_TOOL_CALLS,
573
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
574
+ },
575
+ {
576
+ key: SPAN_KEYS.AI_PROMPT_MESSAGES,
577
+ ...QUERY_FIELD_CONFIGS.STRING_TAG,
578
+ },
590
579
  ]
591
580
  ),
592
581
 
@@ -750,8 +739,8 @@ export async function GET(
750
739
  const toolCallSpans = parseList(resp, QUERY_EXPRESSIONS.TOOL_CALLS);
751
740
  const contextResolutionSpans = parseList(resp, QUERY_EXPRESSIONS.CONTEXT_RESOLUTION);
752
741
  const contextHandleSpans = parseList(resp, QUERY_EXPRESSIONS.CONTEXT_HANDLE);
753
- const contextErrorSpans = parseList(resp, QUERY_EXPRESSIONS.CONTEXT_ERRORS);
754
- const agentGenErrorSpans = parseList(resp, QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS);
742
+ const agentGenerationSpans = parseList(resp, QUERY_EXPRESSIONS.AGENT_GENERATIONS);
743
+ const spansWithErrorsList = parseList(resp, QUERY_EXPRESSIONS.SPANS_WITH_ERRORS);
755
744
  const userMessageSpans = parseList(resp, QUERY_EXPRESSIONS.USER_MESSAGES);
756
745
  const aiAssistantSpans = parseList(resp, QUERY_EXPRESSIONS.AI_ASSISTANT_MESSAGES);
757
746
  const aiGenerationSpans = parseList(resp, QUERY_EXPRESSIONS.AI_GENERATIONS);
@@ -759,6 +748,33 @@ export async function GET(
759
748
  const contextFetcherSpans = parseList(resp, QUERY_EXPRESSIONS.CONTEXT_FETCHERS);
760
749
  const durationSpans = parseList(resp, QUERY_EXPRESSIONS.DURATION_SPANS);
761
750
 
751
+ // Categorize spans with errors into critical errors vs warnings
752
+ const CRITICAL_ERROR_SPAN_NAMES = [
753
+ 'execution_handler.execute',
754
+ 'agent.load_tools',
755
+ 'context.handle_context_resolution',
756
+ 'context.resolve',
757
+ 'agent.generate',
758
+ 'context-resolver.resolve_single_fetch_definition',
759
+ 'graph_session.generate_structured_update',
760
+ 'graph_session.process_artifact',
761
+ 'graph_session.generate_artifact_metadata',
762
+ 'response.format_object_response',
763
+ 'response.format_response',
764
+ ];
765
+
766
+ let errorCount = 0;
767
+ let warningCount = 0;
768
+
769
+ for (const span of spansWithErrorsList) {
770
+ const spanName = getString(span, SPAN_KEYS.NAME, '');
771
+ if (CRITICAL_ERROR_SPAN_NAMES.includes(spanName)) {
772
+ errorCount++;
773
+ } else {
774
+ warningCount++;
775
+ }
776
+ }
777
+
762
778
  let graphId: string | null = null;
763
779
  let graphName: string | null = null;
764
780
  for (const s of userMessageSpans) {
@@ -772,6 +788,7 @@ export async function GET(
772
788
  type:
773
789
  | 'tool_call'
774
790
  | 'ai_generation'
791
+ | 'agent_generation'
775
792
  | 'context_fetch'
776
793
  | 'context_resolution'
777
794
  | 'user_message'
@@ -815,6 +832,9 @@ export async function GET(
815
832
  aiStreamTextContent?: string;
816
833
  aiStreamTextModel?: string;
817
834
  aiStreamTextOperationId?: string;
835
+ // ai generation specifics
836
+ aiResponseToolCalls?: string;
837
+ aiPromptMessages?: string;
818
838
  // save_tool_result specifics
819
839
  saveResultSaved?: boolean;
820
840
  saveArtifactType?: string;
@@ -828,6 +848,9 @@ export async function GET(
828
848
  saveFacts?: string;
829
849
  saveToolArgs?: Record<string, any>;
830
850
  saveFullResult?: Record<string, any>;
851
+ hasError?: boolean;
852
+ otelStatusCode?: string;
853
+ otelStatusDescription?: string;
831
854
  };
832
855
 
833
856
  const activities: Activity[] = [];
@@ -983,24 +1006,6 @@ export async function GET(
983
1006
  });
984
1007
  }
985
1008
 
986
- const contextErrors = contextErrorSpans.map((s) => ({
987
- spanId: getString(s, SPAN_KEYS.SPAN_ID, ''),
988
- timestamp: s.timestamp,
989
- statusDescription:
990
- getString(s, SPAN_KEYS.STATUS_MESSAGE) ||
991
- getString(s, SPAN_KEYS.OTEL_STATUS_DESCRIPTION, '') ||
992
- 'No description available',
993
- }));
994
- const agentGenerationErrors = agentGenErrorSpans.map((s) => ({
995
- spanId: getString(s, SPAN_KEYS.SPAN_ID, ''),
996
- timestamp: s.timestamp,
997
- statusDescription:
998
- getString(s, SPAN_KEYS.STATUS_MESSAGE) ||
999
- getString(s, SPAN_KEYS.OTEL_STATUS_DESCRIPTION, '') ||
1000
- 'No description available',
1001
- }));
1002
- const errorCount = contextErrors.length + agentGenerationErrors.length;
1003
-
1004
1009
  // user messages
1005
1010
  for (const span of userMessageSpans) {
1006
1011
  const hasError = getField(span, SPAN_KEYS.HAS_ERROR) === true;
@@ -1046,6 +1051,11 @@ export async function GET(
1046
1051
  for (const span of aiGenerationSpans) {
1047
1052
  const hasError = getField(span, SPAN_KEYS.HAS_ERROR) === true;
1048
1053
  const durMs = getNumber(span, SPAN_KEYS.DURATION_NANO) / 1e6;
1054
+
1055
+ // Extract ai.response.toolCalls and ai.prompt.messages for ai.generateText.doGenerate spans
1056
+ const aiResponseToolCalls = getString(span, SPAN_KEYS.AI_RESPONSE_TOOL_CALLS, '');
1057
+ const aiPromptMessages = getString(span, SPAN_KEYS.AI_PROMPT_MESSAGES, '');
1058
+
1049
1059
  activities.push({
1050
1060
  id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1051
1061
  type: ACTIVITY_TYPES.AI_GENERATION,
@@ -1062,6 +1072,32 @@ export async function GET(
1062
1072
  inputTokens: getNumber(span, SPAN_KEYS.GEN_AI_USAGE_INPUT_TOKENS, 0),
1063
1073
  outputTokens: getNumber(span, SPAN_KEYS.GEN_AI_USAGE_OUTPUT_TOKENS, 0),
1064
1074
  aiResponseText: getString(span, SPAN_KEYS.AI_RESPONSE_TEXT, '') || undefined,
1075
+ aiResponseToolCalls: aiResponseToolCalls || undefined,
1076
+ aiPromptMessages: aiPromptMessages || undefined,
1077
+ });
1078
+ }
1079
+
1080
+ for (const span of agentGenerationSpans) {
1081
+ const hasError = getField(span, SPAN_KEYS.HAS_ERROR) === true;
1082
+ const statusMessage =
1083
+ getString(span, SPAN_KEYS.STATUS_MESSAGE) ||
1084
+ getString(span, SPAN_KEYS.OTEL_STATUS_DESCRIPTION, '');
1085
+ const otelStatusCode = getString(span, SPAN_KEYS.OTEL_STATUS_CODE, '');
1086
+ const otelStatusDescription = getString(span, SPAN_KEYS.OTEL_STATUS_DESCRIPTION, '');
1087
+
1088
+ activities.push({
1089
+ id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1090
+ type: ACTIVITY_TYPES.AGENT_GENERATION,
1091
+ name: 'agent.generate',
1092
+ description: hasError ? 'Agent generation failed' : 'Agent generation',
1093
+ timestamp: span.timestamp,
1094
+ status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1095
+ result: hasError
1096
+ ? statusMessage || 'Agent generation failed'
1097
+ : 'Agent generation completed',
1098
+ hasError,
1099
+ otelStatusCode: hasError ? otelStatusCode : undefined,
1100
+ otelStatusDescription: hasError ? otelStatusDescription || statusMessage : undefined,
1065
1101
  });
1066
1102
  }
1067
1103
 
@@ -1192,7 +1228,7 @@ export async function GET(
1192
1228
  return count;
1193
1229
  })(),
1194
1230
  totalToolCalls: activities.filter((a) => a.type === ACTIVITY_TYPES.TOOL_CALL).length,
1195
- totalErrors: errorCount,
1231
+ totalErrors: 0,
1196
1232
  totalOpenAICalls: openAICallsCount,
1197
1233
  };
1198
1234
 
@@ -1215,11 +1251,12 @@ export async function GET(
1215
1251
  totalInputTokens,
1216
1252
  totalOutputTokens,
1217
1253
  mcpToolErrors: [],
1218
- contextErrors,
1219
- agentGenerationErrors,
1220
1254
  graphId,
1221
1255
  graphName,
1222
1256
  allSpanAttributes,
1257
+ spansWithErrorsCount: spansWithErrorsList.length,
1258
+ errorCount,
1259
+ warningCount,
1223
1260
  });
1224
1261
  } catch (error) {
1225
1262
  const logger = getLogger('conversation-details');
@@ -8,6 +8,8 @@ import { type MCPNodeData, mcpNodeHandleId } from '../configuration/node-types';
8
8
  import { BaseNode, BaseNodeHeader, BaseNodeHeaderTitle } from './base-node';
9
9
  import { Handle } from './handle';
10
10
 
11
+ const TOOLS_SHOWN_LIMIT = 4;
12
+
11
13
  export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
12
14
  const { data, selected } = props;
13
15
  const toolLookup = useGraphStore((state) => state.toolLookup);
@@ -32,10 +34,14 @@ export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
32
34
  const getToolDisplay = () => {
33
35
  if (selectedTools === null) {
34
36
  // All tools selected
35
- return {
36
- toolBadges: [(activeTools?.length ?? 0).toString()],
37
- additionalBadge: null,
38
- };
37
+ const toolsToShow = (activeTools?.slice(0, TOOLS_SHOWN_LIMIT) || []).map((tool) => tool.name);
38
+ const remainingCount = (activeTools?.length ?? 0) - TOOLS_SHOWN_LIMIT;
39
+ const toolBadges = [...toolsToShow];
40
+ if (remainingCount > 0) {
41
+ toolBadges.push(`+${remainingCount} (ALL)`);
42
+ }
43
+
44
+ return toolBadges;
39
45
  }
40
46
 
41
47
  const selectedCount = selectedTools.length;
@@ -43,41 +49,35 @@ export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
43
49
 
44
50
  // If no tools selected, show 0
45
51
  if (selectedCount === 0) {
46
- return {
47
- toolBadges: ['0'],
48
- additionalBadge: null,
49
- };
52
+ return ['0'];
50
53
  }
51
54
 
52
55
  // If all tools are selected, show total count
53
56
  if (selectedCount === totalCount) {
54
- return {
55
- toolBadges: [totalCount.toString()],
56
- additionalBadge: null,
57
- };
57
+ const toolsToShow = selectedTools.slice(0, TOOLS_SHOWN_LIMIT);
58
+ const remainingCount = selectedCount - TOOLS_SHOWN_LIMIT;
59
+ const toolBadges = [...toolsToShow];
60
+ if (remainingCount > 0) {
61
+ toolBadges.push(`+${remainingCount} (ALL)`);
62
+ }
63
+ return toolBadges;
58
64
  }
59
65
 
60
- // If 2 or fewer tools selected, show each tool name as separate badge
61
- if (selectedCount <= 2) {
62
- return {
63
- toolBadges: selectedTools,
64
- additionalBadge: null,
65
- };
66
+ // If TOOLS_SHOWN_LIMIT or fewer tools selected, show each tool name as separate badge
67
+ if (selectedCount <= TOOLS_SHOWN_LIMIT) {
68
+ return selectedTools;
66
69
  }
67
70
 
68
- // Show first 2 tool names as separate badges, remaining count in additional badge
69
- const firstTwoTools = selectedTools.slice(0, 2);
70
- const remainingCount = selectedCount - 2;
71
- return {
72
- toolBadges: firstTwoTools,
73
- additionalBadge: `+${remainingCount}`,
74
- };
71
+ // Show first TOOLS_SHOWN_LIMIT tool names as separate badges, remaining count in additional badge
72
+ const toolsToShow = selectedTools.slice(0, TOOLS_SHOWN_LIMIT);
73
+ const remainingCount = selectedCount - TOOLS_SHOWN_LIMIT;
74
+ return [...toolsToShow, `+${remainingCount}`];
75
75
  };
76
76
 
77
- const toolDisplay = getToolDisplay();
77
+ const toolBadges = getToolDisplay();
78
78
 
79
79
  return (
80
- <BaseNode isSelected={selected} className="rounded-full min-w-40 min-h-13 max-w-3xs">
80
+ <BaseNode isSelected={selected} className="rounded-4xl min-w-40 min-h-13 max-w-3xs">
81
81
  <BaseNodeHeader className="mb-0 py-3">
82
82
  <div className="flex items-center flex-wrap gap-1">
83
83
  <div className="flex items-center gap-2 flex-shrink-0 mr-4">
@@ -90,23 +90,17 @@ export function MCPNode(props: NodeProps & { data: MCPNodeData }) {
90
90
  />
91
91
  <BaseNodeHeaderTitle className="flex-shrink-0">{name}</BaseNodeHeaderTitle>
92
92
  </div>
93
- {toolDisplay.toolBadges.map((toolName, index) => (
94
- <Badge
95
- key={index}
96
- variant="code"
97
- className="px-2 text-2xs text-gray-700 dark:text-gray-300 flex-shrink-0"
98
- >
99
- {toolName}
100
- </Badge>
101
- ))}
102
- {toolDisplay.additionalBadge && (
103
- <Badge
104
- variant="code"
105
- className="px-2 text-2xs text-gray-700 dark:text-gray-300 flex-shrink-0"
106
- >
107
- {toolDisplay.additionalBadge}
108
- </Badge>
109
- )}
93
+ <div className="flex items-center flex-wrap gap-1">
94
+ {toolBadges.map((label, index) => (
95
+ <Badge
96
+ key={index}
97
+ variant="code"
98
+ className="px-2 text-2xs text-gray-700 dark:text-gray-300 flex-shrink-0"
99
+ >
100
+ {label}
101
+ </Badge>
102
+ ))}
103
+ </div>
110
104
  </div>
111
105
  </BaseNodeHeader>
112
106
  <Handle id={mcpNodeHandleId} type="target" position={Position.Top} isConnectable />
@@ -12,7 +12,7 @@ export function MCPPlaceholderNode(props: NodeProps & { data: MCPPlaceholderNode
12
12
  return (
13
13
  <BaseNode
14
14
  isSelected={selected}
15
- className={`rounded-full border-dashed min-w-40 min-h-13 flex items-center justify-center max-w-3xs ${selected ? 'outline-dashed outline-2 outline-gray-700 hover:outline-gray-700 ring-0 hover:ring-0' : ''}`}
15
+ className={`rounded-4xl border-dashed min-w-40 min-h-13 flex items-center justify-center max-w-3xs ${selected ? 'outline-dashed outline-2 outline-gray-700 hover:outline-gray-700 ring-0 hover:ring-0' : ''}`}
16
16
  >
17
17
  <BaseNodeHeader className="mb-0 py-3">
18
18
  <Hammer className="size-4 text-muted-foreground/65" />
@@ -1,6 +1,12 @@
1
1
  'use client';
2
2
 
3
- import { Activity, ArrowLeft, MessageSquare, TriangleAlert } from 'lucide-react';
3
+ import {
4
+ Activity,
5
+ ArrowLeft,
6
+ ExternalLink as ExternalLinkIcon,
7
+ MessageSquare,
8
+ TriangleAlert,
9
+ } from 'lucide-react';
4
10
  import { useParams } from 'next/navigation';
5
11
  import { useEffect, useState } from 'react';
6
12
  import { formatDateTime, formatDuration } from '@/app/utils/format-date';
@@ -13,7 +19,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
13
19
  import { ExternalLink } from '@/components/ui/external-link';
14
20
  import { ResizablePanelGroup } from '@/components/ui/resizable';
15
21
  import { Skeleton } from '@/components/ui/skeleton';
16
- import { ConversationErrors } from './conversation-errors';
22
+ import { getSignozTracesExplorerUrl } from '@/lib/utils/signoz-links';
17
23
  import { SignozLink } from './signoz-link';
18
24
  import { InfoRow } from './timeline/blocks';
19
25
  import { TimelineWrapper } from './timeline/timeline-wrapper';
@@ -27,7 +33,6 @@ export function ConversationDetail({ conversationId, onBack }: ConversationDetai
27
33
  const [conversation, setConversation] = useState<ConversationDetailType | null>(null);
28
34
  const [loading, setLoading] = useState(true);
29
35
  const [error, setError] = useState<string | null>(null);
30
- const [showErrorsPage, setShowErrorsPage] = useState(false);
31
36
  const { tenantId, projectId } = useParams();
32
37
 
33
38
  useEffect(() => {
@@ -38,7 +43,6 @@ export function ConversationDetail({ conversationId, onBack }: ConversationDetai
38
43
  const response = await fetch(`/api/signoz/conversations/${conversationId}`);
39
44
  if (!response.ok) throw new Error('Failed to fetch conversation details');
40
45
  const data = await response.json();
41
- if (typeof data.totalErrors === 'undefined') data.totalErrors = 0;
42
46
  setConversation(data);
43
47
  } catch (err) {
44
48
  setError(err instanceof Error ? err.message : 'An error occurred');
@@ -86,12 +90,6 @@ export function ConversationDetail({ conversationId, onBack }: ConversationDetai
86
90
  );
87
91
  }
88
92
 
89
- if (showErrorsPage) {
90
- return (
91
- <ConversationErrors conversationId={conversationId} onBack={() => setShowErrorsPage(false)} />
92
- );
93
- }
94
-
95
93
  return (
96
94
  <div className="h-full flex flex-col">
97
95
  {/* Header */}
@@ -121,40 +119,50 @@ export function ConversationDetail({ conversationId, onBack }: ConversationDetai
121
119
 
122
120
  {/* Summary Cards */}
123
121
  <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3 mb-4 flex-shrink-0">
124
- {/* Errors */}
122
+ {/* Duration */}
125
123
  <Card
126
- className={`shadow-none bg-background ${conversation.totalErrors > 0 ? 'cursor-pointer hover:bg-destructive/5 dark:hover:bg-destructive/10 transition-colors' : ''}`}
127
- onClick={() => {
128
- if (conversation.totalErrors > 0) setShowErrorsPage(true);
129
- }}
124
+ className="shadow-none bg-background"
125
+ title={
126
+ conversation.conversationStartTime && conversation.conversationEndTime
127
+ ? `Start: ${conversation.conversationStartTime}\nEnd: ${conversation.conversationEndTime}`
128
+ : 'Timing data not available'
129
+ }
130
130
  >
131
131
  <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
132
- <CardTitle className="text-sm font-medium text-foreground">Errors</CardTitle>
133
- <TriangleAlert className="h-4 w-4 text-muted-foreground" />
132
+ <CardTitle className="text-sm font-medium text-foreground">Duration</CardTitle>
133
+ <Activity className="h-4 w-4 text-muted-foreground" />
134
134
  </CardHeader>
135
135
  <CardContent>
136
- <div
137
- className={`text-2xl font-bold ${conversation.totalErrors > 0 ? 'text-red-600' : 'text-green-600'}`}
138
- >
139
- {conversation.totalErrors}
136
+ <div className="space-y-2">
137
+ {conversation.conversationStartTime && conversation.conversationEndTime ? (
138
+ <>
139
+ <div className="text-sm font-medium text-foreground">
140
+ <div className="flex items-center gap-1">
141
+ <span className="text-xs text-muted-foreground">Start:</span>
142
+ <span className="text-xs font-mono">
143
+ {formatDateTime(conversation.conversationStartTime)}
144
+ </span>
145
+ </div>
146
+ <div className="flex items-center gap-1 mt-1">
147
+ <span className="text-xs text-muted-foreground">End:</span>
148
+ <span className="text-xs font-mono">
149
+ {formatDateTime(conversation.conversationEndTime)}
150
+ </span>
151
+ </div>
152
+ </div>
153
+ <div className="space-y-1 mt-2">
154
+ {conversation.conversationDuration && (
155
+ <div className="text-xs text-muted-foreground">
156
+ <span className="font-medium">Conversation Duration:</span>{' '}
157
+ {formatDuration(conversation.conversationDuration)}
158
+ </div>
159
+ )}
160
+ </div>
161
+ </>
162
+ ) : (
163
+ <div className="text-sm text-muted-foreground">Timing data not available</div>
164
+ )}
140
165
  </div>
141
- <p className="text-xs text-muted-foreground">
142
- {conversation.totalErrors === 0
143
- ? 'No errors detected'
144
- : (() => {
145
- const mcp = conversation.mcpToolErrors?.length || 0;
146
- const ctx = conversation.contextErrors?.length || 0;
147
- const agent = conversation.agentGenerationErrors?.length || 0;
148
- if (mcp || ctx || agent) {
149
- const parts = [];
150
- if (mcp) parts.push(`${mcp} MCP tool`);
151
- if (ctx) parts.push(`${ctx} context`);
152
- if (agent) parts.push(`${agent} agent generation`);
153
- return `${parts.join(', ')} errors - Click to view details`;
154
- }
155
- return 'Errors in conversation';
156
- })()}
157
- </p>
158
166
  </CardContent>
159
167
  </Card>
160
168
 
@@ -215,50 +223,57 @@ export function ConversationDetail({ conversationId, onBack }: ConversationDetai
215
223
  </CardContent>
216
224
  </Card>
217
225
 
218
- {/* Duration */}
219
- <Card
220
- className="shadow-none bg-background"
221
- title={
222
- conversation.conversationStartTime && conversation.conversationEndTime
223
- ? `Start: ${conversation.conversationStartTime}\nEnd: ${conversation.conversationEndTime}`
224
- : 'Timing data not available'
225
- }
226
- >
226
+ {/* Alerts */}
227
+ <Card className="shadow-none bg-background">
227
228
  <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
228
- <CardTitle className="text-sm font-medium text-foreground">Duration</CardTitle>
229
- <Activity className="h-4 w-4 text-muted-foreground" />
229
+ <CardTitle className="text-sm font-medium text-foreground">Alerts</CardTitle>
230
+ <TriangleAlert className="h-4 w-4 text-muted-foreground" />
230
231
  </CardHeader>
231
232
  <CardContent>
232
- <div className="space-y-2">
233
- {conversation.conversationStartTime && conversation.conversationEndTime ? (
233
+ {(() => {
234
+ const errors = conversation.errorCount ?? 0;
235
+ const warnings = conversation.warningCount ?? 0;
236
+ const total = errors + warnings;
237
+
238
+ return (
234
239
  <>
235
- <div className="text-sm font-medium text-foreground">
236
- <div className="flex items-center gap-1">
237
- <span className="text-xs text-muted-foreground">Start:</span>
238
- <span className="text-xs font-mono">
239
- {formatDateTime(conversation.conversationStartTime)}
240
- </span>
240
+ {total > 0 ? (
241
+ <div className="space-y-1">
242
+ {errors > 0 && (
243
+ <div className="flex items-baseline gap-2">
244
+ <span className="text-2xl font-bold font-mono text-red-600">{errors}</span>
245
+ <span className="text-sm text-muted-foreground">error{errors > 1 ? 's' : ''}</span>
246
+ </div>
247
+ )}
248
+ {warnings > 0 && (
249
+ <div className="flex items-baseline gap-2">
250
+ <span className="text-2xl font-bold font-mono text-yellow-500">{warnings}</span>
251
+ <span className="text-sm text-muted-foreground">warning{warnings > 1 ? 's' : ''}</span>
252
+ </div>
253
+ )}
241
254
  </div>
242
- <div className="flex items-center gap-1 mt-1">
243
- <span className="text-xs text-muted-foreground">End:</span>
244
- <span className="text-xs font-mono">
245
- {formatDateTime(conversation.conversationEndTime)}
246
- </span>
255
+ ) : (
256
+ <div>
257
+ <div className="text-2xl font-bold font-mono text-green-600 mb-1">0</div>
258
+ <p className="text-xs text-muted-foreground">No warnings or errors</p>
247
259
  </div>
248
- </div>
249
- <div className="space-y-1 mt-2">
250
- {conversation.conversationDuration && (
251
- <div className="text-xs text-muted-foreground">
252
- <span className="font-medium">Conversation Duration:</span>{' '}
253
- {formatDuration(conversation.conversationDuration)}
254
- </div>
255
- )}
256
- </div>
260
+ )}
261
+ {total > 0 && (
262
+ <Button
263
+ variant="outline"
264
+ size="sm"
265
+ className="mt-3 w-full flex items-center justify-center gap-1"
266
+ onClick={() => {
267
+ window.open(getSignozTracesExplorerUrl(conversationId as string), '_blank');
268
+ }}
269
+ >
270
+ <ExternalLinkIcon className="h-3 w-3" />
271
+ View in SigNoz
272
+ </Button>
273
+ )}
257
274
  </>
258
- ) : (
259
- <div className="text-sm text-muted-foreground">Timing data not available</div>
260
- )}
261
- </div>
275
+ );
276
+ })()}
262
277
  </CardContent>
263
278
  </Card>
264
279
  </div>
@@ -86,14 +86,14 @@ export function ConversationListItem({ conversation, projectId }: ConversationLi
86
86
  </TooltipContent>
87
87
  </Tooltip>
88
88
  )}
89
- <Badge variant="code" className="text-xs">
90
- {graphName ? `${graphName} (${graphId})` : graphId}
91
- </Badge>
92
89
  {hasErrors && (
93
90
  <Badge variant="error" className="flex items-center gap-1">
94
91
  {totalErrors} Error{totalErrors > 1 ? 's' : ''}
95
92
  </Badge>
96
93
  )}
94
+ <Badge variant="code" className="text-xs">
95
+ {graphName ? `${graphName} (${graphId})` : graphId}
96
+ </Badge>
97
97
  </div>
98
98
  </div>
99
99
  </div>
@@ -137,14 +137,14 @@ interface SignozSpanLinkProps {
137
137
  export function SignozLink({ conversationId }: SignozLinkProps) {
138
138
  const { SIGNOZ_URL } = useRuntimeConfig();
139
139
  return (
140
- <ExternalLink href={makeTracesUrl(SIGNOZ_URL, conversationId)}>View in SigNoz</ExternalLink>
140
+ <ExternalLink href={makeTracesUrl(SIGNOZ_URL, conversationId)}>View Conversation in SigNoz</ExternalLink>
141
141
  );
142
142
  }
143
143
 
144
144
  export function SignozSpanLink({ traceId, spanId }: SignozSpanLinkProps) {
145
145
  const { SIGNOZ_URL } = useRuntimeConfig();
146
146
  return (
147
- <ExternalLink href={makeSpanUrl(SIGNOZ_URL, traceId, spanId)}>View in SigNoz</ExternalLink>
147
+ <ExternalLink href={makeSpanUrl(SIGNOZ_URL, traceId, spanId)}>View span in SigNoz</ExternalLink>
148
148
  );
149
149
  }
150
150