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';
|
|
|
|
|
|
|
|
|
|
enum TaskStatus {
|
|
|
|
|
queued,
|
|
|
|
|
running,
|
|
|
|
|
succeeded,
|
|
|
|
|
failed,
|
|
|
|
|
cancelled,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@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 13:20:02 +05:30
|
|
|
const factory OutboundTask.saveConversation({
|
|
|
|
|
required String id,
|
|
|
|
|
String? conversationId,
|
|
|
|
|
@Default(TaskStatus.queued) TaskStatus status,
|
|
|
|
|
@Default(0) int attempt,
|
|
|
|
|
String? idempotencyKey,
|
|
|
|
|
DateTime? enqueuedAt,
|
|
|
|
|
DateTime? startedAt,
|
|
|
|
|
DateTime? completedAt,
|
|
|
|
|
String? error,
|
|
|
|
|
}) = SaveConversationTask;
|
|
|
|
|
|
|
|
|
|
const factory OutboundTask.generateTitle({
|
|
|
|
|
required String id,
|
|
|
|
|
required String conversationId,
|
|
|
|
|
@Default(TaskStatus.queued) TaskStatus status,
|
|
|
|
|
@Default(0) int attempt,
|
|
|
|
|
String? idempotencyKey,
|
|
|
|
|
DateTime? enqueuedAt,
|
|
|
|
|
DateTime? startedAt,
|
|
|
|
|
DateTime? completedAt,
|
|
|
|
|
String? error,
|
|
|
|
|
}) = GenerateTitleTask;
|
|
|
|
|
|
2025-09-01 23:41:22 +05:30
|
|
|
factory OutboundTask.fromJson(Map<String, dynamic> json) =>
|
|
|
|
|
_$OutboundTaskFromJson(json);
|
|
|
|
|
|
|
|
|
|
String get threadKey => (conversationId == null || conversationId!.isEmpty)
|
|
|
|
|
? 'new'
|
|
|
|
|
: conversationId!;
|
|
|
|
|
}
|