ai-evaluate 2.1.5 → 2.1.7

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.
Files changed (45) hide show
  1. package/README.md +151 -72
  2. package/dist/capnweb-bundle.d.ts +10 -0
  3. package/dist/capnweb-bundle.d.ts.map +1 -0
  4. package/dist/capnweb-bundle.js +2596 -0
  5. package/dist/capnweb-bundle.js.map +1 -0
  6. package/dist/evaluate.d.ts +7 -24
  7. package/dist/evaluate.d.ts.map +1 -1
  8. package/dist/evaluate.js +195 -105
  9. package/dist/evaluate.js.map +1 -1
  10. package/dist/node.d.ts +17 -0
  11. package/dist/node.d.ts.map +1 -0
  12. package/dist/node.js +171 -0
  13. package/dist/node.js.map +1 -0
  14. package/dist/repl.d.ts +77 -0
  15. package/dist/repl.d.ts.map +1 -0
  16. package/dist/repl.js +145 -0
  17. package/dist/repl.js.map +1 -0
  18. package/dist/types.d.ts +12 -10
  19. package/dist/types.d.ts.map +1 -1
  20. package/dist/worker-template.d.ts +11 -10
  21. package/dist/worker-template.d.ts.map +1 -1
  22. package/dist/worker-template.js +150 -42
  23. package/dist/worker-template.js.map +1 -1
  24. package/example/package.json +20 -0
  25. package/example/src/index.ts +214 -0
  26. package/example/wrangler.jsonc +25 -0
  27. package/package.json +9 -1
  28. package/src/capnweb-bundle.ts +2596 -0
  29. package/src/evaluate.ts +213 -107
  30. package/src/node.d.ts +17 -0
  31. package/src/node.d.ts.map +1 -0
  32. package/src/node.js +168 -0
  33. package/src/node.js.map +1 -0
  34. package/src/node.ts +200 -0
  35. package/src/repl.ts +228 -0
  36. package/src/types.d.ts +172 -0
  37. package/src/types.d.ts.map +1 -0
  38. package/src/types.js.map +1 -0
  39. package/src/types.ts +15 -16
  40. package/src/worker-template.d.ts +41 -0
  41. package/src/worker-template.d.ts.map +1 -0
  42. package/src/worker-template.js.map +1 -0
  43. package/src/worker-template.ts +189 -60
  44. package/vitest.config.js +6 -0
  45. package/vitest.config.ts +14 -2
package/src/node.ts ADDED
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Evaluate code in a sandboxed environment (Node.js version)
3
+ *
4
+ * Uses Cloudflare worker_loaders when available, falls back to Miniflare for local dev.
5
+ * For Workers-only builds, import from 'ai-evaluate' instead.
6
+ */
7
+
8
+ import type { EvaluateOptions, EvaluateResult, WorkerLoader, SandboxEnv } from './types.js'
9
+ import { generateWorkerCode, generateDevWorkerCode } from './worker-template.js'
10
+
11
+ /**
12
+ * Check if code contains JSX syntax that needs transformation
13
+ */
14
+ function containsJSX(code: string): boolean {
15
+ if (!code) return false
16
+ const jsxPattern = /<[A-Z][a-zA-Z0-9]*[\s/>]|<[a-z][a-z0-9-]*[\s/>]|<>|<\/>/
17
+ const jsxReturnPattern = /return\s*\(\s*<|return\s+<[A-Za-z]/
18
+ return jsxPattern.test(code) || jsxReturnPattern.test(code)
19
+ }
20
+
21
+ /**
22
+ * Transform JSX in code using esbuild
23
+ */
24
+ async function transformJSX(code: string): Promise<string> {
25
+ if (!code || !containsJSX(code)) return code
26
+
27
+ try {
28
+ const { transform } = await import('esbuild')
29
+ const result = await transform(code, {
30
+ loader: 'tsx',
31
+ jsxFactory: 'h',
32
+ jsxFragment: 'Fragment',
33
+ target: 'esnext',
34
+ format: 'esm',
35
+ })
36
+ return result.code
37
+ } catch (error) {
38
+ console.error('JSX transform failed:', error)
39
+ return code
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Evaluate code in a sandboxed worker (Node.js version with Miniflare fallback)
45
+ */
46
+ export async function evaluate(
47
+ options: EvaluateOptions,
48
+ env?: SandboxEnv
49
+ ): Promise<EvaluateResult> {
50
+ const start = Date.now()
51
+
52
+ try {
53
+ // Transform JSX in module, tests, and script before evaluation
54
+ const transformedModule = options.module ? await transformJSX(options.module) : undefined
55
+ const transformedTests = options.tests ? await transformJSX(options.tests) : undefined
56
+ const transformedScript = options.script ? await transformJSX(options.script) : undefined
57
+
58
+ const transformedOptions: EvaluateOptions = {
59
+ ...options,
60
+ module: transformedModule,
61
+ tests: transformedTests,
62
+ script: transformedScript,
63
+ }
64
+
65
+ // Use worker_loaders if available (Cloudflare Workers)
66
+ // Check lowercase first (preferred), then legacy uppercase
67
+ const loader = env?.loader || env?.LOADER
68
+ const testService = env?.test || env?.TEST
69
+ if (loader && testService) {
70
+ return await evaluateWithWorkerLoader(transformedOptions, loader, testService, start)
71
+ }
72
+
73
+ // Fall back to Miniflare (Node.js/local development)
74
+ return await evaluateWithMiniflare(transformedOptions, start)
75
+ } catch (error) {
76
+ return {
77
+ success: false,
78
+ logs: [],
79
+ error: error instanceof Error ? error.message : String(error),
80
+ duration: Date.now() - start,
81
+ }
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Evaluate using Cloudflare worker_loaders binding
87
+ */
88
+ async function evaluateWithWorkerLoader(
89
+ options: EvaluateOptions,
90
+ loader: WorkerLoader,
91
+ testService: unknown,
92
+ start: number
93
+ ): Promise<EvaluateResult> {
94
+ const workerCode = generateWorkerCode({
95
+ module: options.module,
96
+ tests: options.tests,
97
+ script: options.script,
98
+ sdk: options.sdk,
99
+ imports: options.imports,
100
+ })
101
+ const id = `sandbox-${Date.now()}-${Math.random().toString(36).slice(2)}`
102
+
103
+ const worker = loader.get(id, async () => ({
104
+ mainModule: 'worker.js',
105
+ modules: {
106
+ 'worker.js': workerCode,
107
+ },
108
+ compatibilityDate: '2026-01-01',
109
+ globalOutbound: options.fetch === null ? null : undefined,
110
+ bindings: {
111
+ TEST: testService,
112
+ },
113
+ }))
114
+
115
+ const entrypoint = worker.getEntrypoint()
116
+ const response = await entrypoint.fetch(new Request('http://sandbox/execute'))
117
+ const result = (await response.json()) as EvaluateResult
118
+
119
+ return {
120
+ ...result,
121
+ duration: Date.now() - start,
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Evaluate using Miniflare (for Node.js/development)
127
+ */
128
+ async function evaluateWithMiniflare(
129
+ options: EvaluateOptions,
130
+ start: number
131
+ ): Promise<EvaluateResult> {
132
+ const { Miniflare } = await import('miniflare')
133
+
134
+ const workerCode = generateDevWorkerCode({
135
+ module: options.module,
136
+ tests: options.tests,
137
+ script: options.script,
138
+ sdk: options.sdk,
139
+ imports: options.imports,
140
+ fetch: options.fetch, // Pass fetch option to worker template
141
+ })
142
+
143
+ // Block outbound network requests at Miniflare level when fetch: null
144
+ // This complements the globalThis.fetch override in the worker template
145
+ const blockNetwork = options.fetch === null
146
+
147
+ const mf = new Miniflare({
148
+ modules: true,
149
+ script: workerCode,
150
+ compatibilityDate: '2026-01-01',
151
+ // Block all outbound fetch/connect when network is disabled
152
+ ...(blockNetwork && {
153
+ outboundService: () => {
154
+ throw new Error('Network access blocked: fetch is disabled in this sandbox')
155
+ },
156
+ }),
157
+ })
158
+
159
+ try {
160
+ const timeout = options.timeout || 5000
161
+ const controller = new AbortController()
162
+ const timeoutId = setTimeout(() => controller.abort(), timeout)
163
+
164
+ try {
165
+ const response = await mf.dispatchFetch('http://sandbox/execute', {
166
+ signal: controller.signal,
167
+ })
168
+ clearTimeout(timeoutId)
169
+ const result = (await response.json()) as EvaluateResult
170
+
171
+ return {
172
+ ...result,
173
+ duration: Date.now() - start,
174
+ }
175
+ } catch (err) {
176
+ clearTimeout(timeoutId)
177
+ if ((err as Error).name === 'AbortError') {
178
+ return {
179
+ success: false,
180
+ logs: [],
181
+ error: `Timeout: Script execution exceeded ${timeout}ms`,
182
+ duration: Date.now() - start,
183
+ }
184
+ }
185
+ throw err
186
+ }
187
+ } finally {
188
+ await mf.dispose()
189
+ }
190
+ }
191
+
192
+ /**
193
+ * Create an evaluate function bound to a specific environment
194
+ */
195
+ export function createEvaluator(env?: SandboxEnv) {
196
+ return (options: EvaluateOptions) => evaluate(options, env)
197
+ }
198
+
199
+ // Re-export types
200
+ export type { EvaluateOptions, EvaluateResult, SandboxEnv } from './types.js'
package/src/repl.ts ADDED
@@ -0,0 +1,228 @@
1
+ /**
2
+ * REPL session support for ai-evaluate
3
+ *
4
+ * Provides persistent evaluation sessions with context preservation.
5
+ */
6
+
7
+ import type { EvaluateOptions, EvaluateResult, SandboxEnv, SDKConfig } from './types.js'
8
+
9
+ /**
10
+ * REPL session configuration
11
+ */
12
+ export interface ReplSessionConfig {
13
+ /** Use local Miniflare instead of remote workers */
14
+ local?: boolean
15
+ /** Authentication token for remote execution */
16
+ auth?: string
17
+ /** SDK configuration for platform primitives */
18
+ sdk?: SDKConfig | boolean
19
+ /** Code to run when session starts (defines globals, imports) */
20
+ prelude?: string
21
+ /** Timeout for each evaluation in milliseconds */
22
+ timeout?: number
23
+ /** Allow network access */
24
+ allowNetwork?: boolean
25
+ }
26
+
27
+ /**
28
+ * Result from a REPL evaluation
29
+ */
30
+ export interface ReplEvalResult extends EvaluateResult {
31
+ /** Variables exported during evaluation */
32
+ exports?: Record<string, unknown>
33
+ }
34
+
35
+ /**
36
+ * REPL session with persistent context
37
+ */
38
+ export interface ReplSession {
39
+ /** Evaluate code in the session context */
40
+ eval(code: string): Promise<ReplEvalResult>
41
+
42
+ /** Get current session context (accumulated exports) */
43
+ getContext(): Record<string, unknown>
44
+
45
+ /** Set a value in the session context */
46
+ setContext(key: string, value: unknown): void
47
+
48
+ /** Clear the session context */
49
+ clearContext(): void
50
+
51
+ /** Run prelude code (called automatically on first eval) */
52
+ runPrelude(): Promise<void>
53
+
54
+ /** Close the session and release resources */
55
+ close(): Promise<void>
56
+ }
57
+
58
+ /**
59
+ * Create a REPL session for interactive code evaluation
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * import { createReplSession } from 'ai-evaluate/repl'
64
+ *
65
+ * const session = await createReplSession({ local: true })
66
+ *
67
+ * await session.eval('const sum = (a, b) => a + b')
68
+ * const result = await session.eval('sum(1, 2)')
69
+ * console.log(result.value) // 3
70
+ *
71
+ * await session.close()
72
+ * ```
73
+ */
74
+ export async function createReplSession(
75
+ config?: ReplSessionConfig,
76
+ env?: SandboxEnv
77
+ ): Promise<ReplSession> {
78
+ // Context accumulates across evaluations
79
+ let context: Record<string, unknown> = {}
80
+ let preludeRun = false
81
+ let miniflare: unknown = null
82
+
83
+ // Build module code from accumulated context
84
+ function buildContextModule(): string {
85
+ const entries = Object.entries(context)
86
+ if (entries.length === 0) return ''
87
+
88
+ return entries
89
+ .map(([key, value]) => {
90
+ if (typeof value === 'function') {
91
+ return `export const ${key} = ${value.toString()}`
92
+ }
93
+ return `export const ${key} = ${JSON.stringify(value)}`
94
+ })
95
+ .join('\n')
96
+ }
97
+
98
+ // Get the evaluate function (local or remote)
99
+ async function getEvaluate(): Promise<
100
+ (options: EvaluateOptions, env?: SandboxEnv) => Promise<EvaluateResult>
101
+ > {
102
+ if (config?.local) {
103
+ // Use local Miniflare via node.ts
104
+ const { evaluate } = await import('./node.js')
105
+ return evaluate
106
+ } else if (env) {
107
+ // Use remote worker loaders
108
+ const { evaluate } = await import('./evaluate.js')
109
+ return (options) => evaluate(options, env)
110
+ } else {
111
+ // Default to local if no env
112
+ const { evaluate } = await import('./node.js')
113
+ return evaluate
114
+ }
115
+ }
116
+
117
+ const evaluate = await getEvaluate()
118
+
119
+ async function runPrelude(): Promise<void> {
120
+ if (preludeRun || !config?.prelude) return
121
+ preludeRun = true
122
+
123
+ const result = await evaluate(
124
+ {
125
+ module: config.prelude,
126
+ script: 'return Object.keys(module)',
127
+ sdk: config.sdk,
128
+ timeout: config.timeout,
129
+ fetch: config.allowNetwork === false ? null : undefined,
130
+ },
131
+ env
132
+ )
133
+
134
+ if (result.success && Array.isArray(result.value)) {
135
+ // Store exported names in context
136
+ for (const key of result.value) {
137
+ context[key] = `__prelude_${key}__`
138
+ }
139
+ }
140
+ }
141
+
142
+ return {
143
+ async eval(code: string): Promise<ReplEvalResult> {
144
+ await runPrelude()
145
+
146
+ // Wrap code to capture any declared variables
147
+ const contextModule = buildContextModule()
148
+ const preludeModule = config?.prelude || ''
149
+
150
+ // Try to parse as expression first, then as statement
151
+ const isExpression =
152
+ !code.includes('const ') &&
153
+ !code.includes('let ') &&
154
+ !code.includes('function ') &&
155
+ !code.includes('class ') &&
156
+ !code.includes('export ')
157
+
158
+ const script = isExpression
159
+ ? `return (${code})`
160
+ : code.includes('return ')
161
+ ? code
162
+ : `${code}\nreturn undefined`
163
+
164
+ const result = await evaluate(
165
+ {
166
+ module: preludeModule + '\n' + contextModule,
167
+ script,
168
+ sdk: config?.sdk,
169
+ timeout: config?.timeout,
170
+ fetch: config?.allowNetwork === false ? null : undefined,
171
+ },
172
+ env
173
+ )
174
+
175
+ return result
176
+ },
177
+
178
+ getContext(): Record<string, unknown> {
179
+ return { ...context }
180
+ },
181
+
182
+ setContext(key: string, value: unknown): void {
183
+ context[key] = value
184
+ },
185
+
186
+ clearContext(): void {
187
+ context = {}
188
+ },
189
+
190
+ runPrelude,
191
+
192
+ async close(): Promise<void> {
193
+ context = {}
194
+ preludeRun = false
195
+ if (
196
+ miniflare &&
197
+ typeof (miniflare as { dispose?: () => Promise<void> }).dispose === 'function'
198
+ ) {
199
+ await (miniflare as { dispose: () => Promise<void> }).dispose()
200
+ miniflare = null
201
+ }
202
+ },
203
+ }
204
+ }
205
+
206
+ /**
207
+ * Quick evaluation helper for one-off evaluations
208
+ *
209
+ * @example
210
+ * ```ts
211
+ * import { quickEval } from 'ai-evaluate/repl'
212
+ *
213
+ * const result = await quickEval('1 + 2 * 3')
214
+ * console.log(result.value) // 7
215
+ * ```
216
+ */
217
+ export async function quickEval(
218
+ code: string,
219
+ config?: ReplSessionConfig,
220
+ env?: SandboxEnv
221
+ ): Promise<ReplEvalResult> {
222
+ const session = await createReplSession(config, env)
223
+ try {
224
+ return await session.eval(code)
225
+ } finally {
226
+ await session.close()
227
+ }
228
+ }
package/src/types.d.ts ADDED
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Types for ai-sandbox
3
+ */
4
+ /**
5
+ * SDK configuration for the sandbox environment
6
+ */
7
+ export interface SDKConfig {
8
+ /** Execution context: local (in-memory) or remote (RPC) */
9
+ context?: 'local' | 'remote';
10
+ /** RPC endpoint URL for all services (default: https://rpc.do) */
11
+ rpcUrl?: string;
12
+ /** Database RPC URL (default: https://db.do/rpc) */
13
+ dbUrl?: string;
14
+ /** AI RPC URL (default: https://ai.do/rpc) */
15
+ aiUrl?: string;
16
+ /** Authentication token */
17
+ token?: string;
18
+ /** Default namespace for database operations */
19
+ ns?: string;
20
+ /** Cloudflare AI Gateway URL (e.g., https://gateway.ai.cloudflare.com/v1/{account}/{gateway}) */
21
+ aiGatewayUrl?: string;
22
+ /** Cloudflare AI Gateway authentication token */
23
+ aiGatewayToken?: string;
24
+ }
25
+ /**
26
+ * Options for evaluate()
27
+ */
28
+ export interface EvaluateOptions {
29
+ /** Module code with exports */
30
+ module?: string | undefined;
31
+ /** Test code using vitest (describe, expect, it in global scope) */
32
+ tests?: string | undefined;
33
+ /** Script code to run immediately (module exports in scope) */
34
+ script?: string | undefined;
35
+ /** Timeout in milliseconds (default: 5000) */
36
+ timeout?: number | undefined;
37
+ /** Environment variables to pass to the sandbox */
38
+ env?: Record<string, string> | undefined;
39
+ /** Fetch configuration. Set to null to block network access. Default: allowed */
40
+ fetch?: null | undefined;
41
+ /** RPC services to expose via capnweb (URL -> handler) */
42
+ rpc?: Record<string, unknown> | undefined;
43
+ /** Outbound RPC interceptor - intercepts fetch calls to RPC URLs */
44
+ outboundRpc?: ((url: string, request: Request) => Promise<Response> | Response | null) | undefined;
45
+ /** SDK configuration - enables $, db, ai, api, on, send globals */
46
+ sdk?: SDKConfig | boolean | undefined;
47
+ /** Top-level imports to hoist (for MDX test files with external imports) */
48
+ imports?: string[] | undefined;
49
+ }
50
+ /**
51
+ * Result from evaluate()
52
+ */
53
+ export interface EvaluateResult {
54
+ /** Whether execution succeeded */
55
+ success: boolean;
56
+ /** Return value from script (if any) */
57
+ value?: unknown;
58
+ /** Console output */
59
+ logs: LogEntry[];
60
+ /** Test results (if tests were provided) */
61
+ testResults?: TestResults;
62
+ /** Error message if execution failed */
63
+ error?: string;
64
+ /** Execution time in milliseconds */
65
+ duration: number;
66
+ }
67
+ /**
68
+ * A log entry from console.log/warn/error
69
+ */
70
+ export interface LogEntry {
71
+ level: 'log' | 'warn' | 'error' | 'info' | 'debug';
72
+ message: string;
73
+ timestamp: number;
74
+ }
75
+ /**
76
+ * Test results from vitest-style tests
77
+ */
78
+ export interface TestResults {
79
+ /** Total number of tests */
80
+ total: number;
81
+ /** Number of passed tests */
82
+ passed: number;
83
+ /** Number of failed tests */
84
+ failed: number;
85
+ /** Number of skipped tests */
86
+ skipped: number;
87
+ /** Individual test results */
88
+ tests: TestResult[];
89
+ /** Total duration in milliseconds */
90
+ duration: number;
91
+ }
92
+ /**
93
+ * Individual test result
94
+ */
95
+ export interface TestResult {
96
+ /** Test name (describe > it) */
97
+ name: string;
98
+ /** Whether the test passed */
99
+ passed: boolean;
100
+ /** Error message if failed */
101
+ error?: string;
102
+ /** Test duration in milliseconds */
103
+ duration: number;
104
+ }
105
+ /**
106
+ * Worker loader binding type (Cloudflare)
107
+ */
108
+ export interface WorkerLoader {
109
+ get(id: string, loader: () => Promise<WorkerCode>): WorkerStub;
110
+ }
111
+ /**
112
+ * Worker code configuration
113
+ */
114
+ export interface WorkerCode {
115
+ mainModule: string;
116
+ modules: Record<string, string | {
117
+ js?: string;
118
+ cjs?: string;
119
+ text?: string;
120
+ json?: unknown;
121
+ }>;
122
+ compatibilityDate?: string;
123
+ env?: Record<string, unknown>;
124
+ globalOutbound?: null | unknown;
125
+ }
126
+ /**
127
+ * Worker entrypoint with fetch method
128
+ */
129
+ export interface WorkerEntrypoint {
130
+ fetch(request: Request): Promise<Response>;
131
+ }
132
+ /**
133
+ * Worker stub returned by loader
134
+ */
135
+ export interface WorkerStub {
136
+ getEntrypoint(): WorkerEntrypoint;
137
+ }
138
+ /**
139
+ * Test service core - returned by connect() (from ai-tests)
140
+ */
141
+ export interface TestServiceCore {
142
+ expect(value: unknown, message?: string): unknown;
143
+ should(value: unknown): unknown;
144
+ assert: unknown;
145
+ describe(name: string, fn: () => void): void;
146
+ it(name: string, fn: () => void | Promise<void>): void;
147
+ test(name: string, fn: () => void | Promise<void>): void;
148
+ skip(name: string, fn?: () => void | Promise<void>): void;
149
+ only(name: string, fn: () => void | Promise<void>): void;
150
+ beforeEach(fn: () => void | Promise<void>): void;
151
+ afterEach(fn: () => void | Promise<void>): void;
152
+ beforeAll(fn: () => void | Promise<void>): void;
153
+ afterAll(fn: () => void | Promise<void>): void;
154
+ run(): Promise<TestResults>;
155
+ reset(): void;
156
+ }
157
+ /**
158
+ * Test service binding type - WorkerEntrypoint (from ai-tests)
159
+ */
160
+ export interface TestServiceBinding {
161
+ /** Get a test service instance via RPC */
162
+ connect(): Promise<TestServiceCore>;
163
+ }
164
+ /**
165
+ * Environment with worker loader binding
166
+ */
167
+ export interface SandboxEnv {
168
+ loader?: WorkerLoader;
169
+ LOADER?: WorkerLoader;
170
+ TEST?: TestServiceBinding;
171
+ }
172
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/src/types.ts CHANGED
@@ -29,25 +29,25 @@ export interface SDKConfig {
29
29
  */
30
30
  export interface EvaluateOptions {
31
31
  /** Module code with exports */
32
- module?: string
32
+ module?: string | undefined
33
33
  /** Test code using vitest (describe, expect, it in global scope) */
34
- tests?: string
34
+ tests?: string | undefined
35
35
  /** Script code to run immediately (module exports in scope) */
36
- script?: string
36
+ script?: string | undefined
37
37
  /** Timeout in milliseconds (default: 5000) */
38
- timeout?: number
38
+ timeout?: number | undefined
39
39
  /** Environment variables to pass to the sandbox */
40
- env?: Record<string, string>
40
+ env?: Record<string, string> | undefined
41
41
  /** Fetch configuration. Set to null to block network access. Default: allowed */
42
- fetch?: null
42
+ fetch?: null | undefined
43
43
  /** RPC services to expose via capnweb (URL -> handler) */
44
- rpc?: Record<string, unknown>
44
+ rpc?: Record<string, unknown> | undefined
45
45
  /** Outbound RPC interceptor - intercepts fetch calls to RPC URLs */
46
- outboundRpc?: (url: string, request: Request) => Promise<Response> | Response | null
46
+ outboundRpc?: ((url: string, request: Request) => Promise<Response> | Response | null) | undefined
47
47
  /** SDK configuration - enables $, db, ai, api, on, send globals */
48
- sdk?: SDKConfig | boolean
48
+ sdk?: SDKConfig | boolean | undefined
49
49
  /** Top-level imports to hoist (for MDX test files with external imports) */
50
- imports?: string[]
50
+ imports?: string[] | undefined
51
51
  }
52
52
 
53
53
  /**
@@ -113,10 +113,7 @@ export interface TestResult {
113
113
  * Worker loader binding type (Cloudflare)
114
114
  */
115
115
  export interface WorkerLoader {
116
- get(
117
- id: string,
118
- loader: () => Promise<WorkerCode>
119
- ): WorkerStub
116
+ get(id: string, loader: () => Promise<WorkerCode>): WorkerStub
120
117
  }
121
118
 
122
119
  /**
@@ -176,6 +173,8 @@ export interface TestServiceBinding {
176
173
  * Environment with worker loader binding
177
174
  */
178
175
  export interface SandboxEnv {
179
- LOADER?: WorkerLoader
180
- TEST?: TestServiceBinding
176
+ loader?: WorkerLoader
177
+ LOADER?: WorkerLoader // Legacy - prefer lowercase
178
+ test?: TestServiceBinding
179
+ TEST?: TestServiceBinding // Legacy - prefer lowercase
181
180
  }