| Age | Commit message (Collapse) | Author | Files | Lines |
|
Inside the desktop process rather than its own shell: it needs no keepalive
window of its own and restarts with the rest of the desktop.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
|
The socket, the turn model and the window live in Assistant.qml, outside
the window's loader, so closing the card loses nothing and a reply keeps
streaming while it is closed. Tokens reach the model on a 50 ms tick
rather than per token. Prose goes through Notify.sanitize, because model
output can quote a search result and a remote image in it would be
fetched on render. Code blocks get a copy button once their fence closes.
The history panel lists conversations and searches them through the
daemon's full-text index.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
|
Qt's markdown renders a fence but gives no per-block hook, so a copy
button per code block needs the fences found first. An unclosed fence is
open code, which is every fence while a reply streams; a fence inside a
list item keeps its indent out of the copied text.
Co-Authored-By: Claude Haiku 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>
|
|
Shows album art and a scrolling "artist · album · title" while a
player is playing or paused, using the sound module's Player so the
browser proxy duplicates are already filtered. Hovering swaps the text
for a progress bar, swapped in place rather than growing the pill;
MPRIS does not push position, so it is re-read every second while
hovered, and a click seeks only when the player reports canSeek and a
known length. The wheel steps tracks one per notch, as the layout flag
does, so a touchpad does not skip several.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The single Add line at the bottom took a full section.key and left the
user to type the section right. Each heading now carries a + that opens a
key and value row under it; git config --add writes the key into that
existing section, among its neighbours, rather than at the end of the
file. The typed text lives on the page, not in the fields, so a failed add
keeps it across the reload that rebuilds every row. A new section is made
in the editor.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Review findings. With a key holding the same value twice, --fixed-value
--replace-all rewrote both and merged two rows into one, and --unset
failed on both; gitcfg now counts the matches and refuses anything but
exactly one, pointing at the editor. A file git cannot parse made list
print nothing, which the page drew as an empty config; list now prints
git's error as an error= line and the page shows it. Escape in the Add
fields clears the typed text before it leaves the page, as a row's edit
is undone first.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A "More git settings" button under the Git fields. The page emits
moreGit and the module turns it into Page.go("git"), since the page
itself has no reach into the drawer.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Every global value as a row under its section, in file order: Enter saves,
Escape undoes, Remove drops that one value, and an Add row takes
section.key and a value. Each write goes through gitcfg and is followed by
a fresh list, so a row shows what git holds; a failure shows git's reason
under its row. "Edit in editor" opens ~/.gitconfig in Sublime Text.
No tile: up is "user", so back returns to the user page it opens from.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Page gains go(name), wired to the drawer's show(). Module gains up, the
page back() returns to, empty for the grid as before. The back arrow now
calls back() instead of clearing the page itself, so the arrow, Escape
and the mouse's back button agree. For the git page, opened from the
user page.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
NUL between entries and the first newline between name and value, so
values holding = or newlines survive. The key is after the last dot, so
color.branch.remote groups under color.branch.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
list, set, add and unset over git config --global. --fixed-value lets a
write touch one value of a multi-valued key. set and unset check the old
value is still there first: --replace-all with no match appends and exits
0, and the file may have changed in an editor since the page read it.
Co-Authored-By: Claude Sonnet 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>
|
|
The greeting row picks one at random from ~/.config/quickshell/greetings,
one per line with {user} for the login name, # comments and blank lines
skipped; without the file, five built-in ones. The row is rebuilt on every
drawer open, so the file is read then with no watch, and the last pick is
kept in User.js, a shared .pragma library, so the same greeting never
shows twice running.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Up and Down move through the list, wrapping, and light the row as hover
does; Enter takes it; Escape closes the list. With no list open the
keys pass on, so Escape still leaves the page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
There is no place database on this machine, and the user chose
Nominatim over a tz city list for coverage. It is asked 1s after typing
stops (its policy: one request a second, an identifying User-Agent,
nothing personal sent), from three characters, in the desktop's
language, and a reply to an older query is dropped. places() turns its
JSON into 'place, region, country' labels and treats an error page as
no suggestions; test_user.js covers it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The one-line preview became a section: the git name and email as
read-only fields that follow the Name and Email edits as they are
typed, and the signing key, which is git's too, moved under them. A
derived field is computed from the draft and never saved on its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Hover and attention effects were solid: a flat accent ring round the
user page's avatar, a flat quarter-disc in the hot corner, and thick
accent or white borders on window cards, keycaps and knobs. Glow.qml
is a RectangularShadow in the accent, fading out from the shape's edge
and in over 140ms, linked into desktop, window-switcher and keybinds
like Theme.qml, and all five places use it. Selection borders in the
appearance tabs stay: they mark state, not hover.
The avatar also gains the hover cue in the first place: the hand
cursor never showed under a hyprcursor-only theme, so without it the
picture gave no sign it could be clicked.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The avatar had room to spare at 96px; 160 fills the page better. The
two ComboBoxes rendered in the default style's light colours on a dark
page; a palette takes the theme into the control and its popup, and the
background matches the text fields.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
With a surface and a border it read as one more notification in the
list under it. Only a faint hover tint remains.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The page showed AccountsService's icon, an older picture than the one
the rest of the desktop uses: hyprlock, the udt SDDM theme (pointed at
it by udt-accent) and the rofi power menu all read ~/.user-icon.jpg.
get now prefers that file, and set converts the pick to JPEG there,
through a temp file and a rename, before handing it to AccountsService
so both agree.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A key whose write half-failed (AccountsService took it, git did not)
reloads as unchanged and Save went dead. A key with an error now counts
as changed, and editing a field clears its error.
Processes were parented to the page, so leaving it mid-save killed
userctl between stores. They hang off the module now, passed in as
owner (not the module's id, which would bind to itself).
busy now clears when the reload lands, so Save cannot be clicked again
before saved is fresh, and the fields and avatar picker are disabled
while busy.
Avatar paths with # or % broke the preview under a bare file:// prefix;
each segment is now URI-encoded for the Image source (page and row),
while draft.avatar stays a plain path for userctl. Dropped a redundant
saved clear in load.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Name, email, avatar, language, location and the git signing key, each
saved through userctl to every store that holds it. Only changed fields
are sent; a field whose write failed keeps its edit and its error, so
the next Save retries it.
A failed userctl get reports a single error= line. The page shows it in
red under the avatar, leaves saved and draft untouched, and disables
Save until a later load succeeds.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Avatar, Hello <login> and the real name, re-read whenever the grid view
shows again so an edit is visible on the way back from the page. Module
gains tiled, so a module can own a page without a tile.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Parsing userctl's output and locale -a, and the git name preview, kept
out of QML so node can test them.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
busctl and kwriteconfig6 parse a value starting with '-' as an option, so
a location like '-x' failed; '--' before the value ends option parsing
(checked against both binaries).
get ran without pipefail, so a failing busctl gave empty fields and exit
0, which the page would show as a blank form. It now reads all fields
first and, on failure, prints one error= line and exits 1.
keys listed revoked, expired or invalid primaries, keys that cannot
sign, and could label a key with a revoked uid. It now skips those.
Unsetting the signing key uses --unset-all, since git exits 5 on a
multi-valued key with --unset.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
One writer for the stores other programs read: AccountsService (and with
it the passwd GECOS LibreOffice prefills from), KDE's emaildefaults and
the global git config, where the surname goes in as an initial. busctl
is asked for JSON because its plain output escapes non-ASCII as octal.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
The island's performance icon and panel are gone: the drawer page covers
them. With only one host left, the panel drops its three-column grid for
one card per row at a larger size, since the page scrolls; temperatures
get a card of their own as tiles. The files move from island/perf to
modules/perf.
A cache card ports conky's: ~/.cache and its five largest children,
measured with du each time the page opens (28ms over 2 GiB here) rather
than read from conky's 15-minute sampler file. The largest is yellow,
red past half the total, as conky had it.
The warning dot now shows only on the drawer tile.
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>
|
|
Recorded because the inverted filter looked correct, linted clean and
returned an empty list with no error.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The island spec put per-app volume on the drawer page, and it was never
built. Each application playing audio now gets a row with its name, what it
is playing (two browser tabs are otherwise identical rows), a click-to-mute
level and its own slider.
Streams are matched on PwNodeType.AudioOutStream. Quickshell reports isSink
true for a playback stream, so the obvious isStream && !isSink filter found
nothing while Firefox played. Their properties are empty until bound, so the
page carries a PwObjectTracker for them, which stops with the drawer.
speech-dispatcher-dummy is always present and never audible, and is hidden.
The output slider runs to 150%, the ceiling the volume keybind already uses
(wpctl -l 1.5), with a tick at 100%. Input and apps stop at 100%: a boosted
microphone only clips. The meter became an inline component shared by both,
and wheel-up never lowers a level already past its maximum.
Now playing is dropped from the page: the OSD already carries it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The side button (BTN_SIDE, Qt.BackButton) does what Escape does: closes
the history, then leaves a page for the tiles, then closes the drawer.
Both go through one back(). The first attempt let the press fall through
to the full-surface click catcher under the panel, since nothing above
it accepts that button; it never arrived while a page was open. A
MouseArea on top with z: 1, taking only the back button, works, and
left clicks still pass through it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The first cut was small type in one long list: 471 Slackware upgrades
pushed everything below them out of sight, and the repo tag, the
versions and the name ran together across the row. Type is 2px larger
and rows taller. A section over ten rows starts folded behind a
clickable heading with its count. The version being moved to is bright,
the one being left dim, both in Inconsolata so digits line up. Every
other row is shaded to carry the eye across, and the repo is a pill in
one colour per repo, never red, green, yellow or the accent, which mean
something elsewhere.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The tile counts what can be installed now (Slackware and the binary
repo) and what only needs a build, and goes accent when there is
something to install. It runs updatesctl while the drawer is open and
not otherwise; a result over 30 minutes old is followed by a refresh
that runs nvchecker, never after a refresh, so a failing nvchecker
cannot loop.
The page has one section per next action: Slackware upgrades, new and
removed first, then upgrade here, awaiting build, upstream newer, app
updates, the order the work is done in. Each row names the package, the
repo it comes from and the one version jump its action covers. A source
that could not be read says so under the section it empties instead of
reading as nothing pending.
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>
|
|
The awaiting-build branch also required the build to be older than
upstream, which cannot fail there: a build newer than installed was
already taken as an upgrade, so the build is at most the installed
version, which is behind upstream whenever a row is emitted. Removing
it left every test passing, which is how it was found.
The blacklisted testing/ entry sat after the main one in the fixture, so
setdefault kept the main one and the mirror-side blacklist was never
exercised; it now comes first, and dropping the check fails the test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A fifo with no writer blocks cat at open() the way a hard NFS mount
blocks during a NAS outage. The repo section reports unreachable within
the timeout and the mirror sections still fill.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Compared mirror against installed, as upgrade-all does, not against
slackpkg's local ChangeLog: `slackpkg update` replaces that without
installing anything, so a diff against it reads clean after an update
that was never applied. New and removed come from the mirror's
ChangeLog, the newest Added or Removed line deciding, so a package
added and later upgraded still counts as new. Blacklisted build tags
and directories are skipped, as slackpkg skips them.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Each nvchecker stanza lands in one section: upgrade here when the binary
repo's PACKAGES.TXT holds a newer build than installed, awaiting build
when the recipe (the user's or SBo's) has caught up but the build has
not, upstream newer when the recipe lags, app updates for AppImages and
flatpaks. Built comes from PACKAGES.TXT rather than the .info, which is
why gamescope and kitty no longer read as installable: the repo still
held the old build. The repo is on a hard NFS mount, so it is read by a
child the timeout can kill.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
nvtable compares versions for equality, which cannot tell an installed
2.1.278 from an SBo recipe of 2.1.267 that is older than it. vercmp
orders numeric chunks as numbers and treats a trailing alphabetic chunk
as a pre-release, so a kernel suffix or git hash orders as newer than
its base and never reads as behind.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|