Skip to content

Releases: hatimox/TimeAgent

0.0.25

Choose a tag to compare

@github-actions github-actions released this 18 Jun 14:11
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

Choose a tag to compare

@github-actions github-actions released this 18 Jun 13:51
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

Choose a tag to compare

@github-actions github-actions released this 18 Jun 12:36
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

Choose a tag to compare

@github-actions github-actions released this 18 Jun 12:27
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

Choose a tag to compare

@github-actions github-actions released this 18 Jun 11:58
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

Choose a tag to compare

@github-actions github-actions released this 18 Jun 11:16
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

Choose a tag to compare

@github-actions github-actions released this 16 Jun 16:55
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

Choose a tag to compare

@github-actions github-actions released this 16 Jun 16:38
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

Choose a tag to compare

@github-actions github-actions released this 16 Jun 15:32
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

Choose a tag to compare

@github-actions github-actions released this 16 Jun 14:46
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>