Releases: hatimox/TimeAgent
Releases · hatimox/TimeAgent
Release list
0.0.25
Timer-phase-independent watchdog + HTTP timeouts Deep dive found the recurring detection freeze: the old watchdog was a setInterval, so whatever wedges the JS timer phase (a nested native run loop around the meeting UI work) froze the poll loop AND the watchdog together — which is why neither a heartbeat nor a "watchdog restarting" line ever appeared. - Drive the watchdog from setImmediate (libuv check phase) too, so it keeps cycling even when setTimeout/setInterval are dead, and recover by rebuilding fresh timers + polling directly off setImmediate. Verified it recovers with the timer phase fully stubbed dead. - Fix a per-poll setTimeout leak in _micMac (clear the kill timer on the normal path; unref; guard child 'error'). - tpclient: 20s request timeout + req.destroy so a hung DNS/TP call can't hang a promise or leak a socket forever (the c-ares frames in the freeze sample). updateTotals no longer stacks overlapping fetches. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.24
Self-healing watcher watchdog + hard-exit on lost instance lock Heartbeat logs revealed the recurring "no buttons" state: after an update one process's poll loop had died while a second post-update process never started its watcher (lost the lock, lingered as a zombie). - Watchdog: an independent interval restarts the poll loop if it goes quiet, so detection self-heals from ANY stall without a manual relaunch. - A second instance now app.exit(0)s immediately instead of the async app.quit(), so it can't linger as a watcher-less zombie owning the tray. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.23
Bound Stop-tracking suppression + add poll heartbeat - "Stop tracking" suppressed detection until the mic went idle. If you then stayed in back-to-back calls (mic never idle), suppression stuck forever and the Split/Stop buttons never returned. Cap suppression at 90s so detection always recovers. - Add a ~once-a-minute heartbeat log so a stalled poll loop is visible in the field (heartbeat stops while mic stays active = loop died, and where), to pin down the recurring detection freeze. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.22
Single-instance lock + restart watcher on wake After an update users replace the .app while the old copy still runs and reopen it; macOS could leave TWO instances alive, both polling and fighting over the shared tray/popover/log, leaving the visible window with a dead watcher (no Split/Stop buttons) until a manual kill+relaunch. - requestSingleInstanceLock: a second instance quits immediately and tells the first to surface its popover, so there is always exactly one watcher — no manual relaunch needed after updates. - powerMonitor 'resume': restart the meeting watcher on wake, since sleep can leave the detectors stale. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.21
Hang-proof meeting detection: timeout the mic check The poll loop awaited _inMeeting() with no upper bound. If michelper wedged (common after sleep/wake or a CoreAudio hiccup), that await never resolved, the finally never ran, and detection froze permanently — the log went silent while the mic stayed active and the Split/Stop bar never appeared. Race _inMeeting() against a 6s hard timeout in poll() (treat a timeout as "no signal" and carry on), and force-kill michelper if its execFile callback never fires so its promise can't hang. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.20
Async meeting-end dialog + hide Defined list when unused - Switch the meeting-end prompt from showMessageBoxSync to the async showMessageBox. The sync dialog blocked the whole main process, so a prompt left unanswered (e.g. buried after sleep/wake) froze the poll loop and stopped all future meeting detection. - Build the dialog buttons dynamically and map the response by action rather than a fixed index, so "Defined list" is omitted entirely when no dynamic meetings are configured (no more dead-end info popup). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.19
Fix meeting-detection loop dying on a single throw poll() called onMeetingState() then schedule() as separate unguarded statements. onMeetingState runs main-process tray/window code; if it threw once, schedule() never ran and the poll loop stopped permanently — detection froze mid-meeting (log silent, mic still active, Split bar never showing) until the app was restarted. Wrap the whole poll body so the reschedule lives in a finally and can never be skipped; guard onMeetingState/handleEnd/_inMeeting individually and log errors instead of silently killing the loop. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.18
Parent US link, clearer task picker, "In meeting" under username - Task list: show the parent User Story (US #id) next to each item id, clickable to open it in TargetProcess. - "Choose task" picker: reveal the full active-task list on focus, and show the selected task inline in the input instead of a separate line. - Popover: stack the "In meeting · mm:ss" indicator below the username. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.17
Popover meeting controls + Stop tracking; rename Choose task - Move Split into the popover (a meeting-actions bar just below the title, shown only during a call) and remove it from the tray menu. - Add "Stop tracking": ends the current meeting without leaving Zoom, logs the elapsed segment via the normal prompt, then suppresses detection until the mic goes idle so it doesn't immediately re-open. - Rename the meeting-end "Search" button to "Choose task". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.0.16
Fix Linux/Windows app icon + add README screenshots - Set linux.icon/win.icon to build/icon.png so electron-builder generates the installed launcher icon and the .desktop Icon= entry — fixes the blank icon in the Ubuntu app list. Add StartupWMClass so the running window ties to that .desktop entry. - Add app screenshots (popover, task list, meeting prompt, settings) and reference them from the README. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>