fix(app): notifications on child sessions

This commit is contained in:
Adam
2026-02-11 08:47:22 -06:00
parent 8c5ba8aeb0
commit a52fe28246

View File

@@ -69,7 +69,7 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
}),
)
const meta = { pruned: false }
const meta = { pruned: false, disposed: false }
createEffect(() => {
if (!ready()) return
@@ -84,6 +84,17 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
const index = createMemo(() => buildNotificationIndex(store.list))
const lookup = (directory: string, sessionID?: string) => {
if (!sessionID) return Promise.resolve(undefined)
const [syncStore] = globalSync.child(directory, { bootstrap: false })
const match = Binary.search(syncStore.session, sessionID, (s) => s.id)
if (match.found) return Promise.resolve(syncStore.session[match.index])
return globalSDK.client.session
.get({ directory, sessionID })
.then((x) => x.data)
.catch(() => undefined)
}
const unsub = globalSDK.event.listen((e) => {
const event = e.details
if (event.type !== "session.idle" && event.type !== "session.error") return
@@ -102,10 +113,10 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
switch (event.type) {
case "session.idle": {
const sessionID = event.properties.sessionID
const [syncStore] = globalSync.child(directory, { bootstrap: false })
const match = Binary.search(syncStore.session, sessionID, (s) => s.id)
const session = match.found ? syncStore.session[match.index] : undefined
if (session?.parentID) break
void lookup(directory, sessionID).then((session) => {
if (meta.disposed) return
if (!session) return
if (session.parentID) return
playSound(soundSrc(settings.sounds.agent()))
@@ -121,18 +132,18 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
if (settings.notifications.agent()) {
void platform.notify(
language.t("notification.session.responseReady.title"),
session?.title ?? sessionID,
session.title ?? sessionID,
href,
)
}
})
break
}
case "session.error": {
const sessionID = event.properties.sessionID
const [syncStore] = globalSync.child(directory, { bootstrap: false })
const match = sessionID ? Binary.search(syncStore.session, sessionID, (s) => s.id) : undefined
const session = sessionID && match?.found ? syncStore.session[match.index] : undefined
if (session?.parentID) break
void lookup(directory, sessionID).then((session) => {
if (meta.disposed) return
if (session?.parentID) return
playSound(soundSrc(settings.sounds.errors()))
@@ -152,11 +163,15 @@ export const { use: useNotification, provider: NotificationProvider } = createSi
if (settings.notifications.errors()) {
void platform.notify(language.t("notification.session.error.title"), description, href)
}
})
break
}
}
})
onCleanup(unsub)
onCleanup(() => {
meta.disposed = true
unsub()
})
return {
ready,