DeepTutor v1.2.5 Release Notes
Release Date: 2026.04.25
Highlights
Attachment Store and File Preview Drawer
Chat attachments are now persisted as first-class session artifacts instead of living only as inline base64 blobs in message rows. The turn runtime writes every uploaded file to a new attachment store before document extraction, records a stable URL on the message, and drops the bulky base64 payload from persisted chat history.
- Backend attachment store —
deeptutor/services/storage/attachment_store.pyintroduces a pluggableAttachmentStoreprotocol and a defaultLocalDiskAttachmentStorerooted atdata/user/workspace/chat/attachments. The path can be overridden withCHAT_ATTACHMENT_DIR, documented in.env.example. - Safe attachment serving — a new
/api/attachments/{session_id}/{attachment_id}/{filename}router serves stored files with traversal-safe path resolution, atomic writes on upload, inlineContent-Disposition, UTF-8 filename handling, and private no-cache headers. - Stable attachment metadata —
Attachmentnow carries anidplusextracted_text;TurnRuntimeManagergenerates missing IDs, persists original bytes, stores the preview URL, and keeps extracted text from Office/text documents so the UI can show exactly what the assistant read. - Right-side preview drawer —
FilePreviewDraweradds a Claude-style side panel for chat files. On desktop it squeezes the chat column; on smaller screens it overlays. The shell stays mounted for instant open/close, while heavy preview bodies are deferred until after the slide animation to avoid jank. - Preview renderers — PDFs render in the browser viewer, images and SVGs render with native
<img>, Markdown reuses the main Markdown renderer, code/text files useRichCodeBlockwith syntax highlighting, Office files show backend-extracted plain text, and unsupported/legacy files fall back to a download card. - Attachment actions — pending composer chips and sent message cards are clickable, with keyboard focus rings, download, copy-link, Escape-to-close, and graceful "legacy file not stored" messaging for old sessions.
Broader Code and Text Attachment Coverage
The v1.2.4 text/code attachment support has been widened substantially, keeping the backend RAG router, chat extractor, frontend upload allowlist, icons, and preview highlighter aligned.
- More accepted formats —
FileTypeRouter.TEXT_EXTENSIONSandTEXT_LIKE_EXTSnow include JSONC/JSON5, MJS/CJS/MTS/CTS, Vue/Svelte, Kotlin scripts, Groovy/Gradle, C#/Zig/Nim, Objective-C, Perl/Lua/Julia/Dart, Haskell/Clojure/Elixir/Erlang/OCaml/F#, Lisp/Scheme/Racket, Solidity, fish/vim, GraphQL/protobuf, CMake/Makefile, Terraform/HCL, nginx config, and Dockerfile-style files. - Central syntax mapping —
web/lib/code-languages.tsmaps extensions and special filenames (Dockerfile,Makefile,CMakeLists.txt, dotfiles, etc.) to Prism language names so preview classification and code highlighting stay in sync. - Frontend helpers exported —
extOf()is now exported fromweb/lib/doc-attachments.tsfor the preview pipeline, and document icons/categories were expanded to match the new extension set.
Attachment-Aware Deep Capabilities
Uploaded attachments now flow into more agent pipelines, not just the default chat stage.
- Base agent parity — non-streaming LLM calls now use the same
prepare_multimodal_messages()path as streaming calls when attachments are present, including image stripping/logging for non-vision models. - Deep Solve — instead of extracting only the first image URL,
DeepSolveCapabilityforwards image attachments throughMainSolverinto planner, solver, and replan calls, so multimodal problems remain visible throughout the Plan-ReAct-Write loop. - Deep Question — topic generation and follow-up answering pass attachments to the underlying agents. Mimic mode can now use
[Attached Documents]text directly when uploaded PDFs have already been extracted and stripped from base64 storage. - Deep Research — research planning accepts attachments and forwards them into the first planning LLM call, whether that is rephrase or decompose, without duplicating the same image/file context in later planning turns.
- Visualize — visualization analysis now receives chat attachments, enabling diagrams or screenshots to influence render-type selection and data extraction.
TutorBot Export and Notebook Capture
TutorBot chat sessions now have the same capture paths as regular chat:
- The Agent chat page adds Save to Notebook and Download Markdown actions in the header.
SaveToNotebookModal,notebook-api, backend notebook request types, andRecordTypenow recognize a newtutorbotrecord type.- The Knowledge page displays TutorBot notebook entries with their own violet badge and bot icon.
- Restored TutorBot chat history now re-snaps to the bottom across multiple frames so Markdown/KaTeX growth after first paint does not leave the user above the latest message.
Setup Tour Diagnostics and Install Robustness
The guided setup tour now explains dependency failures instead of failing silently:
- Bootstrap dependency installation captures stdout/stderr and prints the real pip error plus a manual retry command.
uvresolution checks common install locations (~/.local/bin,~/.cargo/bin, Homebrew paths) before attempting installation, and reports clear next steps ifuvinstalls successfully but is still not onPATH.uvinstall failures now show localized English/Chinese hints for Python wheel availability, stale shellPATH, PyPI mirror issues, and direct installer options.- Node.js/npm version checks resolve executables through
shutil.which()before running--version, improving Windows.cmd/.batcompatibility after Python subprocess hardening.
Chat and Knowledge UX Fixes
- Auto-scroll reliability —
useChatAutoScrollnow waits for message content before attaching its mutation observer, fixing missed bottom-scroll behavior when reopening sessions whose message container was initially empty. - Preview animation polish —
globals.cssadds achat-preview-shelltransition so the drawer slide and chat-column squeeze move together at the same 220 ms timing. - Knowledge upload picker — KB file inputs no longer rely on the browser/OS
acceptfilter, which could hide valid files on some systems; in-app validation still enforces the supported-file policy after selection. - Localized preview copy — English and Chinese strings were added for preview loading, copy link, unavailable previews, legacy files, remove attachment, and Office extracted-text explanation.
Test Suite Expansion
- Capability attachment forwarding —
tests/core/test_capabilities_runtime.pyadds coverage for Deep Solve, Deep Question, Deep Research, and Visualize attachment propagation, including mimic mode with extracted document text. - Research planning edge case —
tests/agents/research/test_research_pipeline_rag.pyverifies that attachments are forwarded to decompose when rephrase is enabled but performs zero iterations, ensuring the first actual planning LLM call still sees the uploaded context.
Full Changelog: v1.2.4...v1.2.5