// MoonBit-only implementation of the explicit event decoding required by the language type system.
// Corresponding upstream cast: https://github.com/openai/codex/blob/f201c30c52a35f819262865a53df94b6f4ea7a50/sdk/typescript/src/thread.ts#L96-L109
// Event shapes being decoded: https://github.com/openai/codex/blob/f201c30c52a35f819262865a53df94b6f4ea7a50/sdk/typescript/src/events.ts#L5-L84
// This file is intentionally prefixed moonbit_internal_ because no equivalent decoder module exists upstream.
///|
fn moonbit_internal_usage_from_json(json : Json) -> Usage raise CodexSdkError {
let object = moonbit_internal_json_object(json, "usage")
{
input_tokens: moonbit_internal_required_int(object, "input_tokens", "usage"),
cached_input_tokens: moonbit_internal_required_int(
object, "cached_input_tokens", "usage",
),
cache_write_input_tokens: moonbit_internal_int_or_missing_default(
object, "cache_write_input_tokens", "usage", 0,
),
output_tokens: moonbit_internal_required_int(
object, "output_tokens", "usage",
),
reasoning_output_tokens: moonbit_internal_required_int(
object, "reasoning_output_tokens", "usage",
),
}
}
///|
fn moonbit_internal_thread_error_from_json(
json : Json,
) -> ThreadError raise CodexSdkError {
let object = moonbit_internal_json_object(json, "thread error")
{
message: moonbit_internal_required_string(object, "message", "thread error"),
}
}
///|
fn moonbit_internal_thread_event_from_json(
json : Json,
) -> ThreadEvent raise CodexSdkError {
let object = moonbit_internal_json_object(json, "thread event")
let event_type = moonbit_internal_required_string(
object, "type", "thread event",
)
match event_type {
"thread.started" =>
ThreadStarted({
thread_id: moonbit_internal_required_string(
object, "thread_id", event_type,
),
})
"turn.started" => TurnStarted(TurnStartedEvent::{ })
"turn.completed" =>
TurnCompleted({
usage: moonbit_internal_usage_from_json(
moonbit_internal_required_json(object, "usage", event_type),
),
})
"turn.failed" =>
TurnFailed({
error: moonbit_internal_thread_error_from_json(
moonbit_internal_required_json(object, "error", event_type),
),
})
"item.started" =>
ItemStarted({
item: moonbit_internal_thread_item_from_json(
moonbit_internal_required_json(object, "item", event_type),
),
})
"item.updated" =>
ItemUpdated({
item: moonbit_internal_thread_item_from_json(
moonbit_internal_required_json(object, "item", event_type),
),
})
"item.completed" =>
ItemCompleted({
item: moonbit_internal_thread_item_from_json(
moonbit_internal_required_json(object, "item", event_type),
),
})
"error" =>
StreamError({
message: moonbit_internal_required_string(object, "message", event_type),
})
_ =>
raise InvalidEvent(message="unsupported thread event type: \{event_type}")
}
}