summaryrefslogblamecommitdiff
path: root/makima/ios/Sources/Makima/Models/Task.swift
blob: ae5466b9e6de41bc632a4fea81bf3bc6a5b3158c (plain) (tree)


















































                                                                                          
import Foundation

/// Matches `src/db/models.rs::Task` (camelCase). Trimmed to the fields the
/// mobile UI needs; extra fields in the payload are tolerated via
/// non-exhaustive decoding.
struct MakimaTask: Decodable, Identifiable, Hashable {
    let id: String
    let ownerId: String?
    let contractId: String?
    let parentTaskId: String?
    let depth: Int?
    let name: String
    let description: String?
    let status: String           // "pending"|"running"|"paused"|"blocked"|"done"|"failed"
    let priority: Int?
    let plan: String?
    let isSupervisor: Bool?
    let daemonId: String?
    let progressSummary: String?
    let lastOutput: String?
    let errorMessage: String?
    let createdAt: Date?
    let updatedAt: Date?

    var statusColor: StatusKind {
        switch status.lowercased() {
        case "done", "completed":           return .ok
        case "running":                     return .active
        case "pending", "paused":           return .idle
        case "blocked":                     return .warn
        case "failed", "error", "cancelled": return .danger
        default:                            return .idle
        }
    }

    enum StatusKind {
        case ok, active, idle, warn, danger
    }
}

/// Response shape for `GET /mesh/tasks/{id}/output`.
struct TaskOutputResponse: Decodable {
    let output: String?
    let lastOutput: String?
    let truncated: Bool?

    /// Coalesces whichever field the server populates.
    var text: String {
        output ?? lastOutput ?? ""
    }
}