WarpParser.parse_all() (Sensor/adr_sensor/parsers/warp_parser.py) re-reads the entire agent_conversations table and runs a separate SQL JOIN query per conversation on every invocation, with no bound on age or count.
By contrast, ClaudeParser, CursorParser, and ClaudeDesktopParser all implement an explicit 14-day cutoff (max_age_days, documented as "Performance-optimized: Skips [logs] older than 2 weeks by default"). CursorParser is a directly comparable case — also SQLite-backed — and filters conversation IDs by lastUpdatedAt/createdAt before querying details.
Since Warp conversation history grows unboundedly and the sensor is run repeatedly (e.g. via cron/launchd) on end-user machines, this means the amount of work done on every single run grows forever, unlike its sibling parsers. WarpParser is also the only parser with no test coverage in tests/test_parsers.py.
I already have a fix scoped: bring WarpParser in line with CursorParser's existing pattern (age cutoff computed from last_modified_at, filtered before the per-conversation query runs), plus test coverage. Opening this first for visibility — PR to follow.
WarpParser.parse_all()(Sensor/adr_sensor/parsers/warp_parser.py) re-reads the entireagent_conversationstable and runs a separate SQL JOIN query per conversation on every invocation, with no bound on age or count.By contrast,
ClaudeParser,CursorParser, andClaudeDesktopParserall implement an explicit 14-day cutoff (max_age_days, documented as "Performance-optimized: Skips [logs] older than 2 weeks by default").CursorParseris a directly comparable case — also SQLite-backed — and filters conversation IDs bylastUpdatedAt/createdAtbefore querying details.Since Warp conversation history grows unboundedly and the sensor is run repeatedly (e.g. via cron/launchd) on end-user machines, this means the amount of work done on every single run grows forever, unlike its sibling parsers.
WarpParseris also the only parser with no test coverage intests/test_parsers.py.I already have a fix scoped: bring
WarpParserin line withCursorParser's existing pattern (age cutoff computed fromlast_modified_at, filtered before the per-conversation query runs), plus test coverage. Opening this first for visibility — PR to follow.