Cuts release 0.20.0. ## Highlights - X-Request-ID header on every response + sanitized to [A-Za-z0-9_-] (CRLF log-forging mitigation) - Error pages (HTML + JSON 500) surface request_id for support tickets - Dev debug toolbar gated by DEBUG=1 — fastapi-debug-toolbar with custom DuckDBPanel - Centralized app.logging_config.setup_logging() replaces 23 scattered basicConfig calls - Telegram bot drops bot.log file — stdout only (BREAKING) ## Devin findings addressed - BUG_0001: .env.template no longer claims FastAPI debug=True - BUG_0002: subprocess extractor logs INFO to stderr again - ANALYSIS_0003: _wants_html no longer matches Accept: */* (curl gets JSON as before) - BUG on b1c6ee9: HTML 500 page no longer leaks str(exc) in production - BUG on b13d2fe: 2 CLAUDE.md compliance flags (transform.py + ws_gateway) accepted as scope-limited logging refactor — follow-up to update CLAUDE.md if needed See CHANGELOG [0.20.0] for full notes.
26 lines
871 B
HTML
26 lines
871 B
HTML
<h4>DuckDB queries — {{ queries|length }} ({{ "%.1f"|format(total_ms) }} ms total)</h4>
|
|
{% if by_db %}
|
|
<p>By DB:
|
|
{% for db, ms in by_db.items() %}<code>{{ db }}</code>: {{ "%.1f"|format(ms) }} ms{% if not loop.last %} · {% endif %}{% endfor %}
|
|
</p>
|
|
{% endif %}
|
|
<table class="djdt-table">
|
|
<thead>
|
|
<tr><th>#</th><th>DB</th><th>ms</th><th>rows</th><th>SQL</th><th>params</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for q in queries %}
|
|
<tr class="{{ 'djdt-error' if q.error else '' }}">
|
|
<td>{{ loop.index }}</td>
|
|
<td>{{ q.db }}</td>
|
|
<td>{{ "%.2f"|format(q.ms) }}</td>
|
|
<td>{{ q.rows if q.rows is not none else '—' }}</td>
|
|
<td>
|
|
<pre>{{ q.sql }}</pre>
|
|
{% if q.error %}<div class="djdt-error">{{ q.error }}</div>{% endif %}
|
|
</td>
|
|
<td><code>{{ q.params }}</code></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|