| Age | Commit message (Collapse) | Author | Files | Lines |
|
Whistle had the same censor-bar blindfold as dj and takes the same fix.
headbang-down edited from headbang-up came out nearly identical, so both
are made from base with opposite poses. klein will not draw an invisible
guitar, so the air guitar is a neon blue electric.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
With headphones, the blindfold came out as a flat censor bar across her
face, the same failure sing had, so dj takes sing's fix: blindfold off,
eyes closed. "Hiding her legs" drew a table on legs with her boots in
view; a solid front panel to the ground hides them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Twelve frames, dress and leotard. Prompts are a first draft for klein; the
user generates them, and until then each falls back to base.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Reads the sound module's Player, which already filters the MPRIS
duplicates. The track key is artist+title while playing, so a pause and
resume of the same track does not DJ again; a shell start with music on
DJs once, which is harmless. Frame loops are a small table keyed by the
frame Mood names, so dj and headbang need no special case in Mood.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
PhrasesPage takes its intro, key hint, add-button text and saved set, so
the artist set reuses it rather than a copy that would drift. Reset's
enabled state read Prefs.companionApps directly and would have tracked the
wrong set. ArtistsModule mirrors PhrasesModule on Prefs.companionArtists
and Lines.artists.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Artist keys match as a case-insensitive substring of the MPRIS artist, so
collaborations and feat. credits still hit; the cost is a short key
over-matching, marked as a ponytail ceiling. appMap/appList take their
defaults so the settings page can serve artists with the same helpers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A DJ burst ranks just below the headphones sing, so both arriving together
sings first. Music turns only the first idle stage into a groove: yawning
and lying down still win, so music does not keep her awake and the
screensaver handoff is unchanged. The groove pick is an input, keeping
pick() pure.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
She DJs on a track start or change, grooves instead of looking bored while
music plays, and says artist lines edited in a settings page that reuses
the app phrases page. Player.qml already filters the MPRIS duplicates, so
the companion reads it rather than opening players of its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
She now reacts to the headphones connecting with a short singing pose:
eyes shut, blindfold gone, mouth wide open, headphones on, a few musical
notes. The frames are new klein edits in frames.txt (dress/sing from
dress/base, leotard/sing from dress/sing), so a post-self-destruct sing
has its own art.
Detection is the island's rule (StatusPill.qml): by model prefix, since
BlueZ gives no class that says "headphones". The device's BlueZ Name is
WH-CH720N, which the alias does not affect. The reaction is a one-shot
hold in Mood.js (singHold, 4 s), placed after wave like the other event
reactions. A 4 s startup grace keeps a shell start with the headphones
already on from counting as a connection, since Bluetooth reads empty
for about 2 s.
|
|
SUPER+\ now plays a short goodbye instead of dropping her at once: she cycles wave-l and wave-r around the existing wave for a sway, then the normal drop. One hide in four she also says a bye line, non-forced so the usual 30 s cooldown applies; the hold matches what showed, 2 s with a line and 1 s silent.
The sway is klein edits of dress/wave rather than base, so the arm stays up and only the hand moves; the leotard twins come from their dress frames. The leotard rerolled to seed 7 because the first seed left a faint alpha fringe that widened the canvas and made the flip jitter.
Fullscreen, the lock screen and the monitor hop keep their own exits and do not wave.
Also carries the pending onFocusedChanged guard: with no focused monitor, or already away, she moves at once rather than waiting for an exit that will never settle.
|
|
Her per-app lines were hardcoded in Lines.js under app:<class>. They now live in Prefs.companionApps once edited and fall back to Lines.js until then, read live by Companion.qml so a save needs no restart. The new Companion phrases page does full CRUD on apps and their phrases, with a draft, SaveBar and Reset to the built-in set, mirroring Ask presets. Companion settings move out of Desktop into their own Companion group.
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The Prefer rows for cloud models never built: the shell's JS engine has
no Array.prototype.flatMap, and the Repeater's model threw a TypeError
(seen in qs log). The ids are now joined with reduce in the module.
Each tool row gains a cloud switch, applied on Save after the renames:
it writes or drops a top-level cloud = true, validated with tomllib and
replaced atomically, on name.toml or name.toml.off.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The canvas asks for its chat's model, else the preferred one, when it
opens and when the pick changes; a cloud id loads nothing. The paperclip
also closes the model panel, so it and the picker never stack. The plan's
Models.qml import is corrected to the one that resolves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The canvas keeps the chat's model from the daemon (hello.chat_model,
conversation.model), falls back to the preferred one (set from shell.qml
later), and sends it as model with every ask, typed or spoken. The To .md
write stays without one: the daemon always writes with the local model.
Models.qml lists the daemon's models event, router models then cloud
ones, in a panel like History. It opens from the header label in chat,
from a Model button next to History outside chat, and with Ctrl+M. The
models are asked for on hello too, so the cloud marker is right before
the panel was ever opened. Moving a chat with turns to a cloud model
says once that its history goes to that provider.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Settings > Desktop > Companion takes the seconds she stays in the
leotard after the self-destruct, 60 as before. Switched off, she keeps
it until she is hidden and shown again, which already put the dress
back early. Mood.outfit takes the time instead of reading T.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
A 1.5 px shiver side to side, 160 ms a cycle, for the blush3 half of
admire only; a click burst's blush3 stays still. Put back to rest on
stop, since an infinite animation stopped mid-swing keeps its offset.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
At the label's size it was hard to spot. An outline in the base colour
keeps it readable on a light image.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
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>
|
|
Shown on hover, and always on a listed one. It toggles the path in the
list file and leaves the rest of the file as it was.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Empty means the default under ~/.config/keystone, shown as the
placeholder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Checked on switching workspace or closing a window, and whenever she
stops being away, which covers being shown, a remap, a hop to another
monitor, a dodge and fullscreen. The 3 minute cooldown keeps workspace
flicking from repeating it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The list is a plain text file whose path is a preference, the default
under ~/.config/keystone. Written through cat because an emptied list
is an empty file, which FileView.setText does not write.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The watch back view for 1.5 s, then blush3 for 3 s, at most every 3
minutes. Below clicks, so a click during it wins; above the mock and
typing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Toggling keeps comments and every other line, so a hand-edited list
survives the picker's heart. wallp.conf's outputs map a monitor to the
H or V wallpaper.
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 focused window's class, from Hyprland's activewindow event, picks a
line from Lines.js keyed app:<class>. The event fires on every title
change too, so she reacts only when the class changes, and a third of
the time, under the existing 30 s line cooldown so alt-tabbing does not
make her chatter. Classes come from the window rules in the live config;
one without lines says nothing. Lines only, no frames of her own yet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Twice in one session an edit adding an import to desktop/shell.qml
hot-reloaded into "UdtModule is not a type" and then "SunsetModule is
not a type", both existing appearance modules a fresh process resolved.
Recorded so the next one is met with a restart, not a debugging session.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
SUPER+\ only flipped a property, so every restart of the desktop shell
brought her back. Whether she is shown is now `companion` in Prefs.qml,
set by the IPC and by a switch on a new Settings > Desktop > Companion
page. Prefs gains `ready`, so she waits for the file rather than showing
at the default and then vanishing; the greeting now plays on every
appearance, the one at login included.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Her stages sat at 1, 3 and 5 minutes, and the saver starts at 5, so she
lay down under it. They are now 20, 40 and 70% of wscreensavers'
idleTimeoutMinutes, read live from its config: 1, 2 and 3.5 minutes at
its default.
She never idled at all while No lock was on: it holds an idle inhibitor
and her monitors respected inhibitors. Measured with a throwaway shell,
a 5 s monitor respecting them never fired while one ignoring them did.
They now ignore inhibitors, as the saver does, and presentation and
gaming mode keep her awake by name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Remapping only when the assistant opened left her under rofi and the
keybind reminder, which map on the same Overlay layer later. She now
remaps on Hyprland's openlayer event for any namespace but her own,
restarting the timer so a burst of openings ends with her on top.
The bare remap read as a flicker. Unmapped she now counts as away, so
her figure drops out unseen during the 400 ms and plays its entrance
when she is back: a vanish and a hop in.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The assistant canvas is a full-screen Overlay surface mapped on open,
so it covered her and her think and wave were never seen. She moves to
the Overlay layer and unmaps and maps again when the canvas opens, since
a later surface stacks above an earlier one and Hyprland 0.56.2 has no
layer rule to order them: an `order` key was tried, raised no config
error, and did nothing.
Every key sent her into watching, a shortcut included. The pulse comes
at most once a second, so a lone key is one pulse; she now watches from
the second pulse within 2.5 s. The hypr-theme hook drops modifiers and
chords on its side.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Hyprland 0.56.2 reports a Lua `code:N` bind with key "" and keycode 0
in `hyprctl binds -j`, while the bind itself works, so the reminder
printed "Win + " with nothing after it. Such a bind is now named by its
description, with "?" for one not listed, so a new keycode bind shows
up as a visible gap rather than a blank.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The balloon window is one layer surface for the whole stack and stays
mapped while any balloon is queued, so Hyprland's layer animation only
ever played for the first one; the rest just appeared. Each balloon now
animates its own x in from the side its corner sits against. The window
clips it, so it enters from the stack's edge, 12 px inside the screen's.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The balloon arrives almost at once, so 1.2 s of stumbling outlasted the
push. She turns mad beside it after half a second.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The shoved frame held for as long as a balloon stayed, which read as
her stumbling for ten seconds. It now lasts T.shoveHold (1.2 s), then
she is mad beside the balloon until it goes. shovedAt is reset to 0 when
the shove ends and 0 reads as the shove's first instant, so the binding
cannot show mad for a tick before the handler stamps the time.
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>
|
|
Companion.qml is a Top-layer PanelWindow bottom-right of the focused
monitor, masked to her body so every other click passes through. It
gathers the inputs (Hyprland's custom typing and delete events, the
assistant's state and replied signal, the balloons on her screen,
three IdleMonitors, clicks and a hover), hands a snapshot to Mood.js,
and speaks from Lines.js. Figure.qml crossfades frames, bobs, drops
out of view and back, and plays the self-destruct.
Figure.qml was planned as Sprite.qml, but QtQuick ships a Sprite type
and an explicit import beats the directory's own file: the shell failed
to load with "Cannot assign to non-existent property onSettled".
Maximised windows report fullscreen 1 and most windows here are, so
only 2 hides her. She only feels the pointer once it is on her, so the
dodge waits 0.6 s and a quick click still lands.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The desktop companion waves when an answer is ready. The moment already
existed as the done branch that calls notifyDone; it is now a signal
too, so the companion connects to it instead of reading the turn list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Fixed English lines per reaction, terse in the game's register, and the
opening monologue split at its sentences so each fills one bubble.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
The spec's priority table as a pure function over a snapshot of her
inputs, with the click burst, the outfit after the self-destruct, the
mock and line cooldowns and the monologue's odds beside it. Pure so the
node check can drive it with a fake clock; Companion.qml will own the
inputs and timers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|