Skip to content

Commit dcc77e7

Browse files
committed
create get file stat api
1 parent a0d79ec commit dcc77e7

File tree

3 files changed

+99
-4
lines changed

3 files changed

+99
-4
lines changed

src/PintClient/index.ts

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {
3333
listDirectory,
3434
createDirectory,
3535
deleteDirectory,
36-
36+
getFileStat,
3737
} from "../api-clients/pint";
3838

3939
import {
@@ -578,7 +578,43 @@ export class PintFsClient implements IAgentClientFS {
578578
}
579579

580580
async stat(path: string): Promise<PickRawFsResult<"fs/stat">> {
581-
throw new Error("Not implemented");
581+
try {
582+
const response = await getFileStat({
583+
client: this.apiClient,
584+
path: {
585+
path: path,
586+
},
587+
});
588+
589+
if (response.data) {
590+
// Parse modTime string to timestamp (assuming ISO string format)
591+
const modTimeMs = new Date(response.data.modTime).getTime();
592+
593+
return {
594+
type: "ok",
595+
result: {
596+
type: response.data.isDir ? 1 : 0, // 1 = directory, 0 = file
597+
isSymlink: false, // API doesn't provide symlink info, defaulting to false
598+
size: response.data.size,
599+
mtime: modTimeMs,
600+
ctime: modTimeMs, // Using modTime as fallback since API doesn't provide ctime
601+
atime: modTimeMs, // Using modTime as fallback since API doesn't provide atime
602+
},
603+
};
604+
} else {
605+
return {
606+
type: "error",
607+
error: response.error?.message || "Failed to get file stat",
608+
errno: null,
609+
};
610+
}
611+
} catch (error) {
612+
return {
613+
type: "error",
614+
error: error instanceof Error ? error.message : "Unknown error",
615+
errno: null,
616+
};
617+
}
582618
}
583619

584620
async copy(

src/api-clients/pint/sdk.gen.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import type { Client, Options as Options2, TDataShape } from './client';
44
import { client } from './client.gen';
5-
import type { ConnectToExecWebSocketData, ConnectToExecWebSocketErrors, ConnectToExecWebSocketResponses, CreateDirectoryData, CreateDirectoryErrors, CreateDirectoryResponses, CreateExecData, CreateExecErrors, CreateExecResponses, CreateFileData, CreateFileErrors, CreateFileResponses, DeleteDirectoryData, DeleteDirectoryErrors, DeleteDirectoryResponses, DeleteExecData, DeleteExecErrors, DeleteExecResponses, DeleteFileData, DeleteFileErrors, DeleteFileResponses, ExecExecStdinData, ExecExecStdinErrors, ExecExecStdinResponses, ExecuteTaskActionData, ExecuteTaskActionErrors, ExecuteTaskActionResponses, GetExecData, GetExecErrors, GetExecOutputData, GetExecOutputErrors, GetExecOutputResponses, GetExecResponses, GetTaskData, GetTaskErrors, GetTaskResponses, ListDirectoryData, ListDirectoryErrors, ListDirectoryResponses, ListExecsData, ListExecsErrors, ListExecsResponses, ListPortsData, ListPortsErrors, ListPortsResponses, ListSetupTasksData, ListSetupTasksErrors, ListSetupTasksResponses, ListTasksData, ListTasksErrors, ListTasksResponses, PerformFileActionData, PerformFileActionErrors, PerformFileActionResponses, ReadFileData, ReadFileErrors, ReadFileResponses, StreamExecsListData, StreamExecsListErrors, StreamExecsListResponses, StreamPortsListData, StreamPortsListErrors, StreamPortsListResponses, UpdateExecData, UpdateExecErrors, UpdateExecResponses } from './types.gen';
5+
import type { ConnectToExecWebSocketData, ConnectToExecWebSocketErrors, ConnectToExecWebSocketResponses, CreateDirectoryData, CreateDirectoryErrors, CreateDirectoryResponses, CreateExecData, CreateExecErrors, CreateExecResponses, CreateFileData, CreateFileErrors, CreateFileResponses, DeleteDirectoryData, DeleteDirectoryErrors, DeleteDirectoryResponses, DeleteExecData, DeleteExecErrors, DeleteExecResponses, DeleteFileData, DeleteFileErrors, DeleteFileResponses, ExecExecStdinData, ExecExecStdinErrors, ExecExecStdinResponses, ExecuteTaskActionData, ExecuteTaskActionErrors, ExecuteTaskActionResponses, GetExecData, GetExecErrors, GetExecOutputData, GetExecOutputErrors, GetExecOutputResponses, GetExecResponses, GetFileStatData, GetFileStatErrors, GetFileStatResponses, GetTaskData, GetTaskErrors, GetTaskResponses, ListDirectoryData, ListDirectoryErrors, ListDirectoryResponses, ListExecsData, ListExecsErrors, ListExecsResponses, ListPortsData, ListPortsErrors, ListPortsResponses, ListSetupTasksData, ListSetupTasksErrors, ListSetupTasksResponses, ListTasksData, ListTasksErrors, ListTasksResponses, PerformFileActionData, PerformFileActionErrors, PerformFileActionResponses, ReadFileData, ReadFileErrors, ReadFileResponses, StreamExecsListData, StreamExecsListErrors, StreamExecsListResponses, StreamPortsListData, StreamPortsListErrors, StreamPortsListResponses, UpdateExecData, UpdateExecErrors, UpdateExecResponses } from './types.gen';
66

77
export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = Options2<TData, ThrowOnError> & {
88
/**
@@ -94,6 +94,23 @@ export const createFile = <ThrowOnError extends boolean = false>(options: Option
9494
});
9595
};
9696

97+
/**
98+
* Get file stat
99+
* Reads the file metadata.
100+
*/
101+
export const getFileStat = <ThrowOnError extends boolean = false>(options: Options<GetFileStatData, ThrowOnError>) => {
102+
return (options.client ?? client).get<GetFileStatResponses, GetFileStatErrors, ThrowOnError>({
103+
security: [
104+
{
105+
scheme: 'bearer',
106+
type: 'http'
107+
}
108+
],
109+
url: '/api/v1/file_stat/{path}',
110+
...options
111+
});
112+
};
113+
97114
/**
98115
* Delete a directory
99116
* Deletes a directory at the specified path.

src/api-clients/pint/types.gen.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export type FileActionRequest = {
4242
/**
4343
* Type of action to perform on the file
4444
*/
45-
action: 'move';
45+
action: 'move' | 'copy';
4646
/**
4747
* Destination path for move operation
4848
*/
@@ -501,6 +501,48 @@ export type CreateFileResponses = {
501501

502502
export type CreateFileResponse = CreateFileResponses[keyof CreateFileResponses];
503503

504+
export type GetFileStatData = {
505+
body?: never;
506+
path: {
507+
/**
508+
* File path
509+
*/
510+
path: string;
511+
};
512+
query?: never;
513+
url: '/api/v1/file_stat/{path}';
514+
};
515+
516+
export type GetFileStatErrors = {
517+
/**
518+
* Bad Request - Path is required or invalid path
519+
*/
520+
400: _Error;
521+
/**
522+
* Unauthorized
523+
*/
524+
401: _Error;
525+
/**
526+
* File not found
527+
*/
528+
404: _Error;
529+
/**
530+
* Unexpected Error
531+
*/
532+
default: _Error;
533+
};
534+
535+
export type GetFileStatError = GetFileStatErrors[keyof GetFileStatErrors];
536+
537+
export type GetFileStatResponses = {
538+
/**
539+
* File metadata retrieved successfully
540+
*/
541+
200: FileInfo;
542+
};
543+
544+
export type GetFileStatResponse = GetFileStatResponses[keyof GetFileStatResponses];
545+
504546
export type DeleteDirectoryData = {
505547
body?: never;
506548
path: {

0 commit comments

Comments
 (0)