feat(api): complete per-instance file op-set (delete/rename/mkdir/mkfile/move/copy)
Rounds out the per-instance file bridge to the agent's full jailed file
manager so a real file browser can be built on it: POST :id/files/
{delete,rename,mkdir,mkfile,move,copy}, all via requestScoped (license-
scoped reply) on the new agent {op,path} protocol. files.manage. The
broken legacy VueFinder /api/files (retired Go fm_* protocol, wrong
subject, default _INBOX) is superseded by this — frontend rewrite next.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -64,4 +64,70 @@ export class InstancesController {
|
||||
) {
|
||||
return this.instances.writeFile(licenseId, id, body.path, body.content ?? '');
|
||||
}
|
||||
|
||||
@Post(':id/files/delete')
|
||||
@RequirePermission('files.manage')
|
||||
@ApiOperation({ summary: 'Delete a file or directory (jailed)' })
|
||||
async deleteFile(
|
||||
@CurrentTenant() licenseId: string,
|
||||
@Param('id') id: string,
|
||||
@Body() body: { path: string },
|
||||
) {
|
||||
return this.instances.deleteFile(licenseId, id, body.path);
|
||||
}
|
||||
|
||||
@Post(':id/files/rename')
|
||||
@RequirePermission('files.manage')
|
||||
@ApiOperation({ summary: 'Rename a file/directory within its parent (jailed)' })
|
||||
async renameFile(
|
||||
@CurrentTenant() licenseId: string,
|
||||
@Param('id') id: string,
|
||||
@Body() body: { path: string; name: string },
|
||||
) {
|
||||
return this.instances.renameFile(licenseId, id, body.path, body.name);
|
||||
}
|
||||
|
||||
@Post(':id/files/mkdir')
|
||||
@RequirePermission('files.manage')
|
||||
@ApiOperation({ summary: 'Create a directory (jailed)' })
|
||||
async mkdir(
|
||||
@CurrentTenant() licenseId: string,
|
||||
@Param('id') id: string,
|
||||
@Body() body: { path: string },
|
||||
) {
|
||||
return this.instances.mkdir(licenseId, id, body.path);
|
||||
}
|
||||
|
||||
@Post(':id/files/mkfile')
|
||||
@RequirePermission('files.manage')
|
||||
@ApiOperation({ summary: 'Create an empty file (jailed)' })
|
||||
async mkfile(
|
||||
@CurrentTenant() licenseId: string,
|
||||
@Param('id') id: string,
|
||||
@Body() body: { path: string },
|
||||
) {
|
||||
return this.instances.mkfile(licenseId, id, body.path);
|
||||
}
|
||||
|
||||
@Post(':id/files/move')
|
||||
@RequirePermission('files.manage')
|
||||
@ApiOperation({ summary: 'Move a file/directory (jailed)' })
|
||||
async moveFile(
|
||||
@CurrentTenant() licenseId: string,
|
||||
@Param('id') id: string,
|
||||
@Body() body: { path: string; dest: string },
|
||||
) {
|
||||
return this.instances.moveFile(licenseId, id, body.path, body.dest);
|
||||
}
|
||||
|
||||
@Post(':id/files/copy')
|
||||
@RequirePermission('files.manage')
|
||||
@ApiOperation({ summary: 'Copy a file/directory (jailed)' })
|
||||
async copyFile(
|
||||
@CurrentTenant() licenseId: string,
|
||||
@Param('id') id: string,
|
||||
@Body() body: { path: string; dest: string },
|
||||
) {
|
||||
return this.instances.copyFile(licenseId, id, body.path, body.dest);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user