feat(web): iPhone PWA fixes (M1) + warm RTO redesign (M2) #3
Reference in New Issue
Block a user
Delete Branch "dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
- llm.chat_call_stream: streaming generator for all 3 backends (Ollama NDJSON, OpenAI/MI50 SSE), accumulating tool-call fragments by index. - chat.respond_stream: mirrors respond()'s tool loop and persistence/compaction, yielding ("delta", text) / ("tool", name) / ("done", reply). - POST /v1/chat/stream: SSE endpoint; blocking generator bridged to async via a worker thread + asyncio.Queue. Old completions endpoint kept as fallback. - Client streams into a live bubble with a blinking caret; rAF-throttled render (no full re-parse per token) and instant scroll during stream — fixes iOS Safari ghosting from per-token smooth-scroll. Falls back to the blocking endpoint only if nothing streamed (no double-persist). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>Lyra now switches register based on what she's doing at the table instead of being a wishy-washy companion mid-session. Modes (lyra/modes.py): - Talk (default companion) + Cash (live cash copilot); a mode = prompt card + tool allow-list. Tool gating via tools.specs(allow=). - Two-register Cash voice: act-first one-line logging when fed facts; full warm companion voice for strategy / tilt / mental game. - mode persisted per chat session (new sessions.mode column); auto-switch into Cash when start_session fires; UI forces cloud backend in Cash (tools only fire there). Stack tracking + HUD: - log_stack tool + poker_stack_log table; live net while sitting (stack - buy-in). - poker.hud() bundle; /session HUD page (stack sparkline, hands, villains, notes, stats) polling /session/data every 5s; Talk/Cash switcher + Session nav. Endpoints: /session, /session/data, GET/POST /sessions/{id}/mode, /modes. tests/test_modes.py (gating, mode roundtrip, stack/HUD); 36 tests green. v0.3.0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>Answers three gaps: no way to delete a single poker session (only clear_all), no way to browse past sessions, and Lyra could only see aggregate stats. - poker.list_sessions() (per-session summary + hand count + recap flag) and poker.delete_session() (removes a session + its hands/reads/observations/ stacks/rituals; keeps the persistent villain file). - /history page (date, stakes, venue, net, hours, recap link, per-row delete with confirm) + /history/data + DELETE /history/{id}. Nav links from chat + HUD. - recent_sessions read tool, added to the shared lookups so Lyra can answer "how'd my last few sessions go?" in either mode. - Delete is UI/CLI only — deliberately not a Lyra tool. - test_modes.py +2 (list/delete, recent_sessions); 44 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>Previously the only delete was whole-session, so a mis-logged stack or a mis-parsed hand was stuck on the HUD. Now: - undo_last tool ("scratch that") — deletes the most recent hand/stack/read/ scar/confidence/reset in the live session; added to the Cash toolset. - poker.delete_hand/stack/read/ritual + delete_entry dispatch + undo_last. - DELETE /session/entry/{kind}/{id} endpoint. - HUD: per-row × delete buttons on hands, confidence-bank, and scar-note rows (stack/read deletes via the tool). Row ids now surfaced in the hud() bundle. - test_modes.py +2 (undo_last across kinds, tool handler); 46 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>- View any past session as a read-only HUD: /session?id=N (hud(session_id) + /session/data?id=); /history rows now link there. Closed sessions show played duration + final net; recap link when one exists. - Edit session details during or after play: poker.update_session (recomputes net when buy-in/cash-out change), PATCH /session/{id}, an update_session tool ("venue was actually Bellagio", "I bought in for 600"), and an inline ✎ Edit form on the HUD. - Rituals attach to the most-recent session post-close (poker.review_session_id), so scar/confidence/reset work while reviewing after you rack up. - Edit form is poll-safe (won't clobber mid-edit); past-session view doesn't poll. - test_modes.py +3 (edit, review rituals, past-session HUD); 49 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>Quick-logged hands (log_hand) store flat fields with no structured JSON, so the hand viewer dead-ended with "no structured data to replay" — even when the full street-by-street action was captured (e.g. the KhQh-vs-Louis hand). Now: - hand.html renders a readable STATIC view of any flat hand (hero cards, board, street narratives, result, lesson) instead of erroring; also handles empty/garbage structured rows by falling back to the flat view. - "▶ Build replay" button + poker.reconstruct_hand + POST /hand/{id}/reconstruct: parse a flat hand's narrative into structured form on demand, making any quick-logged hand replayable without an LLM call per log during live play. - test_modes.py +1 (reconstruct wiring). (Also reconstructed the two live Meadows hands and removed one empty hand in the DB.) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>