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<typeof Info> 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<string, Info> = {} 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 }}
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<typeof Info>
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<string, Info> = {}
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
}
}