From 45344ca5af847f04aa0e98e061d8bf807638d918 Mon Sep 17 00:00:00 2001 From: Alexander Whitestone Date: Mon, 23 Mar 2026 14:19:51 -0400 Subject: [PATCH] fix: update TemplateResponse calls to new Starlette signature Starlette changed TemplateResponse from TemplateResponse(name, context) to TemplateResponse(request, name, context). The old calling convention passed a dict as the 'name' parameter, which Jinja2 tried to use as a cache key inside a tuple, causing TypeError: unhashable type: 'dict'. Updated all old-style calls in routes/tools.py and routes/calm.py to use the new positional-request-first signature and removed redundant "request" key from context dicts (Starlette adds it automatically). Fixes #1114 Co-Authored-By: Claude Sonnet 4.6 --- src/dashboard/routes/calm.py | 16 +++++++++------- src/dashboard/routes/tools.py | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/dashboard/routes/calm.py b/src/dashboard/routes/calm.py index d9c2dec4..5db1f674 100644 --- a/src/dashboard/routes/calm.py +++ b/src/dashboard/routes/calm.py @@ -196,7 +196,7 @@ async def get_evening_ritual_form(request: Request, db: Session = Depends(get_db if not journal_entry: raise HTTPException(status_code=404, detail="No journal entry for today") return templates.TemplateResponse( - "calm/evening_ritual_form.html", {"request": request, "journal_entry": journal_entry} + request, "calm/evening_ritual_form.html", {"journal_entry": journal_entry} ) @@ -257,8 +257,9 @@ async def create_new_task( # After creating a new task, we might need to re-evaluate NOW/NEXT/LATER, but for simplicity # and given the spec, new tasks go to LATER. Promotion happens on completion/deferral. return templates.TemplateResponse( + request, "calm/partials/later_count.html", - {"request": request, "later_tasks_count": len(get_later_tasks(db))}, + {"later_tasks_count": len(get_later_tasks(db))}, ) @@ -287,9 +288,9 @@ async def start_task( promote_tasks(db) return templates.TemplateResponse( + request, "calm/partials/now_next_later.html", { - "request": request, "now_task": get_now_task(db), "next_task": get_next_task(db), "later_tasks_count": len(get_later_tasks(db)), @@ -316,9 +317,9 @@ async def complete_task( promote_tasks(db) return templates.TemplateResponse( + request, "calm/partials/now_next_later.html", { - "request": request, "now_task": get_now_task(db), "next_task": get_next_task(db), "later_tasks_count": len(get_later_tasks(db)), @@ -345,9 +346,9 @@ async def defer_task( promote_tasks(db) return templates.TemplateResponse( + request, "calm/partials/now_next_later.html", { - "request": request, "now_task": get_now_task(db), "next_task": get_next_task(db), "later_tasks_count": len(get_later_tasks(db)), @@ -360,8 +361,9 @@ async def get_later_tasks_list(request: Request, db: Session = Depends(get_db)): """Render the expandable list of LATER tasks.""" later_tasks = get_later_tasks(db) return templates.TemplateResponse( + request, "calm/partials/later_tasks_list.html", - {"request": request, "later_tasks": later_tasks}, + {"later_tasks": later_tasks}, ) @@ -404,9 +406,9 @@ async def reorder_tasks( # Re-render the relevant parts of the UI return templates.TemplateResponse( + request, "calm/partials/now_next_later.html", { - "request": request, "now_task": get_now_task(db), "next_task": get_next_task(db), "later_tasks_count": len(get_later_tasks(db)), diff --git a/src/dashboard/routes/tools.py b/src/dashboard/routes/tools.py index d65ed9a4..0325e956 100644 --- a/src/dashboard/routes/tools.py +++ b/src/dashboard/routes/tools.py @@ -40,9 +40,9 @@ async def tools_page(request: Request): total_calls = 0 return templates.TemplateResponse( + request, "tools.html", { - "request": request, "available_tools": available_tools, "agent_tools": agent_tools, "total_calls": total_calls, -- 2.43.0