mindfork mindfork

mindfork 0.14.0 — a window of any size, and one reasoning effort for every model

mindfork 0.14.0 is out. Two pieces of work are in it, and neither adds a screen: the app in a small window, and the reasoning effort on models that each take a different part of the scale.

A small window

A terminal window can be dragged down to a few rows, and split panes get there without anyone meaning to. Until now the app drew what fitted and left the rest out: at 57×5 the input box lost its row of text and its prompt landed on the status bar; a tool confirmation's keys — the ones that answer it — were cut off at the corner, its legend being 69 columns wide in Russian.

Two rules replace that.

The chat gives up its chrome, one piece at a time. In a window of eleven rows or more nothing changes. Below that the status bar keeps one row, then the input box loses its border, then the feed does, then the status row goes — so a window of five rows is four rows of the conversation over the ❯ prompt, and three rows are still a chat. The key hints a border carried are on F1.

A window too small for what is in front says so. Below what a screen needs — 20×3 for the chat, 46×12 for the settings — the app shows one line: Window too small, the size the window is and the size it needs. While it is up the keys do nothing but quit, so Enter cannot answer a question that is not on the screen; Esc also works when what does not fit was opened over the chat — a picker, the help, the settings — and closes it.

The same pass went over everything a narrow window used to cut:

  • A screen's key legend takes a third of the window at most. In Russian the chat list's legend wrapped to 13 rows of a 14-row window, leaving one chat above it; past a third it now leaves hints out, keeping F1 and Esc first.
  • The status bar shows every indicator whole that fits and leaves out the rest — it used to be cut mid-number, and what fell off during a turn was the token counter.
  • A box's title drops whole hints rather than ending mid-word; two titles on one border no longer run into each other; the help's tabs stay whole, with … where others are hidden; and the chat's title is no longer squeezed out by the model's name.
  • No cursor blinks through a tool confirmation or through the help.

At 80×24 nothing looks different.

One reasoning effort, every model

The reasoning effort is one setting, and no two models take the same part of its scale. Measured across ten OpenAI models, there are five different sets: nine of the ten refuse minimal, five take max, and gpt-6.1-sol cannot switch reasoning off where gpt-6-sol can. The provider's answer to a value a model lacks is an error — so an effort chosen for one model made every message to the next one fail.

A value the model does not have is now the nearest it has. The request goes out as chosen; if the model refuses it and says what it takes, the app asks once more with the closest value on the list — the lower one on a tie, never more reasoning than you asked for where less is as near — and remembers the answer for that model.

The scale has a new top: max, after xhigh — the tier the newest OpenAI and Claude models have. On a model or a provider without it the nearest tier is used: xhigh on Grok and on the older GPT models, high on Gemini. And xhigh on Claude is now xhigh: it had been sent as high since before the API had the tier, so a chat set to it on Opus 4.7 or newer reasons deeper than it did, at that tier's price.

Grok's efforts are read from xAI's own list. A chat's title, the history summary, a message written on your behalf and a page's retelling ask the model not to reason. On Grok that request was dropped, and each of them reasoned at the model's default depth. The app now reads what xAI says each model takes: Grok 4.3 is switched off for those requests — measured, 0.7–0.8 seconds where they took three or four — and the newer models, which cannot be switched off, are asked for low instead of their default high. The thinking switch, which did nothing on Grok, now works there.

Models that answer again

The same work turned up models on which the app's own defaults were an error on every message:

  • Claude Haiku 4.5, Sonnet 4.5 and Opus 4.5. Thinking is on by default, and those three have no "adaptive" thinking, the only form the app asked for. They are now asked to think within a token budget taken from the effort — 1024 for low, 8192 for medium or none, 24576 for high and above, and never more than half the reply limit.
  • grok-build-0.1 and the two grok-4.20 models refuse the effort setting itself. With any effort chosen every message to them failed; they are now asked again without it.
  • Titles on gpt-6.1-sol, Gemini 3.7 Flash and 3.8 Flash. These refuse the "do not reason" a title is asked with, so chats there stayed untitled — and the history summary and the other background requests failed with it. They are asked with the lowest effort the model offers — on Gemini, the next level up. youtube_watch with one of those two Gemini models as the video model had the same failure.
  • A Grok model named by an alias, such as grok-4.5-latest, has its context size.

Your data

settings.json and the chat files move from version 4 to 5. Nothing in them is rewritten — the step stamps the version, because max is kept in the settings, in a profile's defaults and in every chat, beside each reply made under it, and a version that does not know a value cannot read the file that holds it. 0.13.0 would have refused such settings and, worse, left a chat that held the value out of its list without a word; stamped, it refuses the data as a newer version's and says so. As with every schema change, the data is backed up before it is migrated — backups/pre-migrate-<date>.zip — and that backup is the way back.

The full list is in the changelog; downloads are on the releases page, and cargo install mindfork builds the same version from crates.io.