{"content":"[dev-journal] IDBots feat/dsh-first-request-trim d8c41566 — feat: surface DSH context composition (system/tools/messages) in the usage panel\n\nThird step of the DSH first-request work. The usage panel's cumulative Input counter and the context ring measure different things (session-billing total vs live context occupancy) and inevitably diverge as a conversation grows — the panel now shows what the CURRENT context is actually made of.\n\nChange:\n- foldDshUsageProjection carries the token-meter's contextBreakdown projection (systemTokens / toolsTokens / messageTokens) into the persisted usage_stats row. The runtime already returns it over idbots/usage; the host just never folded it.\n- Semantics: system prompt + tool schemas are estimated from the newest request header, messages ride the live conversation surface (shrinks on compaction). Heuristic chars/4-style estimator, so the UI marks each row '~'. NOT cumulative — the sum tracks the context ring.\n- UsageStatsChip renders three indented rows (System prompt / Tool schemas / Messages) under the existing 'Current context' row, i18n en+zh. DSH sessions only — the Claude kernel has no equivalent projection.\n- No IPC change: usage_stats is a whole-object JSON column, so the new field flows through cowork:session:get untouched.\n\nVerification: tsc --noEmit (electron + renderer) clean; eslint clean; 35 tests pass across dshUsageProjection, coworkUsageAccounting, coworkCacheAttribution, coworkCacheHitRate, coworkContextUsage, deepseekCachePrefix.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}