aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
9 hourswrite: always end with an outcome; empty replies and the meterHEADmasterDanilo M.1-12/+28
From review. A write ended by anything other than its own stop (an ask, a new conversation, another client's stop) sent only state idle, so the canvas waited for written or an error forever; interrupt() now sends error stopped with turn. A refused write carries turn too. An empty reply is refused instead of saved, a document made of several code blocks is no longer stripped as one fence, the write sizes its budget on the whole context since no history goes with it, and its usage no longer moves the chat's context meter. The file is written as UTF-8 whatever the locale. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
9 hoursWrite a reply to a file: the write commandDanilo M.3-5/+129
For the canvas's To .md: a one-off request with attachments, no history, no thinking and no tools, whose reply is written to the first free name in a folder instead of the conversation. It streams progress as a character count, unwraps a reply the model fenced whole, and shares the turn counter, so it stops a reply in flight and stop ends it with no file left behind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
9 hoursSpec the write commandDanilo M.1-0/+45
A one-off request with attachments whose reply goes to a file, for the canvas's To .md: no history, no thinking, a free name, nothing written when stopped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
9 hoursHang up on llama-server at once when a reply is stoppedDanilo M.1-11/+68
A stop was noticed at the reply's next chunk, and llama-server stops a task only when its client hangs up. Through a long prompt pass, measured at 12232 tokens for a file with page images, no chunk comes, so the GPU kept working after Stop until the first one. interrupt() now shuts the reply's socket from the stop handler; the request goes through http.client, which exposes it. A fake server that stays silent records the hang-up within a second of the stop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
9 hoursRead a nameless file's content to tell whether it is textDanilo M.1-2/+34
A file whose name gives no type, such as a shebang script or a Makefile, was refused as not text. When mimetypes knows nothing, the first 4 KB decide: no NUL and valid UTF-8 (a character cut by the window allowed) is text. A name that does say something, even application/octet-stream, is still taken at its word. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursDocs: images past the ubatch kill the model; the preset fixDanilo M.1-0/+11
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursDocs: the two-image retry after the render fixDanilo M.1-0/+3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursDocs: page render boundDanilo M.3-3/+3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursPage renders never upscale; a non-stream answer is an errorDanilo M.1-11/+42
-scale-to 2048 also enlarges: a 600x300 pt scan went out as 2048x1024 beside a second image, and llama-server's model process died on it. The router then answered with a plain 'proxy error: Failed to read connection', which the parser skipped as a non-data line, so the turn finished as an empty reply. Pages now render at 150 dpi, lowered only for a page whose longest side would pass 1600 px (size from pdfinfo), and an answer with no data lines raises with its first line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursDocs: attachmentsDanilo M.3-3/+26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursAttachments: bound page renders, resolve once, no images for blind modelsDanilo M.1-37/+82
From review. A PDF page rendered at 150 dpi had no size bound: a 3000 pt page came out 6250x6250 at 171 MB, past the 20 MB cap an image file has; renders are now scaled to 2048 and refused over the cap. Images resolved on every tool round re-read files and re-rendered pages between rounds, and could flip to gone mid-answer; they resolve once per answer. A conversation holding images, reopened with a text-only model loaded, sent image parts the server rejected; the references become a note instead. Scanned pages past the fourth were dropped silently; they are listed as not shown and the chip is truncated. A pdftotext timeout or a missing poppler is a refusal, newlines in a name no longer close the file block, an image is hashed from the bytes it sends, and /models is read once per answer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursTake files with a questionDanilo M.1-31/+307
ask carries paths; the daemon reads them as the user. Text files and a PDF's text go inline within half the free context, shared equally, and are stored that way, so a reopened conversation still has them. Images, and PDF pages with no text, go as image parts to a model the router reports as seeing images, and are stored as a path and hash, resolved when sent: a file changed or gone since is reported as no longer available. turns gains a files column for the chips, added to an older database on open. A refused file is one log line, not a traceback. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
11 hoursPlan attachmentsDanilo M.1-0/+615
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 hoursSpec attachmentsDanilo M.1-0/+99
ask takes file paths; text and PDFs are extracted and inlined within half the free context, images and scanned pages go as image parts to a model that reports vision. History keeps extracted text inline and images as a path and hash, re-read on reopen while unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 hoursMark the errors that end a replyDanilo M.2-5/+9
Every client sees every event, so a command error from one client, such as opening a conversation another just deleted, reached a canvas watching a reply and was taken as that reply's end: the canvas stopped rendering tokens the daemon kept streaming. An error from the reply thread now carries turn: true; command errors carry none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 hoursFinal review: startup probe, error messages, refusal exit, docsDanilo M.7-17/+44
A startup probe that failed with anything but OSError (llama-server not in router mode, an empty model list) crashed the daemon at boot, against its own comment; it is caught like the per-request failures now. llama-server's reasons reach the client: an HTTP error carries its body and an error chunk mid-stream its message, where the client used to see 'choices'. A daemon that refuses to start, or fails before serving, exits 1 instead of 0. assistant.sh no longer mistakes a --test run for the daemon. AGENTS.md said every section from Hardware to Kokoro was voice-only, which included findings the daemon still applies; it now names the voice ones. It also claimed a stopped reply emits nothing after done, while a late ctx can. The spec lists every error message, the example config no longer shows a non-default temperature as the default, and the updates tool stops telling the model not to read lists aloud. The spec is marked implemented. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 hoursDocs: desktop-assistant is a text daemon nowDanilo M.9-132/+128
README and AGENTS.md describe the socket protocol and the history instead of the voice pipeline; the voice-era findings stay, marked as such, since a return to voice starts from them and from the voice-v1 tag. The overlay spec is marked superseded, the daemon spec records what changed while planning, and the example tools lose their spoken announcements. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
12 hoursMake thinking a config key, on by defaultDanilo M.1-1/+2
Measured live: with reasoning on, a two-line question took 21 s of thinking before its first token, against about 5 s for questions that needed little. thinking = false in config.toml skips it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursassistant.sh: manage the daemon onlyDanilo M.1-34/+14
The overlay is gone from the quickshell repo, and the canvas that replaces it lives in the desktop shell, which has its own lifecycle. status now reports the process, the socket and the log. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursProtocol: check command arguments, keep readers alive, one daemonDanilo M.1-33/+107
From review of the protocol commit. An exception inside a command, such as an id SQLite cannot bind, killed that client's reader and left a deaf connection still receiving events; commands now run under a try that answers error. Ids must be integers: delete with no id compared None to an unsaved conversation's None and wiped it, and a string id deleted the row through SQLite's affinity while the Python comparison missed, leaving the current conversation pointing at nothing so every later answer failed to save. ask, search and their arguments are type-checked instead of coerced. serve() refuses to start over a socket that answers, since unlinking it orphaned the live daemon's clients, and main() removes the socket only if it served it. The accept loop logs and continues on errors instead of dying silently, and a client line over a megabyte is dropped. The two known ceilings, a stalled client delaying everyone once for 2 s and a stopped reply holding the llama-server slot until its next chunk, are marked. New checks cover each of these and a client connecting mid-reply. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursTake questions on the socket and stream replies backDanilo M.1-49/+363
Each client gets a reader thread; commands are ask, stop, new, list, open, search and delete. A reply streams think, token and tool events through say(), which checks the turn counter under the same lock that stop takes, so a stopped reply cannot send a token after its done. A finished turn is saved; a stopped one is not. hello carries the current conversation and any reply in flight, so a reconnecting canvas redraws both. Errors from llama-server become an error event and the daemon stays up; every exit path of main() logs a line, which the voice version's silent death lacked. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
13 hoursHistory: enforce modes on existing paths, index turns, strip NULDanilo M.1-4/+12
From review of the storage commit. makedirs and connect leave an existing directory or file at whatever mode it had, so a history dir made earlier with the default umask stayed 0755; both are now chmodded. A NUL in a search ended the FTS string and raised instead of returning nothing. The index on turns(conv, seq) serves the seq lookup per save, load_conv and the cascade, which otherwise scan every turn. The self-check now also asserts that an OR query matches nothing, which a non-raising but unquoted query would not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursKeep conversations in SQLite with full-text searchDanilo M.1-0/+126
One file under XDG_DATA_HOME, 0700 directory and 0600 file. turns.messages holds what the model is sent for the turn, user/reply/tools what the canvas draws. FTS5 with remove_diacritics finds città from citta. The query is quoted as one phrase so FTS syntax typed by the user is matched as text, and the self-check's integrity-check proves a conversation delete cascades into the index. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
13 hoursDrop the voice pipelineDanilo M.1-463/+33
The assistant becomes a text daemon behind the quickshell canvas. STT, TTS, the mic button loop, the presentation gate, the audio levels and the overlay config table go; the socket, the tool runner, the never-swap model rule and the config merge stay. The reply loop goes with the voice and returns with the text protocol. The voice version is tagged voice-v1, so later voice work starts from the tag instead of from dormant code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursPlan the text daemonvoice-v1Danilo M.1-0/+1574
Six tasks: tag voice-v1 and strip voice, SQLite history, the two-way protocol and reply loop, assistant.sh, a live check against the router, docs. Every code block was assembled stage by stage into a scratch copy and its self-check run; the planning-time deviations from the spec are listed at the top and folded back into it by the docs task. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursSpec the text assistant daemonDanilo M.1-0/+180
Voice is dropped for now: the daemon becomes the single brain behind a quickshell conversation canvas, with typed turns over the existing socket, streamed think/token/tool events, and SQLite FTS5 history. The last voice commit gets tagged voice-v1 before deletion, so later voice work starts from the tag instead of dormant code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30Plan local memory implementationDanilo M.1-0/+1424
Eleven tasks: the local-memory CLI with its self-check, detached commit and push, install, assistant tools and prompt block, llamachat memory module, config key, tool loop and local-only UI gate, the private server repo, guardrails against cloud agents, and the live measurement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30Spec local memory shared with llamachatDanilo M.1-0/+196
Topic files under ~/.local/share/local-memory, a local-memory CLI both clients call, recall/remember/forget tools offered to local models only, offer-to-save plus explicit "remember that", and a private git repo on the user's server with a detached commit and push after every write. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28Let arecord die with the assistantDanilo M.2-1/+5
It was the only child started without PR_SET_PDEATHSIG. The assistant died with no log line and left arecord recording into the unlinked raw file for ~76 minutes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28Replace restart.sh with assistant.sh start|stop|restart|statusDanilo M.4-54/+101
start leaves a running assistant or overlay alone and starts only what is missing; restart is the old restart.sh. status lists each process with its uptime, memory and children, a stray arecord left by a dead assistant, the socket, the presentation/gaming pause flags and the log's last lines, and exits 1 if either process is down. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28Record the openWakeWord hey_jarvis trialDanilo M.1-0/+46
Logging-only trial, nothing wired into the assistant. The pretrained model catches every attempt in a quiet room and with quiet music, but only 3 of 8 under music at normal volume, and pipewire here has no echo canceller to remove it. The options are listed for a later decision. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28Keep tool calls in history, with placeholder resultsDanilo M.2-5/+35
History kept only what was said, so after a few factual answers the model saw no tool behind them and invented the next one: asked for pending updates it made up counts without calling the tool (1/10 on a replayed session). Keeping each turn's tool calls brings it back to 10/10. Their results are replaced by a placeholder, which scores the same and keeps the context close to what it was; a follow-up on an old result calls the tool again. The window is now the last 10 whole turns. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28Record the HDMI sink suspend fix for the clipped first wordDanilo M.1-0/+6
The 0.3 s lead silence no longer covered the wake-up of the default sink, now on HDMI. A WirePlumber rule outside the repo keeps that sink from suspending. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Use beam search in whisper, tell the model about misheard wordsDanilo M.2-0/+20
Whisper wrote "Che ori sono?" twice in one day and the model once answered with the weather. On 10 recorded short questions beam search (beam_size=5) gets 9 right against 8 for greedy, for 0.06 s more; an initial prompt also got 9 but lost one question entirely, so it is not used. The default system prompt now says the user's words come from speech recognition and should be read by how they sound: on "Che ori sono?" stray tool calls went from 1 in 10 to none, other tools unaffected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Stamp the time on each question, ask for digits, add a temperature keyDanilo M.3-2/+30
With the clock only in the system prompt, "what time is it?" asked again an hour later copied the old answer from history. The current question now carries the date and time too; history stays unstamped, because stamping every message made the model drop tool arguments (the finance account filter went from 6/6 to 0/6). Gemma garbles numbers it spells out in Italian ("trent settler"), 3 in 10 time answers. The default system prompt asks for digits, which Kokoro reads correctly: 20/20 clean. temperature in config.toml is sent with every request; unset keeps the llama-server preset's, which other clients share. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Add a Slackware updates tool and a restart scriptDanilo M.5-1/+331
updates.py compares the -current ChangeLog with the installed package database: the newest batch holding an installed package is the last one applied, everything newer is pending. The spoken summary gives counts, security fixes and a kernel bump, never package lists; report=true writes a full markdown recap and opens it in MD_EDITOR, detached. restart.sh stops a running assistant and its quickshell overlay and starts both again in their own session. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Document the overlay and record its findingsDanilo M.3-1/+50
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Emit state, context and audio levels from the voice loopDanilo M.1-6/+71
speaking comes from the reply thread, not the speaker: the tool announcement would otherwise replace the tool state while the tool is still running. arecord gets a 33 ms period, because it writes its file in periods and the default left the user's waves at 8 levels a second; the context size is read at startup so the first hello carries it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Broadcast assistant events on a Unix socket for the overlayDanilo M.1-2/+107
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Notify when a press is ignored in presentation or gaming modeDanilo M.1-6/+25
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Compute audio levels for the overlayDanilo M.1-0/+38
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Add implementation plan for the assistant overlayDanilo M.1-0/+1000
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Add design spec for the assistant overlayDanilo M.1-0/+170
A quickshell overlay fed by a JSON-lines Unix socket the assistant owns: state, tool, context use and real audio levels. Ignored presses send a notification instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Log the prompt token count of every LLM roundDanilo M.2-1/+24
Asks llama-server for usage in the stream, so the log shows how full the model's context is; history, tool definitions and tool results all count. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Read controller batteries, stop the model guessing system factsDanilo M.3-3/+39
- Game controllers report battery through their kernel driver, not BlueZ: bluetooth.sh falls back to the power supply named after the device address. - Asked for a VM's IP after a listing without one, the model made one up without calling a tool. The default system prompt now says facts about the user's computer, devices, accounts, mail, calendar or money come only from a tool, or it says it does not know. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Add bluetooth and vms example toolsDanilo M.5-0/+107
Read-only: bluetoothctl show/devices/info and virsh list, domstate, dominfo and domifaddr. Connecting devices and handling VMs are phase 2. The DHCP lease source is empty for bridged guests, so the VM's IP comes from ARP or the guest agent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Pause during games too, not only in presentation modeDanilo M.2-7/+27
The status registry's effective presentation is the OR of the manual flag and status.gaming, which the shell's game detector writes; statusctl presentation get reads only the manual half and printed 0 with a game running. presenting() now reads both files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Let a button press cut the current reply (barge-in)Danilo M.2-36/+87
Every press bumps a turn counter and kills the running aplay; queued audio from an older turn is dropped, and reply() now runs on its own thread and returns once its turn is stale, so the button loop is never blocked. A cut-off exchange is left out of history so user and assistant messages still alternate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Fix mail counts and finance ranges found testing liveDanilo M.5-18/+68
- mail printed threads and the model called them emails; it now reports messages and threads. - finance spending takes a since date (default the first of the month) instead of a day count, and an optional asset account. The per-account listing needs an end date or the API rejects it; an unknown account name gets the user's accounts back. - Tool errors are capped at 2000 characters like normal output. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26Add calc, mail, playing and finance example toolsDanilo M.8-4/+153
All read-only: each command is fixed in its tool file, so the model fills parameters but can never reach mailctl tag or firefly tx add. qalc reads "17.5% of 240" as a modulo, so the calc hint shows percent as a factor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>