From 80e8b9601dd8401e1b072cdaf79e031b7debb750 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Wed, 24 Sep 2025 11:57:14 -0800 Subject: [PATCH] update no-validate-exceptions.txt (#22907) --- scripts/runner.node.mjs | 1 + src/bun.js/api/filesystem_router.zig | 6 +- src/bun.js/bindings/BunPlugin.cpp | 1 + src/bun.js/bindings/JSObject.zig | 9 +- src/bun.js/bindings/NodeVM.cpp | 1 + src/bun.js/bindings/NodeVMModule.cpp | 1 + src/bun.js/bindings/NodeVMScript.cpp | 1 - src/bun.js/bindings/NodeVMSyntheticModule.cpp | 2 +- src/bun.js/bindings/bindings.cpp | 12 +- src/bun.js/jsc/host_fn.zig | 11 + src/codegen/shared-types.ts | 1 + test/no-validate-exceptions.txt | 200 +----------------- 12 files changed, 39 insertions(+), 207 deletions(-) diff --git a/scripts/runner.node.mjs b/scripts/runner.node.mjs index 39f5069629..dac4df8028 100755 --- a/scripts/runner.node.mjs +++ b/scripts/runner.node.mjs @@ -658,6 +658,7 @@ async function runTests() { const buildResult = await spawnBun(execPath, { cwd: vendorPath, args: ["run", "build"], + timeout: 60_000, }); if (!buildResult.ok) { throw new Error(`Failed to build vendor: ${buildResult.error}`); diff --git a/src/bun.js/api/filesystem_router.zig b/src/bun.js/api/filesystem_router.zig index 1d2d52a139..6a6cd56d01 100644 --- a/src/bun.js/api/filesystem_router.zig +++ b/src/bun.js/api/filesystem_router.zig @@ -517,7 +517,7 @@ pub const MatchedRoute = struct { pub fn createQueryObject(ctx: *jsc.JSGlobalObject, map: *QueryStringMap) JSValue { const QueryObjectCreator = struct { query: *QueryStringMap, - pub fn create(this: *@This(), obj: *JSObject, global: *JSGlobalObject) void { + pub fn create(this: *@This(), obj: *JSObject, global: *JSGlobalObject) bun.JSError!void { var iter = this.query.iter(); while (iter.next(&query_string_values_buf)) |entry| { const entry_name = entry.name; @@ -529,10 +529,10 @@ pub const MatchedRoute = struct { for (entry.values, 0..) |value, i| { values[i] = ZigString.init(value).withEncoding(); } - obj.putRecord(global, &str, values); + try obj.putRecord(global, &str, values); } else { query_string_value_refs_buf[0] = ZigString.init(entry.values[0]).withEncoding(); - obj.putRecord(global, &str, query_string_value_refs_buf[0..1]); + try obj.putRecord(global, &str, query_string_value_refs_buf[0..1]); } } } diff --git a/src/bun.js/bindings/BunPlugin.cpp b/src/bun.js/bindings/BunPlugin.cpp index 8f3905fad5..61b9d5a84d 100644 --- a/src/bun.js/bindings/BunPlugin.cpp +++ b/src/bun.js/bindings/BunPlugin.cpp @@ -689,6 +689,7 @@ extern "C" JSC_DEFINE_HOST_FUNCTION(JSMock__jsModuleMock, (JSC::JSGlobalObject * if (removeFromCJS) { globalObject->requireMap()->remove(globalObject, specifierString); + RETURN_IF_EXCEPTION(scope, {}); } globalObject->onLoadPlugins.addModuleMock(vm, specifier, mock); diff --git a/src/bun.js/bindings/JSObject.zig b/src/bun.js/bindings/JSObject.zig index 9fc09c90c4..914b90b60c 100644 --- a/src/bun.js/bindings/JSObject.zig +++ b/src/bun.js/bindings/JSObject.zig @@ -6,7 +6,6 @@ pub const JSObject = opaque { } extern fn JSC__JSObject__getIndex(this: JSValue, globalThis: *JSGlobalObject, i: u32) JSValue; - extern fn JSC__JSObject__putRecord(this: *JSObject, global: *JSGlobalObject, key: *ZigString, values: [*]ZigString, len: usize) void; extern fn Bun__JSObject__getCodePropertyVMInquiry(global: *JSGlobalObject, obj: *JSObject) JSValue; extern fn JSC__createStructure(global: *jsc.JSGlobalObject, owner: *jsc.JSCell, length: u32, names: [*]ExternColumnIdentifier) jsc.JSValue; extern fn JSC__JSObject__create(global_object: *JSGlobalObject, length: usize, ctx: *anyopaque, initializer: InitializeCallback) JSValue; @@ -123,10 +122,10 @@ pub const JSObject = opaque { const InitializeCallback = *const fn (ctx: *anyopaque, obj: *JSObject, global: *JSGlobalObject) callconv(.C) void; - pub fn Initializer(comptime Ctx: type, comptime func: fn (*Ctx, obj: *JSObject, global: *JSGlobalObject) void) type { + pub fn Initializer(comptime Ctx: type, comptime func: fn (*Ctx, obj: *JSObject, global: *JSGlobalObject) bun.JSError!void) type { return struct { pub fn call(this: *anyopaque, obj: *JSObject, global: *JSGlobalObject) callconv(.C) void { - @call(bun.callmod_inline, func, .{ @as(*Ctx, @ptrCast(@alignCast(this))), obj, global }); + func(@ptrCast(@alignCast(this)), obj, global) catch |err| bun.jsc.host_fn.voidFromJSError(err, global); } }; } @@ -150,8 +149,8 @@ pub const JSObject = opaque { return value; } - pub fn putRecord(this: *JSObject, global: *JSGlobalObject, key: *ZigString, values: []ZigString) void { - return JSC__JSObject__putRecord(this, global, key, values.ptr, values.len); + pub fn putRecord(this: *JSObject, global: *JSGlobalObject, key: *ZigString, values: []ZigString) bun.JSError!void { + return bun.cpp.JSC__JSObject__putRecord(this, global, key, values.ptr, values.len); } /// This will not call getters or be observable from JavaScript. diff --git a/src/bun.js/bindings/NodeVM.cpp b/src/bun.js/bindings/NodeVM.cpp index bcf870de11..6565a9fb96 100644 --- a/src/bun.js/bindings/NodeVM.cpp +++ b/src/bun.js/bindings/NodeVM.cpp @@ -610,6 +610,7 @@ NodeVMGlobalObject* getGlobalObjectFromContext(JSGlobalObject* globalObject, JSV JSC::EncodedJSValue INVALID_ARG_VALUE_VM_VARIATION(JSC::ThrowScope& throwScope, JSC::JSGlobalObject* globalObject, WTF::ASCIILiteral name, JSC::JSValue value) { throwScope.throwException(globalObject, createError(globalObject, ErrorCode::ERR_INVALID_ARG_TYPE, makeString("The \""_s, name, "\" argument must be an vm.Context"_s))); + throwScope.release(); return {}; } diff --git a/src/bun.js/bindings/NodeVMModule.cpp b/src/bun.js/bindings/NodeVMModule.cpp index 4149b7dc41..f58e20133c 100644 --- a/src/bun.js/bindings/NodeVMModule.cpp +++ b/src/bun.js/bindings/NodeVMModule.cpp @@ -81,6 +81,7 @@ JSValue NodeVMModule::evaluate(JSGlobalObject* globalObject, uint32_t timeout, b VM_RETURN_IF_EXCEPTION(scope, {}); } else if (syntheticThis) { record = syntheticThis->moduleRecord(globalObject); + VM_RETURN_IF_EXCEPTION(scope, {}); } else { RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE("Invalid module type"); } diff --git a/src/bun.js/bindings/NodeVMScript.cpp b/src/bun.js/bindings/NodeVMScript.cpp index e176d30b91..03af768036 100644 --- a/src/bun.js/bindings/NodeVMScript.cpp +++ b/src/bun.js/bindings/NodeVMScript.cpp @@ -114,7 +114,6 @@ constructScript(JSGlobalObject* globalObject, CallFrame* callFrame, JSValue newT auto* zigGlobalObject = defaultGlobalObject(globalObject); Structure* structure = zigGlobalObject->NodeVMScriptStructure(); if (zigGlobalObject->NodeVMScript() != newTarget) [[unlikely]] { - auto scope = DECLARE_THROW_SCOPE(vm); if (!newTarget) { throwTypeError(globalObject, scope, "Class constructor Script cannot be invoked without 'new'"_s); return {}; diff --git a/src/bun.js/bindings/NodeVMSyntheticModule.cpp b/src/bun.js/bindings/NodeVMSyntheticModule.cpp index 3cd49018a1..8455d7d88c 100644 --- a/src/bun.js/bindings/NodeVMSyntheticModule.cpp +++ b/src/bun.js/bindings/NodeVMSyntheticModule.cpp @@ -190,7 +190,7 @@ JSValue NodeVMSyntheticModule::evaluate(JSGlobalObject* globalObject) ArgList args; - return AsyncContextFrame::call(globalObject, m_syntheticEvaluationSteps.get(), m_moduleWrapper.get(), args); + RELEASE_AND_RETURN(scope, AsyncContextFrame::call(globalObject, m_syntheticEvaluationSteps.get(), m_moduleWrapper.get(), args)); } void NodeVMSyntheticModule::setExport(JSGlobalObject* globalObject, WTF::String exportName, JSValue value) diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index f1f5cb0de6..fd10d44f99 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -2377,8 +2377,8 @@ double JSC__JSValue__getLengthIfPropertyExistsInternal(JSC::EncodedJSValue value return std::numeric_limits::infinity(); } -void JSC__JSObject__putRecord(JSC::JSObject* object, JSC::JSGlobalObject* global, ZigString* key, - ZigString* values, size_t valuesLen) +[[ZIG_EXPORT(check_slow)]] +void JSC__JSObject__putRecord(JSC::JSObject* object, JSC::JSGlobalObject* global, ZigString* key, ZigString* values, size_t valuesLen) { auto scope = DECLARE_THROW_SCOPE(global->vm()); auto ident = Identifier::fromString(global->vm(), Zig::toStringCopy(*key)); @@ -2395,14 +2395,10 @@ void JSC__JSObject__putRecord(JSC::JSObject* object, JSC::JSGlobalObject* global JSC::JSArray* array = nullptr; { JSC::ObjectInitializationScope initializationScope(global->vm()); - if ((array = JSC::JSArray::tryCreateUninitializedRestricted( - initializationScope, nullptr, - global->arrayStructureForIndexingTypeDuringAllocation(JSC::ArrayWithContiguous), - valuesLen))) { + if ((array = JSC::JSArray::tryCreateUninitializedRestricted(initializationScope, nullptr, global->arrayStructureForIndexingTypeDuringAllocation(JSC::ArrayWithContiguous), valuesLen))) { for (size_t i = 0; i < valuesLen; ++i) { - array->initializeIndexWithoutBarrier( - initializationScope, i, JSC::jsString(global->vm(), Zig::toStringCopy(values[i]))); + array->initializeIndexWithoutBarrier(initializationScope, i, JSC::jsString(global->vm(), Zig::toStringCopy(values[i]))); } } } diff --git a/src/bun.js/jsc/host_fn.zig b/src/bun.js/jsc/host_fn.zig index 26e4ececb2..a92e4c11b4 100644 --- a/src/bun.js/jsc/host_fn.zig +++ b/src/bun.js/jsc/host_fn.zig @@ -165,6 +165,17 @@ inline fn parseErrorSet(T: type, errors: []const std.builtin.Type.Error) ParsedH }; } +// For when bubbling up errors to functions that require a C ABI boundary +// TODO: make this not need a 'globalThis' +pub fn voidFromJSError(err: bun.JSError, globalThis: *jsc.JSGlobalObject) void { + switch (err) { + error.JSError => {}, + error.OutOfMemory => globalThis.throwOutOfMemory() catch {}, + } + // TODO: catch exception, declare throw scope, re-throw + // c++ needs to be able to see that zig functions can throw for BUN_JSC_validateExceptionChecks +} + pub fn wrap1(comptime func: anytype) @"return": { const p = checkWrapParams(func, 1); break :@"return" fn (p[0].type.?) callconv(.c) JSValue; diff --git a/src/codegen/shared-types.ts b/src/codegen/shared-types.ts index f29543034b..ec2b2b6e24 100644 --- a/src/codegen/shared-types.ts +++ b/src/codegen/shared-types.ts @@ -55,6 +55,7 @@ export const sharedTypes: Record = { "JSC::CustomGetterSetter": "bun.jsc.CustomGetterSetter", "JSC::SourceProvider": "bun.jsc.SourceProvider", "JSC::CallFrame": "bun.jsc.CallFrame", + "JSC::JSObject": "bun.jsc.JSObject", }; export const bannedTypes: Record = { diff --git a/test/no-validate-exceptions.txt b/test/no-validate-exceptions.txt index 5c2f6a9afb..c6a0f3ede8 100644 --- a/test/no-validate-exceptions.txt +++ b/test/no-validate-exceptions.txt @@ -1,102 +1,4 @@ # List of tests for which we do NOT set validateExceptionChecks=1 when running in ASAN CI -vendor/elysia/test/a.test.ts -vendor/elysia/test/adapter/web-standard/cookie-to-header.test.ts -vendor/elysia/test/adapter/web-standard/map-compact-response.test.ts -vendor/elysia/test/adapter/web-standard/map-early-response.test.ts -vendor/elysia/test/adapter/web-standard/map-response.test.ts -vendor/elysia/test/adapter/web-standard/set-cookie.test.ts -vendor/elysia/test/aot/analysis.test.ts -vendor/elysia/test/aot/generation.test.ts -vendor/elysia/test/aot/has-transform.test.ts -vendor/elysia/test/aot/has-type.test.ts -vendor/elysia/test/aot/response.test.ts -vendor/elysia/test/bun/router.test.ts -vendor/elysia/test/cookie/explicit.test.ts -vendor/elysia/test/cookie/implicit.test.ts -vendor/elysia/test/cookie/response.test.ts -vendor/elysia/test/cookie/signature.test.ts -vendor/elysia/test/core/as.test.ts -vendor/elysia/test/core/config.test.ts -vendor/elysia/test/core/context.test.ts -vendor/elysia/test/core/dynamic.test.ts -vendor/elysia/test/core/elysia.test.ts -vendor/elysia/test/core/formdata.test.ts -vendor/elysia/test/core/handle-error.test.ts -vendor/elysia/test/core/modules.test.ts -vendor/elysia/test/core/mount.test.ts -vendor/elysia/test/core/native-static.test.ts -vendor/elysia/test/core/normalize.test.ts -vendor/elysia/test/core/path.test.ts -vendor/elysia/test/core/redirect.test.ts -vendor/elysia/test/core/sanitize.test.ts -vendor/elysia/test/core/stop.test.ts -vendor/elysia/test/extends/decorators.test.ts -vendor/elysia/test/extends/error.test.ts -vendor/elysia/test/extends/models.test.ts -vendor/elysia/test/extends/store.test.ts -vendor/elysia/test/hoc/index.test.ts -vendor/elysia/test/lifecycle/after-handle.test.ts -vendor/elysia/test/lifecycle/before-handle.test.ts -vendor/elysia/test/lifecycle/derive.test.ts -vendor/elysia/test/lifecycle/error.test.ts -vendor/elysia/test/lifecycle/hook-types.test.ts -vendor/elysia/test/lifecycle/map-derive.test.ts -vendor/elysia/test/lifecycle/map-resolve.test.ts -vendor/elysia/test/lifecycle/map-response.test.ts -vendor/elysia/test/lifecycle/parser.test.ts -vendor/elysia/test/lifecycle/request.test.ts -vendor/elysia/test/lifecycle/resolve.test.ts -vendor/elysia/test/lifecycle/response.test.ts -vendor/elysia/test/lifecycle/transform.test.ts -vendor/elysia/test/macro/macro.test.ts -vendor/elysia/test/path/group.test.ts -vendor/elysia/test/path/guard.test.ts -vendor/elysia/test/path/path.test.ts -vendor/elysia/test/path/plugin.test.ts -vendor/elysia/test/plugins/affix.test.ts -vendor/elysia/test/plugins/checksum.test.ts -vendor/elysia/test/plugins/error-propagation.test.ts -vendor/elysia/test/plugins/plugin.test.ts -vendor/elysia/test/production/index.test.ts -vendor/elysia/test/response/custom-response.test.ts -vendor/elysia/test/response/headers.test.ts -vendor/elysia/test/response/redirect.test.ts -vendor/elysia/test/response/static.test.ts -vendor/elysia/test/response/stream.test.ts -vendor/elysia/test/sucrose/query.test.ts -vendor/elysia/test/sucrose/sucrose.test.ts -vendor/elysia/test/tracer/aot.test.ts -vendor/elysia/test/tracer/detail.test.ts -vendor/elysia/test/tracer/timing.test.ts -vendor/elysia/test/tracer/trace.test.ts -vendor/elysia/test/type-system/array-string.test.ts -vendor/elysia/test/type-system/boolean-string.test.ts -vendor/elysia/test/type-system/coercion-number.test.ts -vendor/elysia/test/type-system/date.test.ts -vendor/elysia/test/type-system/form.test.ts -vendor/elysia/test/type-system/object-string.test.ts -vendor/elysia/test/type-system/string-format.test.ts -vendor/elysia/test/type-system/union-enum.test.ts -vendor/elysia/test/units/deduplicate-checksum.test.ts -vendor/elysia/test/units/has-ref.test.ts -vendor/elysia/test/units/has-transform.test.ts -vendor/elysia/test/units/merge-deep.test.ts -vendor/elysia/test/units/merge-object-schemas.test.ts -vendor/elysia/test/units/replace-schema-type.test.ts -vendor/elysia/test/validator/body.test.ts -vendor/elysia/test/validator/encode.test.ts -vendor/elysia/test/validator/exact-mirror.test.ts -vendor/elysia/test/validator/header.test.ts -vendor/elysia/test/validator/params.test.ts -vendor/elysia/test/validator/query.test.ts -vendor/elysia/test/validator/response.test.ts -vendor/elysia/test/validator/standalone.test.ts -vendor/elysia/test/validator/validator.test.ts -vendor/elysia/test/ws/aot.test.ts -vendor/elysia/test/ws/connection.test.ts -vendor/elysia/test/ws/destructuring.test.ts -vendor/elysia/test/ws/message.test.ts - # List of tests that potentially throw inside of reifyStaticProperties test/js/node/test/parallel/test-stream-some-find-every.mjs @@ -139,6 +41,8 @@ test/js/third_party/pg-gateway/pglite.test.ts test/js/web/websocket/websocket.test.js test/js/node/test/parallel/test-vm-module-referrer-realm.mjs test/js/bun/resolve/resolve.test.ts +test/cli/install/bunx.test.ts +test/js/node/util/node-inspect-tests/parallel/util-inspect.test.js # trips asan on my macos test machine test/js/node/test/parallel/test-fs-watch.js @@ -146,96 +50,6 @@ test/js/node/test/parallel/test-fs-watch-recursive-watch-file.js # hit a debug assert test/bundler/bundler_compile.test.ts -# needs https://github.com/oven-sh/WebKit/pull/94 -# missing RELEASE_AND_RETURN -test/js/node/test/parallel/test-cluster-disconnect-idle-worker.js -test/js/node/test/parallel/test-cluster-disconnect-leak.js -test/js/node/test/parallel/test-os.js -test/js/node/os/os.test.js -test/js/node/util/util-callbackify.test.js -test/js/node/vm/happy-dom-vm-16277.test.ts -test/bundler/bundler_cjs2esm.test.ts -test/bundler/bundler_html.test.ts -test/bundler/bundler_naming.test.ts -test/bundler/esbuild/css.test.ts -test/bundler/esbuild/dce.test.ts -test/bundler/esbuild/importstar.test.ts -test/bundler/esbuild/loader.test.ts -test/bundler/esbuild/ts.test.ts -test/cli/install/bun-install-registry.test.ts -test/cli/install/bun-workspaces.test.ts -test/cli/install/bunx.test.ts -test/integration/jsdom/jsdom.test.ts -test/integration/svelte/client-side.test.ts -test/js/bun/http/serve-listen.test.ts -test/js/bun/util/filesystem_router.test.ts -test/js/deno/abort/abort-controller.test.ts -test/js/deno/crypto/random.test.ts -test/js/deno/crypto/webcrypto.test.ts -test/js/deno/encoding/encoding.test.ts -test/js/deno/event/custom-event.test.ts -test/js/deno/event/event-target.test.ts -test/js/deno/event/event.test.ts -test/js/deno/fetch/blob.test.ts -test/js/deno/fetch/body.test.ts -test/js/deno/fetch/headers.test.ts -test/js/deno/fetch/request.test.ts -test/js/deno/fetch/response.test.ts -test/js/deno/performance/performance.test.ts -test/js/deno/url/url.test.ts -test/js/deno/url/urlsearchparams.test.ts -test/js/deno/v8/error.test.ts -test/js/third_party/@fastify/websocket/fastity-test-websocket.test.js -test/js/third_party/grpc-js/test-resolver.test.ts -test/js/third_party/grpc-js/test-retry-config.test.ts -test/js/third_party/grpc-js/test-retry.test.ts -test/js/third_party/mongodb/mongodb.test.ts -test/js/third_party/pino/pino.test.js -test/js/node/test/parallel/test-util-callbackify.js -test/js/bun/http/serve.test.ts -test/cli/install/catalogs.test.ts -test/cli/install/npmrc.test.ts -test/cli/install/bun-lockb.test.ts -test/cli/install/isolated-install.test.ts -test/cli/install/bun-publish.test.ts -test/cli/install/bun-lock.test.ts -test/cli/install/bun-install-lifecycle-scripts.test.ts -test/cli/update_interactive_formatting.test.ts -# ProgramExecutable::initializeGlobalProperties -# missing RELEASE_AND_RETURN -test/js/node/test/parallel/test-repl-syntax-error-handling.js -# JSModuleRecord::instantiateDeclarations -# missing RETURN_IF_EXCEPTION -test/js/node/test/parallel/test-vm-module-errors.js -# JSModuleNamespaceObject::overrideExportValue -# missing RETURN_IF_EXCEPTION -test/js/node/test/parallel/test-vm-module-synthetic.js -test/js/bun/test/mock/6874/A.test.ts -test/js/bun/test/mock/6874/B.test.ts -test/js/bun/test/mock/6879/6879.test.ts -test/js/bun/test/mock/mock-module.test.ts -test/regression/issue/11664.test.ts -# ErrorInstance::put -# missing RETURN_IF_EXCEPTION -test/js/node/util/node-inspect-tests/parallel/util-inspect.test.js -test/js/node/vm/vm.test.ts -test/js/third_party/grpc-js/test-call-propagation.test.ts -test/js/third_party/grpc-js/test-channelz.test.ts -test/js/third_party/grpc-js/test-client.test.ts -test/js/third_party/grpc-js/test-deadline.test.ts -test/js/third_party/grpc-js/test-outlier-detection.test.ts -test/js/third_party/grpc-js/test-server-deadlines.test.ts -test/js/third_party/grpc-js/test-server-errors.test.ts -test/js/third_party/grpc-js/test-server-interceptors.test.ts -test/js/third_party/grpc-js/test-server.test.ts -test/js/node/test/parallel/test-assert-if-error.js -# ErrorInstance::defineOwnProperty -# missing RETURN_IF_EXCEPTION -test/js/bun/util/inspect-error.test.js -# moduleLoaderParseModule -# missing RETURN_IF_EXCEPTION -test/bundler/transpiler/bun-pragma.test.ts - # try again later test/js/node/test/parallel/test-worker-nested-uncaught.js @@ -316,6 +130,14 @@ test/js/node/crypto/node-crypto.test.js test/js/third_party/pg/pg.test.ts test/regression/issue/01466.test.ts test/regression/issue/21311.test.ts +test/js/deno/crypto/webcrypto.test.ts +vendor/elysia/test/aot/response.test.ts +vendor/elysia/test/cookie/response.test.ts +vendor/elysia/test/cookie/signature.test.ts +vendor/elysia/test/core/dynamic.test.ts +vendor/elysia/test/lifecycle/error.test.ts +vendor/elysia/test/validator/body.test.ts +vendor/elysia/test/ws/message.test.ts test/regression/issue/ctrl-c.test.ts @@ -326,4 +148,4 @@ test/cli/hot/hot.test.ts test/cli/install/bun-repl.test.ts test/bundler/esbuild/default.test.ts test/integration/vite-build/vite-build.test.ts -test/cli/inspect/HTTPServerAgent.test.ts \ No newline at end of file +test/cli/inspect/HTTPServerAgent.test.ts