aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
4 hoursdocs: rewrap the tray menu notesDanilo M.1-3/+3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 hoursisland: release the tray-menu hold when the menu closesDanilo M.4-11/+30
A tray menu un-hovers the pills, so the island holds itself shown while one is open. display() reports no close, so the hold ended only when the pointer came back to the island. Quitting an app from its menu left the pointer on the vanished menu, below the pills, and the island stayed open until the next hover. Menus now open through a QsMenuAnchor. Its closed signal fires on any dismissal, an entry picked, Escape or a click elsewhere, and clears the hold and restarts the hide timer. Checked by eye: menu placement unchanged, Quit and a dismissal both retract the island, hovering back keeps it shown. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 hourswindow-switcher: Del closes the selected windowDanilo M.2-1/+4
The keyboard could pick a window but only the mouse could close one, on the hovered card's x. Del closes the selection and, like the x, leaves the overlay open for the next close; the card goes when Hyprland reports the window gone, and the next arrow press picks the top-left card again. The README also still named the IPC show(), renamed open() in c889501. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 hoursipc: show() is open(), the CLI could never reach itDanilo M.4-3/+8
qs ipc has a show subcommand, and its parser takes the word wherever it appears: `qs -p <dir> ipc call companion show` printed the target list and exited 0 instead of calling the function. The companion, window switcher and keybind reminder each had a show() no command line could call. The binds use toggle and are unaffected. open() matches the drawer's own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 hourscompanion: stay out of view when the shell starts with her hiddenDanilo M.1-0/+7
A shell started with Prefs.companion false created the Figure with out already true. A starting value fires no onOutChanged, so the drop never ran and she was drawn in place. Hidden, her 200 ms clock does not tick, so every timed step froze: an empty desktop left her on the watch frame of the wallpaper blush, and a balloon left her on shoved, never mad. Toggling her on made the bug look fixed until the next restart. The body is now invisible while out and not animating, and the first entrance after such a start begins from below like any other. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
16 hourscompanion: headbang-down that bows her head, and its leotardDanilo M.1-2/+3
The stronger down prompt tucks her head with the hair hanging over her face, which reads as the downbeat; the up frame keeps the earlier prompt, since spelling out the horns still drew a peace sign. ${LEOTARD} insists her eyes show, which parted the hair even with an override appended, so the leotard line only swaps the skirt, as leotard/sing does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 hourscompanion: groove prompts that klein followsDanilo M.1-4/+4
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>
17 hourscompanion: dj without the blindfold, behind a closed boothDanilo M.1-2/+2
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>
17 hourscompanion: music frames to generate, and the READMEDanilo M.2-1/+27
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>
17 hourscompanion: DJ on track change, groove while bored with musicDanilo M.1-4/+50
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>
18 hourscompanion: artists page icon as an escape, like its siblingsDanilo M.1-1/+1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
18 hourscompanion: artist lines pageDanilo M.3-6/+81
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>
18 hoursprefs: companionArtists, saved like companionAppsDanilo M.1-1/+18
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
18 hourscompanion: artist and groove linesDanilo M.2-17/+65
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>
18 hourscompanion: dj and groove states in MoodDanilo M.2-1/+19
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>
18 hoursdocs: companion music implementation planDanilo M.1-0/+589
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
18 hoursdocs: companion music designDanilo M.1-0/+125
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>
18 hourscompanion: sing when the Sony headphones connectDanilo M.7-8/+45
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.
18 hourscompanion: wave goodbye on hideDanilo M.6-8/+69
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.
20 hourscompanion: editable per-app lines in a settings pageDanilo M.9-26/+410
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.
20 hoursdocs: the shell's JS engine has no flatMapDanilo M.1-0/+5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 hoursassistant settings: a cloud switch per tool; cloud Prefer rows showDanilo M.3-14/+82
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>
21 hoursassistant: load the chat's model on open, docs for cloud modelsDanilo M.5-13/+32
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>
21 hoursassistant: pick the chat's model, local or cloud, from the headerDanilo M.3-13/+186
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>
21 hoursassistant settings: a Cloud section, and Prefer for cloud modelsDanilo M.1-3/+182
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
21 hoursassistant settings: cloud providers, fetch their models, load the chat's modelDanilo M.1-12/+55
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
21 hoursassistant settings: read and write the daemon's [[cloud]] tablesDanilo M.2-2/+126
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
21 hoursdocs: plan the assistant's cloud models, settings and canvasDanilo M.1-0/+909
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 hourscompanion: the leotard's timeout is a setting, or none at allDanilo M.5-14/+74
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>
21 hourscompanion: she trembles while she blushes at a wallpaperDanilo M.2-3/+16
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>
21 hourswallpaper: a bigger, outlined heartDanilo M.1-2/+5
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>
21 hourscompanion: blush spec names what the code checksDanilo M.1-2/+2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 hourscompanion: README for the wallpaper blush, spec matches the triggerDanilo M.2-2/+11
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>
21 hourswallpaper: a heart on each thumbnail, for the companion's listDanilo M.1-0/+18
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>
21 hourscompanion: the wallpaper list path on her settings pageDanilo M.1-20/+53
Empty means the default under ~/.config/keystone, shown as the placeholder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 hourscompanion: blushes at a listed wallpaper on an empty workspaceDanilo M.2-2/+27
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>
21 hourscompanion: Admired, the wallpaper list and what each monitor showsDanilo M.2-1/+113
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>
21 hourscompanion: admire, turned to a wallpaper and then blushingDanilo M.2-2/+18
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>
21 hourscompanion: ListFile.js, the wallpaper list as plain textDanilo M.2-0/+63
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>
21 hourscompanion: plan for blushing at a listed wallpaperDanilo M.1-0/+655
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 hourscompanion: spec for blushing at a listed wallpaperDanilo M.1-0/+73
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>
22 hourscompanion: a remark for the program in front of herDanilo M.3-0/+32
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>
22 hoursagents: a shell.qml edit can fail on a type it did not touchDanilo M.1-0/+7
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>
22 hourscompanion: shown or hidden survives a restart, with a settings switchDanilo M.5-20/+93
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>
22 hourscompanion: idle in step with wscreensavers, and despite No lockDanilo M.2-8/+35
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>
22 hourscompanion: above every overlay that opens, with a hop back inDanilo M.2-17/+20
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>
22 hourscompanion: above the assistant's dim, and typing means a run of keysDanilo M.2-2/+31
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>
23 hourskeybinds: name the companion's code:49 bindDanilo M.2-1/+11
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>
23 hoursnotifications: each balloon slides in from its screen edgeDanilo M.1-0/+15
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>
23 hourscompanion: a shorter shove, 0.5 sDanilo M.1-1/+1
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>