Skip to content

v1.6.6

Latest

Choose a tag to compare

@pancacake pancacake released this 08 Sep 07:47

DeepTutor v1.6.6 Release Notes

Release Date: 2026.09.08

v1.6.6 is a fix release, and an unusually clarifying one. Working through the v1.6.5 feedback showed that most of what people reported was not a regression: v1.6.5 mostly removed things that had been masking older breakage, so answers that silently failed to submit, a copy button that reported success it never had, and reading actions unusable since v1.6.0 all became visible at once. Those are fixed here, along with the batch of community pull requests behind them. Drop-in — no migrations.

What's New

Answers you submit actually arrive

An ask_user card whose turn had already ended could no longer reach the backend, so submitting did nothing. Worse, the three composers discarded what you had typed when a submission was refused, while the error told you to send a new message — which was the very thing being blocked. Both are fixed: a finished turn that still owns an unanswered card keeps its address, and a refused answer is re-sent as an ordinary message instead of being thrown away.

Notebook entries with answer images could not be saved at all since v1.6.3 — the insert listed 23 columns against 22 values and raised OperationalError every time.

A noticeably lighter first load

The generated brand-icon table — every store logo, about 95 KB — was riding in the app-shell chunk that every route shares, for the sake of one footer link. It is out, the sidebar's session-organization UI and the Co-Writer notebook picker now load on demand, and the home route dropped from 305 KB to 203 KB against a 300 KB budget. No route is over budget any more.

Copy actually copies

The copy button reported success whether or not anything reached the clipboard, and announced that false success through aria-live — so a screen-reader user was told the copy worked when it had not. Clipboard access is now probed before the first await (spending the user-gesture allowance too early was the underlying cause) and a real failure is shown as one.

Knowledge bases: names, uploads, empty bases

A knowledge base named with a slash could be created and then never deleted. Validation now lives on the manager, so all eight registration entry points share it, and a bad name that already exists can be removed. Large uploads that failed mid-transfer with a bare "Failed to fetch" also work: the proxy was replaying the client's Expect: 100-continue header, which undici rejects outright. Creating an empty knowledge base no longer raises progress errors.

Partners can use your connected knowledge bases

Assigning an Obsidian vault, a linked index, WeKnora or IMA to a partner used to fail outright: provisioning only knew how to copy a folder, and a pointer knowledge base has none by design. Connected bases are now registered as pointers, stay visible in the partner's library, and can be removed again. Obsidian, MarginNote and subagent bases are deliberately declined — each drives an exclusive capability that would take over every one of that partner's turns.

Files a partner presents in chat download for the person who asked, and a partner conversation now shows which chat it came from, so a Feishu group thread is no longer indistinguishable from a direct message.

Chat stops reaching for tools it does not have

read_source belongs to the context investigator that runs before the answer loop, not to the loop itself. The prompt and the attached-sources manifest said otherwise, so the model kept trying to reopen PDFs through a file tool it was never given.

Reasoning arrives where it was missing

The shared agentic loop never captured a round's reasoning — the field did not exist on its result type — so surfaces built on it, including book quizzes, surfaced provider reasoning errors instead of content. It is carried through now.

Codex sign-in finishes inside Docker

When the browser cannot reach the container's loopback callback, you can paste the address the browser landed on and complete the sign-in. The pasted address must match the redirect URI registered for that attempt exactly, and duplicated OAuth parameters are refused as ambiguous; it is parsed and discarded, never fetched, stored, or echoed back. The catalog compatibility version was also raised, so eligible models that older versions omitted now appear.

Smaller fixes worth naming

Four reading actions that need a text selection have been unusable by mouse since v1.6.0 — the annotation popover disarmed the toolbar before the click landed. Asking a tutor for another language works, and the browser and server copies of that preference stop drifting apart. Mastery Path recognises mastery_mode as a tool that rebinds the path. Learner accounts can open courses again. Malformed ###heading text is normalized without touching #include inside a code fence.

Fixes

The Moonshot Kimi k3 family is named once instead of per released id, so k3-256k and later variants keep their temperature override; Responses requests rejected for an unsupported input[N].status retry once without it and remember the model; the LightRAG SDK moves off the release candidate to 1.5.7; and the README overview screenshot is current.

Upgrade Notes

Run pip install -U deeptutor; Docker users pull ghcr.io/hkuds/deeptutor:latest. Nothing needs migrating.

  • Rolling back to v1.6.4 fixes almost none of this. Most of these defects predate v1.6.5; only the knowledge-base naming and Mastery Path issues have genuinely new v1.6.5 surface area.
  • If a custom prompt or plugin told the answer loop to call read_source, move that work to the context investigator — the loop does not mount it.
  • The English and Chinese guides have been updated together at deeptutor.info.

Full Changelog: v1.6.5...v1.6.6