@executor-js/codemode-core 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -74,7 +74,7 @@ var validateInput = (input) => {
74
74
  };
75
75
 
76
76
  // src/json-schema.ts
77
- import Ajv2020 from "ajv/dist/2020";
77
+ import Ajv2020 from "ajv/dist/2020.js";
78
78
  import addFormats from "ajv-formats";
79
79
  var ajv = new Ajv2020({
80
80
  allErrors: true,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/validation.ts","../src/effect-errors.ts","../src/json-schema.ts","../src/code-recovery.ts","../src/strip-types.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type * as Cause from \"effect/Cause\";\nimport type * as Effect from \"effect/Effect\";\n\nimport type { CodeExecutionError } from \"./effect-errors\";\n\n/** Branded tool path */\nexport type ToolPath = string & { readonly __toolPath: unique symbol };\n\nexport const asToolPath = (value: string): ToolPath => value as ToolPath;\n\n/** Standard Schema alias */\nexport type StandardSchema<Input = unknown, Output = unknown> = StandardSchemaV1<Input, Output>;\n\n/** A tool that can be invoked */\nexport interface Tool {\n readonly path: ToolPath;\n readonly description?: string;\n readonly inputSchema: StandardSchema;\n readonly outputSchema?: StandardSchema;\n readonly execute: (input: unknown) => unknown | Promise<unknown>;\n}\n\n/** Invoke a tool by path from inside a sandbox */\nexport interface SandboxToolInvoker {\n invoke(input: { path: string; args: unknown }): Effect.Effect<unknown, unknown, never>;\n}\n\n/** Result of executing code in a sandbox */\nexport type ExecuteResult = {\n result: unknown;\n error?: string;\n logs?: string[];\n};\n\n/**\n * Executes code in a sandboxed runtime with tool access.\n *\n * Error channel is constrained to Effect's `YieldableError` (the base\n * shape `Data.TaggedError(...)` produces) so callers always get a\n * structurally tagged error, never untyped `unknown`. Defaults to\n * `CodeExecutionError`; runtimes can parameterize with their own\n * `Data.TaggedError` subclass — e.g. `CodeExecutor<WorkerLoaderError>`.\n */\nexport interface CodeExecutor<E extends Cause.YieldableError = CodeExecutionError> {\n execute(code: string, toolInvoker: SandboxToolInvoker): Effect.Effect<ExecuteResult, E>;\n}\n\n/** Accept-anything schema for tools with no input validation */\nexport const unknownInputSchema: StandardSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"@executor-js/codemode-core\",\n validate: (value: unknown) => ({\n value,\n }),\n },\n};\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport * as Effect from \"effect/Effect\";\n\nimport { KernelCoreEffectError } from \"./effect-errors\";\n\nconst getSchemaValidator = (\n schema: unknown,\n):\n | ((\n value: unknown,\n ) => StandardSchemaV1.Result<unknown> | Promise<StandardSchemaV1.Result<unknown>>)\n | null => {\n if (!schema || (typeof schema !== \"object\" && typeof schema !== \"function\")) {\n return null;\n }\n\n const standard = (schema as { \"~standard\"?: unknown })[\"~standard\"];\n if (!standard || typeof standard !== \"object\") {\n return null;\n }\n\n const validate = (standard as { validate?: unknown }).validate;\n return typeof validate === \"function\"\n ? (validate as (\n value: unknown,\n ) => StandardSchemaV1.Result<unknown> | Promise<StandardSchemaV1.Result<unknown>>)\n : null;\n};\n\nconst formatIssuePath = (\n path: ReadonlyArray<PropertyKey | StandardSchemaV1.PathSegment> | undefined,\n): string => {\n if (!path || path.length === 0) {\n return \"$\";\n }\n\n return path\n .map((segment) =>\n typeof segment === \"object\" && segment !== null && \"key\" in segment\n ? String(segment.key)\n : String(segment),\n )\n .join(\".\");\n};\n\nconst formatIssues = (issues: ReadonlyArray<StandardSchemaV1.Issue>): string =>\n issues.map((issue) => `${formatIssuePath(issue.path)}: ${issue.message}`).join(\"; \");\n\n/** Validate a value against a Standard Schema */\nexport const validateInput = (input: {\n schema: unknown;\n value: unknown;\n path: string;\n}): Effect.Effect<unknown, Error> => {\n const validate = getSchemaValidator(input.schema);\n if (!validate) {\n return Effect.fail(\n new KernelCoreEffectError({\n module: \"validation\",\n message: `Tool ${input.path} has no Standard Schema validator on inputSchema`,\n }),\n );\n }\n\n return Effect.tryPromise({\n try: () => Promise.resolve(validate(input.value)),\n catch: (cause) =>\n new KernelCoreEffectError({\n module: \"validation\",\n message: `Validation error for ${input.path}`,\n cause,\n }),\n }).pipe(\n Effect.flatMap((result) => {\n if (\"issues\" in result && result.issues) {\n return Effect.fail(\n new KernelCoreEffectError({\n module: \"validation\",\n message: `Input validation failed for ${input.path}: ${formatIssues(result.issues)}`,\n }),\n );\n }\n return Effect.succeed(result.value);\n }),\n );\n};\n","import * as Data from \"effect/Data\";\n\nexport class KernelCoreEffectError extends Data.TaggedError(\"KernelCoreEffectError\")<{\n readonly module: string;\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\n/**\n * Default failure type for any `CodeExecutor.execute` implementation —\n * surfaces sandbox-level defects (isolate crash, module load failure,\n * worker loader error) as a typed error so callers can handle them\n * structurally instead of untyped `unknown`. Runtimes that want a\n * narrower error shape can define their own `Data.TaggedError` subclass\n * and parameterize `CodeExecutor<MyError>`.\n */\nexport class CodeExecutionError extends Data.TaggedError(\"CodeExecutionError\")<{\n readonly runtime: string;\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n","import type { ErrorObject } from \"ajv\";\nimport Ajv2020 from \"ajv/dist/2020\";\nimport addFormats from \"ajv-formats\";\n\nimport type { StandardSchema } from \"./types\";\nimport { unknownInputSchema } from \"./types\";\n\nconst ajv = new Ajv2020({\n allErrors: true,\n strict: false,\n validateSchema: false,\n allowUnionTypes: true,\n});\n\naddFormats(ajv);\n\nconst decodePointerSegment = (segment: string): PropertyKey => {\n const decoded = segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n return /^\\d+$/.test(decoded) ? Number(decoded) : decoded;\n};\n\nconst pointerToPath = (pointer: string | undefined): ReadonlyArray<PropertyKey> | undefined => {\n if (!pointer || pointer.length === 0 || pointer === \"/\") {\n return undefined;\n }\n\n return pointer\n .split(\"/\")\n .slice(1)\n .filter((segment) => segment.length > 0)\n .map(decodePointerSegment);\n};\n\nconst toIssueMessage = (error: ErrorObject): string => {\n const keyword = error.keyword.trim();\n // oxlint-disable-next-line executor/no-unknown-error-message -- typed AJV ErrorObject exposes optional validation message copy\n const message = (error.message ?? \"Invalid value\").trim();\n return keyword.length > 0 ? `${keyword}: ${message}` : message;\n};\n\nexport const standardSchemaFromJsonSchema = (\n schema: unknown,\n options?: {\n vendor?: string;\n fallback?: StandardSchema;\n },\n): StandardSchema => {\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: AJV compile throws for invalid schemas and this adapter preserves fallback behavior\n try {\n const validate = ajv.compile(schema as Record<string, unknown>);\n\n return {\n \"~standard\": {\n version: 1,\n vendor: options?.vendor ?? \"json-schema\",\n validate: (value: unknown) => {\n const valid = validate(value);\n if (valid) {\n return { value };\n }\n\n const issues = (validate.errors ?? []).map((error) => ({\n message: toIssueMessage(error),\n path: pointerToPath(error.instancePath),\n }));\n\n return {\n issues: issues.length > 0 ? issues : [{ message: \"Invalid value\" }],\n };\n },\n },\n };\n } catch {\n return options?.fallback ?? unknownInputSchema;\n }\n};\n","import { parse } from \"@babel/parser\";\n\nconst FENCED_CODE_BLOCK = /```(?:[^\\n`]*)?\\s*\\n([\\s\\S]*?)```/i;\nconst FUNCTION_DECLARATION = /^(?:async\\s+)?function(?:\\s+([a-zA-Z_$][a-zA-Z0-9_$]*))?\\s*\\(/;\nconst CALLABLE_ERROR = \"Code must evaluate to a function\";\n\nconst extractCandidateSource = (code: string): string => {\n const trimmed = code.trim();\n if (!trimmed) return \"\";\n\n const fenced = trimmed.match(FENCED_CODE_BLOCK)?.[1];\n return (fenced ?? trimmed).trim();\n};\n\nconst wrapCallableBody = (source: string): string =>\n [\n \"const __fn = (\",\n source,\n \");\",\n `if (typeof __fn !== \"function\") throw new Error(${JSON.stringify(CALLABLE_ERROR)});`,\n \"return await __fn();\",\n ].join(\"\\n\");\n\nconst wrapNamedFunctionBody = (source: string, name: string): string =>\n [source, `return await ${name}();`].join(\"\\n\");\n\nconst wrapAnonymousFunctionBody = (source: string): string => `return await (${source})();`;\n\nconst sliceNode = (\n source: string,\n node: {\n start?: number | null;\n end?: number | null;\n },\n): string => {\n const start = node.start ?? 0;\n const end = node.end ?? source.length;\n return source.slice(start, end);\n};\n\nconst unwrapExpression = (expression: { type: string; expression?: unknown }): unknown => {\n switch (expression.type) {\n case \"ParenthesizedExpression\":\n case \"TSAsExpression\":\n case \"TSSatisfiesExpression\":\n case \"TSTypeAssertion\":\n case \"TSNonNullExpression\":\n case \"TSInstantiationExpression\":\n return expression.expression\n ? unwrapExpression(expression.expression as { type: string })\n : expression;\n default:\n return expression;\n }\n};\n\nconst renderExportDefaultBody = (\n source: string,\n declaration: ExportDefaultDeclarationNode,\n): string => {\n if (declaration.type === \"FunctionDeclaration\") {\n const fnSource = sliceNode(source, declaration);\n const name = declaration.id?.name;\n return name ? wrapNamedFunctionBody(fnSource, name) : wrapAnonymousFunctionBody(fnSource);\n }\n\n const expression = unwrapExpression(declaration) as {\n type?: string;\n };\n const expressionSource = sliceNode(source, declaration);\n\n if (expression?.type === \"ArrowFunctionExpression\" || expression?.type === \"FunctionExpression\") {\n return wrapCallableBody(expressionSource);\n }\n\n return `return (${expressionSource});`;\n};\n\ntype ExportDefaultDeclarationNode = {\n type: string;\n start?: number | null;\n end?: number | null;\n id?: { name?: string | null } | null;\n expression?: unknown;\n};\n\nconst renderParsedBody = (source: string): string => {\n const program = parse(source, {\n sourceType: \"module\",\n allowAwaitOutsideFunction: true,\n allowReturnOutsideFunction: true,\n allowImportExportEverywhere: true,\n plugins: [\"typescript\"],\n }).program;\n\n if (program.body.length !== 1) return source;\n\n const [statement] = program.body;\n if (!statement) return source;\n\n switch (statement.type) {\n case \"ExpressionStatement\": {\n const expression = unwrapExpression(\n statement.expression as { type: string; expression?: unknown },\n ) as {\n type?: string;\n };\n return expression?.type === \"ArrowFunctionExpression\" ||\n expression?.type === \"FunctionExpression\"\n ? wrapCallableBody(source)\n : source;\n }\n case \"FunctionDeclaration\":\n return statement.id?.name ? wrapNamedFunctionBody(source, statement.id.name) : source;\n case \"ExportDefaultDeclaration\":\n return renderExportDefaultBody(source, statement.declaration);\n default:\n return source;\n }\n};\n\nconst renderHeuristicBody = (source: string): string => {\n const withoutDefaultExport = source.replace(/^export\\s+default\\s+/, \"\").trim();\n\n if (\n (withoutDefaultExport.startsWith(\"async\") || withoutDefaultExport.startsWith(\"(\")) &&\n withoutDefaultExport.includes(\"=>\")\n ) {\n return wrapCallableBody(withoutDefaultExport);\n }\n\n if (FUNCTION_DECLARATION.test(withoutDefaultExport)) {\n const name = withoutDefaultExport.match(FUNCTION_DECLARATION)?.[1];\n return name\n ? wrapNamedFunctionBody(withoutDefaultExport, name)\n : wrapAnonymousFunctionBody(withoutDefaultExport);\n }\n\n return withoutDefaultExport;\n};\n\nexport const recoverExecutionBody = (code: string): string => {\n const source = extractCandidateSource(code);\n if (!source) return \"\";\n\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: Babel parser throws for malformed candidate code, then recovery falls back to heuristics\n try {\n return renderParsedBody(source);\n } catch {\n return renderHeuristicBody(source);\n }\n};\n","import { transform } from \"sucrase\";\n\n/**\n * Strip TypeScript type syntax (`: T`, `as T`, `<T>`, type aliases,\n * interfaces, etc.) from user-submitted code so it can run in a\n * JavaScript-only sandbox (workerd's WorkerLoader, QuickJS, raw V8).\n * Deno-style runtimes that handle TypeScript natively should skip\n * this step — they get better source-map fidelity by parsing the\n * original input.\n *\n * The execute tool description tells callers to write TypeScript, and\n * `tools.describe.tool` hands them TypeScript shapes — without stripping,\n * a single `: number` annotation throws \"Unexpected token ':'\" inside\n * the sandbox, which used to surface as a 180s client-side timeout\n * before the engine `raceFirst` fix.\n *\n * Sucrase's TypeScript transform is purely syntactic — no semantic\n * checks, no decorator metadata — which keeps the cost low and matches\n * what `tsc --isolatedModules` / Node's experimental type-stripping do.\n *\n * On parse failure we rethrow the original error so the caller can map\n * it into the runtime's tagged error type. We deliberately do NOT fall\n * back to the raw input — passing TS syntax through to a JS-only\n * sandbox trades a clean error here for an opaque one downstream.\n */\nexport const stripTypeScript = (code: string): string =>\n transform(code, {\n transforms: [\"typescript\"],\n // No JSX in user code, no React-specific transforms. `disableESTransforms`\n // keeps sucrase from rewriting `import`/`export` etc — we want only\n // type-syntax removal.\n disableESTransforms: true,\n keepUnusedImports: true,\n }).code;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/types.ts","../src/validation.ts","../src/effect-errors.ts","../src/json-schema.ts","../src/code-recovery.ts","../src/strip-types.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type * as Cause from \"effect/Cause\";\nimport type * as Effect from \"effect/Effect\";\n\nimport type { CodeExecutionError } from \"./effect-errors\";\n\n/** Branded tool path */\nexport type ToolPath = string & { readonly __toolPath: unique symbol };\n\nexport const asToolPath = (value: string): ToolPath => value as ToolPath;\n\n/** Standard Schema alias */\nexport type StandardSchema<Input = unknown, Output = unknown> = StandardSchemaV1<Input, Output>;\n\n/** A tool that can be invoked */\nexport interface Tool {\n readonly path: ToolPath;\n readonly description?: string;\n readonly inputSchema: StandardSchema;\n readonly outputSchema?: StandardSchema;\n readonly execute: (input: unknown) => unknown | Promise<unknown>;\n}\n\n/** Invoke a tool by path from inside a sandbox */\nexport interface SandboxToolInvoker {\n invoke(input: { path: string; args: unknown }): Effect.Effect<unknown, unknown, never>;\n}\n\n/** Result of executing code in a sandbox */\nexport type ExecuteResult = {\n result: unknown;\n error?: string;\n logs?: string[];\n};\n\n/**\n * Executes code in a sandboxed runtime with tool access.\n *\n * Error channel is constrained to Effect's `YieldableError` (the base\n * shape `Data.TaggedError(...)` produces) so callers always get a\n * structurally tagged error, never untyped `unknown`. Defaults to\n * `CodeExecutionError`; runtimes can parameterize with their own\n * `Data.TaggedError` subclass — e.g. `CodeExecutor<WorkerLoaderError>`.\n */\nexport interface CodeExecutor<E extends Cause.YieldableError = CodeExecutionError> {\n execute(code: string, toolInvoker: SandboxToolInvoker): Effect.Effect<ExecuteResult, E>;\n}\n\n/** Accept-anything schema for tools with no input validation */\nexport const unknownInputSchema: StandardSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"@executor-js/codemode-core\",\n validate: (value: unknown) => ({\n value,\n }),\n },\n};\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport * as Effect from \"effect/Effect\";\n\nimport { KernelCoreEffectError } from \"./effect-errors\";\n\nconst getSchemaValidator = (\n schema: unknown,\n):\n | ((\n value: unknown,\n ) => StandardSchemaV1.Result<unknown> | Promise<StandardSchemaV1.Result<unknown>>)\n | null => {\n if (!schema || (typeof schema !== \"object\" && typeof schema !== \"function\")) {\n return null;\n }\n\n const standard = (schema as { \"~standard\"?: unknown })[\"~standard\"];\n if (!standard || typeof standard !== \"object\") {\n return null;\n }\n\n const validate = (standard as { validate?: unknown }).validate;\n return typeof validate === \"function\"\n ? (validate as (\n value: unknown,\n ) => StandardSchemaV1.Result<unknown> | Promise<StandardSchemaV1.Result<unknown>>)\n : null;\n};\n\nconst formatIssuePath = (\n path: ReadonlyArray<PropertyKey | StandardSchemaV1.PathSegment> | undefined,\n): string => {\n if (!path || path.length === 0) {\n return \"$\";\n }\n\n return path\n .map((segment) =>\n typeof segment === \"object\" && segment !== null && \"key\" in segment\n ? String(segment.key)\n : String(segment),\n )\n .join(\".\");\n};\n\nconst formatIssues = (issues: ReadonlyArray<StandardSchemaV1.Issue>): string =>\n issues.map((issue) => `${formatIssuePath(issue.path)}: ${issue.message}`).join(\"; \");\n\n/** Validate a value against a Standard Schema */\nexport const validateInput = (input: {\n schema: unknown;\n value: unknown;\n path: string;\n}): Effect.Effect<unknown, Error> => {\n const validate = getSchemaValidator(input.schema);\n if (!validate) {\n return Effect.fail(\n new KernelCoreEffectError({\n module: \"validation\",\n message: `Tool ${input.path} has no Standard Schema validator on inputSchema`,\n }),\n );\n }\n\n return Effect.tryPromise({\n try: () => Promise.resolve(validate(input.value)),\n catch: (cause) =>\n new KernelCoreEffectError({\n module: \"validation\",\n message: `Validation error for ${input.path}`,\n cause,\n }),\n }).pipe(\n Effect.flatMap((result) => {\n if (\"issues\" in result && result.issues) {\n return Effect.fail(\n new KernelCoreEffectError({\n module: \"validation\",\n message: `Input validation failed for ${input.path}: ${formatIssues(result.issues)}`,\n }),\n );\n }\n return Effect.succeed(result.value);\n }),\n );\n};\n","import * as Data from \"effect/Data\";\n\nexport class KernelCoreEffectError extends Data.TaggedError(\"KernelCoreEffectError\")<{\n readonly module: string;\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\n/**\n * Default failure type for any `CodeExecutor.execute` implementation —\n * surfaces sandbox-level defects (isolate crash, module load failure,\n * worker loader error) as a typed error so callers can handle them\n * structurally instead of untyped `unknown`. Runtimes that want a\n * narrower error shape can define their own `Data.TaggedError` subclass\n * and parameterize `CodeExecutor<MyError>`.\n */\nexport class CodeExecutionError extends Data.TaggedError(\"CodeExecutionError\")<{\n readonly runtime: string;\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n","import type { ErrorObject } from \"ajv\";\nimport Ajv2020 from \"ajv/dist/2020.js\";\nimport addFormats from \"ajv-formats\";\n\nimport type { StandardSchema } from \"./types\";\nimport { unknownInputSchema } from \"./types\";\n\nconst ajv = new Ajv2020({\n allErrors: true,\n strict: false,\n validateSchema: false,\n allowUnionTypes: true,\n});\n\naddFormats(ajv);\n\nconst decodePointerSegment = (segment: string): PropertyKey => {\n const decoded = segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n return /^\\d+$/.test(decoded) ? Number(decoded) : decoded;\n};\n\nconst pointerToPath = (pointer: string | undefined): ReadonlyArray<PropertyKey> | undefined => {\n if (!pointer || pointer.length === 0 || pointer === \"/\") {\n return undefined;\n }\n\n return pointer\n .split(\"/\")\n .slice(1)\n .filter((segment) => segment.length > 0)\n .map(decodePointerSegment);\n};\n\nconst toIssueMessage = (error: ErrorObject): string => {\n const keyword = error.keyword.trim();\n // oxlint-disable-next-line executor/no-unknown-error-message -- typed AJV ErrorObject exposes optional validation message copy\n const message = (error.message ?? \"Invalid value\").trim();\n return keyword.length > 0 ? `${keyword}: ${message}` : message;\n};\n\nexport const standardSchemaFromJsonSchema = (\n schema: unknown,\n options?: {\n vendor?: string;\n fallback?: StandardSchema;\n },\n): StandardSchema => {\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: AJV compile throws for invalid schemas and this adapter preserves fallback behavior\n try {\n const validate = ajv.compile(schema as Record<string, unknown>);\n\n return {\n \"~standard\": {\n version: 1,\n vendor: options?.vendor ?? \"json-schema\",\n validate: (value: unknown) => {\n const valid = validate(value);\n if (valid) {\n return { value };\n }\n\n const issues = (validate.errors ?? []).map((error) => ({\n message: toIssueMessage(error),\n path: pointerToPath(error.instancePath),\n }));\n\n return {\n issues: issues.length > 0 ? issues : [{ message: \"Invalid value\" }],\n };\n },\n },\n };\n } catch {\n return options?.fallback ?? unknownInputSchema;\n }\n};\n","import { parse } from \"@babel/parser\";\n\nconst FENCED_CODE_BLOCK = /```(?:[^\\n`]*)?\\s*\\n([\\s\\S]*?)```/i;\nconst FUNCTION_DECLARATION = /^(?:async\\s+)?function(?:\\s+([a-zA-Z_$][a-zA-Z0-9_$]*))?\\s*\\(/;\nconst CALLABLE_ERROR = \"Code must evaluate to a function\";\n\nconst extractCandidateSource = (code: string): string => {\n const trimmed = code.trim();\n if (!trimmed) return \"\";\n\n const fenced = trimmed.match(FENCED_CODE_BLOCK)?.[1];\n return (fenced ?? trimmed).trim();\n};\n\nconst wrapCallableBody = (source: string): string =>\n [\n \"const __fn = (\",\n source,\n \");\",\n `if (typeof __fn !== \"function\") throw new Error(${JSON.stringify(CALLABLE_ERROR)});`,\n \"return await __fn();\",\n ].join(\"\\n\");\n\nconst wrapNamedFunctionBody = (source: string, name: string): string =>\n [source, `return await ${name}();`].join(\"\\n\");\n\nconst wrapAnonymousFunctionBody = (source: string): string => `return await (${source})();`;\n\nconst sliceNode = (\n source: string,\n node: {\n start?: number | null;\n end?: number | null;\n },\n): string => {\n const start = node.start ?? 0;\n const end = node.end ?? source.length;\n return source.slice(start, end);\n};\n\nconst unwrapExpression = (expression: { type: string; expression?: unknown }): unknown => {\n switch (expression.type) {\n case \"ParenthesizedExpression\":\n case \"TSAsExpression\":\n case \"TSSatisfiesExpression\":\n case \"TSTypeAssertion\":\n case \"TSNonNullExpression\":\n case \"TSInstantiationExpression\":\n return expression.expression\n ? unwrapExpression(expression.expression as { type: string })\n : expression;\n default:\n return expression;\n }\n};\n\nconst renderExportDefaultBody = (\n source: string,\n declaration: ExportDefaultDeclarationNode,\n): string => {\n if (declaration.type === \"FunctionDeclaration\") {\n const fnSource = sliceNode(source, declaration);\n const name = declaration.id?.name;\n return name ? wrapNamedFunctionBody(fnSource, name) : wrapAnonymousFunctionBody(fnSource);\n }\n\n const expression = unwrapExpression(declaration) as {\n type?: string;\n };\n const expressionSource = sliceNode(source, declaration);\n\n if (expression?.type === \"ArrowFunctionExpression\" || expression?.type === \"FunctionExpression\") {\n return wrapCallableBody(expressionSource);\n }\n\n return `return (${expressionSource});`;\n};\n\ntype ExportDefaultDeclarationNode = {\n type: string;\n start?: number | null;\n end?: number | null;\n id?: { name?: string | null } | null;\n expression?: unknown;\n};\n\nconst renderParsedBody = (source: string): string => {\n const program = parse(source, {\n sourceType: \"module\",\n allowAwaitOutsideFunction: true,\n allowReturnOutsideFunction: true,\n allowImportExportEverywhere: true,\n plugins: [\"typescript\"],\n }).program;\n\n if (program.body.length !== 1) return source;\n\n const [statement] = program.body;\n if (!statement) return source;\n\n switch (statement.type) {\n case \"ExpressionStatement\": {\n const expression = unwrapExpression(\n statement.expression as { type: string; expression?: unknown },\n ) as {\n type?: string;\n };\n return expression?.type === \"ArrowFunctionExpression\" ||\n expression?.type === \"FunctionExpression\"\n ? wrapCallableBody(source)\n : source;\n }\n case \"FunctionDeclaration\":\n return statement.id?.name ? wrapNamedFunctionBody(source, statement.id.name) : source;\n case \"ExportDefaultDeclaration\":\n return renderExportDefaultBody(source, statement.declaration);\n default:\n return source;\n }\n};\n\nconst renderHeuristicBody = (source: string): string => {\n const withoutDefaultExport = source.replace(/^export\\s+default\\s+/, \"\").trim();\n\n if (\n (withoutDefaultExport.startsWith(\"async\") || withoutDefaultExport.startsWith(\"(\")) &&\n withoutDefaultExport.includes(\"=>\")\n ) {\n return wrapCallableBody(withoutDefaultExport);\n }\n\n if (FUNCTION_DECLARATION.test(withoutDefaultExport)) {\n const name = withoutDefaultExport.match(FUNCTION_DECLARATION)?.[1];\n return name\n ? wrapNamedFunctionBody(withoutDefaultExport, name)\n : wrapAnonymousFunctionBody(withoutDefaultExport);\n }\n\n return withoutDefaultExport;\n};\n\nexport const recoverExecutionBody = (code: string): string => {\n const source = extractCandidateSource(code);\n if (!source) return \"\";\n\n // oxlint-disable-next-line executor/no-try-catch-or-throw -- boundary: Babel parser throws for malformed candidate code, then recovery falls back to heuristics\n try {\n return renderParsedBody(source);\n } catch {\n return renderHeuristicBody(source);\n }\n};\n","import { transform } from \"sucrase\";\n\n/**\n * Strip TypeScript type syntax (`: T`, `as T`, `<T>`, type aliases,\n * interfaces, etc.) from user-submitted code so it can run in a\n * JavaScript-only sandbox (workerd's WorkerLoader, QuickJS, raw V8).\n * Deno-style runtimes that handle TypeScript natively should skip\n * this step — they get better source-map fidelity by parsing the\n * original input.\n *\n * The execute tool description tells callers to write TypeScript, and\n * `tools.describe.tool` hands them TypeScript shapes — without stripping,\n * a single `: number` annotation throws \"Unexpected token ':'\" inside\n * the sandbox, which used to surface as a 180s client-side timeout\n * before the engine `raceFirst` fix.\n *\n * Sucrase's TypeScript transform is purely syntactic — no semantic\n * checks, no decorator metadata — which keeps the cost low and matches\n * what `tsc --isolatedModules` / Node's experimental type-stripping do.\n *\n * On parse failure we rethrow the original error so the caller can map\n * it into the runtime's tagged error type. We deliberately do NOT fall\n * back to the raw input — passing TS syntax through to a JS-only\n * sandbox trades a clean error here for an opaque one downstream.\n */\nexport const stripTypeScript = (code: string): string =>\n transform(code, {\n transforms: [\"typescript\"],\n // No JSX in user code, no React-specific transforms. `disableESTransforms`\n // keeps sucrase from rewriting `import`/`export` etc — we want only\n // type-syntax removal.\n disableESTransforms: true,\n keepUnusedImports: true,\n }).code;\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@executor-js/codemode-core",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "homepage": "https://github.com/RhysSullivan/executor/tree/main/packages/kernel/core",
5
5
  "bugs": {
6
6
  "url": "https://github.com/RhysSullivan/executor/issues"