When pressing B while A was running, B went green immediately but A
stayed green until getGlobal()+getRunningEntryId() resolved. Now uses
settingsCache to turn off all running buttons in the same synchronous
pass as turning B on — no async gap where both appear active.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Visual state change now happens before any async work (getGlobal,
getRunningEntryId, API calls). Previously the button waited for
getGlobal() to resolve before going green, causing a 1-2s delay.
Also reverts optimistic state on API error.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
setSettings() causes Stream Deck to reset the button visual back to
its default state (state 0). The optimistic setState(1) was correct
but got overridden. Now setState(1) is called again after setSettings
completes to ensure the button stays green.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Selecting a name called saveCredentials, which sent refreshProjects,
which re-fetched users and called populateUsers(users, globalUserId)
with globalUserId still empty — immediately clearing the selection.
Fix: saveCredentials now updates globalUserId immediately, and
refreshProjects is only triggered by token changes (scheduleCredSave),
not by name changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previous versions of checkForUpdates only wrote plugin.js, leaving
property-inspector.html stale on all machines that used Check for
Updates. PI fixes (name dropdown, refreshProjects) never reached them.
Now downloads and writes all UI and image assets before restarting.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
onSendToPropertyInspector (users list) arrives before
onDidReceiveGlobalSettings (saved userId) in most cases, leaving
globalUserId empty when populateUsers runs. Now cachedUsers stores
the list, and onDidReceiveGlobalSettings re-populates if users
already arrived — handles both orderings.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
onDidReceiveGlobalSettings fired before the users list was populated,
so the saved userId couldn't be selected. Now stored in globalUserId
variable and applied when populateUsers runs, regardless of order.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously staff had to close and reopen the property inspector
after entering their token to trigger the fetch. Now saving the
token immediately sends a refreshProjects event to the plugin,
which fetches and returns the project list and name dropdown.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Staff on v1.0.25 check master's version.json for updates. Previously
master was on 1.0.22 (< 1.0.25) so the updater always said "already
up to date". Now master serves the stable-rebuild v1.0.26 binary so
staff can self-update via Check for Updates.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GITEA_BASE was pointing at master (v1.0.22), so Check for Updates
always said "already up to date". Now points at stable-rebuild so
updates are served from the correct branch. Also bumps version.json
to 1.0.26.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both buttons now flip to their final visual state immediately on key
press, before any API calls. Previously the old button stayed green
throughout the stopTimer network round-trip (~0.5–2s), causing a
window where both buttons appeared green simultaneously.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Stream Deck plugin settings panel was showing "version 1" because
manifest.json had a hardcoded "Version": "1.0.0".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Known-good state: blue icons, cross-folder timer fix, name dropdown.
Versioned above master (1.0.22) so auto-updater does not overwrite.
Install script points at stable-rebuild branch.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously onPropertyInspectorDidAppear fired once on PI open — if the
token wasn't saved yet (first-time setup), the dropdown stayed empty
forever. Now saving credentials sends a refresh event to the plugin,
which re-fetches and repopulates projects and names immediately.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Staff machines still had idle.svg/running.svg in their installed plugin
folder (Stream Deck merges rather than replaces on reinstall), causing
the old SVGs to shadow the new PNG icons added in v1.0.15. The
auto-updater now explicitly deletes these legacy files when applying an
update.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove stale idle.svg/running.svg from zip (were shadowing the PNG
icons added in v1.0.15, causing old grey icons to show instead of
the Aurora timer images)
- Fix package script to always delete and recreate zip so removed files
don't persist across builds
- Show a clear error in the name dropdown when fetchUsers fails (e.g.
Notion integration missing "Read user information" capability)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previously only plugin.js was replaced on auto-update, leaving
property-inspector.html, idle.png, and running.png at the originally
installed version. Staff would see the old button colours and missing
UI elements (username dropdown, Update button) even after the code
updated successfully.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Stop previously running timer globally using persisted runningEntryId,
works across nested folders and plugin restarts
- In-memory cache prevents onWillAppear flash of stale running state
- Replace SVG button icons with Aurora timer PNG icons (on/off)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove onWillDisappear cache pruning so buttons in other folders remain
in settingsCache — previously navigating away deleted their entries,
causing the stop-other-timers loop to miss them on next key press.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes chicken-and-egg setup flow where new users couldn't populate
the name dropdown because isConfigured required userId to already exist.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>