Skip to content

Commit 05a174a

Browse files
authored
Merge pull request #20 from tylerslaton/workspace-fixes
feat: add the ability to change the workspace
2 parents 332ad3e + 2ac6774 commit 05a174a

File tree

16 files changed

+153
-44
lines changed

16 files changed

+153
-44
lines changed

actions/scripts/fetch.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ const external = (file: string): boolean => {
88
};
99

1010
export const path = async (file: string): Promise<string> => {
11-
if (!external(file)) return `${SCRIPTS_PATH}/${file}.gpt`;
11+
if (!external(file)) return `${SCRIPTS_PATH()}/${file}.gpt`;
1212
return file;
1313
};
1414

1515
export const fetchFullScript = async (file: string): Promise<Block[]> => {
16-
if (!external(file)) file = `${SCRIPTS_PATH}/${file}.gpt`;
16+
if (!external(file)) file = `${SCRIPTS_PATH()}/${file}.gpt`;
1717

1818
const gptscript = new GPTScript();
1919
try {
@@ -24,7 +24,7 @@ export const fetchFullScript = async (file: string): Promise<Block[]> => {
2424
}
2525

2626
export const fetchScript = async (file: string): Promise<Tool> => {
27-
if (!external(file)) file = `${SCRIPTS_PATH}/${file}.gpt`;
27+
if (!external(file)) file = `${SCRIPTS_PATH()}/${file}.gpt`;
2828

2929
const gptscript = new GPTScript();
3030
try {
@@ -44,15 +44,15 @@ export const fetchScript = async (file: string): Promise<Tool> => {
4444

4545
export const fetchScripts = async (): Promise<Record<string, string>> => {
4646
try {
47-
const files = await fs.readdir(SCRIPTS_PATH);
47+
const files = await fs.readdir(SCRIPTS_PATH());
4848
const gptFiles = files.filter(file => file.endsWith('.gpt'));
4949

5050
if (gptFiles.length === 0) throw new Error('no files found in scripts directory');
5151

5252
const gptscript = new GPTScript();
5353
const scripts: Record<string, string> = {};
5454
for (const file of gptFiles) {
55-
const script = await gptscript.parse(`${SCRIPTS_PATH}/${file}`);
55+
const script = await gptscript.parse(`${SCRIPTS_PATH()}/${file}`);
5656
let description = '';
5757
for (let tool of script) {
5858
if (tool.type === 'text') continue;
@@ -73,7 +73,7 @@ export const fetchScripts = async (): Promise<Record<string, string>> => {
7373
export const fetchScriptCode = async (file: string): Promise<string> => {
7474
file = file.includes('.gpt') ? file : `${file}.gpt`;
7575
try {
76-
return await fs.readFile(`${SCRIPTS_PATH}/${file}`, 'utf-8');
76+
return await fs.readFile(`${SCRIPTS_PATH()}/${file}`, 'utf-8');
7777
} catch (e) {
7878
throw e;
7979
}

actions/scripts/new.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import fs from 'fs/promises';
55

66
export async function newFile(name: string, instructions: string, fileName: string) {
77
try {
8-
const files = await fs.readdir(SCRIPTS_PATH);
8+
const files = await fs.readdir(SCRIPTS_PATH());
99
const gptFiles = files.filter(file => file.endsWith('.gpt'));
1010

1111
if(gptFiles.includes(fileName)) throw new Error('file already exists');
1212
if (!fileName.endsWith('.gpt')) {
1313
throw new Error('file cannot be empty and must end with .gpt');
1414
}
1515

16-
await fs.writeFile(`${SCRIPTS_PATH}/${fileName}`, `---\nName: ${name}\nChat: true\n\n${instructions}\n\n`);
16+
await fs.writeFile(`${SCRIPTS_PATH()}/${fileName}`, `---\nName: ${name}\nChat: true\n\n${instructions}\n\n`);
1717
return fileName.replace('.gpt', '')
1818
} catch (e) {
1919
throw e;

actions/scripts/update.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const external = (file: string): boolean => {
99
};
1010

1111
export const path = async (file: string): Promise<string> => {
12-
if (!external(file)) return `${SCRIPTS_PATH}/${file}.gpt`;
12+
if (!external(file)) return `${SCRIPTS_PATH()}/${file}.gpt`;
1313
return file;
1414
};
1515

@@ -18,7 +18,7 @@ export const updateScript = async (file: string, script: Block[]) => {
1818

1919
const gptscript = new GPTScript();
2020
try {
21-
await fs.writeFile(`${SCRIPTS_PATH}/${file}.gpt`, await gptscript.stringify(script));
21+
await fs.writeFile(`${SCRIPTS_PATH()}/${file}.gpt`, await gptscript.stringify(script));
2222
} catch (e) {
2323
throw e;
2424
}

components/script/chatBar/upload/actions.tsx renamed to actions/upload.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export async function uploadFile(formData: FormData) {
1010
const file = formData.get("file") as File;
1111
const arrayBuffer = await file.arrayBuffer();
1212
const buffer = new Uint8Array(arrayBuffer);
13-
await fs.writeFile(path.join(WORKSPACE_DIR,file.name), buffer);
13+
await fs.writeFile(path.join(WORKSPACE_DIR(),file.name), buffer);
1414
revalidatePath("/");
1515
}
1616

@@ -35,7 +35,7 @@ export async function deleteFile(path: string) {
3535

3636
export async function lsWorkspaceFiles(): Promise<string> {
3737
try {
38-
const dirents = await fs.readdir(WORKSPACE_DIR, { withFileTypes: true });
38+
const dirents = await fs.readdir(WORKSPACE_DIR(), { withFileTypes: true });
3939
const filesOnly = dirents.filter((dirent: Dirent) => !dirent.isDirectory());
4040
return JSON.stringify(filesOnly);
4141
} catch (e) {

actions/workspace.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
"use server"
2+
3+
import { WORKSPACE_DIR, set_WORKSPACE_DIR } from '@/config/env';
4+
5+
export const getWorkspaceDir = async () => WORKSPACE_DIR();
6+
export const setWorkspaceDir = async (dir: string) => set_WORKSPACE_DIR(dir);

app/api/file/[name]/[tool]/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ export async function PUT(
1515
try {
1616
const { name, tool } = params as any;
1717

18-
const script = await gptscript.parse(path.join(SCRIPTS_PATH,`${name}.gpt`));
18+
const script = await gptscript.parse(path.join(SCRIPTS_PATH(),`${name}.gpt`));
1919
const updatedScript = updateScript(script, tool, (await req.json()) as Tool);
2020

21-
await fs.writeFile(path.join(SCRIPTS_PATH,`${name}.gpt`), await gptscript.stringify(updatedScript));
22-
return Response.json(await gptscript.parse(path.join(SCRIPTS_PATH,`${name}.gpt`)));
21+
await fs.writeFile(path.join(SCRIPTS_PATH(),`${name}.gpt`), await gptscript.stringify(updatedScript));
22+
return Response.json(await gptscript.parse(path.join(SCRIPTS_PATH(),`${name}.gpt`)));
2323
} catch (e) {
2424
if (`${e}`.includes('no such file')){
2525
return Response.json({ error: '.gpt file not found' }, { status: 404 });

app/api/file/[name]/route.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export async function DELETE(
1919
) {
2020
try {
2121
const { name } = params as any;
22-
await fs.unlink(path.join(`${SCRIPTS_PATH}/${name}.gpt`));
22+
await fs.unlink(path.join(`${SCRIPTS_PATH()}/${name}.gpt`));
2323
return Response.json({ success: true });
2424
} catch (e) {
2525
return Response.json({ error: e }, { status: 500 });
@@ -28,7 +28,7 @@ export async function DELETE(
2828

2929
// export async function PUT(req: Request) {
3030
// try {
31-
// const scriptsPath = process.env.SCRIPTS_PATH || 'gptscripts';
31+
// const scriptsPath = process.env.SCRIPTS_PATH() || 'gptscripts';
3232
// const { name } = req.params as any;
3333
// const content = await req.text();
3434

@@ -46,7 +46,7 @@ export async function GET(
4646
) {
4747
try {
4848
const { name } = params as any;
49-
const script = await gptscript.parse(path.join(SCRIPTS_PATH,`${name}.gpt`));
49+
const script = await gptscript.parse(path.join(SCRIPTS_PATH(),`${name}.gpt`));
5050
if (req.nextUrl.searchParams.get('nodeify') === 'true') {
5151
const { nodes, edges } = await nodeify(script);
5252
return Response.json({ nodes: nodes, edges: edges });
@@ -69,8 +69,8 @@ export async function PUT(
6969
const nodes = (await req.json()) as RFNode[];
7070
const script = denodeify(nodes);
7171

72-
await fs.writeFile(path.join(SCRIPTS_PATH,`${name}.gpt`), await gptscript.stringify(script));
73-
return Response.json(await gptscript.parse(path.join(SCRIPTS_PATH,`${name}.gpt`)));
72+
await fs.writeFile(path.join(SCRIPTS_PATH(),`${name}.gpt`), await gptscript.stringify(script));
73+
return Response.json(await gptscript.parse(path.join(SCRIPTS_PATH(),`${name}.gpt`)));
7474
} catch (e) {
7575
if (`${e}`.includes('no such file')){
7676
return Response.json({ error: '.gpt file not found' }, { status: 404 });

app/api/file/route.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ const gptscript = new GPTScript();
77

88
export async function GET() {
99
try {
10-
const files = await fs.readdir(SCRIPTS_PATH);
10+
const files = await fs.readdir(SCRIPTS_PATH());
1111
const gptFiles = files.filter(file => file.endsWith('.gpt'));
1212

1313
if (gptFiles.length === 0)
1414
return Response.json({ error: 'no .gpt files found' }, { status: 404 });
1515

1616
const scripts: Record<string, string> = {};
1717
for (const file of gptFiles) {
18-
const script = await gptscript.parse(`${SCRIPTS_PATH}/${file}`);
18+
const script = await gptscript.parse(`${SCRIPTS_PATH()}/${file}`);
1919
let description = '';
2020
for (let tool of script) {
2121
if (tool.type === 'text') continue;
22-
description = tool.description;
22+
description = tool.description || '';
2323
break;
2424
}
2525
scripts[file] = description || '';
@@ -38,7 +38,7 @@ export async function GET() {
3838

3939
export async function POST(_req: Request) {
4040
try {
41-
const files = await fs.readdir(SCRIPTS_PATH);
41+
const files = await fs.readdir(SCRIPTS_PATH());
4242
const gptFiles = files.filter(file => file.endsWith('.gpt'));
4343

4444
let id = 0;
@@ -47,7 +47,7 @@ export async function POST(_req: Request) {
4747
id++;
4848
newFileName = `new-file-${id}.gpt`;
4949
}
50-
await fs.writeFile(`${SCRIPTS_PATH}/${newFileName}`, '---\nname: main');
50+
await fs.writeFile(`${SCRIPTS_PATH()}/${newFileName}`, '---\nname: main');
5151
return Response.json({ file: newFileName });
5252
} catch (e) {
5353
return Response.json({ error: e }, { status: 500 });

components/script.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Loading from "@/components/loading";
99
import useChatSocket from '@/components/script/useChatSocket';
1010
import { Button } from "@nextui-org/react";
1111
import { fetchScript, path } from "@/actions/scripts/fetch";
12+
import { getWorkspaceDir } from "@/actions/workspace";
1213

1314
interface ScriptProps {
1415
file: string;
@@ -34,7 +35,12 @@ const Script: React.FC<ScriptProps> = ({ file, className, messagesHeight = 'h-fu
3435
useEffect(() => {
3536
if (hasRun || !socket || !connected) return;
3637
if ( !tool.arguments?.properties || Object.keys(tool.arguments.properties).length === 0 ) {
37-
path(file).then((path) => { socket.emit("run", path, tool.name, formValues) });
38+
path(file)
39+
.then(async (path) => {
40+
const workspace = await getWorkspaceDir()
41+
return { path, workspace}
42+
})
43+
.then(({path, workspace}) => { socket.emit("run", path, tool.name, formValues, workspace) });
3844
setHasRun(true);
3945
}
4046
}, [tool, file, formValues]);

components/script/chatBar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const ChatBar = ({
6767
onPress={onRestart}
6868
/>
6969
</Tooltip>
70-
<Upload />
70+
<Upload onRestart={onRestart}/>
7171
<Textarea
7272
id="chatInput"
7373
autoComplete="off"

0 commit comments

Comments
 (0)