chore(lint): enable no-promise-executor-return

This commit is contained in:
Peter Steinberger
2026-05-31 23:06:03 +01:00
parent 48afba96a3
commit 22cb7fb6b7
375 changed files with 2134 additions and 884 deletions
+1
View File
@@ -22,6 +22,7 @@
"eslint/no-object-constructor": "error",
"eslint/no-param-reassign": "error",
"eslint/no-proto": "error",
"eslint/no-promise-executor-return": "error",
"eslint/no-regex-spaces": "error",
"eslint/no-return-assign": "error",
"eslint/no-sequences": "error",
+6 -1
View File
@@ -262,7 +262,12 @@ async function terminatePids(
deps: AcpxProcessCleanupDeps | undefined,
): Promise<number[]> {
const killProcess = deps?.killProcess ?? ((pid, signal) => process.kill(pid, signal));
const sleep = deps?.sleep ?? ((ms) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
const sleep =
deps?.sleep ??
((ms) =>
new Promise<void>((resolve) => {
setTimeout(resolve, ms);
}));
const terminated: number[] = [];
for (const pid of pids) {
+12 -4
View File
@@ -2958,7 +2958,9 @@ describe("active-memory plugin", () => {
};
plugin.register(api as unknown as OpenClawPluginApi);
runEmbeddedAgent.mockImplementationOnce(async (params: { timeoutMs?: number }) => {
await new Promise((resolve) => setTimeout(resolve, (params.timeoutMs ?? 0) + 5));
await new Promise((resolve) => {
setTimeout(resolve, (params.timeoutMs ?? 0) + 5);
});
return {
payloads: [{ text: "late timeout payload that should never become memory context" }],
meta: { aborted: true },
@@ -3001,7 +3003,9 @@ describe("active-memory plugin", () => {
};
plugin.register(api as unknown as OpenClawPluginApi);
runEmbeddedAgent.mockImplementationOnce(async () => {
await new Promise((resolve) => setTimeout(resolve, CONFIGURED_TIMEOUT_MS + 5));
await new Promise((resolve) => {
setTimeout(resolve, CONFIGURED_TIMEOUT_MS + 5);
});
return { payloads: [{ text: "remember the ramen place" }] };
});
@@ -3131,7 +3135,9 @@ describe("active-memory plugin", () => {
},
},
]);
await new Promise((resolve) => setTimeout(resolve, 35));
await new Promise((resolve) => {
setTimeout(resolve, 35);
});
return { payloads: [{ text: "User usually orders ramen." }] };
});
@@ -3221,7 +3227,9 @@ describe("active-memory plugin", () => {
},
},
]);
await new Promise((resolve) => setTimeout(resolve, 35));
await new Promise((resolve) => {
setTimeout(resolve, 35);
});
return { payloads: [{ text: "User usually orders ramen after late flights." }] };
});
@@ -42,7 +42,9 @@ import { BrowserCdpEndpointBlockedError } from "./errors.js";
async function startWsServer() {
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wss.once("listening", () => resolve());
});
const port = (wss.address() as { port: number }).port;
return { wss, port, url: `ws://127.0.0.1:${port}/devtools/browser/TEST` };
}
@@ -55,7 +57,9 @@ describe("cdp.helpers internal", () => {
registerManagedProxyBrowserCdpBypassMock.mockReset();
registerManagedProxyBrowserCdpBypassMock.mockImplementation(() => undefined);
if (wss) {
await new Promise<void>((resolve) => wss?.close(() => resolve()));
await new Promise<void>((resolve) => {
wss?.close(() => resolve());
});
wss = null;
}
});
@@ -307,7 +311,9 @@ describe("cdp.helpers internal", () => {
cb(true);
},
});
await new Promise<void>((resolve) => wss?.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wss?.once("listening", () => resolve());
});
const port = (wss.address() as { port: number }).port;
let callbackCount = 0;
wss.on("connection", (socket) => {
@@ -341,7 +347,9 @@ describe("cdp.helpers internal", () => {
cb(false, 429, "too many requests");
},
});
await new Promise<void>((resolve) => wss?.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wss?.once("listening", () => resolve());
});
const port = (wss.address() as { port: number }).port;
await expect(
@@ -397,7 +397,9 @@ type CdpSocketOptions = {
};
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
function normalizeRetryCount(value: number | undefined, fallback: number): number {
@@ -79,7 +79,9 @@ function replyToViewportCommandOrScreenshot(
async function startMockWsServer(handle: CdpReplyHandler) {
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wss.once("listening", () => resolve());
});
const port = (wss.address() as { port: number }).port;
wss.on("connection", (socket) => {
socket.on("message", (raw) => {
@@ -113,7 +115,9 @@ describe("cdp internal", () => {
afterEach(async () => {
if (wss) {
await new Promise<void>((resolve) => wss?.close(() => resolve()));
await new Promise<void>((resolve) => {
wss?.close(() => resolve());
});
wss = null;
}
});
@@ -1072,7 +1076,9 @@ describe("cdp internal", () => {
// in createTargetViaCdp — the bare-ws root triggers discovery.
const http = await import("node:http");
const wsServer = new WebSocketServer({ port: 0, host: "127.0.0.1" });
await new Promise<void>((resolve) => wsServer.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wsServer.once("listening", () => resolve());
});
const wsPort = (wsServer.address() as { port: number }).port;
wsServer.on("connection", (socket) => {
socket.on("message", (raw) => {
@@ -1110,7 +1116,9 @@ describe("cdp internal", () => {
}
res.writeHead(404).end();
});
await new Promise<void>((resolve) => httpServer.listen(0, "127.0.0.1", () => resolve()));
await new Promise<void>((resolve) => {
httpServer.listen(0, "127.0.0.1", () => resolve());
});
const httpPort = (httpServer.address() as { port: number }).port;
try {
const out = await createTargetViaCdp({
@@ -1119,8 +1127,12 @@ describe("cdp internal", () => {
});
expect(out.targetId).toBe("T_BARE_WS");
} finally {
await new Promise<void>((resolve) => wsServer.close(() => resolve()));
await new Promise<void>((resolve) => httpServer.close(() => resolve()));
await new Promise<void>((resolve) => {
wsServer.close(() => resolve());
});
await new Promise<void>((resolve) => {
httpServer.close(() => resolve());
});
}
});
+25 -9
View File
@@ -27,7 +27,9 @@ describe("cdp", () => {
const startWsServer = async () => {
wsServer = new WebSocketServer({ port: 0, host: "127.0.0.1" });
await new Promise<void>((resolve) => wsServer?.once("listening", resolve));
await new Promise<void>((resolve) => {
wsServer?.once("listening", resolve);
});
return (wsServer.address() as { port: number }).port;
};
@@ -77,7 +79,9 @@ describe("cdp", () => {
res.statusCode = 404;
res.end("not found");
});
await new Promise<void>((resolve) => httpServer?.listen(0, "127.0.0.1", resolve));
await new Promise<void>((resolve) => {
httpServer?.listen(0, "127.0.0.1", resolve);
});
return (httpServer.address() as { port: number }).port;
};
@@ -85,14 +89,16 @@ describe("cdp", () => {
vi.unstubAllEnvs();
await new Promise<void>((resolve) => {
if (!httpServer) {
return resolve();
resolve();
return;
}
httpServer.close(() => resolve());
httpServer = null;
});
await new Promise<void>((resolve) => {
if (!wsServer) {
return resolve();
resolve();
return;
}
wsServer.close(() => resolve());
wsServer = null;
@@ -190,7 +196,9 @@ describe("cdp", () => {
res.statusCode = 404;
res.end("not found");
});
await new Promise<void>((resolve) => httpServer?.listen(0, "127.0.0.1", resolve));
await new Promise<void>((resolve) => {
httpServer?.listen(0, "127.0.0.1", resolve);
});
const httpPort = (httpServer.address() as AddressInfo).port;
await expect(
@@ -210,7 +218,9 @@ describe("cdp", () => {
heldSockets.push(socket);
// Hold the TCP connection open without completing the WebSocket handshake.
});
await new Promise<void>((resolve) => httpServer?.listen(0, "127.0.0.1", resolve));
await new Promise<void>((resolve) => {
httpServer?.listen(0, "127.0.0.1", resolve);
});
const port = (httpServer.address() as AddressInfo).port;
try {
@@ -507,7 +517,9 @@ describe("cdp", () => {
}
});
});
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
await new Promise<void>((resolve) => {
server.listen(0, "127.0.0.1", resolve);
});
try {
const addr = server.address() as AddressInfo;
const created = await createTargetViaCdp({
@@ -516,8 +528,12 @@ describe("cdp", () => {
});
expect(created.targetId).toBe("ROOT_FALLBACK");
} finally {
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
}
});
@@ -194,8 +194,12 @@ async function withMockChromeCdpServer(params: {
const addr = server.address() as AddressInfo;
await params.run(`http://127.0.0.1:${addr.port}`);
} finally {
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
}
}
@@ -952,9 +956,13 @@ describe("chrome.ts internal", () => {
it("resolves false when the direct-ws probe cannot connect", async () => {
// Bind a ws server and then close it, so connecting to it fails.
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wss.once("listening", () => resolve());
});
const port = (wss.address() as { port: number }).port;
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
await expect(
isChromeReachable(`ws://127.0.0.1:${port}/devtools/browser/GONE`, 50),
).resolves.toBe(false);
@@ -962,7 +970,9 @@ describe("chrome.ts internal", () => {
it("resolves true when the direct-ws handshake succeeds", async () => {
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wss.once("listening", () => resolve());
});
const port = (wss.address() as { port: number }).port;
try {
// Direct /devtools/ WS URL — isChromeReachable goes through
@@ -972,7 +982,9 @@ describe("chrome.ts internal", () => {
isChromeReachable(`ws://127.0.0.1:${port}/devtools/browser/OK`, 500),
).resolves.toBe(true);
} finally {
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
}
});
});
@@ -994,9 +1006,13 @@ describe("chrome.ts internal", () => {
// accepting ws upgrades — the canRunCdpHealthCommand probe will
// fire its 'error' handler during handshake.
const dead = new WebSocketServer({ port: 0, host: "127.0.0.1" });
await new Promise<void>((resolve) => dead.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
dead.once("listening", () => resolve());
});
const deadPort = (dead.address() as { port: number }).port;
await new Promise<void>((resolve) => dead.close(() => resolve()));
await new Promise<void>((resolve) => {
dead.close(() => resolve());
});
const server = createServer((req, res) => {
if (req.url === "/json/version") {
res.writeHead(200, { "Content-Type": "application/json" });
@@ -1009,14 +1025,18 @@ describe("chrome.ts internal", () => {
}
res.writeHead(404).end();
});
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", () => resolve()));
await new Promise<void>((resolve) => {
server.listen(0, "127.0.0.1", () => resolve());
});
try {
const addr = server.address() as AddressInfo;
await expect(isChromeCdpReady(`http://127.0.0.1:${addr.port}`, 50, 10)).resolves.toBe(
false,
);
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
}
});
@@ -42,14 +42,12 @@ async function startLoopbackCdpServer(): Promise<RunningServer> {
afterEach(async () => {
await Promise.all(
runningServers
.splice(0)
.map(
(server) =>
new Promise<void>((resolve, reject) =>
server.close((err) => (err ? reject(err) : resolve())),
),
),
runningServers.splice(0).map(
(server) =>
new Promise<void>((resolve, reject) => {
server.close((err) => (err ? reject(err) : resolve()));
}),
),
);
});
+27 -9
View File
@@ -108,8 +108,12 @@ async function withMockChromeCdpServer(params: {
const addr = server.address() as AddressInfo;
await params.run(`http://127.0.0.1:${addr.port}`);
} finally {
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
}
}
@@ -549,7 +553,9 @@ describe("browser chrome helpers", () => {
}),
).rejects.toBeInstanceOf(BrowserCdpEndpointBlockedError);
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
}
});
@@ -755,8 +761,12 @@ describe("browser chrome helpers", () => {
expect(diagnostic.wsUrl).toBe(wsOnlyBase);
expect(diagnostic.browser).toBe("Browserless/Mock");
} finally {
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
}
});
@@ -785,12 +795,16 @@ describe("browser chrome helpers", () => {
);
// A real WS server accepts the handshake.
const wss = new WebSocketServer({ port: 0, host: "127.0.0.1" });
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wss.once("listening", () => resolve());
});
const port = (wss.address() as AddressInfo).port;
try {
await expect(isChromeReachable(`ws://127.0.0.1:${port}`, 500)).resolves.toBe(true);
} finally {
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
}
});
@@ -811,7 +825,9 @@ describe("browser chrome helpers", () => {
}
});
});
await new Promise<void>((resolve) => wss.once("listening", () => resolve()));
await new Promise<void>((resolve) => {
wss.once("listening", () => resolve());
});
const port = (wss.address() as AddressInfo).port;
try {
await expect(isChromeCdpReady(`ws://127.0.0.1:${port}`, 500, 500)).resolves.toBe(true);
@@ -820,7 +836,9 @@ describe("browser chrome helpers", () => {
);
expect(diagnostic.wsUrl).toBe(`ws://127.0.0.1:${port}`);
} finally {
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
}
});
+12 -4
View File
@@ -519,7 +519,9 @@ export async function launchOpenClawChrome(
if (exists(localStatePath) && exists(preferencesPath)) {
break;
}
await new Promise((r) => setTimeout(r, CHROME_BOOTSTRAP_PREFS_POLL_MS));
await new Promise((r) => {
setTimeout(r, CHROME_BOOTSTRAP_PREFS_POLL_MS);
});
}
try {
bootstrap.kill("SIGTERM");
@@ -531,7 +533,9 @@ export async function launchOpenClawChrome(
if (bootstrap.exitCode != null) {
break;
}
await new Promise((r) => setTimeout(r, CHROME_BOOTSTRAP_EXIT_POLL_MS));
await new Promise((r) => {
setTimeout(r, CHROME_BOOTSTRAP_EXIT_POLL_MS);
});
}
}
@@ -577,7 +581,9 @@ export async function launchOpenClawChrome(
launchHttpReachable = true;
break;
}
await new Promise((r) => setTimeout(r, CHROME_LAUNCH_READY_POLL_MS));
await new Promise((r) => {
setTimeout(r, CHROME_LAUNCH_READY_POLL_MS);
});
}
if (!launchHttpReachable) {
@@ -682,7 +688,9 @@ export async function stopOpenClawChrome(
return;
}
const remainingMs = timeoutMs - (Date.now() - start);
await new Promise((r) => setTimeout(r, Math.max(1, Math.min(100, remainingMs))));
await new Promise((r) => {
setTimeout(r, Math.max(1, Math.min(100, remainingMs)));
});
}
try {
@@ -37,7 +37,9 @@ describe("browser client fetch attachOnly diagnostics", () => {
socket.on("close", () => sockets.delete(socket));
socket.on("error", () => {});
});
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
await new Promise<void>((resolve) => {
server.listen(0, "127.0.0.1", resolve);
});
const port = (server.address() as { port: number }).port;
const configPath = path.join(tempHome.home, ".openclaw", "openclaw.json");
await fs.writeFile(
@@ -78,7 +80,9 @@ describe("browser client fetch attachOnly diagnostics", () => {
for (const socket of sockets) {
socket.destroy();
}
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
}
});
});
@@ -212,7 +212,9 @@ describe("pw-session ensurePageState", () => {
try {
handlers.get("download")?.[0]?.(download);
await new Promise((resolve) => setImmediate(resolve));
await new Promise((resolve) => {
setImmediate(resolve);
});
expect(unhandled).toStrictEqual([]);
await expect(download.path?.()).rejects.toThrow("save failed");
+3 -1
View File
@@ -947,7 +947,9 @@ async function connectBrowser(cdpUrl: string, ssrfPolicy?: SsrFPolicy): Promise<
break;
}
const delay = resolveCdpConnectRetryDelayMs(attempt);
await new Promise((r) => setTimeout(r, delay));
await new Promise((r) => {
setTimeout(r, delay);
});
}
}
if (lastErr instanceof Error) {
@@ -581,7 +581,9 @@ export async function clickViaPlaywright(opts: {
abortPromise,
reconcileRemoteDialog,
);
await new Promise((resolve) => setTimeout(resolve, delayMs));
await new Promise((resolve) => {
setTimeout(resolve, delayMs);
});
}
if (opts.doubleClick) {
await awaitActionWithAbort(
@@ -45,7 +45,9 @@ import type { BrowserRouteRegistrar } from "./types.js";
import { asyncBrowserRoute, jsonError, toStringOrEmpty } from "./utils.js";
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
const EXISTING_SESSION_INTERACTION_NAVIGATION_RECHECK_DELAYS_MS = [0, 250, 500] as const;
@@ -34,7 +34,9 @@ export async function resolveTargetIdAfterNavigate(opts: {
const first = pickReplacement(await opts.listTabs());
currentTargetId = first.targetId;
if (first.shouldRetry) {
await new Promise((r) => setTimeout(r, opts.retryDelayMs ?? 800));
await new Promise((r) => {
setTimeout(r, opts.retryDelayMs ?? 800);
});
currentTargetId = pickReplacement(await opts.listTabs(), {
allowSingleTabFallback: true,
}).targetId;
@@ -286,7 +286,9 @@ export function createProfileAvailability({
if (await isReachable(attemptTimeoutMs)) {
return;
}
await new Promise((r) => setTimeout(r, CDP_READY_AFTER_LAUNCH_POLL_MS));
await new Promise((r) => {
setTimeout(r, CDP_READY_AFTER_LAUNCH_POLL_MS);
});
}
throw new Error(
`Chrome CDP websocket for profile "${profile.name}" is not reachable after start. ${await describeCdpFailure(
@@ -306,7 +308,9 @@ export function createProfileAvailability({
} catch (err) {
lastError = err;
}
await new Promise((r) => setTimeout(r, CHROME_MCP_ATTACH_READY_POLL_MS));
await new Promise((r) => {
setTimeout(r, CHROME_MCP_ATTACH_READY_POLL_MS);
});
}
throw new BrowserProfileUnavailableError(formatChromeMcpAttachFailure(lastError));
};
@@ -350,7 +350,9 @@ export function createProfileTabOps({
triggerManagedTabLimit(found.targetId);
return assignTabAlias({ profileState, tab: found, label: opts?.label });
}
await new Promise((r) => setTimeout(r, OPEN_TAB_DISCOVERY_POLL_MS));
await new Promise((r) => {
setTimeout(r, OPEN_TAB_DISCOVERY_POLL_MS);
});
}
triggerManagedTabLimit(createdViaCdp);
return assignTabAlias({
@@ -21,7 +21,9 @@ function isTransientStartupFetchError(error: unknown): boolean {
}
async function sleep(ms: number): Promise<void> {
await new Promise((resolve) => setTimeout(resolve, ms));
await new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function postStartWithRetry(params: {
@@ -41,7 +41,9 @@ describe("browser control HTTP auth", () => {
if (!current) {
return;
}
await new Promise<void>((resolve) => current.close(() => resolve()));
await new Promise<void>((resolve) => {
current.close(() => resolve());
});
});
it("requires bearer auth for standalone browser HTTP routes", async () => {
+6 -4
View File
@@ -443,7 +443,9 @@ export async function createCanvasHostHandler(
}
}
if (wss) {
await new Promise<void>((resolve) => wss.close(() => resolve()));
await new Promise<void>((resolve) => {
wss.close(() => resolve());
});
}
},
};
@@ -528,9 +530,9 @@ export async function startCanvasHost(opts: CanvasHostServerOpts): Promise<Canva
if (ownsHandler) {
await handler.close();
}
await new Promise<void>((resolve, reject) =>
server.close((err) => (err ? reject(err) : resolve())),
);
await new Promise<void>((resolve, reject) => {
server.close((err) => (err ? reject(err) : resolve()));
});
},
};
}
+3 -1
View File
@@ -121,7 +121,9 @@ describe("ClickClack gateway", () => {
await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1));
socket.emit("message", Buffer.from("{not json"));
await new Promise((resolve) => setImmediate(resolve));
await new Promise((resolve) => {
setImmediate(resolve);
});
expect(runError).toBeUndefined();
expect(ctx.log?.warn).toHaveBeenCalledWith(
"[default] skipped malformed ClickClack websocket event",
+3 -1
View File
@@ -190,7 +190,9 @@ export async function startClickClackGatewayAccount(
socket.on("error", reject);
});
if (!ctx.abortSignal.aborted) {
await new Promise((resolve) => setTimeout(resolve, account.reconnectMs));
await new Promise((resolve) => {
setTimeout(resolve, account.reconnectMs);
});
}
}
ctx.setStatus({ accountId: account.accountId, running: false });
@@ -790,7 +790,9 @@ async function waitForFile(filePath: string): Promise<string> {
if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
throw error;
}
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
}
}
throw new Error(`timed out waiting for ${filePath}`);
@@ -838,10 +840,14 @@ describe("connectCodexAppServerEndpoint", () => {
await expect(
Promise.race([
probe,
new Promise((_, reject) => setTimeout(() => reject(new Error("probe timed out")), 500)),
new Promise((_, reject) => {
setTimeout(() => reject(new Error("probe timed out")), 500);
}),
]),
).resolves.toMatchObject([{ endpointId: "ws", ok: false }]);
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
});
it("rejects malformed stdio frames instead of throwing out of band", async () => {
@@ -930,7 +936,9 @@ describe("connectCodexAppServerEndpoint", () => {
);
await expect(supervisor.probeEndpoints()).resolves.toEqual([{ endpointId: "exits", ok: true }]);
await new Promise((resolve) => setTimeout(resolve, 50));
await new Promise((resolve) => {
setTimeout(resolve, 50);
});
await expect(supervisor.probeEndpoints()).resolves.toMatchObject([
{
endpointId: "exits",
@@ -147,7 +147,7 @@ describe("Codex app-server attempt timeouts", () => {
}, 5);
});
},
operation: async () => new Promise<never>(() => undefined),
operation: async () => new Promise<never>(() => {}),
});
const rejected = expect(run).rejects.toThrow("codex app-server startup timed out");
@@ -164,7 +164,7 @@ describe("Codex app-server attempt timeouts", () => {
const run = withCodexStartupTimeout({
timeoutMs: 1_000,
signal: controller.signal,
operation: async () => new Promise<never>(() => undefined),
operation: async () => new Promise<never>(() => {}),
});
const rejected = expect(run).rejects.toThrow("codex app-server startup aborted");
@@ -486,7 +486,7 @@ describe("CodexAppServerClient", () => {
clients.push(harness.client);
harness.client.addRequestHandler((request) => {
if (request.method === "item/tool/call") {
return new Promise<never>(() => undefined);
return new Promise<never>(() => {});
}
return undefined;
});
@@ -194,7 +194,7 @@ describe("dynamic tool execution helpers", () => {
toolBridge: {
handleToolCall: vi.fn((_call, options) => {
capturedSignal = options?.signal;
return new Promise<never>(() => undefined);
return new Promise<never>(() => {});
}),
},
signal: new AbortController().signal,
@@ -230,7 +230,7 @@ describe("dynamic tool execution helpers", () => {
arguments: { action: "poll", sessionId: "process-session", timeout: 30_000 },
},
toolBridge: {
handleToolCall: vi.fn(() => new Promise<never>(() => undefined)),
handleToolCall: vi.fn(() => new Promise<never>(() => {})),
},
signal: new AbortController().signal,
timeoutMs: 1,
@@ -35,7 +35,9 @@ const tinyPngBase64 =
type ProjectorNotification = Parameters<CodexAppServerEventProjector["handleNotification"]>[0];
function flushDiagnosticEvents() {
return new Promise<void>((resolve) => setImmediate(resolve));
return new Promise<void>((resolve) => {
setImmediate(resolve);
});
}
function assistantMessage(text: string, timestamp: number) {
@@ -85,7 +85,9 @@ async function drainActiveAppServerAttemptsForTest(): Promise<void> {
}
await Promise.race([
Promise.allSettled(attempts.map((attempt) => attempt.promise)),
new Promise<void>((resolve) => setTimeout(resolve, 5_000)),
new Promise<void>((resolve) => {
setTimeout(resolve, 5_000);
}),
]);
}
@@ -66,7 +66,9 @@ describe("runCodexAppServerAttempt hooks and model diagnostics", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
expect(llmInput).toHaveBeenCalled();
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
const [llmInputPayload, llmInputContext] = mockCall(llmInput, "llm_input") as [
{
@@ -817,7 +817,7 @@ describe("runCodexAppServerAttempt", () => {
onTimeout: async () => {
await releaseCodexSandboxExecServerEnvironment(sandbox);
},
operation: async () => new Promise<never>(() => undefined),
operation: async () => new Promise<never>(() => {}),
}),
).rejects.toThrow("codex app-server startup timed out");
@@ -1111,7 +1111,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
const result = await run;
@@ -1684,7 +1686,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
@@ -1725,7 +1729,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
@@ -1762,7 +1768,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
@@ -1801,7 +1809,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
await run;
@@ -1846,7 +1856,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
await run;
@@ -1891,7 +1903,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
await run;
@@ -2134,7 +2148,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
const result = await run;
@@ -2189,7 +2205,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
const result = await run;
@@ -2266,7 +2284,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
const result = await run;
@@ -2454,7 +2474,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(createParams(sessionFile, workspaceDir));
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
const result = await run;
@@ -2483,7 +2505,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
@@ -2526,7 +2550,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
@@ -2566,7 +2592,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
const result = await run;
@@ -2609,7 +2637,9 @@ describe("runCodexAppServerAttempt", () => {
const run = runCodexAppServerAttempt(params);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
@@ -2851,7 +2881,9 @@ describe("runCodexAppServerAttempt", () => {
const result = await run;
expect(result.aborted).toBe(true);
await new Promise((resolve) => setImmediate(resolve));
await new Promise((resolve) => {
setImmediate(resolve);
});
expect(unhandledRejections).toStrictEqual([]);
} finally {
process.off("unhandledRejection", onUnhandledRejection);
@@ -2943,7 +2975,9 @@ describe("runCodexAppServerAttempt", () => {
{ turnTerminalIdleTimeoutMs: 60_000 },
);
await bufferedTerminal;
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
harness.close();
const result = await run;
@@ -2983,7 +3017,9 @@ describe("runCodexAppServerAttempt", () => {
turnTerminalIdleTimeoutMs: 60_000,
});
await harness.waitForMethod("turn/start");
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
@@ -3076,7 +3112,9 @@ describe("runCodexAppServerAttempt", () => {
},
},
});
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expect(resolved).toBe(false);
await harness.notify({
@@ -3120,7 +3158,9 @@ describe("runCodexAppServerAttempt", () => {
},
},
});
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expect(resolved).toBe(false);
expect(
warn.mock.calls.some(([message]) =>
@@ -3800,7 +3840,7 @@ describe("runCodexAppServerAttempt", () => {
});
it("times out app-server startup before thread setup can hang forever", async () => {
setCodexAppServerClientFactoryForTest(() => new Promise<never>(() => undefined));
setCodexAppServerClientFactoryForTest(() => new Promise<never>(() => {}));
const params = createParams(
path.join(tempDir, "session.jsonl"),
path.join(tempDir, "workspace"),
@@ -3834,7 +3874,9 @@ describe("runCodexAppServerAttempt", () => {
interval: 1,
});
await waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await completeTurn({ threadId: "thread-1", turnId: "turn-1" });
await run;
@@ -4307,7 +4349,7 @@ describe("runCodexAppServerAttempt", () => {
const c = {
request: vi.fn(async (method: string) => {
if (method === "thread/start") {
return await new Promise<never>(() => undefined);
return await new Promise<never>(() => {});
}
return {};
}),
@@ -4502,7 +4544,9 @@ describe("runCodexAppServerAttempt", () => {
interval: 1,
});
await waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
await completeTurn({ threadId: "thread-existing", turnId: "turn-1" });
await run;
@@ -71,7 +71,9 @@ describe("createCodexAttemptTurnWatchController", () => {
try {
controller.armAttemptIdleWatch();
controller.touchActivity("turn:start", { attemptProgress: true });
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
controller.noteNotificationReceived("response.output_text.delta", {
attemptProgress: true,
attemptTimeoutMs: 40,
@@ -405,7 +407,7 @@ describe("runCodexAppServerAttempt turn watches", () => {
return turnStartResult("turn-1", "inProgress");
}
if (method === "turn/interrupt") {
return new Promise<never>(() => undefined);
return new Promise<never>(() => {});
}
return {};
});
@@ -474,7 +476,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
fastWait,
);
await new Promise((resolve) => setTimeout(resolve, 60));
await new Promise((resolve) => {
setTimeout(resolve, 60);
});
await harness.notify({
method: "rawResponseItem/completed",
params: {
@@ -488,7 +492,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
},
});
await new Promise((resolve) => setTimeout(resolve, 60));
await new Promise((resolve) => {
setTimeout(resolve, 60);
});
await harness.notify({
method: "rawResponseItem/completed",
params: {
@@ -543,7 +549,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
fastWait,
);
await new Promise((resolve) => setTimeout(resolve, 60));
await new Promise((resolve) => {
setTimeout(resolve, 60);
});
await harness.handleServerRequest({
id: "request-account-refresh",
method: "account/nonTurnRefresh",
@@ -595,7 +603,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
});
await harness.waitForMethod("turn/start");
await new Promise((resolve) => setTimeout(resolve, 60));
await new Promise((resolve) => {
setTimeout(resolve, 60);
});
void harness.handleServerRequest({
id: "request-auth-refresh",
method: "account/chatgptAuthTokens/refresh",
@@ -659,7 +669,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
fastWait,
);
await new Promise((resolve) => setTimeout(resolve, 60));
await new Promise((resolve) => {
setTimeout(resolve, 60);
});
await harness.handleServerRequest({
id: "request-null-turn-elicitation",
method: "mcpServer/elicitation/request",
@@ -673,7 +685,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
_meta: null,
},
});
await new Promise((resolve) => setTimeout(resolve, 60));
await new Promise((resolve) => {
setTimeout(resolve, 60);
});
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
@@ -735,7 +749,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
),
fastWait,
);
await new Promise((resolve) => setTimeout(resolve, 60));
await new Promise((resolve) => {
setTimeout(resolve, 60);
});
expect(
onRunProgress.mock.calls.some(
([event]) =>
@@ -788,7 +804,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
fastWait,
);
await new Promise((resolve) => setTimeout(resolve, 75));
await new Promise((resolve) => {
setTimeout(resolve, 75);
});
const response = harness.handleServerRequest({
id: "request-user-input",
method: "item/tool/requestUserInput",
@@ -812,7 +830,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await vi.waitFor(() => expect(params.onBlockReply).toHaveBeenCalledTimes(1), fastWait);
await new Promise((resolve) => setTimeout(resolve, 125));
await new Promise((resolve) => {
setTimeout(resolve, 125);
});
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
expect(queueActiveRunMessageForTest("session-1", "2")).toBe(true);
@@ -843,7 +863,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
});
await harness.waitForMethod("turn/start");
await new Promise((resolve) => setTimeout(resolve, 60));
await new Promise((resolve) => {
setTimeout(resolve, 60);
});
await harness.handleServerRequest({
id: "request-foreign-elicitation",
method: "mcpServer/elicitation/request",
@@ -1052,7 +1074,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
expect(settled).toBe(false);
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
@@ -1158,7 +1182,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
expect(settled).toBe(false);
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
@@ -1258,7 +1284,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
},
});
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
await notify({
@@ -1342,7 +1370,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
})) as { success?: boolean };
expect(toolResult.success).toBe(false);
await new Promise((resolve) => setTimeout(resolve, 130));
await new Promise((resolve) => {
setTimeout(resolve, 130);
});
expect(settled).toBe(false);
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
@@ -1406,7 +1436,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 130));
await new Promise((resolve) => {
setTimeout(resolve, 130);
});
expect(settled).toBe(false);
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
@@ -1486,7 +1518,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
fastWait,
);
await new Promise((resolve) => setTimeout(resolve, 130));
await new Promise((resolve) => {
setTimeout(resolve, 130);
});
expect(settled).toBe(false);
expect(request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
@@ -1679,7 +1713,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
expect(settled).toBe(false);
const result = await run;
@@ -1793,7 +1829,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 40));
await new Promise((resolve) => {
setTimeout(resolve, 40);
});
expect(settled).toBe(false);
const result = await run;
@@ -1884,7 +1922,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 30));
await new Promise((resolve) => {
setTimeout(resolve, 30);
});
// This covers the future-compatible path for raw response deltas if Codex
// app-server exposes them directly; current Codex primarily emits
// rawResponseItem/completed for the raw-event surface.
@@ -1896,7 +1936,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
delta: '{"cmd":"apply_patch","patch":"large chunk"}',
},
});
await new Promise((resolve) => setTimeout(resolve, 30));
await new Promise((resolve) => {
setTimeout(resolve, 30);
});
expect(settled).toBe(false);
await notify({
@@ -1989,7 +2031,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 30));
await new Promise((resolve) => {
setTimeout(resolve, 30);
});
await notify({
method: "item/fileChange/patchUpdated",
params: {
@@ -2096,7 +2140,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 30));
await new Promise((resolve) => {
setTimeout(resolve, 30);
});
await notify({
method: "response.custom_tool_call_input.delta",
params: {
@@ -2194,7 +2240,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 40));
await new Promise((resolve) => {
setTimeout(resolve, 40);
});
await notify({
method: "response.custom_tool_call_input.delta",
params: {
@@ -2597,7 +2645,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 25));
await new Promise((resolve) => {
setTimeout(resolve, 25);
});
expect(settled).toBe(false);
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
@@ -2650,7 +2700,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 25));
await new Promise((resolve) => {
setTimeout(resolve, 25);
});
expect(settled).toBe(false);
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
@@ -2686,7 +2738,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 100));
await new Promise((resolve) => {
setTimeout(resolve, 100);
});
expect(settled).toBe(false);
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
@@ -2740,7 +2794,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
});
await new Promise((resolve) => setTimeout(resolve, 100));
await new Promise((resolve) => {
setTimeout(resolve, 100);
});
expect(settled).toBe(false);
await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
@@ -2763,7 +2819,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
const run = runCodexAppServerAttempt(params, { turnCompletionIdleTimeoutMs: 15 });
await harness.waitForMethod("turn/start");
await harness.notify(rateLimitsUpdated(Date.now() + 60_000));
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
const result = await run;
expect({
@@ -2880,7 +2938,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
const queuedTerminal = harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" });
void queuedTerminal.catch(() => undefined);
await new Promise((resolve) => setTimeout(resolve, 30));
await new Promise((resolve) => {
setTimeout(resolve, 30);
});
expect(settled).toBe(false);
expect(harness.request.mock.calls.some(([method]) => method === "turn/interrupt")).toBe(false);
@@ -3191,7 +3251,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
},
});
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
expect(request).not.toHaveBeenCalledWith("turn/interrupt", expect.anything());
await notify({
@@ -3272,7 +3334,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
},
});
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
expect(request).not.toHaveBeenCalledWith("turn/interrupt", expect.anything());
await notify({
@@ -3433,7 +3497,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
},
});
await new Promise((resolve) => setTimeout(resolve, 20));
await new Promise((resolve) => {
setTimeout(resolve, 20);
});
expect(request).not.toHaveBeenCalledWith("turn/interrupt", expect.anything());
await notify({
@@ -3677,7 +3743,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
);
await harness.waitForMethod("turn/start");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
harness.close();
const result = await run;
@@ -3745,7 +3813,9 @@ describe("runCodexAppServerAttempt turn watches", () => {
},
},
});
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expect(resolved).toBe(false);
await harness.notify({
@@ -206,7 +206,9 @@ export async function waitForHttpBodyDeltas(
if (deltas.length >= count) {
return deltas;
}
await new Promise((resolve) => setTimeout(resolve, 25));
await new Promise((resolve) => {
setTimeout(resolve, 25);
});
}
throw new Error(`expected ${count} http body deltas`);
}
@@ -704,7 +704,9 @@ describe("shared Codex app-server client", () => {
});
try {
await new Promise<void>((resolve) => server.once("listening", resolve));
await new Promise<void>((resolve) => {
server.once("listening", resolve);
});
const address = server.address();
if (!address || typeof address === "string") {
throw new Error("expected websocket test server port");
@@ -741,9 +743,9 @@ describe("shared Codex app-server client", () => {
expect(authHeaders).toEqual(["Bearer tok-first", "Bearer tok-second"]);
} finally {
clearSharedCodexAppServerClient();
await new Promise<void>((resolve, reject) =>
server.close((error) => (error ? reject(error) : resolve())),
);
await new Promise<void>((resolve, reject) => {
server.close((error) => (error ? reject(error) : resolve()));
});
}
});
});
@@ -141,7 +141,9 @@ function mockCall(mock: ReturnType<typeof vi.fn>, index = 0): unknown[] {
}
function flushDiagnosticEvents() {
return new Promise<void>((resolve) => setImmediate(resolve));
return new Promise<void>((resolve) => {
setImmediate(resolve);
});
}
function activeDiagnosticToolKeys(events: DiagnosticEventPayload[]): Set<string> {
@@ -12,14 +12,12 @@ describe("Codex app-server websocket transport", () => {
}
clients.length = 0;
await Promise.all(
servers
.splice(0)
.map(
(server) =>
new Promise<void>((resolve, reject) =>
server.close((error) => (error ? reject(error) : resolve())),
),
),
servers.splice(0).map(
(server) =>
new Promise<void>((resolve, reject) => {
server.close((error) => (error ? reject(error) : resolve()));
}),
),
);
});
@@ -42,7 +40,9 @@ describe("Codex app-server websocket transport", () => {
}
});
});
await new Promise<void>((resolve) => server.once("listening", resolve));
await new Promise<void>((resolve) => {
server.once("listening", resolve);
});
const address = server.address();
if (!address || typeof address === "string") {
throw new Error("expected websocket test server port");
@@ -1096,7 +1096,9 @@ describe("codex conversation binding", () => {
},
{ timeoutMs: 50 },
);
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expect(result).toEqual({
handled: true,
+3 -1
View File
@@ -387,7 +387,9 @@ function isCodexPluginLoadWarningItem(item: MigrationItem): boolean {
}
async function sleep(ms: number): Promise<void> {
await new Promise((resolve) => setTimeout(resolve, ms));
await new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function buildTargetCodexPluginAppCacheKey(ctx: MigrationProviderContext): Promise<string> {
+6 -2
View File
@@ -440,7 +440,9 @@ async function waitForLocalHistory(params: {
}
const pollDelayMs = resolveComfyRemainingMs(deadline, params.timeoutMs, params.pollIntervalMs);
await new Promise((resolve) => setTimeout(resolve, pollDelayMs));
await new Promise((resolve) => {
setTimeout(resolve, pollDelayMs);
});
}
}
@@ -479,7 +481,9 @@ async function waitForCloudCompletion(params: {
}
const pollDelayMs = resolveComfyRemainingMs(deadline, params.timeoutMs, params.pollIntervalMs);
await new Promise((resolve) => setTimeout(resolve, pollDelayMs));
await new Promise((resolve) => {
setTimeout(resolve, pollDelayMs);
});
}
}
+3 -1
View File
@@ -55,7 +55,9 @@ function createDeferred<T>() {
}
async function flushAsyncWork() {
await new Promise((resolve) => setTimeout(resolve, 0));
await new Promise((resolve) => {
setTimeout(resolve, 0);
});
}
describe("createCopilotAgentHarness", () => {
+3 -1
View File
@@ -729,7 +729,9 @@ describe("runCopilotAttempt", () => {
});
const session = await sessionCreated.promise;
for (let i = 0; i < 100 && session.sendAndWait.mock.calls.length === 0; i++) {
await new Promise((resolve) => setTimeout(resolve, 0));
await new Promise((resolve) => {
setTimeout(resolve, 0);
});
}
expect(session.sendAndWait).toHaveBeenCalledTimes(1);
+20 -16
View File
@@ -346,7 +346,9 @@ async function emitAndCaptureLog(
}
function flushDiagnosticEvents() {
return new Promise<void>((resolve) => setImmediate(resolve));
return new Promise<void>((resolve) => {
setImmediate(resolve);
});
}
function emitTrustedModelCallCompletedWithContent(
@@ -3297,24 +3299,26 @@ describe("diagnostics-otel service", () => {
},
{
inputMessages: [
{ role: "user", content: "what changed?", timestamp: 1 },
{
role: "assistant",
content: [{ type: "toolCall", id: "call-1", name: "lookup", arguments: { q: "trace" } }],
},
{ role: "toolResult", toolCallId: "call-1", content: { rows: 1 } },
],
{ role: "user", content: "what changed?", timestamp: 1 },
{
role: "assistant",
content: [
{ type: "toolCall", id: "call-1", name: "lookup", arguments: { q: "trace" } },
],
},
{ role: "toolResult", toolCallId: "call-1", content: { rows: 1 } },
],
outputMessages: [
{
role: "assistant",
content: [{ type: "text", text: "the trace changed" }],
stopReason: "stop",
},
],
{
role: "assistant",
content: [{ type: "text", text: "the trace changed" }],
stopReason: "stop",
},
],
systemPrompt: "be exact",
toolDefinitions: [
{ name: "lookup", description: "Lookup data", parameters: { type: "object" } },
],
{ name: "lookup", description: "Lookup data", parameters: { type: "object" } },
],
},
);
await flushDiagnosticEvents();
@@ -1154,9 +1154,13 @@ describe("processDiscordMessage ack reactions", () => {
vi.useFakeTimers();
dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {
await params?.replyOptions?.onCompactionStart?.();
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
await params?.replyOptions?.onCompactionEnd?.();
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
return createNoQueuedDispatchResult();
});
@@ -1545,7 +1549,9 @@ describe("processDiscordMessage session routing", () => {
vi.useFakeTimers();
dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {
await params?.replyOptions?.onReasoningStream?.();
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
return createNoQueuedDispatchResult();
});
const ctx = await createBaseContext({
@@ -1583,7 +1589,9 @@ describe("processDiscordMessage session routing", () => {
vi.useFakeTimers();
dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {
await params?.replyOptions?.onReasoningStream?.();
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
return createNoQueuedDispatchResult();
});
const ctx = await createBaseContext({
@@ -119,7 +119,9 @@ export async function applyDiscordModelPickerSelection(params: {
const fallbackRoute = dispatchResult.effectiveRoute ?? params.route;
if (params.settleMs > 0) {
await new Promise((resolve) => setTimeout(resolve, params.settleMs));
await new Promise((resolve) => {
setTimeout(resolve, params.settleMs);
});
}
let effectiveModelRef = params.resolveCurrentModel(fallbackRoute);
@@ -135,7 +137,9 @@ export async function applyDiscordModelPickerSelection(params: {
params.selectedModel === params.defaultModel,
runtime: params.selectedRuntime,
});
await new Promise((resolve) => setTimeout(resolve, 100));
await new Promise((resolve) => {
setTimeout(resolve, 100);
});
effectiveModelRef = params.resolveCurrentModel(fallbackRoute);
persisted = effectiveModelRef === params.resolvedModelRef;
}
@@ -155,7 +159,9 @@ export async function applyDiscordModelPickerSelection(params: {
params.selectedModel === params.defaultModel,
runtime: params.selectedRuntime,
});
await new Promise((resolve) => setTimeout(resolve, 100));
await new Promise((resolve) => {
setTimeout(resolve, 100);
});
effectiveModelRef = params.resolveCurrentModel(fallbackRoute);
persisted = effectiveModelRef === params.resolvedModelRef;
if (!persisted) {
@@ -440,7 +440,9 @@ describe("createDiscordGatewayPlugin", () => {
process.on("unhandledRejection", onUnhandledRejection);
try {
startIgnoredGatewayRegistration(plugin);
await new Promise((resolve) => setImmediate(resolve));
await new Promise((resolve) => {
setImmediate(resolve);
});
expect(unhandledReasons).toHaveLength(0);
const registration = waitForDiscordGatewayPluginRegistration(plugin);
@@ -3865,14 +3865,18 @@ describe("DiscordVoiceManager", () => {
resolveSecond?.({ payloads: [{ text: "second answer" }] });
resolveThird?.({ payloads: [{ text: "third answer" }] });
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expectUserMessageNotIncludes("second answer");
expectUserMessageNotIncludes("third answer");
bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
const firstStream = lastAudioResourceInput() as PassThrough | undefined;
await vi.waitFor(() => expect(firstStream?.writableEnded).toBe(true));
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expectUserMessageNotIncludes("second answer");
const idleHandler = player.on.mock.calls.find(([event]) => event === "idle")?.[1] as
@@ -3886,7 +3890,9 @@ describe("DiscordVoiceManager", () => {
bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
const secondStream = lastAudioResourceInput() as PassThrough | undefined;
await vi.waitFor(() => expect(secondStream?.writableEnded).toBe(true));
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expectUserMessageNotIncludes("third answer");
idleHandler?.();
@@ -3950,7 +3956,9 @@ describe("DiscordVoiceManager", () => {
bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
const firstStream = lastAudioResourceInput() as PassThrough | undefined;
await vi.waitFor(() => expect(firstStream?.writableEnded).toBe(true));
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expectUserMessageNotIncludes("second answer");
const idleHandler = player.on.mock.calls.find(([event]) => event === "idle")?.[1] as
+3 -1
View File
@@ -538,7 +538,9 @@ async function waitForFalQueueResult(params: {
throw new Error(FAL_VIDEO_MALFORMED_RESPONSE);
}
const pollDelayMs = resolveFalQueueRemainingMs(params.deadline, lastStatus, POLL_INTERVAL_MS);
await new Promise((resolve) => setTimeout(resolve, pollDelayMs));
await new Promise((resolve) => {
setTimeout(resolve, pollDelayMs);
});
}
}
+3 -1
View File
@@ -340,7 +340,9 @@ export async function getAppOwnerOpenId(params: {
}
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
function sleepRegistrationPollInterval(intervalSeconds: number): Promise<void> {
+3 -1
View File
@@ -361,7 +361,9 @@ async function resolveParsedCommentContent(params: {
}
async function delayMs(ms: number): Promise<void> {
await new Promise((resolve) => setTimeout(resolve, ms));
await new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
function buildDriveCommentTargetUrl(params: {
@@ -10,12 +10,16 @@ const WEBHOOK_MONITOR_START_MAX_ATTEMPTS = 4;
export async function getFreePort(): Promise<number> {
const server = createServer();
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", () => resolve()));
await new Promise<void>((resolve) => {
server.listen(0, "127.0.0.1", () => resolve());
});
const address = server.address() as AddressInfo | null;
if (!address) {
throw new Error("missing server address");
}
await new Promise<void>((resolve) => server.close(() => resolve()));
await new Promise<void>((resolve) => {
server.close(() => resolve());
});
return address.port;
}
@@ -29,7 +33,9 @@ async function waitUntilServerReady(url: string): Promise<void> {
} catch {
// retry
}
await new Promise((resolve) => setTimeout(resolve, WEBHOOK_READY_RETRY_DELAY_MS));
await new Promise((resolve) => {
setTimeout(resolve, WEBHOOK_READY_RETRY_DELAY_MS);
});
}
throw new Error(`server did not start: ${url}`);
}
@@ -108,7 +114,9 @@ export async function withRunningWebhookMonitor(
abortController.abort();
await monitorPromise.catch(() => undefined);
if (attempt < WEBHOOK_MONITOR_START_MAX_ATTEMPTS) {
await new Promise((resolve) => setTimeout(resolve, attempt * WEBHOOK_READY_RETRY_DELAY_MS));
await new Promise((resolve) => {
setTimeout(resolve, attempt * WEBHOOK_READY_RETRY_DELAY_MS);
});
}
}
}
@@ -1805,7 +1805,9 @@ describe("createFeishuReplyDispatcher streaming behavior", () => {
const fallbackPromise = result.ensureNoVisibleReplyFallback("zero-final-count");
for (let attempt = 0; attempt < 20 && closeMock.mock.calls.length === 0; attempt += 1) {
await new Promise((resolve) => setTimeout(resolve, 0));
await new Promise((resolve) => {
setTimeout(resolve, 0);
});
}
expect(closeMock).toHaveBeenCalledTimes(1);
expect(sendMessageFeishuMock).not.toHaveBeenCalled();
@@ -85,7 +85,9 @@ describe("createSequentialQueue", () => {
}),
).rejects.toThrow("boom");
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expect(unhandled).toStrictEqual([]);
await expect(enqueue("feishu:default:chat-1", async () => {})).resolves.toBeUndefined();
+3 -1
View File
@@ -420,7 +420,9 @@ async function runNewAppFlow(params: {
// ----- Apply credentials & security policy -----
const configProgress = prompter.progress(t("wizard.feishu.configuring"));
await new Promise((resolve) => setTimeout(resolve, 50));
await new Promise((resolve) => {
setTimeout(resolve, 50);
});
if (appId && appSecret) {
next = patchFeishuConfig(next, targetAccountId, {
+3 -1
View File
@@ -221,7 +221,9 @@ async function sleepGitHubDevicePollDelay(delayMs: number, expiresAt: number): P
while (Date.now() < targetAt) {
const remainingMs = Math.max(1, targetAt - Date.now());
const safeDelayMs = resolveTimerTimeoutMs(remainingMs, 1);
await new Promise((resolve) => setTimeout(resolve, Math.min(safeDelayMs, remainingMs)));
await new Promise((resolve) => {
setTimeout(resolve, Math.min(safeDelayMs, remainingMs));
});
}
}
+3 -1
View File
@@ -140,7 +140,9 @@ function startGoogleMeetNodeAudioInputLoop(params: {
if (consecutiveInputErrors >= 5 || /unknown bridgeId|bridge is not open/i.test(message)) {
await params.stop();
} else {
await new Promise((resolve) => setTimeout(resolve, 250));
await new Promise((resolve) => {
setTimeout(resolve, 250);
});
}
}
}
@@ -766,7 +766,9 @@ async function openMeetWithBrowserRequest(params: {
}
const remainingWaitMs = deadline - Date.now();
if (remainingWaitMs > 0) {
await new Promise((resolve) => setTimeout(resolve, Math.min(750, remainingWaitMs)));
await new Promise((resolve) => {
setTimeout(resolve, Math.min(750, remainingWaitMs));
});
}
} while (Date.now() < deadline);
return { launched: true, browser };
+3 -1
View File
@@ -267,7 +267,9 @@ async function waitForGeminiBatch(params: {
throw new Error(`gemini batch ${params.batchName} timed out after ${params.timeoutMs}ms`);
}
params.debug?.(`gemini batch ${params.batchName} ${state}; waiting ${params.pollIntervalMs}ms`);
await new Promise((resolve) => setTimeout(resolve, params.pollIntervalMs));
await new Promise((resolve) => {
setTimeout(resolve, params.pollIntervalMs);
});
current = undefined;
}
}
+3 -1
View File
@@ -64,7 +64,9 @@ async function pollOperation(
headers: Record<string, string>,
): Promise<{ done?: boolean; response?: { cloudaicompanionProject?: { id?: string } } }> {
for (let attempt = 0; attempt < 24; attempt += 1) {
await new Promise((resolve) => setTimeout(resolve, 5000));
await new Promise((resolve) => {
setTimeout(resolve, 5000);
});
const response = await fetchWithTimeout(`${endpoint}/v1internal/${operationName}`, {
headers,
});
@@ -30,7 +30,9 @@ describe("monitorIMessageProvider", () => {
});
abortController.abort();
// Give the event loop a turn to surface any unhandledRejection, if present.
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
detach();
} finally {
process.off("unhandledRejection", onUnhandled);
@@ -475,7 +475,9 @@ describe("monitorLineProvider lifecycle", () => {
const firstRequests = Array.from({ length: limit }, () =>
route.handler(createHeldPostRequest(), createRouteResponse()),
);
await new Promise((resolve) => setImmediate(resolve));
await new Promise((resolve) => {
setImmediate(resolve);
});
const overflowResponse = createRouteResponse();
await route.handler(createSignedPostRequest(), overflowResponse);
@@ -589,7 +589,7 @@ describe("matrix verification actions", () => {
startVerification: vi.fn(async () => sas),
};
const getOwnDeviceIdentityVerificationStatus = vi.fn(
async () => await new Promise<never>(() => undefined),
async () => await new Promise<never>(() => {}),
);
const getOwnDeviceVerificationStatus = vi.fn(async () => mockVerifiedOwnerStatus());
const getOwnCrossSigningPublicationStatus = vi.fn(async () =>
@@ -293,9 +293,9 @@ async function resolveVerificationSasNoticeForSignal(
};
}
await new Promise((resolve) =>
setTimeout(resolve, params.sasNoticeRetryDelayMs ?? SAS_NOTICE_RETRY_DELAY_MS),
);
await new Promise((resolve) => {
setTimeout(resolve, params.sasNoticeRetryDelayMs ?? SAS_NOTICE_RETRY_DELAY_MS);
});
const retriedSummary = await resolveVerificationSummaryForSignal(client, params);
return {
summary: retriedSummary,
+3 -3
View File
@@ -1848,13 +1848,13 @@ describe("MatrixClient crypto bootstrapping", () => {
localTimeoutMs: 1,
});
vi.spyOn(client, "getRoomKeyBackupStatus").mockImplementation(
async () => await new Promise<never>(() => undefined),
async () => await new Promise<never>(() => {}),
);
vi.spyOn(client, "getDeviceVerificationStatus").mockImplementation(
async () => await new Promise<never>(() => undefined),
async () => await new Promise<never>(() => {}),
);
vi.spyOn(client, "listOwnDevices").mockImplementation(
async () => await new Promise<never>(() => undefined),
async () => await new Promise<never>(() => {}),
);
const status = await client.getOwnDeviceVerificationStatus();
@@ -439,7 +439,9 @@ export abstract class MemoryManagerEmbeddingOps extends MemoryManagerSyncOps {
EMBEDDING_RETRY_MAX_DELAY_MS,
);
log.warn(`memory embeddings retryable error; ${action} in ${waitMs}ms`);
await new Promise((resolve) => setTimeout(resolve, waitMs));
await new Promise((resolve) => {
setTimeout(resolve, waitMs);
});
}
private resolveEmbeddingTimeout(kind: "query" | "batch"): number {
@@ -97,7 +97,9 @@ async function waitUntil(predicate: () => boolean, timeoutMs = 1_000): Promise<v
if (Date.now() - startedAt > timeoutMs) {
throw new Error("Timed out waiting for condition");
}
await new Promise((resolve) => scheduleNativeTimeout(resolve, 10));
await new Promise((resolve) => {
scheduleNativeTimeout(resolve, 10);
});
}
}
@@ -723,7 +725,9 @@ describe("QmdMemoryManager", () => {
void createPromise.then(() => {
created = true;
});
await new Promise<void>((resolve) => setImmediate(resolve));
await new Promise<void>((resolve) => {
setImmediate(resolve);
});
expect(created).toBe(false);
(releaseUpdate as (() => void) | null)?.();
const manager = await createPromise;
@@ -1692,7 +1692,9 @@ export class QmdMemoryManager implements MemorySearchManager {
log.warn(
`qmd update retry ${attempt}/${maxAttempts - 1} after failure (${reason}): ${String(err)}`,
);
await new Promise<void>((resolve) => setTimeout(resolve, delayMs));
await new Promise<void>((resolve) => {
setTimeout(resolve, delayMs);
});
}
}
}
@@ -3049,7 +3051,9 @@ export class QmdMemoryManager implements MemorySearchManager {
}
await Promise.race([
pending.catch(() => undefined),
new Promise<void>((resolve) => setTimeout(resolve, SEARCH_PENDING_UPDATE_WAIT_MS)),
new Promise<void>((resolve) => {
setTimeout(resolve, SEARCH_PENDING_UPDATE_WAIT_MS);
}),
]);
}
@@ -467,7 +467,7 @@ describe("memory tools", () => {
];
});
registerMemoryCorpusSupplement("memory-wiki", {
search: async () => await new Promise(() => undefined),
search: async () => await new Promise(() => {}),
get: async () => null,
});
@@ -503,7 +503,7 @@ describe("memory tools", () => {
let searchCalls = 0;
setMemorySearchImpl(async () => {
searchCalls += 1;
return await new Promise(() => undefined);
return await new Promise(() => {});
});
registerMemoryCorpusSupplement("memory-wiki", {
search: async () => [
+2 -2
View File
@@ -133,7 +133,7 @@ describe("memory_search unavailable payloads", () => {
it("returns unavailable metadata when manager setup does not settle", async () => {
vi.useFakeTimers();
try {
setMemorySearchManagerImpl(async () => await new Promise(() => undefined));
setMemorySearchManagerImpl(async () => await new Promise(() => {}));
const tool = createMemorySearchToolOrThrow();
const resultPromise = tool.execute("manager-timeout", { query: "hello" });
@@ -156,7 +156,7 @@ describe("memory_search unavailable payloads", () => {
let searchCalls = 0;
setMemorySearchImpl(async () => {
searchCalls += 1;
return await new Promise(() => undefined);
return await new Promise(() => {});
});
const tool = createMemorySearchToolOrThrow();
+1 -1
View File
@@ -716,7 +716,7 @@ describe("memory plugin e2e", () => {
test("returns unavailable when memory_recall embedding does not settle", async () => {
vi.useFakeTimers();
const ensureGlobalUndiciEnvProxyDispatcher = vi.fn();
const post = vi.fn(() => new Promise(() => undefined));
const post = vi.fn(() => new Promise(() => {}));
const loadLanceDbModule = vi.fn(async () => ({
connect: vi.fn(async () => ({
tableNames: vi.fn(async () => ["memories"]),
+3 -1
View File
@@ -148,7 +148,9 @@ describe("compileMemoryWikiVault", () => {
activePageReads += 1;
maxActivePageReads = Math.max(maxActivePageReads, activePageReads);
try {
await new Promise((resolve) => setTimeout(resolve, 5));
await new Promise((resolve) => {
setTimeout(resolve, 5);
});
return await originalReadFile(...args);
} finally {
activePageReads -= 1;
+3 -1
View File
@@ -284,7 +284,9 @@ export async function loginMiniMaxPortalOAuth(params: {
if (remainingMs <= 0) {
break;
}
await new Promise((resolve) => setTimeout(resolve, Math.min(pollIntervalMs, remainingMs)));
await new Promise((resolve) => {
setTimeout(resolve, Math.min(pollIntervalMs, remainingMs));
});
pollIntervalMs = Math.max(pollIntervalMs, 2000);
}
@@ -303,7 +303,9 @@ describe("monitorMSTeamsProvider lifecycle", () => {
const early = await Promise.race([
task.then(() => "resolved"),
new Promise<"pending">((resolve) => setTimeout(() => resolve("pending"), 50)),
new Promise<"pending">((resolve) => {
setTimeout(() => resolve("pending"), 50);
}),
]);
expect(early).toBe("pending");
+3 -1
View File
@@ -1869,7 +1869,9 @@ describe("createOllamaStreamFn streaming events", () => {
expect(
await Promise.race([
pendingStartEvent.then(() => "event" as const),
new Promise<"timeout">((resolve) => setTimeout(() => resolve("timeout"), 100)),
new Promise<"timeout">((resolve) => {
setTimeout(() => resolve("timeout"), 100);
}),
]),
).toBe("timeout");
+3 -1
View File
@@ -194,7 +194,9 @@ async function waitForOpenAiBatch(params: {
throw new Error(`openai batch ${params.batchId} timed out after ${params.timeoutMs}ms`);
}
params.debug?.(`openai batch ${params.batchId} ${state}; waiting ${params.pollIntervalMs}ms`);
await new Promise((resolve) => setTimeout(resolve, params.pollIntervalMs));
await new Promise((resolve) => {
setTimeout(resolve, params.pollIntervalMs);
});
current = undefined;
}
}
@@ -194,9 +194,9 @@ async function pollOpenAICodexDeviceCode(params: {
}
if (response.status === 403 || response.status === 404) {
await new Promise((resolve) =>
setTimeout(resolve, resolveNextDeviceCodePollDelayMs(params.intervalMs, deadline)),
);
await new Promise((resolve) => {
setTimeout(resolve, resolveNextDeviceCodePollDelayMs(params.intervalMs, deadline));
});
continue;
}
@@ -163,7 +163,7 @@ function settleAfterDelay(params: {
}
function waitForeverForPromptInput(): Promise<string> {
return new Promise<string>(() => undefined);
return new Promise<string>(() => {});
}
function createOpenAICodexOAuthError(
+3 -1
View File
@@ -312,7 +312,9 @@ describeLive("openai plugin live", () => {
try {
await session.connect();
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
expect(errors).toStrictEqual([]);
expect(session.isConnected()).toBe(true);
} finally {
+3 -1
View File
@@ -872,7 +872,9 @@ class OpenAIRealtimeVoiceBridge implements RealtimeVoiceBridge {
type: "session.reconnect.scheduled",
detail: `reason=${reason} attempt=${attempt} delayMs=${delay}`,
});
await new Promise((resolve) => setTimeout(resolve, delay));
await new Promise((resolve) => {
setTimeout(resolve, delay);
});
if (this.intentionallyClosed) {
return;
}
@@ -148,7 +148,9 @@ describeCacheLive("openrouter plugin live cache", () => {
];
await completeOpenRouterChat({ client, model: resolved.id, messages });
await new Promise((resolve) => setTimeout(resolve, 2_000));
await new Promise((resolve) => {
setTimeout(resolve, 2_000);
});
const cached = await completeOpenRouterChat({ client, model: resolved.id, messages });
const cachedTokens = cached.usage?.prompt_tokens_details?.cached_tokens ?? 0;
+3 -1
View File
@@ -270,7 +270,9 @@ HTTPServer(("0.0.0.0", 8000), Handler).serve_forever()
},
};
}
await new Promise((resolve) => setTimeout(resolve, 500));
await new Promise((resolve) => {
setTimeout(resolve, 500);
});
}
await runCommand({
+3 -1
View File
@@ -130,7 +130,9 @@ describe("qa-bus state", () => {
const beforeMatch = await Promise.race([
pending.then(() => "resolved"),
new Promise((resolve) => setTimeout(() => resolve("still-waiting"), 20)),
new Promise((resolve) => {
setTimeout(() => resolve("still-waiting"), 20);
}),
]);
expect(beforeMatch).toBe("still-waiting");
+1 -1
View File
@@ -491,7 +491,7 @@ async function runInterruptibleServer(label: string, server: InterruptibleServer
process.on("SIGINT", onSignal);
process.on("SIGTERM", onSignal);
await new Promise(() => undefined);
await new Promise(() => {});
}
async function readQaCredentialPayloadFile(filePath: string) {
@@ -25,9 +25,9 @@ async function occupyPortOrAcceptExisting(port: number): Promise<{ close: () =>
if (!listening) {
return;
}
await new Promise<void>((resolve, reject) =>
server.close((error) => (error ? reject(error) : resolve())),
);
await new Promise<void>((resolve, reject) => {
server.close((error) => (error ? reject(error) : resolve()));
});
},
};
}
+3 -1
View File
@@ -376,7 +376,9 @@ async function waitForQaGatewayChildExit(child: ChildProcess, timeoutMs: number)
return true;
}
return await Promise.race([
new Promise<boolean>((resolve) => child.once("exit", () => resolve(true))),
new Promise<boolean>((resolve) => {
child.once("exit", () => resolve(true));
}),
sleep(timeoutMs).then(() => false),
]);
}
@@ -41,9 +41,9 @@ describe("qa-lab server capture helpers", () => {
});
cleanups.push(
async () =>
await new Promise<void>((resolve, reject) =>
server.close((error) => (error ? reject(error) : resolve())),
),
await new Promise<void>((resolve, reject) => {
server.close((error) => (error ? reject(error) : resolve()));
}),
);
const address = server.address();
+3 -3
View File
@@ -480,9 +480,9 @@ describe("qa-lab server", () => {
});
cleanups.push(
async () =>
await new Promise<void>((resolve, reject) =>
upstream.close((error) => (error ? reject(error) : resolve())),
),
await new Promise<void>((resolve, reject) => {
upstream.close((error) => (error ? reject(error) : resolve()));
}),
);
const address = upstream.address();
@@ -656,7 +656,9 @@ async function waitForDiscordVoiceState(params: {
} catch (error) {
lastError = formatErrorMessage(error);
}
await new Promise((resolve) => setTimeout(resolve, 500));
await new Promise((resolve) => {
setTimeout(resolve, 500);
});
}
const stateDetails = lastState
? `last voice state channel=${lastState.channel_id ?? "none"} user=${lastState.user_id ?? "unknown"}`
@@ -1061,7 +1063,9 @@ async function observeStatusReactionTimeline(params: {
if (params.expectedSequence.every((emoji) => seenSequence.includes(emoji))) {
break;
}
await new Promise((resolve) => setTimeout(resolve, 250));
await new Promise((resolve) => {
setTimeout(resolve, 250);
});
}
return {
expectedSequence: params.expectedSequence,
@@ -1159,7 +1163,9 @@ async function pollChannelMessages(params: {
return { message: observedMessage, afterSnowflake };
}
}
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
}
throw new Error(`timed out after ${params.timeoutMs}ms waiting for Discord message`);
}
@@ -1185,7 +1191,9 @@ async function pollThreadReplyMessage(params: {
if (match) {
return match;
}
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
}
return undefined;
}
@@ -1369,7 +1377,9 @@ async function waitForDiscordChannelRunning(
} catch {
// retry
}
await new Promise((resolve) => setTimeout(resolve, 500));
await new Promise((resolve) => {
setTimeout(resolve, 500);
});
}
const details = lastStatus
? ` (last status: running=${String(lastStatus.running)} connected=${String(lastStatus.connected)} restartPending=${String(lastStatus.restartPending)} lastConnectedAt=${String(lastStatus.lastConnectedAt)} lastError=${lastStatus.lastError ?? "null"} lastDisconnect=${JSON.stringify(lastStatus.lastDisconnect)})`
@@ -1533,7 +1543,9 @@ async function assertDiscordApplicationCommandsRegistered(params: {
if (missing.length === 0) {
return { commandNames: lastNames };
}
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
}
throw new Error(
`missing Discord native command(s): ${params.expectedCommandNames
@@ -388,7 +388,11 @@ export async function acquireQaCredentialLease<TPayload>(
});
const fetchImpl = opts.fetchImpl ?? fetch;
const sleepImpl =
opts.sleepImpl ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));
opts.sleepImpl ??
((ms: number) =>
new Promise((resolve) => {
setTimeout(resolve, ms);
}));
const timeImpl = opts.timeImpl ?? (() => Date.now());
const randomImpl = opts.randomImpl ?? (() => Math.random());
const startedAt = timeImpl();
@@ -949,7 +949,9 @@ async function waitForSlackScenarioReply(params: {
{ cause: error },
);
}
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
}
throw new Error(`timed out after ${params.timeoutMs}ms waiting for Slack message`);
}
@@ -1012,7 +1014,9 @@ async function waitForSlackNoReply(params: {
elapsedMs = Date.now() - startedAt;
const remainingMs = params.timeoutMs - elapsedMs;
if (remainingMs > 0) {
await new Promise((resolve) => setTimeout(resolve, Math.min(1_000, remainingMs)));
await new Promise((resolve) => {
setTimeout(resolve, Math.min(1_000, remainingMs));
});
}
elapsedMs = Date.now() - startedAt;
}
@@ -1134,7 +1138,9 @@ async function waitForSlackApprovalPrompt(params: {
observedAt: new Date().toISOString(),
};
}
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
}
throw new Error(
[
@@ -1202,7 +1208,9 @@ async function waitForSlackApprovalResolvedUpdate(params: {
};
}
}
await new Promise((resolve) => setTimeout(resolve, 1_000));
await new Promise((resolve) => {
setTimeout(resolve, 1_000);
});
}
throw new Error(
`timed out after ${params.timeoutMs}ms waiting for Slack ${params.approvalKind} approval resolution update`,
@@ -1252,7 +1260,9 @@ async function waitForSlackApprovalCheckpointAck(params: {
throw error;
}
}
await new Promise((resolve) => setTimeout(resolve, 500));
await new Promise((resolve) => {
setTimeout(resolve, 500);
});
}
throw new Error(`timed out after ${params.timeoutMs}ms waiting for ${params.ackPath}`);
}
@@ -1572,7 +1582,9 @@ async function waitForSlackChannelRunning(
} catch {
// retry
}
await new Promise((resolve) => setTimeout(resolve, 500));
await new Promise((resolve) => {
setTimeout(resolve, 500);
});
}
throw new Error(
`slack account "${accountId}" did not become ready` +
@@ -1599,9 +1611,9 @@ async function waitForSlackChannelStable(
if (readyForMs >= SLACK_QA_READY_STABILITY_MS) {
return;
}
await new Promise((resolve) =>
setTimeout(resolve, Math.max(500, SLACK_QA_READY_STABILITY_MS - readyForMs)),
);
await new Promise((resolve) => {
setTimeout(resolve, Math.max(500, SLACK_QA_READY_STABILITY_MS - readyForMs));
});
}
throw new Error(
`slack account "${accountId}" did not remain ready for ${SLACK_QA_READY_STABILITY_MS}ms`,
@@ -2018,7 +2030,9 @@ export async function runSlackQaLive(params: {
await gatewayHarness.stop().catch((error) => {
appendLiveLaneIssue(cleanupIssues, "gateway stop failed", error);
});
await new Promise((resolve) => setTimeout(resolve, SLACK_QA_GATEWAY_STOP_SETTLE_MS));
await new Promise((resolve) => {
setTimeout(resolve, SLACK_QA_GATEWAY_STOP_SETTLE_MS);
});
}
}
if (scenarioResults.at(-1)?.id === scenario.id) {
@@ -898,7 +898,9 @@ async function sendGroupMessage(
}
async function waitForTelegramPollRetryDelay(remainingMs: number) {
await new Promise((resolve) => setTimeout(resolve, Math.min(250, Math.max(100, remainingMs))));
await new Promise((resolve) => {
setTimeout(resolve, Math.min(250, Math.max(100, remainingMs)));
});
}
async function waitForObservedMessage(params: {
@@ -1120,7 +1122,9 @@ async function waitForTelegramChannelRunning(
} catch {
// retry
}
await new Promise((resolve) => setTimeout(resolve, 500));
await new Promise((resolve) => {
setTimeout(resolve, 500);
});
}
throw new Error(`telegram account "${accountId}" did not become ready`);
}
@@ -535,7 +535,9 @@ async function waitForWhatsAppChannelRunning(
} catch {
// retry
}
await new Promise((resolve) => setTimeout(resolve, 750));
await new Promise((resolve) => {
setTimeout(resolve, 750);
});
}
throw new Error(
`whatsapp account "${accountId}" did not become ready` +
@@ -555,9 +557,9 @@ async function waitForWhatsAppChannelStable(gateway: WhatsAppQaGateway, accountI
if (connectedForMs >= WHATSAPP_QA_READY_STABILITY_MS) {
return;
}
await new Promise((resolve) =>
setTimeout(resolve, Math.max(750, WHATSAPP_QA_READY_STABILITY_MS - connectedForMs)),
);
await new Promise((resolve) => {
setTimeout(resolve, Math.max(750, WHATSAPP_QA_READY_STABILITY_MS - connectedForMs));
});
}
throw new Error(
`whatsapp account "${accountId}" did not remain ready for ${WHATSAPP_QA_READY_STABILITY_MS}ms`,
@@ -636,7 +638,9 @@ async function startWhatsAppQaDriverSessionWithRetry(params: { authDir: string }
) {
throw error;
}
await new Promise((resolve) => setTimeout(resolve, WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS));
await new Promise((resolve) => {
setTimeout(resolve, WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS);
});
}
}
throw new Error("unreachable WhatsApp QA driver retry loop exit");
@@ -1022,7 +1026,9 @@ async function runWhatsAppScenario(params: {
if (scenarioRun.quietInput) {
const quietStartedAt = new Date();
await params.driver.sendText(target, scenarioRun.quietInput);
await new Promise((resolve) => setTimeout(resolve, scenarioRun.quietWindowMs ?? 5_000));
await new Promise((resolve) => {
setTimeout(resolve, scenarioRun.quietWindowMs ?? 5_000);
});
const unexpectedReply = params.driver.getObservedMessages().find((message) => {
if (new Date(message.observedAt).getTime() < quietStartedAt.getTime()) {
return false;
@@ -1041,7 +1047,9 @@ async function runWhatsAppScenario(params: {
const requestStartedAt = new Date();
await params.driver.sendText(target, scenarioRun.input);
if (!scenarioRun.expectReply) {
await new Promise((resolve) => setTimeout(resolve, params.scenario.timeoutMs));
await new Promise((resolve) => {
setTimeout(resolve, params.scenario.timeoutMs);
});
return {
id: params.scenario.id,
title: params.scenario.title,
@@ -1309,9 +1317,9 @@ export async function runWhatsAppQaLive(params: {
isTransientWhatsAppQaDriverError(error)
) {
driverAttempt += 1;
await new Promise((resolve) =>
setTimeout(resolve, WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS),
);
await new Promise((resolve) => {
setTimeout(resolve, WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS);
});
try {
activeDriver = await restartWhatsAppQaDriverSession({
authDir: driverAuthDir,
+5 -1
View File
@@ -198,7 +198,11 @@ async function mapQaSuiteWithConcurrency<T, U>(
const workerCount = Math.min(Math.max(1, Math.floor(concurrency)), items.length);
const startStaggerMs = Math.max(0, Math.floor(opts?.startStaggerMs ?? 0));
const sleepImpl =
opts?.sleepImpl ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
opts?.sleepImpl ??
((ms: number) =>
new Promise<void>((resolve) => {
setTimeout(resolve, ms);
}));
async function waitForStartSlot(shouldReleaseNextSlot: boolean) {
const currentGate = nextStartGate;
let releaseNextSlot: (() => void) | undefined;
@@ -131,7 +131,9 @@ async function resolveGeneratedImagePath(params: {
if (match) {
return match;
}
await new Promise((resolve) => setTimeout(resolve, 250));
await new Promise((resolve) => {
setTimeout(resolve, 250);
});
}
throw new Error(`timed out after ${params.timeoutMs}ms`);
}
@@ -255,7 +255,9 @@ async function waitForMemorySearchMatch(params: {
if (haystack.includes(params.expectedNeedle)) {
return result;
}
await new Promise((resolve) => setTimeout(resolve, 500));
await new Promise((resolve) => {
setTimeout(resolve, 500);
});
}
throw new Error(`memory index missing expected fact after reindex: ${params.expectedNeedle}`);
}
@@ -280,7 +280,9 @@ export function startMatrixQaOpenClawCli(params: {
},
writeStdin: async (text) => {
if (!child.stdin.write(text)) {
await new Promise<void>((resolve) => child.stdin.once("drain", resolve));
await new Promise<void>((resolve) => {
child.stdin.once("drain", resolve);
});
}
},
kill: () => {
@@ -641,5 +641,7 @@ async function runWithConcurrency(
}
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
+3 -1
View File
@@ -147,7 +147,9 @@ async function persistentRetryLoop<T>(
}
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
// ============ Pre-built Retry Policies ============
@@ -188,7 +188,9 @@ describe("dispatchOutbound", () => {
try {
const runtime = makeRuntime({
onDeliver: async (deliver) => {
await new Promise<void>((resolve) => setTimeout(resolve, 301_000));
await new Promise<void>((resolve) => {
setTimeout(resolve, 301_000);
});
await deliver({ text: "late answer" }, { kind: "block" });
},
});
@@ -161,12 +161,12 @@ export async function dispatchOutbound(
}
return r;
}),
new Promise<OutboundResult>((resolve) =>
new Promise<OutboundResult>((resolve) => {
setTimeout(() => {
ac.abort();
resolve({ channel: "qqbot", error: "timeout" });
}, TOOL_MEDIA_SEND_TIMEOUT),
),
}, TOOL_MEDIA_SEND_TIMEOUT);
}),
]);
if (result.error) {
log?.error(`Tool fallback error: ${result.error}`);

Some files were not shown because too many files have changed in this diff Show More