Submatter/apps/worker/src/env.ts

48 lines
1.4 KiB
TypeScript
Raw Normal View History

import { z } from "zod";
const envSchema = z.object({
DATABASE_URL: z.string().min(1),
REDIS_URL: z.string().min(1).optional(),
WORKER_DRY_RUN: z
.enum(["0", "1", "true", "false", ""])
.optional()
.transform((value) => value === "1" || value === "true"),
WORKER_BLPOP_TIMEOUT_S: z
.string()
.optional()
.transform((value) => {
const parsed = Number(value ?? "5");
return Number.isFinite(parsed) && parsed > 0 ? parsed : 5;
}),
WORKER_MAX_TOOL_STEPS: z
.string()
.optional()
.transform((value) => {
const parsed = Number(value ?? "12");
return Number.isFinite(parsed) && parsed > 0 ? parsed : 12;
}),
WORKER_CHECKPOINT_EVERY_N_STEPS: z
.string()
.optional()
.transform((value) => {
const parsed = Number(value ?? "1");
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : 1;
}),
WORKER_REPO_ROOT: z.string().optional(),
WORKER_WORKTREE_BASE: z
.string()
.optional()
.transform((value) => value?.trim() || "/tmp/echodo-worker-worktrees"),
});
export type WorkerEnv = z.infer<typeof envSchema>;
export function loadEnv(): WorkerEnv {
const parsed = envSchema.safeParse(process.env);
if (!parsed.success) {
console.error("[worker] Invalid environment:", parsed.error.flatten().fieldErrors);
process.exit(1);
}
return parsed.data;
}