Fix activity-ingest empty stdout blocking Cursor gate hooks - #166
Conversation
beforeFileRead and other gate events require valid allow/continue JSON; emit it in a finally so ingest stays fail-open without failing closed. Co-authored-by: Cursor <cursoragent@cursor.com>
PR Summary by QodoPrevent Cursor gate hooks from blocking by always emitting allow/continue JSON
AI Description
Diagram
High-Level Assessment
Files changed (2)
|
Code Review by Qodo
1.
|
Cursor already records reads via afterTool/postToolUse; the beforeReadFile hook only duplicated them as kind file and risked gate failures. Co-authored-by: Cursor <cursoragent@cursor.com>
Add hooks.activityCorrelation field maps per provider so ingest extracts chat/turn ids without hardcoding, persist them on tool_calls, and nest the Activity feed conversation → generation → spans. Co-authored-by: Cursor <cursoragent@cursor.com>
Add hooks.activityAttributes field maps so model, model_id, versions, and related metadata are stored on tool_calls without provider-specific hardcoding. Co-authored-by: Cursor <cursoragent@cursor.com>
Read PostToolUse results from provider-configured fields (Claude tool_response, Cursor tool_output) instead of assuming Cursor-only names. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep generation rows focused on the turn; show the provider once per conversation. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Inherit conversation/generation on MCP traces and keep afterShell rows for capa sh so Bash/Shell calls are visible in the activity feed. Co-authored-by: Cursor <cursoragent@cursor.com>
Apply Biome format/import fixes across activity files and keep activity-ingest fail-open when stdout is broken. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Summary
capa activity-ingestis an observer but was installed on Cursor gate events (beforeFileRead,subagentStart,userPromptSubmit) without writing stdout.{"permission":"allow"}/{"continue":true}in afinallyblock so ingest stays fail-open and gates never fail closed.Test plan
bun test src/cli/commands/__tests__/activity-ingest.test.tscapa activity-ingest ... --event beforeFileReadand confirm stdout is{"permission":"allow"}capaand confirm Cursor Read is no longer blocked by the activity hook