@inkeep/agents-manage-ui 0.31.0 → 0.31.1

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 (184) 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 +205 -205
  3. package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +11 -11
  4. package/.next/standalone/agents-manage-ui/.next/build-manifest.json +5 -5
  5. package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +13 -13
  6. package/.next/standalone/agents-manage-ui/.next/react-loadable-manifest.json +4 -4
  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]/agents/[agentId]/page.js +2 -2
  10. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page.js +1 -1
  12. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page.js +1 -1
  14. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
  16. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js +2 -2
  18. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js.nft.json +1 -1
  19. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js +2 -2
  21. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js.nft.json +1 -1
  22. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js +2 -2
  24. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js +2 -2
  26. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js +1 -1
  28. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js +2 -2
  30. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +2 -2
  32. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
  34. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +2 -2
  36. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
  38. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
  39. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +1 -1
  41. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
  43. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page.js +2 -2
  45. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/page.js +1 -1
  47. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/new/page.js +2 -2
  49. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/new/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/page.js +2 -2
  51. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
  53. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
  54. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
  56. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js.nft.json +1 -1
  57. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +2 -2
  59. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
  60. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +1 -1
  62. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
  64. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  65. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +1 -1
  66. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +2 -2
  68. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
  69. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +2 -2
  71. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +3 -3
  73. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
  74. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
  75. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +1 -1
  76. package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +1 -1
  78. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  79. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
  80. package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
  81. package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-render/route.js +2 -2
  82. package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-render/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route.js +1 -1
  84. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
  87. package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
  88. package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +11 -11
  89. package/.next/standalone/agents-manage-ui/.next/server/chunks/2323.js +2 -2
  90. package/.next/standalone/agents-manage-ui/.next/server/chunks/3200.js +1 -1
  91. package/.next/standalone/agents-manage-ui/.next/server/chunks/341.js +4 -4
  92. package/.next/standalone/agents-manage-ui/.next/server/chunks/4266.js +1 -1
  93. package/.next/standalone/agents-manage-ui/.next/server/chunks/4936.js +1 -0
  94. package/.next/standalone/agents-manage-ui/.next/server/chunks/5130.js +1 -1
  95. package/.next/standalone/agents-manage-ui/.next/server/chunks/5316.js +3 -3
  96. package/.next/standalone/agents-manage-ui/.next/server/chunks/6224.js +1 -1
  97. package/.next/standalone/agents-manage-ui/.next/server/chunks/6384.js +1 -0
  98. package/.next/standalone/agents-manage-ui/.next/server/chunks/70.js +1 -0
  99. package/.next/standalone/agents-manage-ui/.next/server/chunks/7065.js +7 -7
  100. package/.next/standalone/agents-manage-ui/.next/server/chunks/8359.js +1 -1
  101. package/.next/standalone/agents-manage-ui/.next/server/chunks/{8374.js → 848.js} +1 -1
  102. package/.next/standalone/agents-manage-ui/.next/server/chunks/9542.js +1 -1
  103. package/.next/standalone/agents-manage-ui/.next/server/middleware-build-manifest.js +1 -1
  104. package/.next/standalone/agents-manage-ui/.next/server/middleware-manifest.json +5 -5
  105. package/.next/standalone/agents-manage-ui/.next/server/middleware-react-loadable-manifest.js +1 -1
  106. package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
  107. package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
  108. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
  109. package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
  110. package/.next/standalone/agents-manage-ui/.next/static/chunks/31411-cbacdddda02a71ad.js +1 -0
  111. package/.next/standalone/agents-manage-ui/.next/static/chunks/32848-e368b492419ae6e4.js +1 -0
  112. package/.next/standalone/agents-manage-ui/.next/static/chunks/35694-cd683e40b2ff9fb6.js +1 -0
  113. package/.next/standalone/agents-manage-ui/.next/static/chunks/50118.1c7ac0c134716b42.js +1 -0
  114. package/.next/standalone/agents-manage-ui/.next/static/chunks/{55157-ebbf65f28884e4b0.js → 55157-25e4c0b9f9d95f2c.js} +1 -1
  115. package/.next/standalone/agents-manage-ui/.next/static/chunks/{44274-a124ee7d0e9bbf36.js → 67932-c2178c26618f6820.js} +1 -1
  116. package/.next/standalone/agents-manage-ui/.next/static/chunks/6804-e9595bf74c07058e.js +1 -0
  117. package/.next/standalone/agents-manage-ui/.next/static/chunks/97061-02431a2eb7031ffb.js +1 -0
  118. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/{page-7b138b74aa1b6cc4.js → page-418465cf3e57d112.js} +1 -1
  119. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-c1960963f976eb19.js +1 -0
  120. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/{page-0613cd0de89555f2.js → page-0b6940cf79665598.js} +1 -1
  121. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/{page-33d38258008068ef.js → page-cda8e337d66a021d.js} +1 -1
  122. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-e4f3aef1f40c9bf7.js +1 -0
  123. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-d12d19bfb3b0d102.js +1 -0
  124. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/{page-f8ce61ef934023fe.js → page-77d86d4f33293f56.js} +1 -1
  125. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page-1b306a83fa4ceacc.js +1 -0
  126. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/page-a9860dea576ef98d.js +1 -0
  127. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-a860dc8ee68c3780.js +1 -0
  128. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-641b27cabd40331a.js +1 -0
  129. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-2ef23dc2048b712a.js +1 -0
  130. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-ae80cda47d578187.js +1 -0
  131. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-915741768be9759b.js → page-f20bfd58a0a17c52.js} +1 -1
  132. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page-5128cfef25651d47.js +1 -0
  133. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/new/page-edf63292bd5b8ad1.js +1 -0
  134. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/page-fc766a714e38896d.js +1 -0
  135. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/{page-0eda84c6756f05d4.js → page-e455db4c386226dc.js} +1 -1
  136. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-fe56358f31e65716.js +1 -0
  137. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-3defad8f3981df45.js → page-45de64677dd86b11.js} +1 -1
  138. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/{page-925d005895fa7166.js → page-34e69891e16a6a61.js} +1 -1
  139. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-944f6415e8418ec1.js → page-fade925bc1cff005.js} +1 -1
  140. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page-fe4008846a914db1.js +1 -0
  141. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-e4fee623dbbbcefb.js +1 -0
  142. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/{page-9e4b43e3d743ebf1.js → page-ccd5098ae7d16eb1.js} +1 -1
  143. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-dedaf5704e4a3d75.js +1 -0
  144. package/.next/standalone/agents-manage-ui/.next/static/chunks/{d834c995-aa1be5b3f2aabfaa.js → d834c995-85cbaf1e7f74897d.js} +1 -1
  145. package/.next/standalone/agents-manage-ui/.next/static/chunks/{webpack-9f7107d4096ccd92.js → webpack-e5241b458329a412.js} +1 -1
  146. package/.next/standalone/agents-manage-ui/.next/static/css/79e788a7e7a93a1e.css +1 -0
  147. package/.next/standalone/agents-manage-ui/package.json +1 -1
  148. package/.next/standalone/packages/agents-core/package.json +1 -1
  149. package/package.json +4 -4
  150. package/src/app/api/signoz/conversations/[conversationId]/route.ts +73 -28
  151. package/src/components/traces/timeline/hierarchical-timeline.tsx +151 -0
  152. package/src/components/traces/timeline/timeline-item.tsx +34 -9
  153. package/src/components/traces/timeline/timeline-wrapper.tsx +6 -4
  154. package/src/components/traces/timeline/tree-utils.ts +81 -0
  155. package/src/components/traces/timeline/types.ts +1 -0
  156. package/.next/standalone/agents-manage-ui/.next/server/chunks/1319.js +0 -1
  157. package/.next/standalone/agents-manage-ui/.next/server/chunks/7403.js +0 -1
  158. package/.next/standalone/agents-manage-ui/.next/server/chunks/7850.js +0 -1
  159. package/.next/standalone/agents-manage-ui/.next/static/chunks/15890-6694e366870d7977.js +0 -1
  160. package/.next/standalone/agents-manage-ui/.next/static/chunks/50118.b4a463e89825ca55.js +0 -1
  161. package/.next/standalone/agents-manage-ui/.next/static/chunks/50840-e61f8487dca6e5dc.js +0 -1
  162. package/.next/standalone/agents-manage-ui/.next/static/chunks/56795-ac5daea13056f2d1.js +0 -1
  163. package/.next/standalone/agents-manage-ui/.next/static/chunks/57183-91e28fb6372961d9.js +0 -1
  164. package/.next/standalone/agents-manage-ui/.next/static/chunks/69387-788fe104e9200de8.js +0 -1
  165. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-bd4eb51411fb1d84.js +0 -1
  166. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-85154d8147fb0e07.js +0 -1
  167. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-9fee2a6c273348dc.js +0 -1
  168. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page-48dfc09ca84ac33d.js +0 -1
  169. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/page-418f79b80fdfaf9d.js +0 -1
  170. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-b7902a950db917b3.js +0 -1
  171. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-f6aefdae7c13a062.js +0 -1
  172. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-13fecba8f9580e78.js +0 -1
  173. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-2a3324df7e328b87.js +0 -1
  174. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page-3c4cdc90fe498f5b.js +0 -1
  175. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/new/page-41804c6316f86c76.js +0 -1
  176. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/page-b286b892d54757cd.js +0 -1
  177. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-e545c7134b230dda.js +0 -1
  178. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page-7be5a55c90e9652f.js +0 -1
  179. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-b71b09da8b3e95d2.js +0 -1
  180. package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-2b71a361f54d52ca.js +0 -1
  181. package/.next/standalone/agents-manage-ui/.next/static/css/f9fbffcdb4166a2a.css +0 -1
  182. package/src/components/traces/timeline/activity-timeline.tsx +0 -34
  183. /package/.next/standalone/agents-manage-ui/.next/static/{lDlviZ-fsvH_GGTtL9vCU → tkbmvZjhUKAsZg_pT9Nzk}/_buildManifest.js +0 -0
  184. /package/.next/standalone/agents-manage-ui/.next/static/{lDlviZ-fsvH_GGTtL9vCU → tkbmvZjhUKAsZg_pT9Nzk}/_ssgManifest.js +0 -0
@@ -936,6 +936,30 @@ export async function GET(
936
936
  agentName = getString(s, SPAN_KEYS.AGENT_NAME, '') || null;
937
937
  if (agentId || agentName) break;
938
938
  }
939
+
940
+ let allSpanAttributes: Array<{
941
+ spanId: string;
942
+ traceId: string;
943
+ timestamp: string;
944
+ data: Record<string, any>;
945
+ }> = [];
946
+ try {
947
+ allSpanAttributes = await fetchAllSpanAttributes_SQL(
948
+ conversationId,
949
+ SIGNOZ_URL,
950
+ SIGNOZ_API_KEY
951
+ );
952
+ } catch (e) {
953
+ const logger = getLogger('span-attributes');
954
+ logger.error({ error: e }, 'allSpanAttributes SQL fetch skipped/failed');
955
+ }
956
+
957
+ const spanIdToParentSpanId = new Map<string, string | null>();
958
+ for (const spanAttr of allSpanAttributes) {
959
+ const parentSpanId = spanAttr.data[SPAN_KEYS.PARENT_SPAN_ID] || null;
960
+ spanIdToParentSpanId.set(spanAttr.spanId, parentSpanId);
961
+ }
962
+
939
963
  // activities
940
964
  type Activity = {
941
965
  id: string;
@@ -952,6 +976,7 @@ export async function GET(
952
976
  | 'artifact_processing';
953
977
  description: string;
954
978
  timestamp: string;
979
+ parentSpanId?: string | null;
955
980
  status: 'success' | 'error' | 'pending';
956
981
  subAgentId?: string;
957
982
  subAgentName?: string;
@@ -1040,12 +1065,14 @@ export async function GET(
1040
1065
  getString(span, SPAN_KEYS.OTEL_STATUS_DESCRIPTION, '')
1041
1066
  : '';
1042
1067
 
1068
+ const toolCall = getString(span, SPAN_KEYS.SPAN_ID, '');
1043
1069
  activities.push({
1044
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1070
+ id: toolCall,
1045
1071
  type: ACTIVITY_TYPES.TOOL_CALL,
1046
1072
  toolName: name,
1047
1073
  description: hasError && statusMessage ? `Tool ${name} failed` : `Called ${name}`,
1048
1074
  timestamp: span.timestamp,
1075
+ parentSpanId: spanIdToParentSpanId.get(toolCall) || undefined,
1049
1076
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1050
1077
  subAgentName: getString(span, SPAN_KEYS.SUB_AGENT_NAME, ACTIVITY_NAMES.UNKNOWN_AGENT),
1051
1078
  subAgentId: getString(span, SPAN_KEYS.SUB_AGENT_ID, ACTIVITY_NAMES.UNKNOWN_AGENT),
@@ -1078,11 +1105,13 @@ export async function GET(
1078
1105
  else if (Array.isArray(rawKeys)) keys = rawKeys as string[];
1079
1106
  } catch {}
1080
1107
 
1108
+ const contextResolution = getString(span, SPAN_KEYS.SPAN_ID, '');
1081
1109
  activities.push({
1082
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1110
+ id: contextResolution,
1083
1111
  type: ACTIVITY_TYPES.CONTEXT_RESOLUTION,
1084
1112
  description: `Context fetch ${hasError ? 'failed' : 'completed'}`,
1085
1113
  timestamp: span.timestamp,
1114
+ parentSpanId: spanIdToParentSpanId.get(contextResolution) || undefined,
1086
1115
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1087
1116
  contextStatusDescription: statusMessage || undefined,
1088
1117
  contextUrl: getString(span, SPAN_KEYS.CONTEXT_URL, '') || undefined,
@@ -1107,11 +1136,13 @@ export async function GET(
1107
1136
  else if (Array.isArray(rawKeys)) keys = rawKeys as string[];
1108
1137
  } catch {}
1109
1138
 
1139
+ const contextHandle = getString(span, SPAN_KEYS.SPAN_ID, '');
1110
1140
  activities.push({
1111
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1141
+ id: contextHandle,
1112
1142
  type: ACTIVITY_TYPES.CONTEXT_RESOLUTION,
1113
1143
  description: `Context handle ${hasError ? 'failed' : 'completed'}`,
1114
1144
  timestamp: span.timestamp,
1145
+ parentSpanId: spanIdToParentSpanId.get(contextHandle) || undefined,
1115
1146
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1116
1147
  contextStatusDescription: statusMessage || undefined,
1117
1148
  contextUrl: getString(span, SPAN_KEYS.CONTEXT_URL, '') || undefined,
@@ -1125,11 +1156,13 @@ export async function GET(
1125
1156
  for (const span of userMessageSpans) {
1126
1157
  const hasError = getField(span, SPAN_KEYS.HAS_ERROR) === true;
1127
1158
  const durMs = getNumber(span, SPAN_KEYS.DURATION_NANO) / 1e6;
1159
+ const userMessageSpanId = getString(span, SPAN_KEYS.SPAN_ID, '');
1128
1160
  activities.push({
1129
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1161
+ id: userMessageSpanId,
1130
1162
  type: ACTIVITY_TYPES.USER_MESSAGE,
1131
1163
  description: 'User sent a message',
1132
1164
  timestamp: getString(span, SPAN_KEYS.MESSAGE_TIMESTAMP),
1165
+ parentSpanId: spanIdToParentSpanId.get(userMessageSpanId) || undefined,
1133
1166
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1134
1167
  subAgentId: AGENT_IDS.USER,
1135
1168
  subAgentName: ACTIVITY_NAMES.USER,
@@ -1144,11 +1177,13 @@ export async function GET(
1144
1177
  for (const span of aiAssistantSpans) {
1145
1178
  const hasError = getField(span, SPAN_KEYS.HAS_ERROR) === true;
1146
1179
  const durMs = getNumber(span, SPAN_KEYS.DURATION_NANO) / 1e6;
1180
+ const aiAssistantMessageSpanId = getString(span, SPAN_KEYS.SPAN_ID, '');
1147
1181
  activities.push({
1148
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1182
+ id: aiAssistantMessageSpanId,
1149
1183
  type: ACTIVITY_TYPES.AI_ASSISTANT_MESSAGE,
1150
1184
  description: 'AI Assistant responded',
1151
1185
  timestamp: getString(span, SPAN_KEYS.AI_RESPONSE_TIMESTAMP),
1186
+ parentSpanId: spanIdToParentSpanId.get(aiAssistantMessageSpanId) || undefined,
1152
1187
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1153
1188
  subAgentId: getString(span, SPAN_KEYS.SUB_AGENT_ID, ACTIVITY_NAMES.UNKNOWN_AGENT),
1154
1189
  subAgentName: getString(span, SPAN_KEYS.SUB_AGENT_NAME, ACTIVITY_NAMES.UNKNOWN_AGENT),
@@ -1169,11 +1204,13 @@ export async function GET(
1169
1204
  const aiResponseToolCalls = getString(span, SPAN_KEYS.AI_RESPONSE_TOOL_CALLS, '');
1170
1205
  const aiPromptMessages = getString(span, SPAN_KEYS.AI_PROMPT_MESSAGES, '');
1171
1206
 
1207
+ const aiGeneration = getString(span, SPAN_KEYS.SPAN_ID, '');
1172
1208
  activities.push({
1173
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1209
+ id: aiGeneration,
1174
1210
  type: ACTIVITY_TYPES.AI_GENERATION,
1175
1211
  description: 'AI model generating text response',
1176
1212
  timestamp: span.timestamp,
1213
+ parentSpanId: spanIdToParentSpanId.get(aiGeneration) || undefined,
1177
1214
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1178
1215
  subAgentId: getString(
1179
1216
  span,
@@ -1205,11 +1242,13 @@ export async function GET(
1205
1242
  const otelStatusCode = getString(span, SPAN_KEYS.OTEL_STATUS_CODE, '');
1206
1243
  const otelStatusDescription = getString(span, SPAN_KEYS.OTEL_STATUS_DESCRIPTION, '');
1207
1244
 
1245
+ const agentGeneration = getString(span, SPAN_KEYS.SPAN_ID, '');
1208
1246
  activities.push({
1209
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1247
+ id: agentGeneration,
1210
1248
  type: ACTIVITY_TYPES.AGENT_GENERATION,
1211
1249
  description: hasError ? 'Agent generation failed' : 'Agent generation',
1212
1250
  timestamp: span.timestamp,
1251
+ parentSpanId: spanIdToParentSpanId.get(agentGeneration) || undefined,
1213
1252
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1214
1253
  result: hasError
1215
1254
  ? statusMessage || 'Agent generation failed'
@@ -1226,11 +1265,13 @@ export async function GET(
1226
1265
  for (const span of aiStreamingSpans) {
1227
1266
  const hasError = getField(span, SPAN_KEYS.HAS_ERROR) === true;
1228
1267
  const durMs = getNumber(span, SPAN_KEYS.DURATION_NANO) / 1e6;
1268
+ const aiStreamingText = getString(span, SPAN_KEYS.SPAN_ID, '');
1229
1269
  activities.push({
1230
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1270
+ id: aiStreamingText,
1231
1271
  type: ACTIVITY_TYPES.AI_MODEL_STREAMED_TEXT,
1232
1272
  description: 'AI model streaming text response',
1233
1273
  timestamp: span.timestamp,
1274
+ parentSpanId: spanIdToParentSpanId.get(aiStreamingText) || undefined,
1234
1275
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1235
1276
  subAgentId: getString(
1236
1277
  span,
@@ -1258,11 +1299,13 @@ export async function GET(
1258
1299
  for (const span of aiStreamingObjectSpans) {
1259
1300
  const hasError = getField(span, SPAN_KEYS.HAS_ERROR) === true;
1260
1301
  const durMs = getNumber(span, SPAN_KEYS.DURATION_NANO) / 1e6;
1302
+ const aiStreamingObject = getString(span, SPAN_KEYS.SPAN_ID, '');
1261
1303
  activities.push({
1262
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1304
+ id: aiStreamingObject,
1263
1305
  type: ACTIVITY_TYPES.AI_MODEL_STREAMED_OBJECT,
1264
1306
  description: 'AI model streaming object response',
1265
1307
  timestamp: span.timestamp,
1308
+ parentSpanId: spanIdToParentSpanId.get(aiStreamingObject) || undefined,
1266
1309
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1267
1310
  subAgentId: getString(span, SPAN_KEYS.SUB_AGENT_ID, ACTIVITY_NAMES.UNKNOWN_AGENT),
1268
1311
  subAgentName: getString(span, SPAN_KEYS.SUB_AGENT_NAME, ACTIVITY_NAMES.UNKNOWN_AGENT),
@@ -1281,11 +1324,13 @@ export async function GET(
1281
1324
  // context fetchers
1282
1325
  for (const span of contextFetcherSpans) {
1283
1326
  const hasError = getField(span, SPAN_KEYS.HAS_ERROR) === true;
1327
+ const contextFetcher = getString(span, SPAN_KEYS.SPAN_ID, '');
1284
1328
  activities.push({
1285
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1329
+ id: contextFetcher,
1286
1330
  type: ACTIVITY_TYPES.CONTEXT_FETCH,
1287
1331
  description: '',
1288
1332
  timestamp: span.timestamp,
1333
+ parentSpanId: spanIdToParentSpanId.get(contextFetcher) || undefined,
1289
1334
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1290
1335
  subAgentId: UNKNOWN_VALUE,
1291
1336
  subAgentName: 'Context Fetcher',
@@ -1302,11 +1347,13 @@ export async function GET(
1302
1347
  const artifactType = getString(span, SPAN_KEYS.ARTIFACT_TYPE, '');
1303
1348
  const artifactDescription = getString(span, SPAN_KEYS.ARTIFACT_DESCRIPTION, '');
1304
1349
 
1350
+ const artifactProcessing = getString(span, SPAN_KEYS.SPAN_ID, '');
1305
1351
  activities.push({
1306
- id: getString(span, SPAN_KEYS.SPAN_ID, ''),
1352
+ id: artifactProcessing,
1307
1353
  type: 'artifact_processing',
1308
1354
  description: 'Artifact processed',
1309
1355
  timestamp: span.timestamp,
1356
+ parentSpanId: spanIdToParentSpanId.get(artifactProcessing) || undefined,
1310
1357
  status: hasError ? ACTIVITY_STATUS.ERROR : ACTIVITY_STATUS.SUCCESS,
1311
1358
  subAgentId: getString(span, SPAN_KEYS.SUB_AGENT_ID, ACTIVITY_NAMES.UNKNOWN_AGENT),
1312
1359
  subAgentName: getString(span, SPAN_KEYS.SUB_AGENT_NAME, ACTIVITY_NAMES.UNKNOWN_AGENT),
@@ -1325,6 +1372,21 @@ export async function GET(
1325
1372
  const operationStartTime = allSpanTimes.length > 0 ? Math.min(...allSpanTimes) : null;
1326
1373
  const operationEndTime = allSpanTimes.length > 0 ? Math.max(...allSpanTimes) : null;
1327
1374
 
1375
+ // Resolve parentSpanId to nearest ancestor activity
1376
+ const activityIds = new Set(activities.map((a) => a.id));
1377
+ function findAncestorActivity(spanId: string): string | undefined {
1378
+ if (!spanId) return undefined;
1379
+ if (activityIds.has(spanId)) return spanId;
1380
+ const parentSpanId = spanIdToParentSpanId.get(spanId);
1381
+ if (!parentSpanId) return undefined;
1382
+ return findAncestorActivity(parentSpanId);
1383
+ }
1384
+ for (const activity of activities) {
1385
+ if (activity.parentSpanId) {
1386
+ activity.parentSpanId = findAncestorActivity(activity.parentSpanId) || undefined;
1387
+ }
1388
+ }
1389
+
1328
1390
  // Sort activities by pre-parsed timestamps
1329
1391
  activities.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
1330
1392
 
@@ -1374,23 +1436,6 @@ export async function GET(
1374
1436
 
1375
1437
  const openAICallsCount = aiGenerationSpans.length;
1376
1438
 
1377
- let allSpanAttributes: Array<{
1378
- spanId: string;
1379
- traceId: string;
1380
- timestamp: string;
1381
- data: Record<string, any>;
1382
- }> = [];
1383
- try {
1384
- allSpanAttributes = await fetchAllSpanAttributes_SQL(
1385
- conversationId,
1386
- SIGNOZ_URL,
1387
- SIGNOZ_API_KEY
1388
- );
1389
- } catch (e) {
1390
- const logger = getLogger('span-attributes');
1391
- logger.error({ error: e }, 'allSpanAttributes SQL fetch skipped/failed');
1392
- }
1393
-
1394
1439
  const conversation = {
1395
1440
  conversationId,
1396
1441
  startTime: conversationStartTime ? conversationStartTime : null,
@@ -0,0 +1,151 @@
1
+ import { useState } from 'react';
2
+ import { TimelineItem } from '@/components/traces/timeline/timeline-item';
3
+ import { buildActivityTree, type TreeNode } from '@/components/traces/timeline/tree-utils';
4
+ import type { ActivityItem } from '@/components/traces/timeline/types';
5
+
6
+ interface HierarchicalTimelineProps {
7
+ activities: ActivityItem[];
8
+ onSelect: (a: ActivityItem) => void;
9
+ selectedActivityId?: string | null;
10
+ collapsedAiMessages?: Set<string>;
11
+ onToggleAiMessageCollapse?: (activityId: string) => void;
12
+ }
13
+
14
+ interface TreeNodeItemProps {
15
+ node: TreeNode;
16
+ isLast: boolean;
17
+ onSelect: (a: ActivityItem) => void;
18
+ selectedActivityId?: string | null;
19
+ collapsedAiMessages?: Set<string>;
20
+ onToggleAiMessageCollapse?: (activityId: string) => void;
21
+ collapsedNodes: Set<string>;
22
+ toggleNodeCollapse: (nodeId: string) => void;
23
+ }
24
+
25
+ function TreeNodeItem({
26
+ node,
27
+ isLast,
28
+ onSelect,
29
+ selectedActivityId,
30
+ collapsedAiMessages,
31
+ onToggleAiMessageCollapse,
32
+ collapsedNodes,
33
+ toggleNodeCollapse,
34
+ }: TreeNodeItemProps) {
35
+ const hasChildren = node.children.length > 0;
36
+ const isCollapsed = collapsedNodes.has(node.activity.id);
37
+ const indentSize = 24;
38
+
39
+ return (
40
+ <div className="relative">
41
+ {/* Vertical line extending through all descendants - positioned relative to entire subtree */}
42
+ {!isCollapsed && !isLast && (
43
+ <div
44
+ className="absolute left-0 top-0 border-l border-border"
45
+ style={{
46
+ left: node.depth > 0 ? `${(node.depth - 1) * indentSize + 7}px` : '7px',
47
+ bottom: '-16px',
48
+ }}
49
+ />
50
+ )}
51
+
52
+ <div className="flex items-start">
53
+ <div
54
+ style={{
55
+ width: `${node.depth * indentSize}px`,
56
+ minWidth: `${node.depth * indentSize}px`,
57
+ }}
58
+ className="relative flex-shrink-0"
59
+ >
60
+ {node.depth > 0 && (
61
+ <div
62
+ className="absolute top-[16px] border-t border-border"
63
+ style={{
64
+ left: `${(node.depth - 1) * indentSize + 7}px`,
65
+ width: `${indentSize - 7}px`,
66
+ }}
67
+ />
68
+ )}
69
+ </div>
70
+
71
+ <div className="flex-1">
72
+ <div className="inline-block w-full">
73
+ <TimelineItem
74
+ activity={node.activity}
75
+ isLast={isLast && (node.children.length === 0 || isCollapsed)}
76
+ onSelect={() => onSelect(node.activity)}
77
+ isSelected={selectedActivityId === node.activity.id}
78
+ isAiMessageCollapsed={collapsedAiMessages?.has(node.activity.id) || false}
79
+ onToggleAiMessageCollapse={onToggleAiMessageCollapse}
80
+ hasChildren={hasChildren}
81
+ isCollapsed={isCollapsed}
82
+ onToggleCollapse={() => toggleNodeCollapse(node.activity.id)}
83
+ />
84
+ </div>
85
+ </div>
86
+ </div>
87
+
88
+ {!isCollapsed && node.children.length > 0 && (
89
+ <div>
90
+ {node.children.map((child, index) => (
91
+ <TreeNodeItem
92
+ key={`${child.activity.id}-${child.activity.type}-${index}`}
93
+ node={child}
94
+ isLast={index === node.children.length - 1}
95
+ onSelect={onSelect}
96
+ selectedActivityId={selectedActivityId}
97
+ collapsedAiMessages={collapsedAiMessages}
98
+ onToggleAiMessageCollapse={onToggleAiMessageCollapse}
99
+ collapsedNodes={collapsedNodes}
100
+ toggleNodeCollapse={toggleNodeCollapse}
101
+ />
102
+ ))}
103
+ </div>
104
+ )}
105
+ </div>
106
+ );
107
+ }
108
+
109
+ export function HierarchicalTimeline({
110
+ activities,
111
+ onSelect,
112
+ selectedActivityId,
113
+ collapsedAiMessages,
114
+ onToggleAiMessageCollapse,
115
+ }: HierarchicalTimelineProps) {
116
+ const [collapsedNodes, setCollapsedNodes] = useState<Set<string>>(new Set());
117
+
118
+ const toggleNodeCollapse = (nodeId: string) => {
119
+ setCollapsedNodes((prev) => {
120
+ const newSet = new Set(prev);
121
+ if (newSet.has(nodeId)) {
122
+ newSet.delete(nodeId);
123
+ } else {
124
+ newSet.add(nodeId);
125
+ }
126
+ return newSet;
127
+ });
128
+ };
129
+
130
+ const tree = buildActivityTree(activities);
131
+
132
+ return (
133
+ <div className="pt-2 px-6 pb-6">
134
+ <div className="relative space-y-2">
135
+ {tree.map((node, index) => (
136
+ <TreeNodeItem
137
+ key={`${node.activity.id}-${node.activity.type}-${index}`}
138
+ node={node}
139
+ isLast={index === tree.length - 1}
140
+ onSelect={onSelect}
141
+ selectedActivityId={selectedActivityId}
142
+ collapsedAiMessages={collapsedAiMessages}
143
+ onToggleAiMessageCollapse={onToggleAiMessageCollapse}
144
+ collapsedNodes={collapsedNodes}
145
+ toggleNodeCollapse={toggleNodeCollapse}
146
+ />
147
+ ))}
148
+ </div>
149
+ </div>
150
+ );
151
+ }
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  ArrowRight,
3
- ArrowUpRight,
4
3
  ChevronDown,
5
4
  ChevronRight,
6
5
  Cpu,
@@ -79,6 +78,9 @@ interface TimelineItemProps {
79
78
  isSelected?: boolean;
80
79
  isAiMessageCollapsed?: boolean;
81
80
  onToggleAiMessageCollapse?: (activityId: string) => void;
81
+ hasChildren?: boolean;
82
+ isCollapsed?: boolean;
83
+ onToggleCollapse?: () => void;
82
84
  }
83
85
 
84
86
  export function TimelineItem({
@@ -88,6 +90,9 @@ export function TimelineItem({
88
90
  isSelected = false,
89
91
  isAiMessageCollapsed = false,
90
92
  onToggleAiMessageCollapse,
93
+ hasChildren = false,
94
+ isCollapsed = false,
95
+ onToggleCollapse,
91
96
  }: TimelineItemProps) {
92
97
  const typeForIcon =
93
98
  activity.type === ACTIVITY_TYPES.TOOL_CALL && activity.toolType === TOOL_TYPES.TRANSFER
@@ -113,8 +118,10 @@ export function TimelineItem({
113
118
  return (
114
119
  <div className={`flex flex-col text-muted-foreground relative text-xs`}>
115
120
  <div className="flex items-start">
116
- <div className="mr-2 py-2">
117
- <Icon className={`w-4 h-4 ${className}`} />
121
+ <div className="mr-2 py-2" style={{ width: '16px' }}>
122
+ <div className="absolute left-[7px] top-[8px] -translate-x-1/2 flex items-center justify-center w-5 h-5 rounded bg-white dark:bg-background z-10">
123
+ <Icon className={`w-4 h-4 ${className}`} />
124
+ </div>
118
125
  </div>
119
126
 
120
127
  <div
@@ -122,7 +129,7 @@ export function TimelineItem({
122
129
  isSelected ? 'ring-1 ring-primary/50 bg-primary/5' : ''
123
130
  }`}
124
131
  >
125
- <div className="flex items-center gap-2">
132
+ <div className="flex items-center justify-between gap-2">
126
133
  <button
127
134
  type="button"
128
135
  onClick={onSelect}
@@ -132,11 +139,24 @@ export function TimelineItem({
132
139
  <span className="font-medium">
133
140
  <Streamdown>{activity.description}</Streamdown>
134
141
  </span>
135
- <ArrowUpRight
136
- className={`h-4 w-4 transition-colors ${activity.status === 'error' ? 'text-red-700 group-hover:text-red-800' : 'text-muted-foreground group-hover:text-primary'}`}
137
- aria-hidden="true"
138
- />
139
142
  </button>
143
+ {hasChildren && onToggleCollapse && (
144
+ <button
145
+ type="button"
146
+ onClick={(e) => {
147
+ e.stopPropagation();
148
+ onToggleCollapse();
149
+ }}
150
+ className="flex-shrink-0 inline-flex items-center justify-center w-5 h-5 rounded hover:bg-muted transition-colors"
151
+ title={isCollapsed ? 'Expand children' : 'Collapse children'}
152
+ >
153
+ {isCollapsed ? (
154
+ <ChevronRight className="w-4 h-4 text-muted-foreground" />
155
+ ) : (
156
+ <ChevronDown className="w-4 h-4 text-muted-foreground" />
157
+ )}
158
+ </button>
159
+ )}
140
160
  </div>
141
161
 
142
162
  {/* user message bubble */}
@@ -400,7 +420,12 @@ export function TimelineItem({
400
420
  </div>
401
421
  </div>
402
422
 
403
- {!isLast && <div className="absolute top-8 left-[7px] border-l border-border h-full" />}
423
+ {!isLast && !isCollapsed && hasChildren && (
424
+ <div
425
+ className="absolute top-4 left-[7px] border-l border-border"
426
+ style={{ height: 'calc(100%)' }}
427
+ />
428
+ )}
404
429
  </div>
405
430
  );
406
431
  }
@@ -4,7 +4,7 @@ import { toast } from 'sonner';
4
4
  import { StickToBottom } from 'use-stick-to-bottom';
5
5
  import { ConversationTracesLink } from '@/components/traces/signoz-link';
6
6
  import { ActivityDetailsSidePane } from '@/components/traces/timeline/activity-details-sidepane';
7
- import { ActivityTimeline } from '@/components/traces/timeline/activity-timeline';
7
+ import { HierarchicalTimeline } from '@/components/traces/timeline/hierarchical-timeline';
8
8
  import { renderPanelContent } from '@/components/traces/timeline/render-panel-content';
9
9
  import type {
10
10
  ActivityItem,
@@ -363,7 +363,9 @@ export function TimelineWrapper({
363
363
  <div className="bg-background h-full flex flex-col py-4">
364
364
  <div className="flex-shrink-0">
365
365
  <div className="flex items-center justify-between px-6 pb-4">
366
- <div className="text-foreground text-md font-medium">Activity timeline</div>
366
+ <div className="flex items-center gap-2">
367
+ <div className="text-foreground text-md font-medium">Activity timeline</div>
368
+ </div>
367
369
  <div className="flex items-center gap-2">
368
370
  {/* Copy JSON Button */}
369
371
  {onCopyTrace && (
@@ -435,7 +437,7 @@ export function TimelineWrapper({
435
437
  initial="smooth"
436
438
  >
437
439
  <StickToBottom.Content>
438
- <ActivityTimeline
440
+ <HierarchicalTimeline
439
441
  activities={sortedActivities}
440
442
  onSelect={(activity) => {
441
443
  setSelected({
@@ -469,7 +471,7 @@ export function TimelineWrapper({
469
471
  </StickToBottom>
470
472
  ) : (
471
473
  <div className="h-full overflow-y-auto scrollbar-thin scrollbar-thumb-muted-foreground/30 scrollbar-track-transparent dark:scrollbar-thumb-muted-foreground/50">
472
- <ActivityTimeline
474
+ <HierarchicalTimeline
473
475
  activities={sortedActivities}
474
476
  onSelect={(activity) => {
475
477
  setSelected({
@@ -0,0 +1,81 @@
1
+ import type { ActivityItem } from './types';
2
+
3
+ export interface TreeNode {
4
+ activity: ActivityItem;
5
+ children: TreeNode[];
6
+ depth: number;
7
+ }
8
+
9
+ export function buildActivityTree(activities: ActivityItem[]): TreeNode[] {
10
+ const sortedActivities = [...activities].sort(
11
+ (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()
12
+ );
13
+
14
+ const nodeMap = new Map<string, TreeNode>();
15
+ const rootNodes: TreeNode[] = [];
16
+ const activityIndexMap = new Map<string, number>();
17
+
18
+ for (let i = 0; i < sortedActivities.length; i++) {
19
+ const activity = sortedActivities[i];
20
+ activityIndexMap.set(activity.id, i);
21
+ nodeMap.set(activity.id, {
22
+ activity,
23
+ children: [],
24
+ depth: 0,
25
+ });
26
+ }
27
+
28
+ for (const activity of sortedActivities) {
29
+ const node = nodeMap.get(activity.id);
30
+ if (!node) continue;
31
+
32
+ // activity.parentSpanId is already resolved to nearest ancestor activity by API route
33
+ const parentSpanId = activity.parentSpanId;
34
+
35
+ if (parentSpanId && nodeMap.has(parentSpanId)) {
36
+ const parent = nodeMap.get(parentSpanId);
37
+ if (parent) {
38
+ parent.children.push(node);
39
+ node.depth = parent.depth + 1;
40
+ }
41
+ } else {
42
+ rootNodes.push(node);
43
+ }
44
+ }
45
+
46
+ function sortChildren(node: TreeNode) {
47
+ node.children.sort(
48
+ (a, b) => new Date(a.activity.timestamp).getTime() - new Date(b.activity.timestamp).getTime()
49
+ );
50
+ for (const child of node.children) {
51
+ sortChildren(child);
52
+ }
53
+ }
54
+
55
+ for (const root of rootNodes) {
56
+ sortChildren(root);
57
+ }
58
+
59
+ rootNodes.sort(
60
+ (a, b) => new Date(a.activity.timestamp).getTime() - new Date(b.activity.timestamp).getTime()
61
+ );
62
+
63
+ return rootNodes;
64
+ }
65
+
66
+ export function flattenTree(nodes: TreeNode[]): ActivityItem[] {
67
+ const result: ActivityItem[] = [];
68
+
69
+ function traverse(node: TreeNode) {
70
+ result.push(node.activity);
71
+ for (const child of node.children) {
72
+ traverse(child);
73
+ }
74
+ }
75
+
76
+ for (const node of nodes) {
77
+ traverse(node);
78
+ }
79
+
80
+ return result;
81
+ }
@@ -33,6 +33,7 @@ export interface ActivityItem {
33
33
  name?: string;
34
34
  description: string;
35
35
  timestamp: string;
36
+ parentSpanId?: string | null;
36
37
  subAgentId?: string;
37
38
  subAgentName?: string;
38
39
  toolName?: string;