- Add tool-use loop in generate_with_tools(): LLM can call read_file,
roll, player_roll, and think tools via tool fenced blocks before
producing the final json response. Tool results fed back for
multi-round reasoning.
- Add player_roll tool: shows a modal overlay asking the player to
physically roll dice and type the result. Blocks the worker thread
via threading.Event until the player responds.
- Add RollModal Screen with dice label, reason, input, and submit.
- Every tool call updates status bar with a specific DM action
message (e.g. "DM is rolling dice", "DM is reading the character
sheet") instead of the generic "weaving the narrative".
The thinking-dot animation uses the last-reported action as its base.
- Replace all user-facing "LLM" references with "DM".
- Remove predefined choices: no more choice buttons or choice
container. Player types freely. System prompt says "never present
predefined choices" and all instruction templates say "let the
player decide".
- Add book story context to system prompt — last 3 turns from
book.md injected as "Recent Story" section.
- Fix build_user_message: detects existing book content; if story
exists, sends "continue from where it left off" instead of
"establish the opening scene".
- Improve parse_response: add JSON-only fallback when no json
fenced block is found.