import type { TypedResponse } from "@remix-run/server-runtime"; import { json } from "@remix-run/server-runtime"; import type { MachinePreset } from "@trigger.dev/core/v3"; import { SemanticInternalAttributes } from "@trigger.dev/core/v3"; import type { AuthenticatedEnvironment } from "@trigger.dev/core/v3/auth/environment"; import { RunId, SnapshotId } from "@trigger.dev/core/v3/isomorphic"; import type { WorkerApiRunAttemptStartResponseBody } from "@trigger.dev/core/v3/workers"; import { WorkerApiRunAttemptStartRequestBody } from "@trigger.dev/core/v3/workers"; import { z } from "zod"; import { prisma } from "~/db.server"; import { generateJWTTokenForEnvironment } from "~/services/apiAuth.server"; import { logger } from "~/services/logger.server"; import { defaultMachine } from "~/services/platform.v3.server"; import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server"; import { resolveVariablesForEnvironment } from "~/v3/environmentVariables/environmentVariablesRepository.server"; import { machinePresetFromName } from "~/v3/machinePresets.server"; import { engine } from "~/v3/runEngine.server"; import { runStore } from "~/v3/runStore.server"; const { action } = createActionApiRoute( { body: WorkerApiRunAttemptStartRequestBody, params: z.object({ runFriendlyId: z.string(), snapshotFriendlyId: z.string(), }), method: "POST", }, async ({ authentication, body, params, }): Promise> => { const { runFriendlyId, snapshotFriendlyId } = params; try { const run = await runStore.findRun( { friendlyId: params.runFriendlyId, runtimeEnvironmentId: authentication.environment.id, }, prisma ); if (!run) { throw new Response("You don't have permissions for this run", { status: 401 }); } const engineResult = await engine.startRunAttempt({ runId: RunId.toId(runFriendlyId), snapshotId: SnapshotId.toId(snapshotFriendlyId), }); const defaultMachinePreset = machinePresetFromName(defaultMachine); const envVars = await getEnvVars( authentication.environment, engineResult.run.id, engineResult.execution.machine ?? defaultMachinePreset, engineResult.run.taskEventStore ); return json({ ...engineResult, envVars, }); } catch (error) { logger.error("Failed to record dev log", { environmentId: authentication.environment.id, error, }); throw error; } } ); async function getEnvVars( environment: AuthenticatedEnvironment, runId: string, machinePreset: MachinePreset, taskEventStore?: string ): Promise> { const variables = await resolveVariablesForEnvironment(environment); const jwt = await generateJWTTokenForEnvironment(environment, { run_id: runId, machine_preset: machinePreset.name, }); variables.push( ...[ { key: "TRIGGER_JWT", value: jwt }, { key: "TRIGGER_RUN_ID", value: runId }, { key: "TRIGGER_MACHINE_PRESET", value: machinePreset.name }, ] ); if (taskEventStore) { const resourceAttributes = JSON.stringify({ [SemanticInternalAttributes.TASK_EVENT_STORE]: taskEventStore, }); variables.push( ...[ { key: "OTEL_RESOURCE_ATTRIBUTES", value: resourceAttributes }, { key: "TRIGGER_OTEL_RESOURCE_ATTRIBUTES", value: resourceAttributes }, ] ); } return variables.reduce((acc: Record, curr) => { acc[curr.key] = curr.value; return acc; }, {}); } export { action };