(event: LlmEvent)
| 161 | } |
| 162 | |
| 163 | recordLlm(event: LlmEvent): void { |
| 164 | const db = this.ensureOpen(); |
| 165 | if (!db) return; |
| 166 | try { |
| 167 | db.prepare( |
| 168 | `INSERT INTO llm_events (ts, cwd, provider, model, role, input_tokens, output_tokens, duration_ms, cost_usd, success) |
| 169 | VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, |
| 170 | ).run( |
| 171 | event.timestamp, |
| 172 | this.maskCwd(event.cwd), |
| 173 | event.provider, |
| 174 | event.model, |
| 175 | event.role, |
| 176 | event.inputTokens, |
| 177 | event.outputTokens, |
| 178 | event.durationMs, |
| 179 | event.costUsd, |
| 180 | event.success ? 1 : 0, |
| 181 | ); |
| 182 | } catch (e: any) { |
| 183 | logger.debug('Telemetry recordLlm failed', { err: e?.message }); |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | /** Tool stats over the last N days. */ |
| 188 | getToolStats(daysBack = 30, cwd?: string): ToolStats[] { |
nothing calls this directly
no test coverage detected