Fix Cursor CLI activity trace grouping - #169
Conversation
Cursor Agent CLI sends different conversation_id values on prompts vs tool hooks; reconcile by generation before grouping so live SSE updates keep one run per turn.
PR Summary by QodoFix Cursor CLI activity trace grouping via conversation ID reconciliation
AI Description
Diagram
High-Level Assessment
Files changed (4)
|
Keep attributes_json valid JSON under the size cap, tighten plugin skill fallback guards, namespace activity run ids by conversation, populate nested plugin manifest paths, and skip Cursor id reconcile when generation chat ids conflict.
Code Review by Qodo
1.
|
Cursor CLI does not emit postToolUse for CallDynamicTool (WebSearch/WebFetch) or Glob; ingest those at preToolUse without duplicating Read/Shell spans.
Show touched files beside activity spans with search, resizable split, wrap shadow path remapping, and two-way highlight between expanded spans and file rows. Co-authored-by: Cursor <cursoragent@cursor.com>
Use Array.isArray for file-tree selection typing. Only read transcript_path from stop rows after a cheap string pre-check. Co-authored-by: Cursor <cursoragent@cursor.com>
Treat strict path prefixes and extensionless search roots as directories so nested activity paths no longer render with file icons. Co-authored-by: Cursor <cursoragent@cursor.com>
Summary
conversation_idmismatch).attributes_json; plugin skill fallback only fortype: plugin; composite run ids (conversation:generation); realmanifestFilein nested plugin lookup; test formatting.generation_idmaps to conflicting chat ids.Test plan
bun test src/shared/__tests__/activity-correlation-reconcile.test.ts src/shared/__tests__/activity-attributes.test.ts web-ui/src/features/projects/components/activity/groupActivityRuns.test.ts src/server/__tests__/skill-content-plugin.test.tsgeneration_idopen distinct runs