+
+
- {payload.title &&
{payload.title}
}
-
{payload.message}
+ {payload.title &&
{payload.title}
}
+
{payload.message}
diff --git a/src/lib/sse-manager.ts b/src/lib/sse-manager.ts
index 05bfb8ac..338948df 100644
--- a/src/lib/sse-manager.ts
+++ b/src/lib/sse-manager.ts
@@ -30,6 +30,13 @@ interface TuiToastEvent {
}
}
+interface SessionIdleEvent {
+ type: "session.idle"
+ properties: {
+ sessionID: string
+ }
+}
+
const [connectionStatus, setConnectionStatus] = createSignal<
Map
>(new Map())
@@ -118,7 +125,7 @@ class SSEManager {
this.onTuiToast?.(instanceId, event as TuiToastEvent)
break
case "session.idle":
- console.log("[SSE] Session idle")
+ this.onSessionIdle?.(instanceId, event as SessionIdleEvent)
break
default:
console.warn("[SSE] Unknown event type:", event.type)
@@ -161,6 +168,7 @@ class SSEManager {
onSessionCompacted?: (instanceId: string, event: any) => void
onSessionError?: (instanceId: string, event: any) => void
onTuiToast?: (instanceId: string, event: TuiToastEvent) => void
+ onSessionIdle?: (instanceId: string, event: SessionIdleEvent) => void
getStatus(instanceId: string): "connecting" | "connected" | "disconnected" | "error" | null {
return connectionStatus().get(instanceId) ?? null
diff --git a/src/stores/sessions.ts b/src/stores/sessions.ts
index 3b733e36..113d14bf 100644
--- a/src/stores/sessions.ts
+++ b/src/stores/sessions.ts
@@ -1767,6 +1767,19 @@ function handleSessionCompacted(instanceId: string, event: any): void {
console.log(`[SSE] Session compacted: ${sessionID}`)
loadMessages(instanceId, sessionID, true).catch(console.error)
+
+ const instanceSessions = sessions().get(instanceId)
+ const session = instanceSessions?.get(sessionID)
+ const label = session?.title?.trim() ? session.title : sessionID
+ const instanceFolder = instances().get(instanceId)?.folder ?? instanceId
+ const instanceName = instanceFolder.split(/[\\/]/).filter(Boolean).pop() ?? instanceFolder
+
+ showToastNotification({
+ title: instanceName,
+ message: `Session ${label ? `"${label}"` : sessionID} was compacted`,
+ variant: "info",
+ duration: 10000,
+ })
}
function handleSessionError(instanceId: string, event: any): void {
@@ -1821,6 +1834,24 @@ function handleTuiToast(_instanceId: string, event: any): void {
})
}
+function handleSessionIdle(instanceId: string, event: any): void {
+ const sessionID = event.properties?.sessionID
+ if (!sessionID) return
+
+ const instanceSessions = sessions().get(instanceId)
+ const session = instanceSessions?.get(sessionID)
+ const label = session?.title?.trim() ? session.title : sessionID
+ const instanceFolder = instances().get(instanceId)?.folder ?? instanceId
+ const instanceName = instanceFolder.split(/[\\/]/).filter(Boolean).pop() ?? instanceFolder
+
+ showToastNotification({
+ title: instanceName,
+ message: `Session ${label ? `"${label}"` : sessionID} is idle`,
+ variant: "info",
+ duration: 10000,
+ })
+}
+
sseManager.onMessageUpdate = handleMessageUpdate
sseManager.onMessageRemoved = handleMessageRemoved
sseManager.onMessagePartRemoved = handleMessagePartRemoved
@@ -1828,6 +1859,7 @@ sseManager.onSessionUpdate = handleSessionUpdate
sseManager.onSessionCompacted = handleSessionCompacted
sseManager.onSessionError = handleSessionError
sseManager.onTuiToast = handleTuiToast
+sseManager.onSessionIdle = handleSessionIdle
export {
sessions,