# assistant Two settings pages for desktop-assistant, the daemon behind the assistant canvas (`../../assistant/`). **Assistant** edits the daemon's `~/.config/desktop-assistant/config.toml` and switches its tools. The model fields (server, temperature, tool rounds, thinking), the system prompt, the `[env]` rows and the tool switches all edit a draft, and the header's Save writes it: the config first, then the tool renames. An emptied field falls back to the daemon's default, shown as its placeholder; the defaults come from `assistant.py --defaults`, so they are never copied here. A refused number is outlined and holds Save back. The system prompt also has "Use the default". The tool environment (`[env]`) is one row per key, with an add row below. A tool's switch, once saved, renames `tools/.toml` to `.toml.off`, which the daemon's `*.toml` glob skips. Its cloud switch sets or drops `cloud = true` at the top of the file, which offers the tool to cloud chats; the file is checked with `tomllib` and replaced atomically. **Cloud** edits the daemon's `[[cloud]]` tables: name, URL and key command per provider. Fetch saves the page, then runs `assistant.py --cloud-models `, which runs the key command and lists the provider's ids; the switches choose which the canvas offers. The key never reaches this page. A table holding more than the page writes (a multi-line array, another key) is left alone, with a note to edit it by hand. The saved cloud models also get Prefer in the Model list. The page also lists llama-server's models with their state. The daemon always answers with whichever model is loaded and never asks for one, so it never swaps a model out from under another client. Load is the deliberate swap: it asks the router to load that model now, polling `/v1/models` until it reports `loaded`, and leaves the preference alone. Prefer is the other, separate choice: the model the assistant should use, saved in `Prefs`. A first version made Load also set the preference, so a model loaded for another client became the assistant's too. Each chat uses the model picked in the canvas's model menu, else the preferred one, else whatever is loaded. Opening the canvas, or picking a local model for its chat, loads that model when another one is resident, and the canvas header reads "loading …" until it is in. This desktop runs one model and one client at a time, so that is when the model should come back. A cloud model loads nothing. The daemon reads all of this only at startup, so after a change the page says so and offers Restart, which runs `assistant.sh restart`; a daemon that does not come back shows the script's status, whose log tail says why. The file is edited line by line (`Config.js`) so the comments the example ships with survive: an unset key sits commented out, setting it activates its line, and unsetting comments it back out. Every write first parses the whole new file with `tomllib`, then replaces the old one atomically, so an edit can never leave a config the daemon refuses to start with. **Ask presets** edits the canvas's canned questions for staged files: label, question, and the file kinds each is offered for. They live in `Prefs` and the canvas reads them live, so changes apply at once; "Reset to defaults" drops the saved list and brings back the built-in one in `../../assistant/Presets.js`. A new preset gets the fallback icon. Search finds the model fields, every `[env]` key, every tool and every preset by name. Check: `node desktop/modules/assistant/test_config.js`.