58 lines
1.8 KiB
TypeScript
58 lines
1.8 KiB
TypeScript
import type { CommandExecResult, FilesAPI, RuntimeAPIs } from '@/lib/api/types';
|
|||
|
|
|
||
|
|
type ExecResult = { success: boolean; results: CommandExecResult[] };
|
||
|
|
|
||
|
|
const DEFAULT_BASE_URL = import.meta.env.VITE_OPENCODE_URL || '/api';
|
||
|
|
|
||
|
|
const getBaseUrl = (): string => {
|
||
|
|
if (typeof DEFAULT_BASE_URL === 'string' && DEFAULT_BASE_URL.startsWith('/')) {
|
||
|
|
return DEFAULT_BASE_URL;
|
||
|
|
}
|
||
|
|
return DEFAULT_BASE_URL;
|
||
|
|
};
|
||
|
|
|
||
|
|
function getRuntimeFilesAPI(): FilesAPI | null {
|
||
|
|
if (typeof window === 'undefined') return null;
|
||
|
|
const apis = (window as typeof window & { __OPENCHAMBER_RUNTIME_APIS__?: RuntimeAPIs }).__OPENCHAMBER_RUNTIME_APIS__;
|
||
|
|
if (apis?.files) {
|
||
|
|
return apis.files;
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function execCommands(commands: string[], cwd: string): Promise<ExecResult> {
|
||
|
|
const runtimeFiles = getRuntimeFilesAPI();
|
||
|
|
if (runtimeFiles?.execCommands) {
|
||
|
|
return runtimeFiles.execCommands(commands, cwd);
|
||
|
|
}
|
||
|
|
|
||
|
|
const response = await fetch(`${getBaseUrl()}/fs/exec`, {
|
||
|
|
method: 'POST',
|
||
|
|
headers: { 'Content-Type': 'application/json' },
|
||
|
|
body: JSON.stringify({ commands, cwd, background: false }),
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!response.ok) {
|
||
|
|
const error = await response.json().catch(() => ({ error: response.statusText }));
|
||
|
|
throw new Error((error as { error?: string }).error || 'Command exec failed');
|
||
|
|
}
|
||
|
|
|
||
|
|
const payload = (await response.json().catch(() => null)) as
|
||
|
|
| { success?: boolean; results?: CommandExecResult[] }
|
||
|
|
| null;
|
||
|
|
|
||
|
|
return {
|
||
|
|
success: Boolean(payload?.success),
|
||
|
|
results: Array.isArray(payload?.results) ? payload!.results! : [],
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function execCommand(command: string, cwd: string): Promise<CommandExecResult> {
|
||
|
|
const result = await execCommands([command], cwd);
|
||
|
|
const first = result.results[0];
|
||
|
|
if (!first) {
|
||
|
|
return { command, success: result.success };
|
||
|
|
}
|
||
|
|
return first;
|
||
|
|
}
|