fix: internet access no longer disappears — a request like "collect today's news" was classified as a coding task by a single keyword, and compact coding mode then handed the agent a tool set with no web search and no page reading, so it truthfully answered that it could not fetch the news; the same mode also switched on unconditionally whenever the working folder held a build file such as package.json, which removed web access from every request that did not literally say "internet". Web search and page reading now stay available in every mode, and a plain request for information is no longer treated as code work
feat: the agent knows today's date — "today", "yesterday" and the current calendar year no longer depend on guesswork, which is what "news for today" needed
feat: folder tools — create_dir creates directories (write_file always creates a file, so "create a folder with five subfolders inside" produced empty files instead), and empty_dir clears a folder while keeping the folder itself; write_file now refuses a path that points at a directory instead of silently replacing it with a file, and delete_file states plainly how to remove a folder together with its contents
fix: tasks no longer end at a directory listing — a step whose only successful result was list_dir was treated as the finished answer, so "delete the contents of this folder" stopped at the listing; the shortcut now applies only when a listing is what was actually asked for
fix: API requests rejected over credits — with the profile's Max tokens left empty the app sent no limit at all, so pay-as-you-go providers reserved the model's entire output and refused before generating anything (OpenRouter answered 402 with "you requested up to 65536 tokens"); a limit is now always sent, a credit refusal is recognised and retried once within the budget the provider itself reported, and the result is explained in plain language instead of raw JSON
fix: replies cut off by the token limit — the provider's finish reason is now read, so a tool call truncated by the limit becomes a clear error naming that limit instead of another loop iteration; previously this looked like endless thinking. The Max tokens field is validated, can be cleared again, and carries a hint about pay-as-you-go billing
fix: model load failures name the real cause — llama.cpp's own message (unsupported architecture, missing VRAM) reached only stderr and was lost, so every failure showed the same generic text about memory, graphics card and a corrupted file; the cause and a memory snapshot are now part of both the error and the log, and the file-size check works for models added by hand, not only for catalog downloads
feat: agent work is visible in the log — loop iterations are written to ~/.doka/server.log and to the run trace, so a run that spends resources without visible steps can finally be diagnosed; a tool call printed as text under a name that does not exist is now reported back to the model instead of quietly passing through as the final answer
feat: balance-low banner catches more people — the threshold became a share of the key's accumulated grant instead of a flat amount, and the banner can appear again later instead of once per process; it also keeps working when the settings store is temporarily unavailable
fix: context overflow on small models — the system prompt budget now accounts for the weight of tool schemas, the browser tool is included only when the request actually asks for browser automation, and an oversized first turn degrades gracefully instead of failing; manual chat compaction no longer loses a grown history, run twice at once, or accept a late result after stop
feat: attachment limits follow the active model — text files are no longer cut at one 8k-oriented constant for every provider; by default an attachment may use half of the current context window, the limit can be overridden in model settings, and a truncated-file badge shows how much text actually reached the model
feat: the recommended local model matches your hardware — the default now accounts for graphics memory, not just RAM, so a computer with a weak or undetectable GPU is no longer offered the largest model and then left waiting ten minutes for a download it cannot run well; any model can still be chosen manually, now with an honest warning when it is heavier than your machine is likely to handle
fix: graphics memory detection on current Windows — detection no longer relies on WMIC, which Microsoft removed from recent Windows builds, and it reads the full 64-bit value instead of the 32-bit field that under-reported cards of 4 GB and above; NVIDIA cards are queried directly, and Linux reads the standard driver files
chore: download diagnostics — a failed model download now reports a bounded reason (network, server response, antivirus lock, disk space, incomplete file, checksum, blocked address) instead of being indistinguishable from every other failure; the reason class is sent, never the path, URL, or error text
fix: browser sessions survive compaction — an open browser session is detected from the live runtime state, so the tool no longer disappears mid-task and does go away after close or timeout