File size: 1,246 Bytes
abcf568 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import type { StudioMessage } from '../../protocol/studio-agent-types'
export interface StudioCommandPanelSnapshot {
messages: StudioMessage[]
isBusy: boolean
latestAssistantText: string
animatedAssistantText: string
}
type Listener = () => void
export interface StudioCommandPanelStore {
getSnapshot(): StudioCommandPanelSnapshot
setSnapshot(snapshot: StudioCommandPanelSnapshot): void
subscribe(listener: Listener): () => void
}
export function createStudioCommandPanelStore(
initialSnapshot: StudioCommandPanelSnapshot,
): StudioCommandPanelStore {
let snapshot = initialSnapshot
const listeners = new Set<Listener>()
return {
getSnapshot() {
return snapshot
},
setSnapshot(nextSnapshot) {
if (
snapshot.messages === nextSnapshot.messages
&& snapshot.isBusy === nextSnapshot.isBusy
&& snapshot.latestAssistantText === nextSnapshot.latestAssistantText
&& snapshot.animatedAssistantText === nextSnapshot.animatedAssistantText
) {
return
}
snapshot = nextSnapshot
listeners.forEach((listener) => listener())
},
subscribe(listener) {
listeners.add(listener)
return () => listeners.delete(listener)
},
}
}
|