use list-dir instead of list-files. move function related functions to the center

This commit is contained in:
Shivering Ocelot committed 2026-09-12 14:32:44 -05:00
1 parent 62f5fa87a9
commit 1e35028148
4 files changed
+49 -21

No files matched your search

-38
View File
@@ -1,38 +0,0 @@
import fs from 'node:fs';
import path from 'node:path';
export const spec = {
name: 'create-function',
description: 'Create a new function on this remote by writing a function module.',
parameters: {
type: 'object',
properties: {
name: { type: 'string', description: 'Function identifier.' },
description: { type: 'string', description: 'Description shown to the AI.' },
parameters: { type: 'object', description: 'OpenAI tool parameter schema for the function arguments.' },
code: { type: 'string', description: 'JavaScript statements forming the function body; `args` and `ctx` are in scope.' },
},
required: ['name', 'description', 'parameters', 'code'],
},
};
export default async function (args, ctx) {
const name = args.name;
if (typeof name !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(name)) {
throw new Error(`Invalid function name: ${JSON.stringify(name)}`);
}
const functionsDir = path.join(ctx.dir, '.remote', 'functions');
fs.mkdirSync(functionsDir, { recursive: true });
const moduleSource = `export const spec = ${JSON.stringify({
name,
description: args.description,
parameters: args.parameters,
}, null, 2)};
export default async function (args, ctx) {
${args.code}
}
`;
fs.writeFileSync(path.join(functionsDir, `${name}.mjs`), moduleSource);
return { created: name };
}
-26
View File
@@ -1,26 +0,0 @@
import fs from 'node:fs';
import path from 'node:path';
export const spec = {
name: 'delete-function',
description: 'Delete a function module from this remote.',
parameters: {
type: 'object',
properties: {
name: { type: 'string', description: 'Name of the function to delete.' },
},
required: ['name'],
},
};
export default async function (args, ctx) {
const functionsDir = path.join(ctx.dir, '.remote', 'functions');
for (const ext of ['.mjs', '.js']) {
const file = path.join(functionsDir, `${args.name}${ext}`);
if (fs.existsSync(file)) {
fs.unlinkSync(file);
return { deleted: args.name };
}
}
throw new Error(`No such function: ${args.name}`);
}
+49
View File
@@ -0,0 +1,49 @@
import fs from 'node:fs';
import path from 'node:path';
export const spec = {
name: 'list-dir',
description: 'List items in a directory. Takes a path argument and returns a list of strings representing the items in that directory.',
parameters: {
type: 'object',
properties: {
path: {
type: 'string',
description: 'Directory path relative to the space directory'
}
},
required: ['path']
}
};
function resolveIn(base, relPath) {
const resolved = path.resolve(base, relPath);
if (resolved !== base && !resolved.startsWith(base + path.sep)) {
throw new Error('Path escapes the space directory');
}
return resolved;
}
export default async function (args, ctx) {
const dirPath = resolveIn(ctx.dir, args.path);
// Check if path exists and is a directory
if (!fs.existsSync(dirPath)) {
throw new Error(`Directory not found: ${args.path}`);
}
if (!fs.statSync(dirPath).isDirectory()) {
throw new Error(`Path is not a directory: ${args.path}`);
}
// Read directory and format paths with trailing slash for directories
const items = [];
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
for (const entry of entries) {
const relPath = args.path ? `${args.path}/${entry.name}` : entry.name;
items.push(entry.isDirectory() ? `${relPath}/` : relPath);
}
return { items };
}
-21
View File
@@ -1,21 +0,0 @@
import fs from 'node:fs';
import path from 'node:path';
export const spec = {
name: 'list-files',
description: 'List every file in the space, as paths relative to the space directory.',
parameters: { type: 'object', properties: {} },
};
export default async function (args, ctx) {
const files = [];
const walk = (dir, prefix) => {
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
if (entry.isDirectory()) walk(path.join(dir, entry.name), rel);
else files.push(rel);
}
};
walk(ctx.dir, '');
return { files };
}