1
0
This repository has been archived on 2026-03-24. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Timmy-time-dashboard/src/dashboard/templates/grok_status.html
Alexander Whitestone 7792ae745f feat: agentic loop for multi-step tasks + regression fixes (#148)
* 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>
2026-03-08 01:46:29 -05:00

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 %}