- _render_jon_page(): generates index.html on every request with
all-time cost in ZAR, today's cost, token counts, last 3 tasks
(title + project + Claude/Python badge), and per-intent breakdown
- Task summary now includes project name for display in the page
- ZAR_RATE env var (default 18.50) controls USD→ZAR conversion
- Page regenerated automatically after every interaction via _write_status
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- brain.py: prefers direct Anthropic API (ANTHROPIC_API_KEY) over Hermes
for all LLM calls — ~22x cheaper (122 tokens vs 5600+ Hermes overhead).
Falls back to Hermes then Ollama if key unavailable.
extract_task_fields(): non-streaming call returns clean {title, project}
from any natural language phrasing — no more regex whack-a-mole.
- token_log.py: appends every LLM call to token-usage.jsonl with intent,
in/out token counts, and USD cost. get_summary() aggregates all-time,
today, and per-intent breakdowns.
- main.py: task handler uses extract_task_fields() with regex fallback;
streaming handler captures usage from final chunk; GET /usage endpoint
returns live cost summary.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Item noun phrases (job item, work item) checked before "add X to Y"
so the wrong " to " isn't captured in multi-clause sentences
- "please add X to [project], title" — comma after project = explicit title
- "work item to [project], title" — strips "to " filler then takes after comma
- Restructured function: explicit prefixes → item nouns → add-to pattern
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Intent classifier: task phrases now checked before query to prevent
"add task X" mis-routing; "job item"/"job ticket"/"work order" added
to TASK_PHRASES; "please add + project keyword" fallback added;
substring match bug fixed ("in" inside "incident" triggered query)
- brain.py: routes planning fallback to Hermes cloud (claude-sonnet-4-6)
via HERMES_URL/HERMES_API_KEY env vars; falls back to local Ollama
if Hermes is unavailable
- main.py: rolling 50-run log written to logs/jon-snow/runs.jsonl
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Open WebUI sends 4-5 extra requests per chat: query augmentation (Query: ...),
title generation, tag generation, and follow-up question suggestions. These all
include the full chat history, so they match execute/task intents incorrectly.
Added early return to classify_intent for Open WebUI system prompt patterns.
OpenAI-compatible API at :8900. Intent classifier routes status queries
to FAST_MODEL (Ollama), task submissions to Plane, planning to SMART_MODEL.
Reads agent-os logs for status context. Phase 3: approval gate + execution.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>