Files
kandev/apps/web/lib/api/domains/quick-terminal-api.ts
T
2026-08-06 11:16:29 +01:00

92 lines
2.5 KiB
TypeScript

import { fetchJson, type ApiRequestOptions } from "../client";
import type { QuickTerminalStatus, QuickTerminalTab } from "@/lib/state/slices/ui/types";
export type QuickTerminalTabResponse = {
tabId: string;
workspaceId: string;
sessionId: string | null;
sequence: number;
status: QuickTerminalStatus;
exitCode?: number;
error?: string;
};
export type ListQuickTerminalTabsResponse = {
tabs: QuickTerminalTabResponse[];
};
export type QuickTerminalLifecycleUpdate = {
sessionId?: string | null;
status: QuickTerminalStatus;
exitCode?: number | null;
error?: string | null;
};
export async function listQuickTerminalTabs(
workspaceId: string,
options?: ApiRequestOptions,
): Promise<ListQuickTerminalTabsResponse> {
const params = new URLSearchParams({ workspace_id: workspaceId });
return fetchJson<ListQuickTerminalTabsResponse>(
`/api/v1/quick-terminal-tabs?${params.toString()}`,
options,
);
}
export async function createQuickTerminalTab(
tabId: string,
workspaceId: string,
options?: ApiRequestOptions,
): Promise<QuickTerminalTabResponse> {
return fetchJson<QuickTerminalTabResponse>("/api/v1/quick-terminal-tabs", {
...options,
init: {
method: "POST",
body: JSON.stringify({ tab_id: tabId, workspace_id: workspaceId }),
...(options?.init ?? {}),
},
});
}
export async function updateQuickTerminalTab(
tabId: string,
update: QuickTerminalLifecycleUpdate,
options?: ApiRequestOptions,
): Promise<QuickTerminalTabResponse> {
return fetchJson<QuickTerminalTabResponse>(`/api/v1/quick-terminal-tabs/${tabId}`, {
...options,
init: {
method: "PATCH",
body: JSON.stringify({
session_id: update.sessionId ?? null,
status: update.status,
exit_code: update.exitCode ?? null,
error: update.error ?? "",
}),
...(options?.init ?? {}),
},
});
}
export async function deleteQuickTerminalTab(
tabId: string,
options?: ApiRequestOptions,
): Promise<void> {
await fetchJson<{ ok: boolean }>(`/api/v1/quick-terminal-tabs/${tabId}`, {
...options,
init: { method: "DELETE", ...(options?.init ?? {}) },
});
}
export function toQuickTerminalTab(tab: QuickTerminalTabResponse): QuickTerminalTab {
return {
tabId: tab.tabId,
workspaceId: tab.workspaceId,
sessionId: tab.sessionId,
sequence: tab.sequence,
status: tab.status,
...(tab.exitCode === undefined ? {} : { exitCode: tab.exitCode }),
...(tab.error ? { error: tab.error } : {}),
};
}