| Age | Commit message (Collapse) | Author | Files | Lines |
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The trigger fires whenever she stops being away, which is a dodge and
fullscreen as well as the three appearances the spec named.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
She turns to the wallpaper with the existing watch back view and blushes
with blush3, when the workspace in front of her is empty and the
wallpaper on her monitor is on a plain text list. The list is toggled
from the wallpaper picker and its path set on the companion page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The README records the measurements the code depends on: where typing
and BackSpace come from, why the dodge waits for the pointer, the
IdleMonitor enabled default, and fullscreen 2 against maximised 1.
AGENTS.md gains the QtQuick Sprite trap beside the Controls Button one,
since it took the desktop shell down on restart.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The dress frames are made. What the tries taught is in frames.txt beside
each line: klein turns the blindfold into an eye mask under strong
expressions, so those take it off (BARE) and the rest name it as one solid
band (EYES); standing "shoved" read as walking in four seeds, so it is
airborne, edited from the seed-7 attempt kept in candidates/; a back view
fits "watch", her watching the screen while the user types; klein would
neither draw the game's Virtuous Treaty nor move a sword, nor turn her
three-quarters, so muse takes only the arms of her official art.
gen-frames now takes several references per frame (a + b): the first is
edited, the rest are images the prompt points at. The leotard set loses
the blindfold too. shoved gets a frame of its own instead of mad: in the
spec's table and the plan's Mood.js and its test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Eleven tasks: the Hyprland events first, since the spec's open checks
gate the QML that depends on them; the shared balloon check; Mood.js and
Lines.js with node checks; prep-frames; the assistant's replied signal;
Sprite and Companion; notes; then the hand checks and the frame list
for the user.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Lying down is what boredom ends in, so a sitting rest pose made it no
change. The standing base is a klein edit of the sitting one, which
stays as its source, and the smile and wave made from the sitting base
are redone from the standing one so every frame descends from a single
reference.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The self-destruct leaves her in the leotard for 60 s. With one leotard
frame she would freeze for that long while reactions played only as
lines; a full second set keeps every state animated. Each leotard frame
is a klein edit of its own dress frame, so the pose carries over, and a
missing frame falls back within its outfit, never to the other one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A chibi 2B in the bottom-right corner of the focused monitor, part of
desktop/ so she reads the assistant's state directly. The spec records
what was measured while making the art (img2img moves faces, not limbs;
klein moves limbs when every kept detail is named), the sd.cpp SDXL
diffusers bug that forced the single-file Pony checkpoint, and the three
Hyprland behaviours still to test before code depends on them.
The art stays out of the repo: the character is Square Enix's and the
repo is GPLv2.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Two pages under SB Builder in the settings window: the GUI's config.toml
edited in place, and the helper's config on the VM through new
config-get/config-set commands, so the helper keeps validating what is
written to it. The sb-builder half is built in that repo.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
AssistantModule keeps each router model's input_modalities and exposes
hears: the model loading, else the first not unloaded (the daemon's
rule), reports audio. Unknown inputs or a router that is down count as
yes; the daemon's error covers the rest. The model list is now read on
every canvas open, not only when a preferred model is set, so hears is
current when the card shows.
Checked: the rule against the router's live /models (Gemma resident:
on; Qwen resident or loading: off; router down: on). Not yet seen by
eye after a desktop shell reload.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Each recording is a pw-record Process of its own, made from a Component
like the Do row's runs, so a stopped recording's late exit cannot be
read as the next one's. Stopping sets running to false (SIGTERM), which
lets pw-record write the WAV header; the audio ask goes out from the
process's exit, not from the click.
Recording stops itself at 59 s: the daemon refuses over 60 s by file
size, and the stop lands a little after the tick. Escape cancels a
recording before it does anything else, and closing the card or losing
the daemon cancels it too. A pw-record that ends on its own says
"recording failed".
Checked: a scratch harness saw transcribing, thinking, idle for a 2 s
recording; by hand, every case in the spec passed with no pw-record
left behind, a desktop shell reload mid-recording included.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A mic button records with pw-record and sends the WAV's path as an
audio ask; the daemon transcribes it. pw-record writes a right header
when stopped by SIGTERM, but one stray kept recording in a trial, so
every path out stops it and the checks look for a stray each time.
Recording stops at 59 s: the daemon refuses over 60 s by file size.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Save sets the system sound theme too, and the page reads it back on every
open so a change made elsewhere shows instead of being overwritten.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A sound per urgency in config.json, played by the balloon shell under the
same checks that decide the balloon. notifyd resolves the apps' sound-file,
sound-name and suppress-sound hints into two published fields, looking
names up in a configurable sound theme.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Ten tasks across notifyd (config loader, timeouts, caps, reload) and this
repo (shared resolver with a node check, balloon placement and mute, the
settings module).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
One config file in ~/.config/notifyd read by the daemon (timeouts, caps,
picked up by notifyctl reload) and by both shells (placement, mute, DND).
Snooze stays out: the status tile already covers it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
|
|
|
|
At rest the pill is a record dot with the elapsed time; a click morphs it
into a panel, as the status pill does for sound, with Record/Stop,
Pause/Resume, Show/Hide webcam and the scene list. The user preferred it
to every control inline: the pill stays small, and scenes are picked by
name rather than stepped through, so obsStep is gone. OBS quitting with
the panel open clears it, or the island would stay held open.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Six tasks: logic helpers with their check, the openssl auth helper, the
Obs singleton, the pill, island wiring with the sliver pulse, docs.
Records two deviations from the spec found while planning: QML's
WebSocket hides the close code, so a wrong password is logged as
'closed before Identified'; responses route on the echoed requestType.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A pill on the island that exists while OBS runs: record, pause, scene,
webcam visibility, and a pulsing sliver while recording. Talks to
obs-websocket directly from QML (QtWebSockets is installed), reading the
password from OBS's own config so no copy exists. Auth stays on because
obs-websocket listens on every interface.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Reported from use: a note created with only a title then saved left a db.json
entry with no file beside it, and reopening it said the file was missing.
Cause: FileView.setText("") on a path that view has not loaded creates no
file at all and reports no error. The index write (always non-empty JSON)
was fine, so only the body was lost, which is why it looked like a missing
file rather than a failed save. Bodies are now written by a Process running
cat > <file> with the text on stdin: verified against empty and non-empty
payloads, consecutive writes on one Process, and a store with no db.json at
all. The exit code is the real outcome, so a refused write reports it.
Second report in the same flow: the editor stays editable after the first
click, so typing more and then pressing Commit & push dropped the edit, the
push carrying only what the first click wrote. The second click now writes
the current title and body before it commits and pushes.
|
|
The confirm was on the second click, after the first had already removed the
file and the entry, so the 'Confirm?' label promised a check that had
already happened and one stray click lost the note. The first click now only
arms the button; the second removes and pushes the removal.
|
|
A review of the branch found four ways the page could report success for
work that never happened, all reachable in ordinary use.
Writes: setText is asynchronous unless blockWrites, and its
saved()/saveFailed() do not fire for every write (a second setText to the
same path loses the signal, which stranded the callback), so a save was
reported before it landed and a failed db.json or body write was never
seen. Both views now block and carry the outcome, so writeDb and writeBody
know the result when they return; a failed create therefore leaves no index
entry. The create path also loads the body before the index, so a failed
body write cannot leave an entry with no text.
Commits: the sync chain swallowed every commit failure with '|| true', so a
failing pre-commit hook or a signing failure pushed an unchanged HEAD and
reported success. It now stages, commits only when something is staged, and
lets 'set -e' fail the chain, with stderr folded in for the whole chain
rather than just the push.
Duplicate notes: the 'awaiting commit' state lived only in a 3 second
timer, so a slower second click re-entered create() and appended a second
note. It is now a page property that outlives the timer, and the button
follows it.
Preview: the shared Switch writes checked itself, dropping the binding, so
the switch stopped following page.preview; resynced on change, the way
StatusRow.qml does.
Also validates a note's file name as digits before read, write or rm, and
clears the index error once the index reads again.
|
|
The editor, and the write and git path behind it. Save is two clicks and
each does one thing: the first writes the note and only then arms the
button as 'Commit & push?', so a quick second click cannot commit a note
the first has not written yet.
The write path refuses when db.json cannot be read as the index. That is
not hypothetical: git pull --rebase --autostash resolves a remote db.json
change against a local uncommitted one, the stash pop conflicts, git still
exits 0, and the file is left full of merge markers. Reading that as 'no
notes' and writing it back deleted every title in a probe; Notes.valid now
distinguishes it from an empty store and the write reports instead. parse
stays tolerant for display. Stamping lastpull also only follows a pull
that worked, and only when git is on at all.
Db reads that a write is based on go through reload() plus waitForJob():
blockLoading does not make reload() blocking, contrary to the note in
AGENTS.md, and reading text() straight after reload() returns the old
contents. A body is written with a plain setText, which needs no prior
load; only reading text() before a load would.
|
|
A drawer tile and page for bash-notes: browse, write, edit and delete
notes in the page, sharing notes.sh's store so both tools work on the
same notes.
Git follows notes.sh's shape, pull before write, commit and push after,
with two departures the page needs: an unconfirmed Save leaves db.json
uncommitted (write and commit are two clicks here, one invocation there),
so the pulls carry --autostash, and lastpull is stamped after the pull
rather than before it, which notes.sh does and then ignores the failed
pull that follows.
|
|
The canvas: a To .md ended any other way than its own Stop (the footer
Stop, a question, a drop, a daemon restart, an older daemon refusing the
command) left the card at Working forever. The footer Stop goes through
stopOp(), asking and dropping end the operation first, a disconnect ends
it, and an error while nothing else runs is taken as its outcome. Each
fileops run gets its own Process, so a stopped run's late answer is never
read as the next one's. To .md takes one PDF, as one file is written.
Compress... no longer flips back when file(1) refines a kind, long errors
are elided, and a desktop with no documents folder gets
Documents/Assistant rather than ~/Assistant.
fileops: an animated GIF to PNG or JPEG left one file per frame under
names the rename never found; the first frame is taken. JPEG flattens
transparency onto white. Zipping a folder holding the output folder read
its own growing archive without end; only regular files outside it are
added, which also skips FIFOs and dangling links. qpdf warnings no longer
fail a merge. A folder's free name keeps its dots, a lone .gz or .xz is
decompressed rather than refused, and a dotfile's archive is not hidden.
Tools die with fileops even when it is killed outright, a killed run's
leftovers are swept on the next run, a stop between fork and bookkeeping
cannot miss the child, and a late stop cannot add a second answer.
Error lines lose bsdtar's doubled prefix and its delayed-exit noise.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
One CLI for converting, extracting, merging and compressing staged files,
answering with one JSON line. Results are written under a temporary name
and renamed to the first free one, so a failure or a stop leaves nothing
half written, and a stop kills the tool's whole process group. This
ffmpeg has no libx264 and no AAC encoder, so MP4 is H.264 through VAAPI
with MP3 audio, and audio extraction copies AAC, MP3 and Opus tracks as
they are. The test builds its inputs and checks every result's type.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Local conversions, extraction, merge and compression through a small
fileops CLI, results in Documents/Assistant, and To .md through the
daemon's new write command.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Canned questions per staged kind in the file state, stored in Prefs with
built-in defaults so a future settings page can edit them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Checked by hand: resume rule, island drop and its refusal message, the file
state, Chat about it, the picker, and the Escape order.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Four tasks: file kinds, the three card states with staging and the
in-card picker, the island receptacle, and the handover. The card files
ran in a scratch harness against the attachment daemon first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A system file dialog would open under the overlay that holds the keyboard,
so the picker is drawn in the card, over the transcript, from
Qt.labs.folderlistmodel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Three card states: an entry line, a file state offering what to do with
dropped files, and the chat. A drop always starts a new task, and asking
about a file is one of the choices rather than the only one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
All nine visual checks passed by hand.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Five tasks: the markdown splitter, the canvas components, hosting them in
the desktop shell, the switch-over (voice overlay out, hypr-theme bind,
autostart and blur), and the user's visual check. Every file was run in a
scratch harness against the real daemon before planning.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A Luma-style overlay on SUPER+Home, inside the desktop process, as a pure
view over desktop-assistant's socket. It replaces the voice overlay in
assistant/ and stands in for llamachat while it is tested.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A drawer page, reached from the user page, listing every global git key and
editing, adding and removing values through git config itself, so the file
keeps its comments and quoting. --fixed-value lets each write target one
value of a multi-valued key.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The git sync was meant to include user.signingkey and the spec had
dropped it, claiming nothing reads a GPG key. git does. The page offers
the secret keys gpg holds, plus None, and writes the fingerprint.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
passwd in a terminal already does it, AccountsService's SetPassword needs
admin rights and a hash, and a change desyncs the login keyring.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A drawer row greets the login user and opens a page that edits name,
email, avatar, language and location, written where other programs
already read them: AccountsService (and through it the passwd GECOS
LibreOffice reads), KDE's emaildefaults and the global git config, with
the surname shortened to an initial for git.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A git hash starting with a letter (3.1-a59215d) ordered behind its base,
because any trailing alphabetic chunk counted as a pre-release; only
alpha, beta, rc, pre and dev do now. Trailing zeros (1.14 against
1.14.0) compare equal instead of reading as an upstream bump. A bad line
in the slackpkg blacklist is skipped rather than crashing the script and
leaving the drawer with nothing. An AppImage keeps its key over a
flatpak of the same name, as the spec orders them, and flatpak list has
a timeout. A Slackware upgrade compares version and build, so an arch
change alone is not a row. The spec's prose now matches the code: the
upstream comparison includes the installed version.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|