import { BusEvent } from "@/bus/bus-event" import { Bus } from "@/bus" import { Instance } from "@/project/instance" import z from "zod" export namespace SessionStatus { export const Info = z .union([ z.object({ type: z.literal("idle"), }), z.object({ type: z.literal("retry"), attempt: z.number(), message: z.string(), next: z.number(), }), z.object({ type: z.literal("busy"), }), ]) .meta({ ref: "SessionStatus", }) export type Info = z.infer export const Event = { Status: BusEvent.define( "session.status", z.object({ sessionID: z.string(), status: Info, }), ), // deprecated Idle: BusEvent.define( "session.idle", z.object({ sessionID: z.string(), }), ), } const state = Instance.state(() => { const data: Record = {} return data }) export function get(sessionID: string) { return ( state()[sessionID] ?? { type: "idle", } ) } export function list() { return state() } export function set(sessionID: string, status: Info) { Bus.publish(Event.Status, { sessionID, status, }) if (status.type === "idle") { // deprecated Bus.publish(Event.Idle, { sessionID, }) delete state()[sessionID] return } state()[sessionID] = status } }