mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-25 00:51:20 +00:00
52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
// Terminal focus state signal — non-React access to DECSET 1004 focus events.
|
|
// 'unknown' is the default for terminals that don't support focus reporting;
|
|
// consumers treat 'unknown' identically to 'focused' (no throttling).
|
|
// Subscribers are notified synchronously when focus changes, used by
|
|
// TerminalFocusProvider to avoid polling.
|
|
export type TerminalFocusState = 'focused' | 'blurred' | 'unknown'
|
|
|
|
let focusState: TerminalFocusState = 'unknown'
|
|
const resolvers: Set<() => void> = new Set()
|
|
const subscribers: Set<() => void> = new Set()
|
|
|
|
export function setTerminalFocused(v: boolean): void {
|
|
focusState = v ? 'focused' : 'blurred'
|
|
|
|
// Notify useSyncExternalStore subscribers
|
|
for (const cb of subscribers) {
|
|
cb()
|
|
}
|
|
|
|
if (!v) {
|
|
for (const resolve of resolvers) {
|
|
resolve()
|
|
}
|
|
|
|
resolvers.clear()
|
|
}
|
|
}
|
|
|
|
export function getTerminalFocused(): boolean {
|
|
return focusState !== 'blurred'
|
|
}
|
|
|
|
export function getTerminalFocusState(): TerminalFocusState {
|
|
return focusState
|
|
}
|
|
|
|
// For useSyncExternalStore
|
|
export function subscribeTerminalFocus(cb: () => void): () => void {
|
|
subscribers.add(cb)
|
|
|
|
return () => {
|
|
subscribers.delete(cb)
|
|
}
|
|
}
|
|
|
|
export function resetTerminalFocusState(): void {
|
|
focusState = 'unknown'
|
|
|
|
for (const cb of subscribers) {
|
|
cb()
|
|
}
|
|
}
|