History

Keep kernel core failures typed

Rhys Sullivan committed 6 months ago

Commit 025cdf61 parent b039b6e3 files · +16 −13Browse files

Unified · Split

3 files
  1. packages/kernel/core/src/code-recovery.ts +1 −0
  2. packages/kernel/core/src/effect-errors.ts +1 −3
  3. packages/kernel/core/src/validation.ts +14 −10
packages/kernel/core/src/code-recovery.ts+1−0
@@ -139,6 +139,7 @@ export const recoverExecutionBody = (code: string): string => { · 138 unmodified lines
139 const source = extractCandidateSource(code);139 const source = extractCandidateSource(code);
140 if (!source) return "";140 if (!source) return "";
141 141
142 // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: Babel parser throws for malformed candidate code, then recovery falls back to heuristics
142 try {143 try {
143 return renderParsedBody(source);144 return renderParsedBody(source);
144 } catch {145 } catch {
packages/kernel/core/src/effect-errors.ts+1−3
@@ -3,11 +3,9 @@ import * as Data from "effect/Data"; · 2 unmodified lines
3export class KernelCoreEffectError extends Data.TaggedError("KernelCoreEffectError")<{3export class KernelCoreEffectError extends Data.TaggedError("KernelCoreEffectError")<{
4 readonly module: string;4 readonly module: string;
5 readonly message: string;5 readonly message: string;
6 readonly cause?: unknown;
6}> {}7}> {}
7 8
8export const kernelCoreEffectError = (module: string, message: string) =>
9 new KernelCoreEffectError({ module, message });
10
11/**9/**
12 * Default failure type for any `CodeExecutor.execute` implementation —10 * Default failure type for any `CodeExecutor.execute` implementation —
13 * surfaces sandbox-level defects (isolate crash, module load failure,11 * surfaces sandbox-level defects (isolate crash, module load failure,
packages/kernel/core/src/validation.ts+14−10
@@ -1,7 +1,7 @@
1import type { StandardSchemaV1 } from "@standard-schema/spec";1import type { StandardSchemaV1 } from "@standard-schema/spec";
2import * as Effect from "effect/Effect";2import * as Effect from "effect/Effect";
3 3
4import { kernelCoreEffectError } from "./effect-errors";4import { KernelCoreEffectError } from "./effect-errors";
5 5
6const getSchemaValidator = (6const getSchemaValidator = (
7 schema: unknown,7 schema: unknown,
@@ -55,25 +55,29 @@ export const validateInput = (input: { · 47 unmodified lines
55 const validate = getSchemaValidator(input.schema);55 const validate = getSchemaValidator(input.schema);
56 if (!validate) {56 if (!validate) {
57 return Effect.fail(57 return Effect.fail(
58 kernelCoreEffectError(58 new KernelCoreEffectError({
59 "validation",59 module: "validation",
60 `Tool ${input.path} has no Standard Schema validator on inputSchema`,60 message: `Tool ${input.path} has no Standard Schema validator on inputSchema`,
61 ),61 }),
62 );62 );
63 }63 }
64 64
65 return Effect.tryPromise({65 return Effect.tryPromise({
66 try: () => Promise.resolve(validate(input.value)),66 try: () => Promise.resolve(validate(input.value)),
67 catch: (cause) =>67 catch: (cause) =>
68 kernelCoreEffectError("validation", `Validation error for ${input.path}: ${String(cause)}`),68 new KernelCoreEffectError({
69 module: "validation",
70 message: `Validation error for ${input.path}`,
71 cause,
72 }),
69 }).pipe(73 }).pipe(
70 Effect.flatMap((result) => {74 Effect.flatMap((result) => {
71 if ("issues" in result && result.issues) {75 if ("issues" in result && result.issues) {
72 return Effect.fail(76 return Effect.fail(
73 kernelCoreEffectError(77 new KernelCoreEffectError({
74 "validation",78 module: "validation",
75 `Input validation failed for ${input.path}: ${formatIssues(result.issues)}`,79 message: `Input validation failed for ${input.path}: ${formatIssues(result.issues)}`,
76 ),80 }),
77 );81 );
78 }82 }
79 return Effect.succeed(result.value);83 return Effect.succeed(result.value);