From 6d18386473f6e62c84a7e38e18cf941e25bcaa1f Mon Sep 17 00:00:00 2001 From: plenarius Date: Mon, 20 Apr 2026 19:51:05 -0400 Subject: [PATCH] feat: add hak build pipeline --- packages/backend/src/routes/build.ts | 10 +++++++ .../backend/src/services/build.service.ts | 27 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/packages/backend/src/routes/build.ts b/packages/backend/src/routes/build.ts index ca2bf40..9ff5111 100644 --- a/packages/backend/src/routes/build.ts +++ b/packages/backend/src/routes/build.ts @@ -3,6 +3,7 @@ import { buildModule, hotReloadScripts, compileSingle, + buildHaks, } from "../services/build.service.js"; const router = Router(); @@ -47,4 +48,13 @@ router.post("/compile-single", async (req, res) => { } }); +router.post("/haks", async (_req, res) => { + try { + const result = await buildHaks(); + res.json(result); + } catch (err: any) { + res.status(500).json({ error: err.message }); + } +}); + export default router; diff --git a/packages/backend/src/services/build.service.ts b/packages/backend/src/services/build.service.ts index 03777bb..93958dc 100644 --- a/packages/backend/src/services/build.service.ts +++ b/packages/backend/src/services/build.service.ts @@ -93,3 +93,30 @@ export async function compileSingle( return { success: result.success, errors }; } + +export async function buildHaks(): Promise<{ + success: boolean; + output: string; +}> { + const workspacePath = getWorkspacePath(); + + broadcast("build", "start", { type: "haks" }); + + const result = await runEphemeralContainer({ + image: "layonara-builder", + cmd: ["layonara_nwn", "hak", "--yes"], + binds: [ + `${workspacePath}/repos/nwn-haks:/build/nwn-haks`, + `${workspacePath}/server/hak:/output/hak`, + `${workspacePath}/server/tlk:/output/tlk`, + ], + workingDir: "/build/nwn-haks", + }); + + const success = result.statusCode === 0; + broadcast("build", success ? "complete" : "failed", { + type: "haks", + exitCode: result.statusCode, + }); + return { success, output: result.output }; +}