summaryrefslogtreecommitdiff
path: root/makima/frontend/src/lib
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-01-26 20:32:07 +0000
committersoryu <soryu@soryu.co>2026-01-26 20:32:07 +0000
commitbbbaab80baca6b152ce2edf68a971f29f189cd97 (patch)
treeb16cf1496d87217526fae189271a2ba9acf43633 /makima/frontend/src/lib
parent185de223067313bb93808d7ce573830a011627d3 (diff)
downloadsoryu-bbbaab80baca6b152ce2edf68a971f29f189cd97.tar.gz
soryu-bbbaab80baca6b152ce2edf68a971f29f189cd97.zip
Add WorktreeFilesPanel and PatchesListPanel components
Diffstat (limited to 'makima/frontend/src/lib')
-rw-r--r--makima/frontend/src/lib/api.ts103
1 files changed, 103 insertions, 0 deletions
diff --git a/makima/frontend/src/lib/api.ts b/makima/frontend/src/lib/api.ts
index c3b2a2a..f15eec0 100644
--- a/makima/frontend/src/lib/api.ts
+++ b/makima/frontend/src/lib/api.ts
@@ -2816,3 +2816,106 @@ export function getSupervisorStatus(
export async function dismissTask(taskId: string): Promise<Task> {
return updateTask(taskId, { hidden: true });
}
+
+// =============================================================================
+// Worktree Info Types and Functions
+// =============================================================================
+
+/** File status in the worktree (git status) */
+export type FileStatus = "M" | "A" | "D" | "R" | "C" | "U" | "?" | "modified" | "added" | "deleted" | "renamed" | "copied" | "unmerged" | "untracked";
+
+/** A single changed file in the worktree */
+export interface WorktreeFile {
+ /** File path relative to worktree root */
+ path: string;
+ /** Git status code (M=modified, A=added, D=deleted, R=renamed, C=copied, U=unmerged, ?=untracked) */
+ status: FileStatus;
+ /** Lines added (0 if deleted or unavailable) */
+ linesAdded: number;
+ /** Lines removed (0 if added or unavailable) */
+ linesRemoved: number;
+}
+
+/** Statistics about worktree changes */
+export interface WorktreeStats {
+ /** Number of files changed */
+ filesChanged: number;
+ /** Total lines inserted */
+ insertions: number;
+ /** Total lines deleted */
+ deletions: number;
+}
+
+/** Worktree information for a task */
+export interface WorktreeInfo {
+ /** Task ID */
+ taskId: string;
+ /** Path to the worktree directory */
+ worktreePath: string | null;
+ /** Whether the worktree exists on the daemon */
+ exists: boolean;
+ /** Aggregate statistics */
+ stats: WorktreeStats;
+ /** Changed files list */
+ files: WorktreeFile[];
+ /** Current branch name */
+ branch: string | null;
+ /** Current HEAD commit SHA */
+ headSha: string | null;
+}
+
+/**
+ * Get worktree information for a task.
+ * Returns changed files, stats, and metadata about the worktree.
+ */
+export async function getWorktreeInfo(taskId: string): Promise<WorktreeInfo> {
+ const res = await authFetch(`${API_BASE}/api/v1/mesh/tasks/${taskId}/worktree-info`);
+ if (!res.ok) {
+ const errorText = await res.text();
+ throw new Error(`Failed to get worktree info: ${errorText || res.statusText}`);
+ }
+ return res.json();
+}
+
+// =============================================================================
+// Patch Types and Functions
+// =============================================================================
+
+/** Summary of a patch file (contract file of type "patch") */
+export interface PatchSummary {
+ /** Patch/file ID */
+ id: string;
+ /** Patch name */
+ name: string;
+ /** Optional description */
+ description: string | null;
+ /** Task ID this patch was created from */
+ taskId: string | null;
+ /** Contract ID */
+ contractId: string;
+ /** Number of files in the patch */
+ filesCount: number;
+ /** Total lines added */
+ linesAdded: number;
+ /** Total lines removed */
+ linesRemoved: number;
+ /** List of file paths in the patch (if available) */
+ files: string[] | null;
+ /** When the patch was created */
+ createdAt: string;
+ /** When the patch was last updated */
+ updatedAt: string;
+}
+
+/**
+ * List patches for a task.
+ * Returns contract files of type "patch" associated with the task.
+ */
+export async function listTaskPatches(taskId: string, contractId: string): Promise<PatchSummary[]> {
+ const res = await authFetch(`${API_BASE}/api/v1/mesh/tasks/${taskId}/patches?contractId=${contractId}`);
+ if (!res.ok) {
+ const errorText = await res.text();
+ throw new Error(`Failed to list patches: ${errorText || res.statusText}`);
+ }
+ return res.json();
+}