2025-09-01 23:41:22 +05:30
|
|
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
|
|
|
|
|
|
|
|
part 'outbound_task.freezed.dart';
|
|
|
|
|
part 'outbound_task.g.dart';
|
|
|
|
|
|
2025-09-24 12:00:49 +05:30
|
|
|
enum TaskStatus { queued, running, succeeded, failed, cancelled }
|
2025-09-01 23:41:22 +05:30
|
|
|
|
|
|
|
|
@freezed
|
|
|
|
|
abstract class OutboundTask with _$OutboundTask {
|
|
|
|
|
const OutboundTask._();
|
|
|
|
|
|
|
|
|
|
const factory OutboundTask.sendTextMessage({
|
|
|
|
|
required String id,
|
|
|
|
|
String? conversationId,
|
|
|
|
|
required String text,
|
|
|
|
|
@Default(<String>[]) List<String> attachments,
|
|
|
|
|
@Default(<String>[]) List<String> toolIds,
|
|
|
|
|
@Default(TaskStatus.queued) TaskStatus status,
|
|
|
|
|
@Default(0) int attempt,
|
|
|
|
|
String? idempotencyKey,
|
|
|
|
|
DateTime? enqueuedAt,
|
|
|
|
|
DateTime? startedAt,
|
|
|
|
|
DateTime? completedAt,
|
|
|
|
|
String? error,
|
|
|
|
|
}) = SendTextMessageTask;
|
|
|
|
|
|
|
|
|
|
const factory OutboundTask.uploadMedia({
|
|
|
|
|
required String id,
|
|
|
|
|
String? conversationId,
|
|
|
|
|
required String filePath,
|
|
|
|
|
required String fileName,
|
|
|
|
|
int? fileSize,
|
|
|
|
|
String? mimeType,
|
|
|
|
|
String? checksum,
|
|
|
|
|
@Default(TaskStatus.queued) TaskStatus status,
|
|
|
|
|
@Default(0) int attempt,
|
|
|
|
|
String? idempotencyKey,
|
|
|
|
|
DateTime? enqueuedAt,
|
|
|
|
|
DateTime? startedAt,
|
|
|
|
|
DateTime? completedAt,
|
|
|
|
|
String? error,
|
|
|
|
|
}) = UploadMediaTask;
|
|
|
|
|
|
|
|
|
|
const factory OutboundTask.executeToolCall({
|
|
|
|
|
required String id,
|
|
|
|
|
String? conversationId,
|
|
|
|
|
required String toolName,
|
|
|
|
|
@Default(<String, dynamic>{}) Map<String, dynamic> arguments,
|
|
|
|
|
@Default(TaskStatus.queued) TaskStatus status,
|
|
|
|
|
@Default(0) int attempt,
|
|
|
|
|
String? idempotencyKey,
|
|
|
|
|
DateTime? enqueuedAt,
|
|
|
|
|
DateTime? startedAt,
|
|
|
|
|
DateTime? completedAt,
|
|
|
|
|
String? error,
|
|
|
|
|
}) = ExecuteToolCallTask;
|
|
|
|
|
|
2025-09-02 11:12:48 +05:30
|
|
|
const factory OutboundTask.generateImage({
|
|
|
|
|
required String id,
|
|
|
|
|
String? conversationId,
|
|
|
|
|
required String prompt,
|
|
|
|
|
@Default(TaskStatus.queued) TaskStatus status,
|
|
|
|
|
@Default(0) int attempt,
|
|
|
|
|
String? idempotencyKey,
|
|
|
|
|
DateTime? enqueuedAt,
|
|
|
|
|
DateTime? startedAt,
|
|
|
|
|
DateTime? completedAt,
|
|
|
|
|
String? error,
|
|
|
|
|
}) = GenerateImageTask;
|
|
|
|
|
|
2025-09-02 19:08:23 +05:30
|
|
|
const factory OutboundTask.imageToDataUrl({
|
|
|
|
|
required String id,
|
|
|
|
|
String? conversationId,
|
|
|
|
|
required String filePath,
|
|
|
|
|
required String fileName,
|
|
|
|
|
@Default(TaskStatus.queued) TaskStatus status,
|
|
|
|
|
@Default(0) int attempt,
|
|
|
|
|
String? idempotencyKey,
|
|
|
|
|
DateTime? enqueuedAt,
|
|
|
|
|
DateTime? startedAt,
|
|
|
|
|
DateTime? completedAt,
|
|
|
|
|
String? error,
|
|
|
|
|
}) = ImageToDataUrlTask;
|
|
|
|
|
|
2025-09-01 23:41:22 +05:30
|
|
|
factory OutboundTask.fromJson(Map<String, dynamic> json) =>
|
|
|
|
|
_$OutboundTaskFromJson(json);
|
|
|
|
|
|
2025-09-02 20:43:57 +05:30
|
|
|
// Provide a unified nullable conversationId across variants
|
|
|
|
|
String? get maybeConversationId => map(
|
2025-09-24 12:00:49 +05:30
|
|
|
sendTextMessage: (t) => t.conversationId,
|
|
|
|
|
uploadMedia: (t) => t.conversationId,
|
|
|
|
|
executeToolCall: (t) => t.conversationId,
|
|
|
|
|
generateImage: (t) => t.conversationId,
|
|
|
|
|
imageToDataUrl: (t) => t.conversationId,
|
|
|
|
|
);
|
2025-09-02 20:43:57 +05:30
|
|
|
|
|
|
|
|
String get threadKey =>
|
|
|
|
|
(maybeConversationId == null || maybeConversationId!.isEmpty)
|
2025-09-24 12:00:49 +05:30
|
|
|
? 'new'
|
|
|
|
|
: maybeConversationId!;
|
2025-09-01 23:41:22 +05:30
|
|
|
}
|