git.iko.soy/opencode-android
on d643c13 help sign in
109 lines 2.9 kB history raw
1package soy.iko.opencode.data.model
3import kotlinx.serialization.SerialName
4import kotlinx.serialization.Serializable
6/**
7 * The SSE envelope from `GET /event`: `{ "type": "<event>", "properties": { ... } }`.
8 * Discriminated on `type` (the global discriminator). Unknown events decode to
9 * [UnknownEvent] so the stream never dies on a new event type.
10 *
11 * Property shapes are kept lenient (nullable fields + ignoreUnknownKeys) because they
12 * drift across opencode versions; the reducer only reads the fields it needs.
13 */
14@Serializable
15sealed interface BusEvent
17@Serializable
18@SerialName("server.connected")
19data object ServerConnected : BusEvent
21@Serializable
22@SerialName("message.updated")
23data class MessageUpdated(val properties: Props) : BusEvent {
24 @Serializable
25 data class Props(val info: MessageInfo)
28@Serializable
29@SerialName("message.part.updated")
30data class MessagePartUpdated(val properties: Props) : BusEvent {
31 @Serializable
32 data class Props(
33 val part: Part,
34 val sessionID: String? = null,
35 val messageID: String? = null,
36 )
39@Serializable
40@SerialName("message.part.removed")
41data class MessagePartRemoved(val properties: Props) : BusEvent {
42 @Serializable
43 data class Props(
44 val sessionID: String? = null,
45 val messageID: String? = null,
46 val partID: String? = null,
47 )
50@Serializable
51@SerialName("message.removed")
52data class MessageRemoved(val properties: Props) : BusEvent {
53 @Serializable
54 data class Props(
55 val sessionID: String? = null,
56 val messageID: String? = null,
57 )
60@Serializable
61@SerialName("session.idle")
62data class SessionIdle(val properties: Props) : BusEvent {
63 @Serializable
64 data class Props(val sessionID: String? = null)
67@Serializable
68@SerialName("session.error")
69data class SessionError(val properties: Props) : BusEvent {
70 @Serializable
71 data class Props(
72 val sessionID: String? = null,
73 val error: kotlinx.serialization.json.JsonElement? = null,
74 )
77@Serializable
78@SerialName("session.updated")
79data class SessionUpdated(val properties: Props) : BusEvent {
80 @Serializable
81 data class Props(val info: Session)
84@Serializable
85@SerialName("session.deleted")
86data class SessionDeleted(val properties: Props) : BusEvent {
87 @Serializable
88 data class Props(val info: Session? = null, val sessionID: String? = null)
91@Serializable
92@SerialName("permission.updated")
93data class PermissionUpdated(val properties: Permission) : BusEvent
95@Serializable
96@SerialName("permission.replied")
97data class PermissionReplied(val properties: Props) : BusEvent {
98 @Serializable
99 data class Props(
100 val sessionID: String? = null,
101 val permissionID: String? = null,
102 val response: String? = null,
103 )
106/** Fallback for any event type we don't model. */
107@Serializable
108@SerialName("__unknown")
109data object UnknownEvent : BusEvent