import 'package:json_annotation/json_annotation.dart'; import 'tool_result.dart'; part 'ag_ui_event.g.dart'; class AgUiEventTypeWire { static const runStarted = 'RUN_STARTED'; static const runFinished = 'RUN_FINISHED'; static const runError = 'RUN_ERROR'; static const textMessageStart = 'TEXT_MESSAGE_START'; static const textMessageContent = 'TEXT_MESSAGE_CONTENT'; static const textMessageEnd = 'TEXT_MESSAGE_END'; static const toolCallStart = 'TOOL_CALL_START'; static const toolCallArgs = 'TOOL_CALL_ARGS'; static const toolCallEnd = 'TOOL_CALL_END'; static const toolCallResult = 'TOOL_CALL_RESULT'; static const toolCallError = 'TOOL_CALL_ERROR'; } enum AgUiEventType { runStarted, runFinished, runError, textMessageStart, textMessageContent, textMessageEnd, toolCallStart, toolCallArgs, toolCallEnd, toolCallResult, toolCallError, unknown, } AgUiEventType agUiEventTypeFromWire(String wire) { switch (wire) { case AgUiEventTypeWire.runStarted: return AgUiEventType.runStarted; case AgUiEventTypeWire.runFinished: return AgUiEventType.runFinished; case AgUiEventTypeWire.runError: return AgUiEventType.runError; case AgUiEventTypeWire.textMessageStart: return AgUiEventType.textMessageStart; case AgUiEventTypeWire.textMessageContent: return AgUiEventType.textMessageContent; case AgUiEventTypeWire.textMessageEnd: return AgUiEventType.textMessageEnd; case AgUiEventTypeWire.toolCallStart: return AgUiEventType.toolCallStart; case AgUiEventTypeWire.toolCallArgs: return AgUiEventType.toolCallArgs; case AgUiEventTypeWire.toolCallEnd: return AgUiEventType.toolCallEnd; case AgUiEventTypeWire.toolCallResult: return AgUiEventType.toolCallResult; case AgUiEventTypeWire.toolCallError: return AgUiEventType.toolCallError; default: return AgUiEventType.unknown; } } String agUiEventTypeToWire(AgUiEventType type) { switch (type) { case AgUiEventType.runStarted: return AgUiEventTypeWire.runStarted; case AgUiEventType.runFinished: return AgUiEventTypeWire.runFinished; case AgUiEventType.runError: return AgUiEventTypeWire.runError; case AgUiEventType.textMessageStart: return AgUiEventTypeWire.textMessageStart; case AgUiEventType.textMessageContent: return AgUiEventTypeWire.textMessageContent; case AgUiEventType.textMessageEnd: return AgUiEventTypeWire.textMessageEnd; case AgUiEventType.toolCallStart: return AgUiEventTypeWire.toolCallStart; case AgUiEventType.toolCallArgs: return AgUiEventTypeWire.toolCallArgs; case AgUiEventType.toolCallEnd: return AgUiEventTypeWire.toolCallEnd; case AgUiEventType.toolCallResult: return AgUiEventTypeWire.toolCallResult; case AgUiEventType.toolCallError: return AgUiEventTypeWire.toolCallError; case AgUiEventType.unknown: return ''; } } @JsonSerializable() class AgUiEvent { final AgUiEventType type; AgUiEvent({required this.type}); factory AgUiEvent.fromJson(Map json) { final typeStr = json['type'] as String? ?? ''; final type = agUiEventTypeFromWire(typeStr); switch (type) { case AgUiEventType.runStarted: return RunStartedEvent.fromJson(json); case AgUiEventType.runFinished: return RunFinishedEvent.fromJson(json); case AgUiEventType.runError: return RunErrorEvent.fromJson(json); case AgUiEventType.textMessageStart: return TextMessageStartEvent.fromJson(json); case AgUiEventType.textMessageContent: return TextMessageContentEvent.fromJson(json); case AgUiEventType.textMessageEnd: return TextMessageEndEvent.fromJson(json); case AgUiEventType.toolCallStart: return ToolCallStartEvent.fromJson(json); case AgUiEventType.toolCallArgs: return ToolCallArgsEvent.fromJson(json); case AgUiEventType.toolCallEnd: return ToolCallEndEvent.fromJson(json); case AgUiEventType.toolCallResult: return ToolCallResultEvent.fromJson(json); case AgUiEventType.toolCallError: return ToolCallErrorEvent.fromJson(json); case AgUiEventType.unknown: return UnknownAgUiEvent.fromJson(json); } } Map toJson() => _$AgUiEventToJson(this); } @JsonSerializable() class UnknownAgUiEvent extends AgUiEvent { final Map rawJson; UnknownAgUiEvent({required this.rawJson}) : super(type: AgUiEventType.unknown); factory UnknownAgUiEvent.fromJson(Map json) => UnknownAgUiEvent(rawJson: json); @override Map toJson() => rawJson; } @JsonSerializable() class RunStartedEvent extends AgUiEvent { final String threadId; final String runId; RunStartedEvent({required this.threadId, required this.runId}) : super(type: AgUiEventType.runStarted); factory RunStartedEvent.fromJson(Map json) => _$RunStartedEventFromJson(json); @override Map toJson() => _$RunStartedEventToJson(this); } @JsonSerializable() class RunFinishedEvent extends AgUiEvent { final String threadId; final String runId; RunFinishedEvent({required this.threadId, required this.runId}) : super(type: AgUiEventType.runFinished); factory RunFinishedEvent.fromJson(Map json) => _$RunFinishedEventFromJson(json); @override Map toJson() => _$RunFinishedEventToJson(this); } @JsonSerializable() class RunErrorEvent extends AgUiEvent { final String message; final String? code; RunErrorEvent({required this.message, this.code}) : super(type: AgUiEventType.runError); factory RunErrorEvent.fromJson(Map json) => _$RunErrorEventFromJson(json); @override Map toJson() => _$RunErrorEventToJson(this); } @JsonSerializable() class TextMessageStartEvent extends AgUiEvent { final String messageId; final String role; TextMessageStartEvent({required this.messageId, required this.role}) : super(type: AgUiEventType.textMessageStart); factory TextMessageStartEvent.fromJson(Map json) => _$TextMessageStartEventFromJson(json); @override Map toJson() => _$TextMessageStartEventToJson(this); } @JsonSerializable() class TextMessageContentEvent extends AgUiEvent { final String messageId; final String delta; TextMessageContentEvent({required this.messageId, required this.delta}) : super(type: AgUiEventType.textMessageContent); factory TextMessageContentEvent.fromJson(Map json) => _$TextMessageContentEventFromJson(json); @override Map toJson() => _$TextMessageContentEventToJson(this); } @JsonSerializable() class TextMessageEndEvent extends AgUiEvent { final String messageId; TextMessageEndEvent({required this.messageId}) : super(type: AgUiEventType.textMessageEnd); factory TextMessageEndEvent.fromJson(Map json) => _$TextMessageEndEventFromJson(json); @override Map toJson() => _$TextMessageEndEventToJson(this); } @JsonSerializable() class ToolCallStartEvent extends AgUiEvent { final String toolCallId; final String toolCallName; final String? parentMessageId; ToolCallStartEvent({ required this.toolCallId, required this.toolCallName, this.parentMessageId, }) : super(type: AgUiEventType.toolCallStart); factory ToolCallStartEvent.fromJson(Map json) => _$ToolCallStartEventFromJson(json); @override Map toJson() => _$ToolCallStartEventToJson(this); } @JsonSerializable() class ToolCallArgsEvent extends AgUiEvent { final String toolCallId; final String delta; ToolCallArgsEvent({required this.toolCallId, required this.delta}) : super(type: AgUiEventType.toolCallArgs); factory ToolCallArgsEvent.fromJson(Map json) => _$ToolCallArgsEventFromJson(json); @override Map toJson() => _$ToolCallArgsEventToJson(this); } @JsonSerializable() class ToolCallEndEvent extends AgUiEvent { final String toolCallId; ToolCallEndEvent({required this.toolCallId}) : super(type: AgUiEventType.toolCallEnd); factory ToolCallEndEvent.fromJson(Map json) => _$ToolCallEndEventFromJson(json); @override Map toJson() => _$ToolCallEndEventToJson(this); } @JsonSerializable() class ToolCallResultEvent extends AgUiEvent { final String messageId; final String toolCallId; final Map result; final UiCard? ui; ToolCallResultEvent({ required this.messageId, required this.toolCallId, required this.result, this.ui, }) : super(type: AgUiEventType.toolCallResult); factory ToolCallResultEvent.fromJson(Map json) => _$ToolCallResultEventFromJson(json); @override Map toJson() => _$ToolCallResultEventToJson(this); } @JsonSerializable() class ToolCallErrorEvent extends AgUiEvent { final String toolCallId; final String error; final String? code; ToolCallErrorEvent({required this.toolCallId, required this.error, this.code}) : super(type: AgUiEventType.toolCallError); factory ToolCallErrorEvent.fromJson(Map json) => _$ToolCallErrorEventFromJson(json); @override Map toJson() => _$ToolCallErrorEventToJson(this); }