94 lines · 3.0 KB · TypeScript
RawDownload
import { HttpApiBuilder } from "effect/unstable/httpapi";import { Effect } from "effect";import { Schema } from "effect"; import { ExecutorApi } from "../api";import { formatExecuteResult, formatPausedExecution } from "@executor-js/execution";import { ExecutionEngineService } from "../services";import { capture, captureEngineError } from "@executor-js/api"; class ExecutionNotFoundError extends Schema.TaggedErrorClass<ExecutionNotFoundError>()(  "ExecutionNotFoundError",  {    executionId: Schema.String,  },) {} export const ExecutionsHandlers = HttpApiBuilder.group(ExecutorApi, "executions", (handlers) =>  handlers    .handle("getPaused", ({ params: path }) =>      capture(        Effect.gen(function* () {          const engine = yield* ExecutionEngineService;          const paused = yield* captureEngineError(engine.getPausedExecution(path.executionId));           if (!paused) {            return yield* new ExecutionNotFoundError({ executionId: path.executionId });          }           return formatPausedExecution(paused);        }),      ),    )    .handle("execute", ({ payload }) =>      capture(        Effect.gen(function* () {          const engine = yield* ExecutionEngineService;          const outcome = yield* captureEngineError(            engine.executeWithPause(payload.code, { autoApprove: payload.autoApprove }),          );           if (outcome.status === "completed") {            const formatted = formatExecuteResult(outcome.result);            return {              status: "completed" as const,              text: formatted.text,              structured: formatted.structured,              isError: formatted.isError,            };          }           const formatted = formatPausedExecution(outcome.execution);          return {            status: "paused" as const,            text: formatted.text,            structured: formatted.structured,          };        }),      ),    )    .handle("resume", ({ params: path, payload }) =>      capture(        Effect.gen(function* () {          const engine = yield* ExecutionEngineService;          const result = yield* captureEngineError(            engine.resume(path.executionId, {              action: payload.action,              content: payload.content as Record<string, unknown> | undefined,            }),          );           if (!result) {            return yield* new ExecutionNotFoundError({ executionId: path.executionId });          }           if (result.status === "completed") {            const formatted = formatExecuteResult(result.result);            return {              status: "completed" as const,              text: formatted.text,              structured: formatted.structured,              isError: formatted.isError,            };          }           const formatted = formatPausedExecution(result.execution);          return {            status: "paused" as const,            text: formatted.text,            structured: formatted.structured,          };        }),      ),    ),);