Index: pages/forge/forge.telefunc.ts
===================================================================
--- pages/forge/forge.telefunc.ts	(revision 98543934547eec4612872caf60e2c3b4464ff5e9)
+++ pages/forge/forge.telefunc.ts	(revision 8fe7f1a767c88b0e707d70ba86e48e5563ea908e)
@@ -5,20 +5,22 @@
 import {removeComponentFromBuild} from "../../database/drizzle/queries";
 
-export async function onSaveNewBuild({ name, description, componentIds }
-                                       : { name: string; description: string; componentIds: number[] }) {
+export async function onRemoveComponentFromBuild({ buildId, componentId }
+                                                 : { buildId: number, componentId: number }) {
     const { c, userId } = requireUser()
 
-    const newBuildId = await drizzleQueries.addNewBuild(c.db, userId, name, description, componentIds);
+    const result = await drizzleQueries.removeComponentFromBuild(c.db, userId, buildId, componentId);
 
-    if(!newBuildId) throw Abort();
+    if(!result) throw Abort();
 
     return { success: true };
 }
 
-export async function onRemoveComponentFromBuild({ buildId, componentId }
-                                                 : { buildId: number, componentId: number }) {
+export async function onAddComponentToBuild({ buildId, componentId }: { buildId: number, componentId: number }) {
     const { c, userId } = requireUser()
 
-    const result = await drizzleQueries.removeComponentFromBuild(c.db, buildId, componentId);
+    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+    if(!Number.isInteger(componentId) || componentId <= 0) throw Abort();
+
+    const result = await drizzleQueries.addComponentToBuild(c.db, userId, buildId, componentId);
 
     if(!result) throw Abort();
@@ -49,19 +51,6 @@
 }
 
-export async function onAddComponentToBuild({ buildId, componentId }: { buildId: number, componentId: number }) {
-    const { c, userId } = requireUser()
-
-    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
-    if(!Number.isInteger(componentId) || componentId <= 0) throw Abort();
-
-    const result = await drizzleQueries.addComponentToBuild(c.db, buildId, componentId);
-
-    if(!result) throw Abort();
-
-    return { success: true };
-}
-
 export async function onGetCompatibleComponents({ buildId, componentType, limit, sort }
-                                                : { db: Database, buildId: number, componentType: string, limit?: number, sort?: string }) {
+                                                : { buildId: number, componentType: string, limit?: number, sort?: string }) {
     const { c, userId } = requireUser()
 
@@ -74,2 +63,28 @@
     return compatibleComponents;
 }
+
+export async function onGetBuildState({ db, buildId}
+                                      :{ db: Database, buildId: number }) {
+    const { c, userId } = requireUser()
+
+    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+
+    const buildState = await drizzleQueries.getBuildState(c.db, userId, buildId);
+
+    if(!buildState) throw Abort();
+
+    return buildState;
+}
+
+export async function saveBuildState({ db, buildId, name, description }
+                                     :{ db: Database, buildId: number, name: string, description: string }) {
+    const { c, userId } = requireUser()
+
+    if(!Number.isInteger(buildId) || buildId <= 0) throw Abort();
+
+    const result = await drizzleQueries.saveBuildState(c.db, userId, buildId, name, description);
+
+    if(!result) throw Abort();
+
+    return { success: true };
+}
