mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-22 16:25:58 +00:00
refactor(desktop): tidy the cross-window deduper
Drop the unused DEDUPE_WINDOW_MS export and rename its interval so "window" isn't overloaded against BrowserWindow in a multi-window feature (windowMs → intervalMs). DRY the completion-sound play path. No behavior change.
This commit is contained in:
parent
fb0c6d9ee1
commit
a41346f8ae
2 changed files with 11 additions and 18 deletions
|
|
@ -2,22 +2,21 @@
|
|||
// sound, spoken replies). Every desktop window is its own renderer process, so N
|
||||
// open windows each independently react to the same backend event. The main
|
||||
// process is the one place they all share and it handles IPC serially, so it's
|
||||
// the race-free owner: the first window to claim a key within the window wins;
|
||||
// peers see it's taken and stay quiet.
|
||||
//
|
||||
// Pure + injectable clock so it's unit-testable without Electron.
|
||||
// the race-free owner: the first window to claim a key within the interval wins;
|
||||
// peers see it's taken and stay quiet. Pure + injectable clock, so it's
|
||||
// unit-testable without Electron.
|
||||
|
||||
const DEDUPE_WINDOW_MS = 1000
|
||||
const DEDUPE_INTERVAL_MS = 1000
|
||||
|
||||
// Returns true when `key` was already claimed within the window (caller drops
|
||||
// Returns true when `key` was already claimed within the interval (caller drops
|
||||
// this one). Self-evicting: stale keys are pruned on every call, so the map
|
||||
// can't grow unbounded.
|
||||
function createEventDeduper(windowMs = DEDUPE_WINDOW_MS) {
|
||||
export function createEventDeduper(intervalMs = DEDUPE_INTERVAL_MS) {
|
||||
const lastSeenAt = new Map<string, number>()
|
||||
|
||||
return function isDuplicate(key: string, now = Date.now()): boolean {
|
||||
for (const [k, at] of lastSeenAt) {
|
||||
if (now - at >= windowMs) {
|
||||
if (now - at >= intervalMs) {
|
||||
lastSeenAt.delete(k)
|
||||
}
|
||||
}
|
||||
|
|
@ -31,5 +30,3 @@ function createEventDeduper(windowMs = DEDUPE_WINDOW_MS) {
|
|||
return false
|
||||
}
|
||||
}
|
||||
|
||||
export { createEventDeduper, DEDUPE_WINDOW_MS }
|
||||
|
|
|
|||
|
|
@ -462,17 +462,13 @@ export function playCompletionSound(dedupeKey?: string) {
|
|||
return
|
||||
}
|
||||
|
||||
if (!dedupeKey) {
|
||||
playVariant($completionSoundVariantId.get())
|
||||
const play = () => playVariant($completionSoundVariantId.get())
|
||||
|
||||
return
|
||||
if (!dedupeKey) {
|
||||
return play()
|
||||
}
|
||||
|
||||
void ownsAmbientCue(`sound:${dedupeKey}`).then(owns => {
|
||||
if (owns) {
|
||||
playVariant($completionSoundVariantId.get())
|
||||
}
|
||||
})
|
||||
void ownsAmbientCue(`sound:${dedupeKey}`).then(owns => owns && play())
|
||||
}
|
||||
|
||||
interface AirPuffSpec {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue