159 lines
3.8 KiB
Dart
159 lines
3.8 KiB
Dart
class Prompt {
|
|
final String id;
|
|
final String text;
|
|
final String title;
|
|
final int order;
|
|
|
|
Prompt({
|
|
required this.id,
|
|
required this.text,
|
|
required this.title,
|
|
required this.order,
|
|
});
|
|
|
|
factory Prompt.fromJson(Map<String, dynamic> json) {
|
|
return Prompt(
|
|
id: json['id'] as String? ?? '',
|
|
text: json['text'] as String? ?? '',
|
|
title: json['title'] as String? ?? '',
|
|
order: json['order'] as int? ?? 0,
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toJson() {
|
|
return {'id': id, 'text': text, 'title': title, 'order': order};
|
|
}
|
|
|
|
Prompt copyWith({String? id, String? text, String? title, int? order}) {
|
|
return Prompt(
|
|
id: id ?? this.id,
|
|
text: text ?? this.text,
|
|
title: title ?? this.title,
|
|
order: order ?? this.order,
|
|
);
|
|
}
|
|
}
|
|
|
|
class Pipeline {
|
|
final String id;
|
|
final String name;
|
|
final List<Prompt> prompts;
|
|
final String workingDir;
|
|
final String createdAt;
|
|
final String updatedAt;
|
|
|
|
Pipeline({
|
|
required this.id,
|
|
required this.name,
|
|
required this.prompts,
|
|
required this.workingDir,
|
|
required this.createdAt,
|
|
required this.updatedAt,
|
|
});
|
|
|
|
factory Pipeline.fromJson(Map<String, dynamic> json) {
|
|
return Pipeline(
|
|
id: json['id'] as String? ?? '',
|
|
name: json['name'] as String? ?? '',
|
|
prompts:
|
|
(json['prompts'] as List<dynamic>?)
|
|
?.map((p) => Prompt.fromJson(p as Map<String, dynamic>))
|
|
.toList() ??
|
|
[],
|
|
workingDir: json['working_dir'] as String? ?? '',
|
|
createdAt: json['created_at'] as String? ?? '',
|
|
updatedAt: json['updated_at'] as String? ?? '',
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toJson() {
|
|
return {
|
|
'id': id,
|
|
'name': name,
|
|
'prompts': prompts.map((p) => p.toJson()).toList(),
|
|
'working_dir': workingDir,
|
|
'created_at': createdAt,
|
|
'updated_at': updatedAt,
|
|
};
|
|
}
|
|
}
|
|
|
|
enum RunStatus { pending, running, completed, error }
|
|
|
|
RunStatus parseRunStatus(String s) {
|
|
switch (s) {
|
|
case 'pending':
|
|
return RunStatus.pending;
|
|
case 'running':
|
|
return RunStatus.running;
|
|
case 'completed':
|
|
return RunStatus.completed;
|
|
case 'error':
|
|
return RunStatus.error;
|
|
default:
|
|
return RunStatus.pending;
|
|
}
|
|
}
|
|
|
|
class StepResult {
|
|
final int stepIndex;
|
|
final String title;
|
|
final RunStatus status;
|
|
final int returnCode;
|
|
final String output;
|
|
final String error;
|
|
|
|
StepResult({
|
|
required this.stepIndex,
|
|
required this.title,
|
|
required this.status,
|
|
required this.returnCode,
|
|
required this.output,
|
|
required this.error,
|
|
});
|
|
|
|
factory StepResult.fromJson(Map<String, dynamic> json) {
|
|
return StepResult(
|
|
stepIndex: json['step_index'] as int? ?? 0,
|
|
title: json['title'] as String? ?? '',
|
|
status: parseRunStatus(json['status'] as String? ?? 'pending'),
|
|
returnCode: json['returncode'] as int? ?? 0,
|
|
output: json['output'] as String? ?? '',
|
|
error: json['error'] as String? ?? '',
|
|
);
|
|
}
|
|
}
|
|
|
|
class RunState {
|
|
final String runId;
|
|
final String pipelineId;
|
|
final RunStatus status;
|
|
final int currentStep;
|
|
final List<StepResult> steps;
|
|
|
|
RunState({
|
|
required this.runId,
|
|
required this.pipelineId,
|
|
required this.status,
|
|
required this.currentStep,
|
|
required this.steps,
|
|
});
|
|
|
|
factory RunState.fromJson(Map<String, dynamic> json) {
|
|
return RunState(
|
|
runId: json['run_id'] as String? ?? '',
|
|
pipelineId: json['pipeline_id'] as String? ?? '',
|
|
status: parseRunStatus(json['status'] as String? ?? 'pending'),
|
|
currentStep: json['current_step'] as int? ?? -1,
|
|
steps:
|
|
(json['steps'] as List<dynamic>?)
|
|
?.map((s) => StepResult.fromJson(s as Map<String, dynamic>))
|
|
.toList() ??
|
|
[],
|
|
);
|
|
}
|
|
|
|
bool get isFinished =>
|
|
status == RunStatus.completed || status == RunStatus.error;
|
|
}
|