From 025cdf68efdd5096d110daed2020237de60c8afd Mon Sep 17 00:00:00 2001 From: Rhys Sullivan <39114868+RhysSullivan@users.noreply.github.com> Date: Tue, 5 May 2026 22:10:55 -0700 Subject: [PATCH] Keep kernel core failures typed --- packages/kernel/core/src/code-recovery.ts | 1 + packages/kernel/core/src/effect-errors.ts | 4 +--- packages/kernel/core/src/validation.ts | 24 +++++++++++++---------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/packages/kernel/core/src/code-recovery.ts b/packages/kernel/core/src/code-recovery.ts index 58a7f4fe2..fb59f0fc1 100644 --- a/packages/kernel/core/src/code-recovery.ts +++ b/packages/kernel/core/src/code-recovery.ts @@ -139,6 +139,7 @@ export const recoverExecutionBody = (code: string): string => { const source = extractCandidateSource(code); if (!source) return ""; + // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: Babel parser throws for malformed candidate code, then recovery falls back to heuristics try { return renderParsedBody(source); } catch { diff --git a/packages/kernel/core/src/effect-errors.ts b/packages/kernel/core/src/effect-errors.ts index 26b5d7f8d..8e22d2406 100644 --- a/packages/kernel/core/src/effect-errors.ts +++ b/packages/kernel/core/src/effect-errors.ts @@ -3,11 +3,9 @@ import * as Data from "effect/Data"; export class KernelCoreEffectError extends Data.TaggedError("KernelCoreEffectError")<{ readonly module: string; readonly message: string; + readonly cause?: unknown; }> {} -export const kernelCoreEffectError = (module: string, message: string) => - new KernelCoreEffectError({ module, message }); - /** * Default failure type for any `CodeExecutor.execute` implementation — * surfaces sandbox-level defects (isolate crash, module load failure, diff --git a/packages/kernel/core/src/validation.ts b/packages/kernel/core/src/validation.ts index 4bfd41ca8..81ae3be1c 100644 --- a/packages/kernel/core/src/validation.ts +++ b/packages/kernel/core/src/validation.ts @@ -1,7 +1,7 @@ import type { StandardSchemaV1 } from "@standard-schema/spec"; import * as Effect from "effect/Effect"; -import { kernelCoreEffectError } from "./effect-errors"; +import { KernelCoreEffectError } from "./effect-errors"; const getSchemaValidator = ( schema: unknown, @@ -55,25 +55,29 @@ export const validateInput = (input: { const validate = getSchemaValidator(input.schema); if (!validate) { return Effect.fail( - kernelCoreEffectError( - "validation", - `Tool ${input.path} has no Standard Schema validator on inputSchema`, - ), + new KernelCoreEffectError({ + module: "validation", + message: `Tool ${input.path} has no Standard Schema validator on inputSchema`, + }), ); } return Effect.tryPromise({ try: () => Promise.resolve(validate(input.value)), catch: (cause) => - kernelCoreEffectError("validation", `Validation error for ${input.path}: ${String(cause)}`), + new KernelCoreEffectError({ + module: "validation", + message: `Validation error for ${input.path}`, + cause, + }), }).pipe( Effect.flatMap((result) => { if ("issues" in result && result.issues) { return Effect.fail( - kernelCoreEffectError( - "validation", - `Input validation failed for ${input.path}: ${formatIssues(result.issues)}`, - ), + new KernelCoreEffectError({ + module: "validation", + message: `Input validation failed for ${input.path}: ${formatIssues(result.issues)}`, + }), ); } return Effect.succeed(result.value);