forked from Rockachopa/Timmy-time-dashboard
* fix: name extraction blocklist, memory preview escaping, and gitignore cleanup - Add _NAME_BLOCKLIST to extract_user_name() to reject gerunds and UI-state words like "Sending" that were incorrectly captured as user names - Collapse whitespace in get_memory_status() preview so newlines survive JSON serialization without showing raw \n escape sequences - Broaden .gitignore from specific memory/self/user_profile.md to memory/self/ and untrack memory/self/methodology.md (runtime-edited file) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: catch Ollama connection errors in session.py + add 71 smoke tests - Wrap agent.run() in session.py with try/except so Ollama connection failures return a graceful fallback message instead of dumping raw tracebacks to Docker logs - Add tests/test_smoke.py with 71 tests covering every GET route: core pages, feature pages, JSON APIs, and a parametrized no-500 sweep — catches import errors, template failures, and schema mismatches that unit tests miss Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: agentic loop for multi-step tasks + Round 10 regression fixes Agentic loop (Parts 1-4): - Add multi-step chaining instructions to system prompt - New agentic_loop.py with plan→execute→adapt→summarize flow - Register plan_and_execute tool for background task execution - Add max_agent_steps config setting (default: 10) - Discord fix: 300s timeout, typing indicator, send error handling - 16 new unit + e2e tests for agentic loop Round 10 regressions (R1-R5, P1): - R1: Fix literal \n escape sequences in tool responses - R2: Chat timeout/error feedback in agent panel - R3: /hands infinite spinner → static empty states - R4: /self-coding infinite spinner → static stats + journal - R5: /grok/status raw JSON → HTML dashboard template - P1: VETO confirmation dialog on task cards Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: briefing route 500 in CI when agno is MagicMock stub _call_agent() returned a MagicMock instead of a string when agno is stubbed in tests, causing SQLite "Error binding parameter 4" on save. Ensure the return value is always an actual string. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: briefing route 500 in CI — graceful degradation at route level When agno is stubbed with MagicMock in CI, agent.run() returns a MagicMock instead of raising — so the exception handler never fires and a MagicMock propagates as the summary to SQLite, which can't bind it. Fix: catch at the route level and return a fallback Briefing object. This follows the project's graceful degradation pattern — the briefing page always renders, even when the backend is completely unavailable. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Trip T <trip@local> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
122 lines
4.0 KiB
HTML
122 lines
4.0 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Grok Status — Timmy Time{% endblock %}
|
|
|
|
{% block content %}
|
|
<div class="container-fluid py-4">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<div>
|
|
<h1 class="h3 mb-0">Grok Status</h1>
|
|
<p class="text-muted small mb-0">xAI frontier reasoning — premium cloud augmentation</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Status Cards -->
|
|
<div class="row g-3 mb-4">
|
|
<div class="col-md-3">
|
|
<div class="card border-0 shadow-sm">
|
|
<div class="card-body text-center py-3">
|
|
<div class="h5 mb-1 {{ 'text-success' if status.enabled else 'text-muted' }}">
|
|
{{ 'Enabled' if status.enabled else 'Disabled' }}
|
|
</div>
|
|
<small class="text-muted">Status</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card border-0 shadow-sm">
|
|
<div class="card-body text-center py-3">
|
|
<div class="h5 mb-1 {{ 'text-success' if status.available else 'text-danger' }}">
|
|
{{ 'Available' if status.available else 'Unavailable' }}
|
|
</div>
|
|
<small class="text-muted">Backend</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card border-0 shadow-sm">
|
|
<div class="card-body text-center py-3">
|
|
<div class="h5 mb-1">{{ status.model }}</div>
|
|
<small class="text-muted">Model</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card border-0 shadow-sm">
|
|
<div class="card-body text-center py-3">
|
|
<div class="h5 mb-1">{{ 'Free' if status.free_mode else (status.max_sats_per_query|string + ' sats') }}</div>
|
|
<small class="text-muted">Cost Cap</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Configuration -->
|
|
<div class="row g-4">
|
|
<div class="col-md-6">
|
|
<div class="card border-0 shadow-sm">
|
|
<div class="card-header bg-transparent border-secondary">
|
|
<h5 class="mb-0">Configuration</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<table class="table table-sm table-borderless mb-0">
|
|
<tr>
|
|
<td class="text-muted">API Key Set</td>
|
|
<td>{{ 'Yes' if status.api_key_set else 'No' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-muted">Free Mode</td>
|
|
<td>{{ 'Yes' if status.free_mode else 'No' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-muted">Active</td>
|
|
<td>{{ 'Yes' if status.active else 'No' }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-muted">Max Sats/Query</td>
|
|
<td>{{ status.max_sats_per_query }}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-6">
|
|
<div class="card border-0 shadow-sm">
|
|
<div class="card-header bg-transparent border-secondary">
|
|
<h5 class="mb-0">Usage Stats</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
{% if stats %}
|
|
<table class="table table-sm table-borderless mb-0">
|
|
<tr>
|
|
<td class="text-muted">Total Requests</td>
|
|
<td>{{ stats.total_requests }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-muted">Prompt Tokens</td>
|
|
<td>{{ stats.total_prompt_tokens }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-muted">Completion Tokens</td>
|
|
<td>{{ stats.total_completion_tokens }}</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-muted">Estimated Cost</td>
|
|
<td>{{ stats.estimated_cost_sats }} sats</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="text-muted">Errors</td>
|
|
<td>{{ stats.errors }}</td>
|
|
</tr>
|
|
</table>
|
|
{% else %}
|
|
<p class="text-muted mb-0">No usage data available.</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|