@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.
- package/.next/standalone/agents-manage-ui/.next/BUILD_ID +1 -1
- package/.next/standalone/agents-manage-ui/.next/app-build-manifest.json +205 -205
- package/.next/standalone/agents-manage-ui/.next/app-path-routes-manifest.json +11 -11
- package/.next/standalone/agents-manage-ui/.next/build-manifest.json +5 -5
- package/.next/standalone/agents-manage-ui/.next/prerender-manifest.json +13 -13
- package/.next/standalone/agents-manage-ui/.next/react-loadable-manifest.json +4 -4
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/agents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page.js +3 -3
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/api-keys/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/artifacts/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/components/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/new/providers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/credentials/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/external-agents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/edit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/mcp-servers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/ai-calls/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js +3 -3
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page.js.nft.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/[projectId]/traces/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/[tenantId]/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/_not-found.rsc +9 -9
- package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-render/route.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/api/data-components/[dataComponentId]/generate-render/route_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/api/signoz/route_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app/page.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/app-paths-manifest.json +11 -11
- package/.next/standalone/agents-manage-ui/.next/server/chunks/2323.js +2 -2
- package/.next/standalone/agents-manage-ui/.next/server/chunks/3200.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/341.js +4 -4
- package/.next/standalone/agents-manage-ui/.next/server/chunks/4266.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/4936.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5130.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/5316.js +3 -3
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6224.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/6384.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/70.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/7065.js +7 -7
- package/.next/standalone/agents-manage-ui/.next/server/chunks/8359.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/{8374.js → 848.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/9542.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/agents-manage-ui/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/pages/404.html +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/pages/500.html +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/agents-manage-ui/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/31411-cbacdddda02a71ad.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/32848-e368b492419ae6e4.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/35694-cd683e40b2ff9fb6.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/50118.1c7ac0c134716b42.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{55157-ebbf65f28884e4b0.js → 55157-25e4c0b9f9d95f2c.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{44274-a124ee7d0e9bbf36.js → 67932-c2178c26618f6820.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/6804-e9595bf74c07058e.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/97061-02431a2eb7031ffb.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/[agentId]/{page-7b138b74aa1b6cc4.js → page-418465cf3e57d112.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-c1960963f976eb19.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/{page-0613cd0de89555f2.js → page-0b6940cf79665598.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/api-keys/{page-33d38258008068ef.js → page-cda8e337d66a021d.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-e4f3aef1f40c9bf7.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-d12d19bfb3b0d102.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/{page-f8ce61ef934023fe.js → page-77d86d4f33293f56.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page-1b306a83fa4ceacc.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/page-a9860dea576ef98d.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-a860dc8ee68c3780.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-641b27cabd40331a.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-2ef23dc2048b712a.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-ae80cda47d578187.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/{page-915741768be9759b.js → page-f20bfd58a0a17c52.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page-5128cfef25651d47.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/new/page-edf63292bd5b8ad1.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/page-fc766a714e38896d.js +1 -0
- 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
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-fe56358f31e65716.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/new/{page-3defad8f3981df45.js → page-45de64677dd86b11.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/{page-925d005895fa7166.js → page-34e69891e16a6a61.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/settings/{page-944f6415e8418ec1.js → page-fade925bc1cff005.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page-fe4008846a914db1.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-e4fee623dbbbcefb.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/{page-9e4b43e3d743ebf1.js → page-ccd5098ae7d16eb1.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-dedaf5704e4a3d75.js +1 -0
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{d834c995-aa1be5b3f2aabfaa.js → d834c995-85cbaf1e7f74897d.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/{webpack-9f7107d4096ccd92.js → webpack-e5241b458329a412.js} +1 -1
- package/.next/standalone/agents-manage-ui/.next/static/css/79e788a7e7a93a1e.css +1 -0
- package/.next/standalone/agents-manage-ui/package.json +1 -1
- package/.next/standalone/packages/agents-core/package.json +1 -1
- package/package.json +4 -4
- package/src/app/api/signoz/conversations/[conversationId]/route.ts +73 -28
- package/src/components/traces/timeline/hierarchical-timeline.tsx +151 -0
- package/src/components/traces/timeline/timeline-item.tsx +34 -9
- package/src/components/traces/timeline/timeline-wrapper.tsx +6 -4
- package/src/components/traces/timeline/tree-utils.ts +81 -0
- package/src/components/traces/timeline/types.ts +1 -0
- package/.next/standalone/agents-manage-ui/.next/server/chunks/1319.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/7403.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/server/chunks/7850.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/15890-6694e366870d7977.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/50118.b4a463e89825ca55.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/50840-e61f8487dca6e5dc.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/56795-ac5daea13056f2d1.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/57183-91e28fb6372961d9.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/69387-788fe104e9200de8.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/agents/new/page-bd4eb51411fb1d84.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/[artifactComponentId]/page-85154d8147fb0e07.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/artifacts/new/page-9fee2a6c273348dc.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/[dataComponentId]/page-48dfc09ca84ac33d.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/new/page-418f79b80fdfaf9d.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/components/page-b7902a950db917b3.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/[credentialId]/page-f6aefdae7c13a062.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/bearer/page-13fecba8f9580e78.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/credentials/new/providers/[providerId]/page-2a3324df7e328b87.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/[externalAgentId]/edit/page-3c4cdc90fe498f5b.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/new/page-41804c6316f86c76.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/external-agents/page-b286b892d54757cd.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/mcp-servers/[mcpServerId]/page-e545c7134b230dda.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/conversations/[conversationId]/page-7be5a55c90e9652f.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/[tenantId]/projects/[projectId]/traces/page-b71b09da8b3e95d2.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/chunks/app/layout-2b71a361f54d52ca.js +0 -1
- package/.next/standalone/agents-manage-ui/.next/static/css/f9fbffcdb4166a2a.css +0 -1
- package/src/components/traces/timeline/activity-timeline.tsx +0 -34
- /package/.next/standalone/agents-manage-ui/.next/static/{lDlviZ-fsvH_GGTtL9vCU → tkbmvZjhUKAsZg_pT9Nzk}/_buildManifest.js +0 -0
- /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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
<
|
|
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 &&
|
|
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 {
|
|
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="
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
+
}
|