Commit Graph
37 Commits
Author SHA1 Message Date
pdmarf 3a033679c8 v1.0.47: auto-refresh version display in property inspector after update
The version number shown in the PI only updates via the 'projects' push,
which only fires from onPropertyInspectorDidAppear (i.e. when a
different button is clicked, forcing the PI to re-appear). After
'Check for Updates' completes and the plugin process restarts, an
already-open PI kept showing the pre-update version indefinitely.

Two changes: send a final 'Updated to vX — restarting…' status right
before process.exit(0) so the update message doesn't hang on
'Updating…', and push sendProjectsToPI() once on every plugin startup
(after streamDeck.connect()) so a PI that survived the restart gets
the new version immediately instead of waiting for an unrelated button
click.
2026-09-02 11:24:30 +01:00
pdmarf 5b3ba8186c v1.0.46: clear stale running-timer state even when stopTimer fails in Notion
The onKeyDown stop/switch paths only cleared memRunningActionId/EntryId
after a successful stopTimer call. If the tracked Notion entry was
already gone (archived/deleted/edited outside the plugin), stopTimer
threw and the stale ID was never cleared -- every subsequent keypress
retried the same doomed stop call, showed a warning triangle, and the
deck got permanently stuck (unable to unselect the stuck button or
start any new timer). checkElapsed already handled this correctly by
clearing state unconditionally; onKeyDown now does the same: stopTimer
failures are logged but non-fatal, and local state clears regardless.
2026-09-02 11:16:24 +01:00
pdmarf e897f0a8f5 v1.0.45: delay blocked-press icon correction to avoid native flash collision
Diagnosed via instrumented logging: the v1.0.44 blocked-press redraw
was calling setState()/setTitle() successfully (no error, confirmed
in logs) but Stream Deck wasn't visually applying it — the corrective
image call was landing too close to Stream Deck's own native
key-press flash animation and getting silently dropped. Forcing a
page navigation away and back always redrew correctly, proving the
tracked state was right all along and this was purely a rendering
timing issue. Adding a 150ms delay before the corrective redraw lets
the native animation settle first; confirmed fixed on device.
2026-08-25 16:52:32 +01:00
pdmarf 2e2f2553ac v1.0.44: clear tracked running state immediately after stopping old timer
Found while testing v1.0.43's icon self-heal: when switching from one
running timer to another, the old Notion entry was stopped but
memRunningActionId/EntryId weren't cleared until AFTER the new
startTimer call resolved. During that gap, a blocked press on the
just-stopped button read the stale (not-yet-cleared) tracked id and
self-healed itself back to a wrongly-'running' green — reinforcing
the exact staleness the self-heal was meant to fix. Now cleared to
null the moment the old timer is actually stopped.
2026-08-25 16:34:38 +01:00
pdmarf 45201bc376 v1.0.43: self-heal stale button icon when blocked by the keyDown lock
When a keyDown is blocked by the v1.0.42 lock, redraw that button to
match memRunningActionId instead of leaving whatever it was already
showing. This closes the follow-on issue found while testing 1.0.42:
a button's key image can go stale if its Notion timer was ever
stopped/started outside the plugin (e.g. a manual Notion edit), and
a blocked press was leaving that stale image in place — misleading
the user into thinking a timer was running when it wasn't, which
then caused a *real* unintended timer start on the next press.
2026-08-25 16:27:46 +01:00
pdmarf 18f8007df5 v1.0.42: fix duplicate timer race across different buttons
pendingKeyDown was a Set keyed by action.id, so it only blocked a
button from re-firing itself. Pressing two different buttons in fast
succession (e.g. RB01 then RA01) both passed the guard, both read
memRunningActionId before either had persisted it, and both started
a Notion timer entry. Replaced with a single keyDownBusy flag shared
across all buttons of the action, set synchronously before the first
await, closing the race.
2026-08-25 15:42:43 +01:00
pdmarf ce1a17975d v1.0.41: add 1-hour elapsed check with continue/stop dialog, auto-stop on no response 2026-07-13 13:21:34 +01:00
pdmarfandClaude Sonnet 4.6 f76c5ac33b v1.0.40: bump version.json so auto-updater delivers update to staff
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 17:07:17 +01:00
pdmarf 060a2bc917 v1.0.39: fix button flash by making setRunningEntry synchronous
Remove await from running-state updates so onWillAppear cannot
fire between the optimistic setState(1) and the API call completing,
eliminating the green→blue→green flash on button press.
2026-04-24 09:29:43 +01:00
pdmarfandClaude Sonnet 4.6 4171b2f6e9 v1.0.38: eliminate setSettings from onKeyDown to fix flash
setSettings always resets the button visual state — no workaround
exists. Removed activeEntryId from per-button settings entirely.
Running state now tracked via runningActionId in global settings
(alongside runningEntryId). onWillAppear restores state from
memRunningActionId. onKeyDown only calls setState — clean, instant.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 09:20:41 +01:00
pdmarfandClaude Sonnet 4.6 35a0bbb867 v1.0.37: send setSettings and setState simultaneously to avoid flash
Previously setSettings was awaited first (causing blue flash), then
setState was called. Now both are sent in the same Promise.all so
Stream Deck processes setState in the same batch, overriding the
visual reset from setSettings with no visible blue transition.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 09:15:48 +01:00
pdmarfandClaude Sonnet 4.6 5cdc77ccf3 v1.0.36: eliminate blue flash between setSettings and setState
setState was being called after setRunningEntry, which makes two
async global settings calls and takes ~1 second. During that time
the button sat in the blue reset state from setSettings. Now
setState is called immediately after setSettings, before
setRunningEntry, so the blue flash is imperceptibly brief.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 09:13:38 +01:00
pdmarfandClaude Sonnet 4.6 bb021633a3 v1.0.35: re-assert setState(0) after setSettings on stop path
setSettings() resets the visual state in both directions. The start
path already re-asserted setState(1) after setSettings. The stop path
was missing the equivalent setState(0), leaving the button green.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 09:11:30 +01:00
pdmarfandClaude Sonnet 4.6 93616d3a1a v1.0.34: fix both buttons showing green simultaneously
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>
2026-04-24 09:07:55 +01:00
pdmarfandClaude Sonnet 4.6 2fd2b6ad8a v1.0.33: instant button feedback on key press
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>
2026-04-24 09:05:41 +01:00
pdmarfandClaude Sonnet 4.6 e3a19234a9 v1.0.32: re-assert button state after setSettings resets it
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>
2026-04-24 09:01:55 +01:00
pdmarfandClaude Sonnet 4.6 a233cfc4fd v1.0.31: fix name selection being wiped when refreshProjects fires
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>
2026-04-24 08:58:42 +01:00
pdmarfandClaude Sonnet 4.6 036567bc7c v1.0.30: auto-updater now updates HTML and images, not just plugin.js
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>
2026-04-24 08:56:37 +01:00
pdmarfandClaude Sonnet 4.6 ccc6d90578 v1.0.29: fix userId not restoring due to race condition
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>
2026-04-24 08:53:15 +01:00
pdmarfandClaude Sonnet 4.6 c3add8da27 v1.0.28: fix name dropdown not restoring when switching buttons
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>
2026-04-24 08:50:39 +01:00
pdmarfandClaude Sonnet 4.6 5426a388ba v1.0.27: auto-load projects/users after API token is entered
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>
2026-04-24 08:43:12 +01:00
pdmarfandClaude Sonnet 4.6 034c951d9b v1.0.26: point auto-updater at stable-rebuild branch
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>
2026-04-24 07:49:03 +01:00
pdmarfandClaude Sonnet 4.6 c1384e942b v1.0.15: fix cross-folder timer conflict + new icons
- 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>
2026-04-21 18:28:30 +01:00
pdmarfandClaude Sonnet 4.6 f69eb8e841 v1.0.14: clean release (no debug logging)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 17:45:18 +01:00
pdmarfandClaude Sonnet 4.6 2738bed445 v1.0.13: fix cross-folder timer stop
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>
2026-04-21 17:37:58 +01:00
pdmarfandClaude Sonnet 4.6 3299ad5268 chore: bump to 1.0.12
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 17:15:21 +01:00
pdmarfandClaude Sonnet 4.6 160eabb44d chore: bump to 1.0.11 to test auto-update
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 17:08:01 +01:00
pdmarfandClaude Sonnet 4.6 6195b6fee7 fix: fetch users/projects when token is set but userId is missing
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>
2026-04-17 16:56:17 +01:00
pdmarf c8a783f3b4 v1.0.9: test auto-update through Pangolin auth gate 2026-04-11 10:22:31 +01:00
pdmarf 34f16b4b87 v1.0.8: switch to public Gitea URL 2026-04-11 10:14:23 +01:00
pdmarf f94a40e77d v1.0.7: replace PI libs with official Elgato source 2026-04-10 23:06:54 +01:00
pdmarf 7fe0841024 v1.0.6: fetch timeouts and project pagination 2026-04-10 20:53:19 +01:00
pdmarf d6282d7396 v1.0.5: user dropdown from Notion API, settingsCache pruning 2026-04-10 20:42:11 +01:00
pdmarf 84d5e96487 Add Ed25519 signature verification to auto-updater (v1.0.4) 2026-04-10 20:20:10 +01:00
pdmarf acb90f2d69 Bump to v1.0.3 2026-04-10 19:56:09 +01:00
pdmarf 7a6a9f0d2b Bump version to 1.0.2 to test auto-updater 2026-04-10 19:53:41 +01:00
pdmarf 9c55f8a8b8 Add auto-updater checking Gitea on startup 2026-04-10 19:52:50 +01:00